Topi LED Mewah: 5 Langkah (dengan Gambar)
Topi LED Mewah: 5 Langkah (dengan Gambar)
Anonim
Image
Image
Topi LED Mewah
Topi LED Mewah

Saya selalu ingin melakukan proyek Arduino, tetapi tidak pernah punya ide bagus untuk itu sampai keluarga saya diundang ke pesta topi mewah. Dengan waktu tenggang dua minggu, saya ingin tahu apakah saya dapat merencanakan dan menjalankan topi animasi LED yang peka terhadap gerakan. Ternyata saya bisa! Saya mungkin sedikit berlebihan, tetapi total biaya proyek sekitar $80. Dengan eksperimen dan beberapa pengkodean, Anda dapat melakukannya dengan lebih murah.

Tujuan dengan topi adalah sebagai berikut:

  1. Mintalah satu set lampu bergerak dari bagian tengah depan topi ke belakang, satu lampu di setiap sisi
  2. Ubah kecepatan perjalanan cahaya yang ditentukan oleh kemiringan topi dari depan ke belakang
  3. Biarkan lampu mundur saat pita topi dimiringkan ke bawah (yaitu meniru efek gravitasi pada lampu)
  4. Ubah warna berdasarkan kemiringan topi dari kiri ke kanan
  5. Rasakan guncangan, dan tampilkan efek khusus
  6. Rasakan putaran pemakainya, dan tampilkan efek khusus
  7. Apakah itu benar-benar terkandung di dalam topi

Langkah 1: Bagian yang Dibutuhkan

Bagian yang Dibutuhkan
Bagian yang Dibutuhkan
Bagian yang Dibutuhkan
Bagian yang Dibutuhkan
Bagian yang Dibutuhkan
Bagian yang Dibutuhkan

Saya menggunakan komponen utama berikut (termasuk tautan Amazon non-afiliasi):

  • Mikrokontroler LC kecil - Saya memilih ini daripada Arduino biasa karena ukurannya yang kecil, dan memiliki koneksi khusus untuk mengontrol LED saya, serta perpustakaan yang kuat dan dukungan komunitas.
  • Sensor posisi berbasis Bosch BNO055 - sejujurnya salah satu dokumentasi pertama yang saya temukan. Ada opsi yang jauh lebih murah, namun begitu Anda mengetahui Bosch, itu sangat bermanfaat bagi Anda yang seharusnya Anda lakukan dalam kode
  • Strip LED beralamat WS2812 - Saya memilih panjang 1 meter dengan 144 LED per meter. Memiliki kepadatan itu membantu cahaya terlihat lebih seperti bergerak, daripada elemen individu yang menyala secara berurutan.

Dan komponen minor berikut:

  • Topi - topi apa pun dengan pita topi bisa digunakan. Ini adalah topi $6 dari toko lokal. Jika memiliki jahitan di bagian belakang akan lebih mudah untuk mendapatkan kabel melalui. Perhatikan apakah pita topi direkatkan karena itu juga akan menyebabkan kesulitan ekstra. Yang ini dijahit di bagian atas, tetapi bagian bawahnya mudah ditarik.
  • Resistor 4.7K ohm
  • Casing baterai 3x AAA - menggunakan 3 baterai AAA menghasilkan tegangan persis dalam kisaran yang diinginkan elektronik, yang menyederhanakan banyak hal. AAA cocok dengan topi lebih mudah daripada AA dan masih memiliki runtime yang bagus.
  • Kawat pengukur kecil - Saya menggunakan beberapa kawat padat yang saya letakkan dari proyek LED sebelumnya.
  • Besi solder dan solder
  • Beberapa spandex yang cocok dengan warna bagian dalam topi, dan benang

Disarankan, tetapi opsional:

  • Konektor cepat untuk kabel baterai
  • Alat Helping Hands, benda-benda ini sangat kecil dan sulit untuk disolder

Langkah 2: Ubah Topi

Ubah Topi
Ubah Topi
Ubah Topi
Ubah Topi
Ubah Topi
Ubah Topi
Ubah Topi
Ubah Topi

Anda akan membutuhkan tempat di topi untuk memasang elektronik, dan tempat untuk baterai. Istri saya bekerja dengan pakaian secara profesional, jadi saya meminta saran dan bantuannya. Kami akhirnya membuat dua kantong dengan spandex. Saku pertama yang lebih kecil ke arah depan runcing seperti topi itu sendiri sehingga ketika elektronik dipasang, sensor posisi dipegang dengan cukup baik, namun dapat dengan mudah dilepas jika perlu. Saku kedua di bagian belakang adalah untuk menahan unit baterai di tempatnya.

Kantong-kantongnya ditaburi benang yang senada dengan warna topi, sepanjang garis mahkota. Tergantung pada gaya topi dan bahannya terbuat dari YMMV dengan teknik ini.

