Isi kandungan:

Topi LED Fancy: 5 Langkah (dengan Gambar)
Topi LED Fancy: 5 Langkah (dengan Gambar)

Video: Topi LED Fancy: 5 Langkah (dengan Gambar)

Video: Topi LED Fancy: 5 Langkah (dengan Gambar)
Video: Naas, Hingga Pingsan !!!! Pemuda Nekat Tebas Ular Hingga Kepala Putus Dan Terbang Mengenai Lengan 2024, November
Anonim
Image
Image
Topi LED mewah
Topi LED mewah

Saya selalu mahu membuat projek Arduino, tetapi tidak pernah mempunyai idea hebat sehinggalah keluarga saya dijemput ke pesta topi mewah. Dengan masa dua minggu, saya ingin tahu sama ada saya dapat merancang dan melaksanakan topi animasi LED sensitif gerakan. Ternyata saya boleh! Saya mungkin sedikit berlebihan, tetapi jumlah projeknya berharga sekitar $ 80. Dengan percubaan dan pengekodan, anda dapat melakukannya dengan lebih sedikit.

Matlamat dengan topi adalah seperti berikut:

  1. Mempunyai satu set lampu bergerak dari bahagian tengah topi ke belakang, satu lampu di setiap sisi
  2. Tukar kelajuan perjalanan cahaya yang ditentukan oleh kecondongan topi dari depan ke belakang
  3. Biarkan lampu terbalik apabila tali topi dimiringkan ke bawah (iaitu meniru kesan graviti pada lampu)
  4. Tukar warna berdasarkan kecondongan topi dari kiri ke kanan
  5. Rasa terkejut, dan memaparkan kesan khas
  6. Rasa pemakainya berputar, dan tampilkan kesan khas
  7. Adakah ia betul-betul terkandung di dalam topi

Langkah 1: Bahagian Diperlukan

Bahagian Diperlukan
Bahagian Diperlukan
Bahagian Diperlukan
Bahagian Diperlukan
Bahagian Diperlukan
Bahagian Diperlukan

Saya menggunakan komponen utama berikut (termasuk pautan Amazon bukan gabungan):

  • Mikrokontroler Teensy LC - Saya memilih ini daripada Arduino biasa kerana saiznya yang kecil, dan ia mempunyai sambungan khas untuk mengawal LED saya, serta sokongan perpustakaan dan komuniti yang kuat.
  • Sensor kedudukan berdasarkan Bosch BNO055 - sejujurnya adalah salah satu dokumentasi pertama yang saya dapati. Terdapat banyak pilihan yang lebih murah, namun setelah anda mengetahui Bosch, ia sangat berguna bagi anda yang sebaliknya anda perlu lakukan dalam kod
  • Jalur LED beralamat WS2812 - Saya memilih panjang 1 meter dengan 144 LED per meter. Mempunyai ketumpatan itu membantu cahaya kelihatan lebih seperti bergerak, dan bukannya elemen individu yang menyala secara berurutan.

Dan komponen kecil berikut:

  • Topi - topi apa pun dengan topi akan berjaya. Ini adalah topi $ 6 dari kedai tempatan. Sekiranya ia mempunyai jahitan di bahagian belakang, lebih mudah untuk mendapatkan pendawaian. Perhatikan jika tali topi dilekatkan kerana itu juga akan menyebabkan kesukaran tambahan. Yang ini dijahit di bahagian atas, tetapi bahagian bawahnya mudah ditarik.
  • Perintang 4.7K ohm
  • Sarung bateri 3x AAA - menggunakan voltan keluaran 3 bateri AAA tepat dalam julat yang dikehendaki oleh elektronik, yang memudahkan segalanya. AAA sesuai dengan topi lebih mudah daripada AA dan masih mempunyai jangka masa yang hebat.
  • Kawat tolok kecil - Saya menggunakan beberapa wayar padat yang saya pasangkan dari projek LED sebelumnya.
  • Pateri dan pateri
  • Beberapa spandeks yang sesuai dengan warna topi, dan benang

Disarankan, tetapi pilihan:

  • Penyambung pantas untuk wayar bateri
  • Alat Bantu Tangan, benda-benda ini sangat kecil dan sukar dipateri

Langkah 2: Ubah Topi