Kami juga menemukan pita topi terselip di satu sisi, dan itu sepenuhnya dijahit ke topi di lokasi itu. Kami harus melepas jahitan asli untuk menjalankan LED di bawah pita. Selama pembuatan itu diadakan di tempat dengan pin, dan kemudian dijahit dengan benang yang cocok saat selesai.

Akhirnya kami membuka jahitan di bagian belakang topi jika ditutup oleh band. Kami menyelipkan harnes kawat yang disertakan dengan LED melalui jahitan itu dan melapisi LED pertama di strip tepat di jahitannya. Kami kemudian membungkus LED di sekitar topi dan memotong strip sehingga LED terakhir akan tepat di sebelah yang pertama. Strip LED dapat ditahan di tempatnya hanya dengan pita topi, namun tergantung pada pita dan bahan Anda, Anda mungkin perlu mengencangkan LED dengan menjahit atau merekatkan.

Langkah 3: Sambungkan

Hubungkan
Hubungkan

Papan Teensy dan LED akan bekerja dengan daya mulai dari 3.3v hingga 5v. Inilah sebabnya mengapa saya memilih untuk menggunakan 3 baterai AAA, tegangan output 4,5v baik dalam kisaran itu, dan mereka memiliki banyak waktu untuk cara saya memprogram LED untuk bekerja. Anda harus bisa mendapatkan lebih dari 8 jam runtime.

Menghubungkan daya

Saya menghubungkan kabel positif dan negatif dari kotak baterai dan LED bersama-sama, kemudian disolder ke Teensy di lokasi yang sesuai. Positif dari baterai perlu dihubungkan ke pin kanan atas Teensy dalam diagram (berlabel Vin di papan), dan negatif dapat ditransfer ke pin berlabel GND. Nyaman ada satu langsung di sisi berlawanan dari papan, atau tepat di sebelah pin Vin. Diagram pinout lengkap untuk papan dapat ditemukan di bagian bawah halaman ini. Dan dalam beberapa kasus, salinan kertas disertakan saat Anda memesan papan.

Jika Anda berencana menjalankan kode yang hanya memiliki beberapa LED yang menyala pada satu waktu, Anda dapat menyalakan LED dari Teensy itu sendiri, dengan menggunakan output 3.3v dan GND, namun jika Anda mencoba menarik terlalu banyak daya, Anda dapat merusak papan. Jadi untuk memberi diri Anda pilihan paling banyak, yang terbaik adalah menghubungkan LED ke sumber baterai Anda secara langsung.

Menghubungkan LED

Saya memilih Teensy LC untuk proyek ini karena memiliki pin yang membuatnya lebih mudah untuk memasang LED yang dapat dialamatkan. Di bagian bawah papan pin yang kedua dari spion kiri Pin #17, tetapi juga memiliki 3.3v di atasnya. Ini disebut sebagai pull-up, dan di papan lain Anda harus memasang resistor untuk memberikan tegangan itu. Dalam kasus LC Teensy, Anda dapat menghubungkan pin itu langsung ke kabel data LED Anda.

Menghubungkan sensor posisi

Beberapa papan BNO055 yang tersedia jauh lebih ketat pada tegangan dan hanya menginginkan 3.3v. Karena itu, saya menghubungkan Vin pada papan BNO055 dari output 3.3v khusus pada Teensy, yang merupakan pin ke-3 di sebelah kanan. Anda kemudian dapat menghubungkan GND pada BNO055 ke GND mana pun pada Teensy.

Sensor posisi BNO055 menggunakan I2c untuk berbicara dengan Teensy. I2c membutuhkan pull-up, jadi saya menghubungkan dua resistor 4.7K ohm dari output 3.3v pada Teensy ke pin 18 dan 19. Saya kemudian menyambungkan pin 19 ke pin SCL pada papan BNO055, dan 18 ke pin SDA.

Tip/trik kabel

Untuk melakukan proyek ini saya menggunakan kawat padat daripada terdampar. Salah satu keuntungan untuk kawat padat adalah saat menyolder ke papan prototipe seperti ini. Anda dapat mengupas beberapa kawat, menekuknya hingga 90 derajat, dan memasukkannya melalui bagian bawah salah satu terminal, sehingga ujung kabel yang terpotong menempel di atas papan Anda. Anda kemudian hanya perlu sedikit solder untuk menahannya ke terminal, dan Anda dapat memotong kelebihannya dengan mudah.

Kawat padat bisa lebih sulit untuk dikerjakan karena cenderung ingin tetap dibengkokkan. Namun untuk proyek ini itu adalah keuntungan. Saya memotong dan membentuk kabel saya sedemikian rupa sehingga orientasi sensor posisi akan konsisten saat saya memasukkan dan melepas elektronik dari topi untuk tweaker dan pemrograman.