Ubah topi
Ubah topi
Ubah topi
Ubah topi
Ubah topi
Ubah topi
Ubah topi
Ubah topi

Anda akan memerlukan tempat di topi untuk memasang elektronik, dan tempat untuk bateri. Isteri saya bekerja dengan pakaian secara profesional, jadi saya meminta nasihat dan pertolongan kepadanya. Kami akhirnya mencipta dua poket dengan spandeks. Poket pertama yang lebih kecil ke arah depan ditunjuk seperti topi itu sendiri sehingga ketika elektronik dipasang sensor posisi dipegang di tempat yang cukup baik, namun dapat dengan mudah dikeluarkan jika perlu. Poket kedua ke arah belakang adalah dengan memegang pek bateri di tempatnya.

Poket disemai dengan benang yang sesuai dengan warna topi, sepanjang garis mahkota. Bergantung pada gaya topi dan bahan, ia diperbuat daripada YMMV dengan teknik ini.

Kami juga menjumpai topi topi itu sendiri di satu sisi, dan itu dijahit sepenuhnya ke topi di lokasi itu. Kami terpaksa menanggalkan jahitan asal untuk menjalankan LED di bawah jalur. Semasa membina, ia dipasang di tempat dengan pin, dan kemudian dijahit dengan benang yang sepadan apabila selesai.

Akhirnya kami membuka jahitan di bahagian belakang topi sekiranya ia ditutupi oleh band. Kami mengikat tali wayar yang disertakan dengan LED melalui jahitan itu dan membariskan LED pertama di jalur yang tepat di jahitan. Kami kemudian membungkus LED di sekeliling topi dan memotong jalur sehingga LED terakhir berada tepat di sebelah yang pertama. Jalur LED boleh dipegang di tempatnya hanya dengan tali topi, namun bergantung pada jalur dan bahan anda, anda mungkin perlu mengamankan LED dengan menjahit atau gam.

Langkah 3: Wire It Up

Wire It Up
Wire It Up

Papan Teensy dan LED akan berfungsi di mana sahaja dari 3.3v hingga 5v untuk kuasa. Inilah sebabnya mengapa saya memilih untuk menggunakan 3 bateri AAA, voltan keluaran 4.5v sangat baik dalam julat itu, dan mereka mempunyai banyak masa proses untuk cara saya memprogram LED untuk berfungsi. Anda seharusnya dapat pulih lebih dari 8 jam waktu proses.

Pendawaian kuasa

Saya memasang kabel positif dan negatif dari kotak bateri dan LED bersama-sama, kemudian disisipkan ke Teensy di lokasi yang sesuai. Positif dari bateri perlu disambungkan ke pin kanan atas Teensy dalam rajah (berlabel Vin di papan), dan yang negatif boleh disambungkan ke pin berlabel GND. Dengan mudah terdapat satu tepat di seberang papan, atau betul-betul di sebelah pin Vin. Gambarajah pinout lengkap untuk papan boleh didapati di bahagian bawah halaman ini. Dan dalam beberapa kes, salinan kertas disertakan semasa anda memesan papan.

Sekiranya anda merancang menjalankan kod yang hanya menghidupkan beberapa LED dalam satu masa, anda boleh menghidupkan LED dari Teensy itu sendiri, dengan menggunakan output 3.3v dan GND, namun jika anda cuba menarik terlalu banyak tenaga, anda boleh merosakkan papan. Oleh itu, untuk memberikan pilihan yang terbaik kepada diri sendiri, lebih baik memasangkan LED ke sumber bateri anda secara langsung.

Pendawaian LED

Saya memilih Teensy LC untuk projek ini kerana ia mempunyai pin yang menjadikannya lebih mudah untuk menyambungkan LED yang dapat diatasi. Di bahagian bawah papan pin yang kedua dari cermin kiri Pin # 17, tetapi juga mempunyai 3.3v di atasnya. Ini disebut sebagai pull-up, dan pada papan lain anda perlu memasang wayar dalam perintang untuk memberikan voltan tersebut. Dalam kes Teensy LC, anda boleh memasukkan wayar dari pin itu terus ke wayar data LED anda.

Pendawaian sensor kedudukan

Sebilangan papan BNO055 yang tersedia jauh lebih ketat pada voltan dan hanya mahukan 3.3v. Oleh kerana itu, saya memasang kabel Vin pada papan BNO055 dari output 3.3v khusus pada Teensy, yang merupakan pin ke-3 di sebelah kanan. Anda kemudian boleh menyambungkan GND di BNO055 ke mana-mana GND di Teensy.

Sensor kedudukan BNO055 menggunakan I2c untuk bercakap dengan Teensy. I2c memerlukan pull-up, jadi saya memasang dua perintang ohm 4.7K dari output 3.3v pada Teensy hingga pin 18 dan 19. Saya kemudian memasang pin 19 ke pin SCL pada papan BNO055, dan 18 ke pin SDA.

Petua / helah pendawaian

Untuk melakukan projek ini, saya menggunakan wayar padat dan bukannya terdampar. Satu kelebihan untuk wayar padat adalah ketika menyolder ke papan prototaip seperti ini. Anda boleh melepaskan beberapa wayar, membengkokkannya hingga 90 darjah, dan memasukkannya ke bahagian bawah salah satu terminal, sehingga hujung wayar yang terpasang melekat di atas papan anda. Anda hanya memerlukan sedikit pateri untuk menahannya ke terminal, dan anda boleh memotong lebihan dengan mudah.

Kawat padat boleh menjadi lebih sukar untuk dikerjakan kerana cenderung ingin tetap seperti yang dibengkokkan. Walau bagaimanapun untuk projek ini adalah satu kelebihan. Saya memotong dan membentuk wayar saya sedemikian rupa sehingga orientasi sensor kedudukan akan konsisten semasa saya memasukkan dan mengeluarkan elektronik dari topi untuk tweak dan pengaturcaraan.

Langkah 4: Pengaturcaraan

Setelah semuanya dipasang, anda memerlukan alat pengaturcaraan yang serasi dengan Arduino. Saya menggunakan Arduino IDE yang sebenarnya (berfungsi dengan Linux, Mac, dan PC). Anda juga memerlukan perisian Teensyduino untuk bersambung dengan papan Teensy. Projek ini banyak menggunakan perpustakaan FastLED untuk melakukan pengaturcaraan warna dan kedudukan LED.

Menentukur

Perkara pertama yang anda ingin lakukan adalah pergi ke repositori GitHub Kris Winer's yang sangat baik untuk BNO055 dan muat turun lakaran BNO_055_Nano_Basic_AHRS_t3.ino-nya. Pasang kod itu dengan Serial Monitor berjalan dan ia akan memberitahu anda jika papan BNO055 betul-betul online dan lulus ujian sendiri. Ini juga akan memberi petunjuk kepada anda untuk menentukur BNO055, yang akan memberikan hasil yang lebih konsisten kemudian.

Bermula dengan lakaran LED Fancy

Kod untuk topi Fancy LED dilampirkan secara khusus, dan juga di repositori GitHub saya. Saya merancang untuk membuat lebih banyak perubahan pada kod dan yang akan dipaparkan di repo GitHub. Fail di sini mencerminkan kod ketika Instructable ini diterbitkan. Setelah memuat turun dan membuka lakaran, terdapat beberapa perkara yang perlu anda ubah. Sebilangan besar nilai penting untuk diubah adalah paling utama sebagai pernyataan #define:

Baris 24: #tentukan NUM_LEDS 89 - ubah ini kepada bilangan sebenar LED pada jalur LED anda

Baris 28: #define SERIAL_DEBUG false - anda mungkin mahu menjadikannya benar, supaya anda dapat melihat output pada monitor bersiri

Kod pengesanan kedudukan

Pengesanan kedudukan dan sebahagian besar tweak anda bermula pada baris 742, dan melalui 802. Kami mendapat data Pitch, Roll, dan Yaw dari sensor kedudukan dan menggunakannya untuk menetapkan nilai. Bergantung pada bagaimana elektronik anda dipasang, anda mungkin perlu mengubahnya. Sekiranya anda memasang sensor kedudukan dengan cip ke bahagian atas topi, dan anak panah di sebelah X yang dicetak di papan menunjuk ke arah depan topi, anda akan melihat yang berikut:

  • Pitch menganggukkan kepala
  • Gulung memiringkan kepala anda, mis. sentuh telinga anda ke bahu anda
  • Yaw adalah arah mana. yang anda hadapi (Utara, Barat, dll).