Langkah 4: Pemrograman

Sekarang setelah semuanya terpasang, Anda memerlukan alat pemrograman yang kompatibel dengan Arduino. Saya menggunakan Arduino IDE yang sebenarnya (berfungsi dengan Linux, Mac, dan PC). Anda juga memerlukan perangkat lunak Teensyduino untuk berinteraksi dengan papan Teensy. Proyek ini banyak menggunakan perpustakaan FastLED untuk melakukan pemrograman warna dan posisi LED.

Kalibrasi

Hal pertama yang ingin Anda lakukan adalah pergi ke repositori GitHub Kris Winer yang luar biasa untuk BNO055 dan unduh sketsa BNO_055_Nano_Basic_AHRS_t3.ino-nya. Instal kode itu dengan Serial Monitor yang berjalan dan itu akan memberi tahu Anda jika papan BNO055 online dengan benar dan lulus tes mandiri. Ini juga akan memandu Anda dalam mengkalibrasi BNO055, yang nantinya akan memberi Anda hasil yang lebih konsisten.

Memulai dengan sketsa LED Mewah

Kode untuk topi Fancy LED terlampir secara khusus, dan juga di repositori GitHub saya. Saya berencana membuat lebih banyak penyesuaian pada kode dan itu akan diposting di repo GitHub. File di sini mencerminkan kode saat Instructable ini diterbitkan. Setelah mengunduh dan membuka sketsa, ada beberapa hal yang perlu Anda ubah. Sebagian besar nilai penting untuk diubah ada di bagian paling atas seperti pernyataan #define:

Baris 24: #define NUM_LEDS 89 - ubah ini ke jumlah LED aktual pada strip LED Anda

Baris 28: #define SERIAL_DEBUG false - Anda mungkin ingin membuat ini benar, sehingga Anda dapat melihat output pada monitor serial

Kode deteksi posisi

Deteksi posisi dan sebagian besar tweaking Anda dimulai pada baris 742, dan melewati 802. Kami mendapatkan data Pitch, Roll, dan Yaw dari sensor posisi dan menggunakannya untuk menetapkan nilai. Tergantung pada bagaimana elektronik Anda dipasang, Anda mungkin perlu mengubahnya. Jika Anda memasang sensor posisi dengan chip ke arah atas topi, dan panah di sebelah X yang tercetak di papan mengarah ke depan topi, Anda akan melihat yang berikut:

  • Pitch menganggukkan kepalamu
  • Roll adalah memiringkan kepala Anda, mis. sentuh telingamu ke bahumu
  • Yaw ke arah mana. Anda hadapi (Utara, Barat, dll).

Jika papan Anda dipasang dalam orientasi yang berbeda, Anda perlu menukar Pitch/Roll/Yaw agar mereka berperilaku seperti yang Anda inginkan.

Untuk menyesuaikan pengaturan Roll, Anda dapat mengubah nilai #define berikut:

  • ROLLOFFSET: dengan topi Anda stabil dan sepusat mungkin, jika Roll tidak 0, ubah ini dengan selisih. Yaitu. jika Anda melihat Roll di -20 saat topi Anda berada di tengah, buat ini 20.
  • ROLLMAX: nilai maksimum yang digunakan untuk pengukuran Roll. Paling mudah ditemukan dengan mengenakan topi dan menggerakkan telinga kanan ke arah bahu kanan. Anda memerlukan kabel USB yang panjang untuk melakukan ini saat menggunakan monitor serial.
  • ROLLMIN: nilai terendah yang digunakan untuk pengukuran Roll, ketika Anda memiringkan kepala ke kiri

Demikian pula, untuk Pitch:

  • MAXPITCH - nilai maksimum saat Anda melihat ke atas
  • MINPITCH - nilai minimum saat Anda melihat ke bawah
  • PITCHCENTER - nilai nada saat Anda melihat lurus ke depan

Jika Anda menyetel SERIALDEBUG ke true di bagian atas file, Anda akan melihat nilai saat ini untuk keluaran Roll/Pitch/Yaw ke monitor serial untuk membantu mengubah nilai ini.

Parameter lain yang mungkin ingin Anda ubah

  • MAX_LED_DELAY 35 - partikel LED paling lambat dapat bergerak. Ini dalam milidetik. Ini adalah penundaan dari perpindahan dari satu LED ke LED berikutnya dalam string.
  • MIN_LED_DELAY 10 - puasa agar partikel LED dapat bergerak. Seperti di atas dalam milidetik.

Kesimpulan

Jika Anda sudah sejauh ini, Anda harus memiliki topi LED yang berfungsi penuh dan menyenangkan! Jika Anda ingin berbuat lebih banyak dengannya, halaman berikutnya memiliki beberapa informasi lanjutan tentang mengubah pengaturan, dan melakukan hal-hal Anda sendiri. serta beberapa penjelasan tentang apa yang dilakukan oleh sisa kode saya.

Langkah 5: Lanjutan dan Opsional: Di dalam Kode

Deteksi benturan & putaran

Deteksi benturan/putaran dilakukan menggunakan fungsi sensor G tinggi dari BNO055. Anda dapat mengubah sensitivitasnya dengan baris berikut di initBNO055():

  • Baris #316: BNO055_ACC_HG_DURATION - berapa lama acara harus berlangsung
  • Baris #317: BNO055_ACC_HG_THRESH - seberapa keras dampak yang dibutuhkan
  • Baris #319: BNO055_GYR_HR_Z_SET - ambang batas kecepatan rotasi
  • Baris #320: BNO055_GYR_DUR_Z - berapa lama rotasi harus berlangsung

Kedua nilai adalah biner 8 bit, saat ini dampaknya diatur ke B11000000, yaitu 192 dari 255.

Ketika benturan atau putaran terdeteksi, BNO055 menetapkan nilai yang dicari kode tepat di awal Loop:

// Mendeteksi interupsi yang dipicu, misalnya karena G byte tinggi intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { dampak(); } else if(intStatus > 0) { spin(); }

Cari baris void impact() di atas dalam kode untuk mengubah perilaku impact, atau void spin() untuk mengubah perilaku spin.

Pembantu

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

setAllLeds(CRGB::Hitam);

Atau Anda dapat memilih warna apa pun yang dikenali oleh perpustakaan FastLED:

setAllLeds(CRGB::Merah);

Ada juga fungsi fadeAllLeds() yang akan meredupkan semua LED sebesar 25%.

Kelas Partikel

Untuk menyederhanakan pengkabelan, saya ingin menggunakan satu string LED, tetapi membuatnya berperilaku seperti banyak string. Karena ini adalah percobaan pertama saya, saya ingin membuatnya sesederhana mungkin, jadi saya memperlakukan satu string sebagai dua, dengan LED tengah yang ada di sana, perpecahan akan terjadi. Karena kita dapat memiliki bilangan genap atau ganjil, kita perlu memperhitungkannya. Saya mulai dengan beberapa variabel global:

/* * Variabel dan wadah untuk LED */ CRGB leds[NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2;static bool oddLeds = 0; partikel bool statisDir = 1; static bool speedDir = 1; unsigned long dirCount; hueCount panjang yang tidak ditandatangani;

Dan beberapa kode di setup():

if(NUM_LEDS % 2 == 1) { oddLeds = 1; maxLedPos = NUM_LEDS/2; } else { oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Jika kita memiliki angka ganjil, kita ingin menggunakan titik 1/2 sebagai tengah, jika tidak kita menginginkan titik 1/2 - 1. Ini mudah dilihat dengan 10 atau 11 LED:

  • 11 LED: 11/2 dengan bilangan bulat harus mengevaluasi ke 5. dan komputer menghitung dari 0. Jadi 0 - 4 adalah satu setengah, 6 - 10 adalah setengah lainnya, dan 5 di antara mereka. Kami memperlakukan #5 dalam kasus ini seolah-olah itu adalah bagian dari keduanya, yaitu #1 untuk kedua string virtual LED
  • 10 LED: 10/2 adalah 5. Tapi karena komputer menghitung dari 0 kita perlu menghapusnya. Kemudian kita memiliki 0 - 4 untuk satu setengah, dan 5 - 9 untuk yang lain. #1 untuk string virtual pertama adalah 4, dan #1 untuk string virtual kedua adalah #5.

Kemudian dalam kode partikel kita, kita harus melakukan beberapa penghitungan dari posisi keseluruhan kita ke posisi sebenarnya pada string LED:

if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Kode juga memiliki kondisi di mana partikel dapat mengubah arah, jadi kita juga harus memperhitungkannya:

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

Jadi kami menggunakan arah yang diinginkan (particleDir), untuk menghitung LED mana yang harus menyala selanjutnya, tetapi kami juga harus mempertimbangkan apakah kami telah mencapai ujung sebenarnya dari string LED, atau titik pusat kami, yang juga bertindak sebagai ujung untuk masing-masing string virtual.

Setelah kami menemukan semua itu, kami menyalakan lampu berikutnya seperlunya:

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

Mengapa membuat ini kelas sama sekali? Karena itu, ini cukup mudah dan tidak perlu berada di kelas. Namun saya memiliki rencana masa depan untuk memperbarui kode untuk memungkinkan lebih dari satu partikel terjadi pada satu waktu, dan beberapa bekerja secara terbalik sementara yang lain maju. Saya pikir ada beberapa kemungkinan yang sangat bagus untuk deteksi putaran menggunakan banyak partikel.