Sekiranya papan anda dipasang dalam orientasi yang berbeza, anda perlu menukar Pitch / Roll / Yaw agar mereka berkelakuan seperti yang anda mahukan.

Untuk menyesuaikan tetapan Roll, anda boleh mengubah nilai #define berikut:

  • ROLLOFFSET: dengan topi anda stabil dan sepusat yang boleh, jika Roll tidak 0, ubah ini dengan perbezaannya. I. E. jika anda melihat Roll pada -20 ketika topi anda berpusat, buat 20 ini.
  • ROLLMAX: nilai maksimum yang digunakan untuk pengukuran Roll. Paling senang dijumpai dengan memakai topi dan menggerakkan telinga kanan ke arah bahu kanan anda. Anda memerlukan kabel USB yang panjang untuk melakukan ini semasa menggunakan monitor bersiri.
  • ROLLMIN: nilai terendah untuk digunakan untuk pengukuran Roll, untuk ketika anda memiringkan kepala ke kiri

Begitu juga untuk Pitch:

  • MAXPITCH - nilai maksimum semasa anda mencari
  • MINPITCH - nilai minimum semasa anda melihat ke bawah
  • PITCHCENTER - nilai nada semasa anda melihat ke hadapan

Sekiranya anda menetapkan SERIALDEBUG ke true di bahagian atas fail, anda akan melihat nilai semasa untuk output Roll / Pitch / Yaw ke monitor bersiri untuk membantu mengubah nilai-nilai ini.

Parameter lain yang mungkin anda mahu ubah

  • MAX_LED_DELAY 35 - paling perlahan zarah LED dapat bergerak. Ini dalam milisaat. Ini adalah kelewatan untuk bergerak dari satu LED ke LED yang lain dalam rentetan.
  • MIN_LED_DELAY 10 - puasa agar zarah LED dapat bergerak. Seperti di atas, ia adalah dalam milisaat.

Kesimpulannya

Sekiranya anda telah pergi sejauh ini, anda harus mempunyai topi LED yang berfungsi sepenuhnya dan menyeronokkan! Sekiranya anda ingin melakukan lebih banyak perkara, halaman seterusnya mempunyai beberapa maklumat lanjutan mengenai menukar tetapan, dan melakukan perkara anda sendiri. serta beberapa penjelasan mengenai apa yang dilakukan oleh kod saya yang lain.

Langkah 5: Lanjutan dan Pilihan: Di dalam Kod

Pengesanan kesan & putaran

Pengesanan hentaman / putaran dilakukan menggunakan fungsi sensor G tinggi BNO055. Anda boleh mengubah kepekaannya dengan baris berikut di initBNO055 ():

  • Baris # 316: BNO055_ACC_HG_DURATION - berapa lama acara itu mesti berlangsung
  • Baris # 317: BNO055_ACC_HG_THRESH - betapa sukarnya kesannya
  • Baris # 319: BNO055_GYR_HR_Z_SET - ambang kelajuan putaran
  • Baris # 320: BNO055_GYR_DUR_Z - berapa lama putaran bahkan perlu bertahan

Kedua-dua nilai adalah 8 bit binari, saat ini impak ditetapkan ke B11000000, iaitu 192 dari 255.

Apabila kesan atau putaran dikesan, BNO055 menetapkan nilai yang dicari kod tepat di awal Gelung:

// Kesan gangguan yang dicetuskan, iaitu disebabkan oleh GSt tinggi byte intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); jika (intStatus> 8) {impak (); } lain jika (intStatus> 0) {putar (); }

Cari garis hentaman kekosongan () di atas dalam kod untuk mengubah tingkah laku hentaman, atau putaran batal () untuk mengubah tingkah laku putaran.

Pembantu

Saya telah membuat fungsi pembantu mudah (void setAllLeds ()) untuk menetapkan semua LED dengan cepat ke satu warna. Satu menggunakannya untuk mematikan semuanya:

setAllLeds (CRGB:: Hitam);

Atau anda boleh memilih warna yang dikenali oleh perpustakaan FastLED:

setAllLeds (CRGB:: Merah);

Terdapat juga fungsi fadeAllLeds () yang akan meredupkan semua LED sebanyak 25%.

Kelas Zarah

Untuk mempermudah pendawaian, saya ingin menggunakan satu rentetan LED, tetapi membiarkannya berkelakuan seperti pelbagai rentetan. Oleh kerana ini adalah percubaan pertama saya, saya mahu menyimpannya sesederhana mungkin, jadi saya memperlakukan satu rentetan sebagai dua, dengan LED tengah berada di sana, perpecahan akan berlaku. Oleh kerana kita boleh mempunyai nombor genap atau nombor ganjil, kita perlu menjelaskannya. Saya mulakan dengan beberapa pemboleh ubah global:

/ * * Boleh ubah dan bekas untuk LED * / CRGB led [NUM_LEDS]; int curLedDelay statik yang tidak ditandatangani = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; stat stat int maxLedPos = NUM_LEDS / 2; stat stool oddLeds = 0; partikel bool statikDir = 1; speed bool statikDir = 1; dirCount panjang yang tidak ditandatangani; hueCount panjang yang tidak ditandatangani;

Dan beberapa kod dalam persediaan ():

jika (NUM_LEDS% 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS / 2; } lain {oddLeds = 0; maxLedPos = NUM_LEDS / 2 - 1; }

Sekiranya kita mempunyai nombor ganjil, kita mahu menggunakan titik 1/2 sebagai tengah, jika tidak kita mahu titik 1/2 - 1. Ini mudah dilihat dengan 10 atau 11 LED:

  • 11 LED: 11/2 dengan bilangan bulat harus dinilai hingga 5. dan komputer dikira dari 0. Oleh itu 0 - 4 adalah satu setengah, 6 - 10 adalah separuh yang lain, dan 5 berada di antara mereka. Kami memperlakukan # 5 dalam kes ini seolah-olah itu adalah bahagian dari kedua-duanya, iaitu # 1 untuk kedua-dua rentetan maya LED
  • 10 LED: 10/2 adalah 5. Tetapi kerana komputer dikira dari 0, kita perlu mengeluarkannya. Kemudian kita mempunyai 0 - 4 untuk satu setengah, dan 5 - 9 untuk yang lain. # 1 untuk rentetan maya pertama adalah 4, dan # 1 untuk rentetan maya kedua akan menjadi # 5.

Kemudian dalam kod zarah kita perlu membuat pengiraan dari kedudukan keseluruhan kita hingga kedudukan sebenar pada rentetan LED:

jika (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } lain {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Kod ini juga mempunyai syarat di mana zarah dapat mengubah arah, jadi kita juga harus mempertimbangkannya:

if (particleDir) {if ((currPos == NUM_LEDS / 2) && oddLeds) {currPos = 0; } lain jika ((currPos == NUM_LEDS / 2 - 1) && (! oddLeds)) {currPos = 0; } lain {currPos ++; }} lain {if ((currPos == 0) && oddLeds) {currPos = centerLed; } lain jika ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } lain {currPos--; }}

Oleh itu, kami menggunakan arah yang dimaksudkan (particleDir), untuk mengira LED mana yang harus dinyalakan seterusnya, tetapi kami juga harus mempertimbangkan sama ada kami telah mencapai sama ada ujung tali LED yang sebenarnya, atau titik tengah kami, yang juga bertindak sebagai akhir untuk setiap rentetan maya.

Setelah mengetahui semuanya, kami akan menyalakan cahaya seterusnya jika perlu:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } lain {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} lain {if (oddLeds) {Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } lain {Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; }} leds [Pos1] = CHSV (CurrHue, 255, 255); leds [Pos2] = CHSV (CurrHue, 255, 255); FastLED.show ();}

Mengapa menjadikan ini kelas sama sekali? Seperti ini, ini cukup mudah dan tidak semestinya perlu berada di kelas. Walau bagaimanapun, saya mempunyai rancangan masa depan untuk mengemas kini kod untuk membolehkan lebih daripada satu zarah berlaku pada satu masa, dan ada yang bekerja secara terbalik sementara yang lain terus maju. Saya rasa ada kemungkinan besar untuk mengesan putaran menggunakan beberapa zarah.

Disyorkan: