Isi kandungan:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, November
Anonim
Image
Image

Oleh itu, anak saya Doon melihat lampu pesta yang sangat sejuk yang terbuat dari botol kokas lama dan jaring Glow Sticks yang lengket, dan bertanya adakah kita dapat membuatnya untuk Peperiksaan Sekolahnya yang Akan Datang Melebihi PartAYYY !!! Saya katakan pasti, tapi bukankah anda lebih suka mempunyai beberapa cincin Adafruit Neopixel yang telah kami baca … Dia menatap kosong. Kerana kenyataannya dia tidak tahu apa yang saya bicarakan, tetapi Ayah telah melihat peluang untuk bermain dengan cincin Neopixel yang telah dibacanya, dan kita semua tahu salah satu daripada 10 sebab utama ayah geek menghasilkan adalah alasan untuk bermain dengan alat keren yang mereka katakan kepada semua orang untuk anak-anak mereka.

Ini adalah projek super sederhana yang kelihatan sangat hebat. Kami membina 3 botol kokas lama, pinggan kayu, dan pendakap tiang permainan - barang yang terletak di ruang bawah tanah - digabungkan dengan Arduino (Leonardo dalam kes kami, tetapi papan Genuino akan berjaya!) Dan tiga cincin Neopixel. Saya memesan cincin 9-LED, tetapi berakhir dengan cincin 12-LED dengan harga yang sama. Yang manis, tetapi bermaksud penggantian pada lubang sumur - cincin 12-LED selebar 35mm, berbanding 23mm. Apa yang anda perlukan:

  • Papan Genuino / Arduino (Kami menggunakan Leonardo, tetapi hampir semua papan akan melakukannya)
  • 3 cincin Neopixel (masing-masing 12 LED): dapatkannya dari Adafruit, dan menyokong mereka yang baik
  • Kapasitor 1000 µf 6.3v atau lebih baik
  • Perintang 300-500 ohm
  • Pinggan kayu, atau sebidang kayu skrap, atau apa sahaja yang boleh anda masukkan ke dalam neopixel dan letakkan botol coke di atas
  • Sebilangan bentuk pelekap - pendakap pasak taman permainan sangat sesuai untuk kita
  • Ketuat dinding 9v
  • Pengorek lubang 40mm
  • Baut, Mur, Pencuci, Spacer
  • Kawat teras pepejal
  • Pateri dan pateri
  • Papan roti
  • Kotak plastik untuk Arduino. Anda boleh keluar dan membeli sarung plastik yang sangat sesuai dan diperbuat daripada petroleum berusia sejuta tahun yang digerudi keluar dari tanah dalam beberapa persekitaran yang rapuh dan dihasilkan di seberang planet ini dan dihantar dalam bekas ke gudang berhampiran anda dengan semua pelabuhan dipotong dalam jajaran yang sempurna dan dihantar ke pintu anda dengan van yang memancarkan karbon dioksida ke atmosfera. Atau anda boleh melakukan apa yang saya lakukan dan menggunakan kotak plastik yang sudah lama dibuang.. dalam hal ini kotak bantuan band Madagascar tergeletak di lemari ubat … dan gerudi beberapa lubang di dalamnya. Di sini berakhirnya kuliah. Jom buat…

Langkah 1: Buat Pangkalan

Buat Pangkalan
Buat Pangkalan
Buat Pangkalan
Buat Pangkalan

Anda boleh meningkatkan pangkalan anda dari barang sampah yang anda ada di ruang bawah tanah anda sendiri, atau hanya menggunakan kotak kayu atau apa sahaja yang akan menyembunyikan barang elektronik anda.

Mula-mula kami menggerudi tiga lubang, jarak yang rata di atas piring kayu, cukup besar untuk cincin Neopixel duduk. Pada akhirnya, kerana ukuran cincin 12-LED yang lebih besar, kami harus menggerudi lubang dengan sedikit penggerek. Ini bermaksud melintasi piring, dan bukannya memasukkan cincin dengan baik ke dalam sumur sedalam 2mm yang dibuat dengan halus dengan lubang tengah untuk menjalankan wayar yang kemas, akhirnya saya mengikat cincin dengan… ahem… Pita saluran di bahagian bawah dari pinggan. Jangan menilai. Anda tidak dapat melihat bahagian bawah piring dalam reka bentuk saya. Dan gelap ketika menyala. Dan selain itu - apa yang salah dengan pita saluran?

Saya memerlukan pelepasan antara plat dan pendakap untuk papan roti di bahagian bawah pinggan dan satu komponen - kapasitor, dan untuk wayar berjalan yang harus pergi dari papan roti ke Arduino, yang saya rancangkan untuk dimasukkan ke dalam pendakap. Oleh itu, saya meletakkan satu set spacer sementara pada batang bolt untuk memberikan jarak yang cukup - kira-kira 3cm, ketinggian papan roti dan sedikit supaya anda tidak merapatkan pendawaian. Saya menggunakan dua baut sauh kayu di setiap sudut kerana ketinggiannya betul dan tergeletak di dalam laci lelaki … kotak sekrup longgar, bolt, paku, rantai rantai berkarat, gandingan selang, syiling lama, benda tajam yang tidak dijangka, dan pelbagai cara bit dan bob yang secara ajaib dapat menjimatkan perjalanan anda ke kedai perkakasan dengan menawarkan, jika bukan perkara tepat yang anda perlukan, sesuatu yang akan dilakukan dengan baik.

Kemalangan gembira mengenai tiang taman permainan yang saya dapati di ruang bawah tanah kerana sudah ada lubang yang mengalir di pinggan. Tidak perlu menggerudi besi! Pangkalannya mempunyai empat lubang baut, dan kami menggerudi empat lubang kontra di piring kayu untuk dipadankan.

Kami kemudian menyemburkan keseluruhan warna Gothic Black.

Langkah 2: Menyiapkan Neopixel Rings

Menyiapkan Cincin Neopixel
Menyiapkan Cincin Neopixel

Anda perlu memasangkan wayar ke cincin neopixel anda: wayar Data-In untuk mereka semua, wayar Data-Out untuk dua daripadanya, dan kuasa dan ground untuk masing-masing. Apa sahaja panjang yang anda fikirkan anda perlukan, tambahkan sedikit. Anda selalu boleh memotong wayar yang berlebihan, anda tidak boleh meregangkan kabel yang terlalu pendek. Dan perhatikan amaran dari Adafruit:

Semasa memasang kabel pada cincin ini, anda perlu lebih berhati-hati mengenai gumpalan solder dan litar pintas. Jarak antara komponen sangat ketat! Selalunya paling mudah memasukkan wayar dari depan dan solder di bahagian belakang.

Saya harap saya membacanya sebelum saya melekap ke depan. Saya tidak dapat menyalakan LED saya, tetapi saya menghancurkan pinggirnya dengan cara yang membuat saya berpeluh sehingga saya menyalakannya. Sekiranya saya membaca manual yang baik, saya juga akan membaca amaran untuk tidak meletakkan klip buaya pada LED. Biarkan kapal karam dekat saya menjadi rumah api anda.

Neopixel berdering daisy-chain, yang bermaksud anda dapat mengawal semua LED mereka secara serentak dari Arduino dengan menyambungkan wayar dari OUT satu cincin ke IN yang lain. Setiap cincin juga memerlukan kabel kuasa dan kabel tanah.

Langkah 3: Pendawaian

Pendawaian
Pendawaian

Wire it seperti di dia Fritzing di atas - pin 6 dari Arduino membawa data ke dering pertama, Data-out dari cincin itu pergi ke Data-in of the next, Data-out yang satu itu pergi ke Data masuk cincin terakhir. Anda tidak memerlukan wayar keluar dari cincin akhir.

Kapasiti 1000 µf terletak di antara rel positif dan negatif papan roti. Topi ini melindungi cincin dari lonjakan kuasa dan disyorkan oleh bahagian amalan terbaik Adafruit NeoPixel Uberguide. Perintang pada Data ke neopixel pertama juga disyorkan oleh Adafruit - ia adalah 1K di Fritzing tetapi rintangan yang disyorkan ialah 300-500 ohm.

Dalam binaan saya, saya memasang wayar dari Neopixels di bahagian belakang piring ke papan roti yang terpaku di tengahnya. Dengan cara itu, anda hanya perlu memasukkan tiga wayar panjang ke unit asas: kuasa, tanah, dan data. Saya membuat wayar ini terlalu lama - terdapat banyak ruang penyimpanan di pangkalan, dan memudahkan untuk mengeluarkan papan untuk memprogram ulang.

Langkah 4: Kodnya

"loading =" lazy "menyebutkan bahawa anak saya mahukan versi reaktif muzik ini. Menjadi ulang tahunnya yang ke-18 untuk mendapatkannya, tetapi ini dia!

Peralatan tambahan:

1 tiang tunggal, Double Throw Switch1 Automatic Gain Control Mic (Saya menggunakan AdaFruit's MAX9184) 1 1uF-100uF kapasitor (Nilai apa pun)

Mikrofon mesti mempunyai Automatic Gain Control agar ini berfungsi dengan baik. AGC akan sentiasa mengambil sampel bunyi persekitaran dan menaikkan dan menurunkan ambang yang dianggapnya latar belakang, jadi cahaya anda akan bertindak balas terhadap lonjakan terhadap latar belakang tersebut. Mik AdaFruit sangat hebat: anda boleh pergi dari bilik yang sunyi di mana suara satu suara akan mencetuskannya ke mod pesta penuh dengan bilik yang penuh dengan remaja dan muzik, dan ia akan mendapat rentak muzik baiklah. Alternatifnya, Adjustable Gain Mic, mempunyai potensiometer kecil di papan yang sangat halus dan halus. Tidak memerlukan banyak perubahan pada suara ambien untuk menjadikan unit tidak berguna: lampu terus menerus atau gelap sentiasa. AGC berfungsi seperti sihir.

Saya mahukan pilihan untuk menggunakan corak atau muzik ujian pusingan, jadi saya memasang kabel pusat beralih ke VIN dan satu memimpin ke pin 4 yang lain ke pin 8 dari Leonardo. Dengan menguji pin tersebut untuk TINGGI atau RENDAH kita dapat mengetahui keadaan suis masuk, dan kod cabang dengan sewajarnya.

Langkah 7: Memasang Mikrofon

Memasang Mikrofon
Memasang Mikrofon

Masukkan input Mic, melalui kapasitor 1-100µF, ke Pin Analog 0. Jika kapasitor anda terpolarisasi, pin keluar menuju ke sisi positif (Kawat hijau).

Terima kasih kepada CodeGirlJP untuk rutin Trinket-Color-by-Sound, yang saya sesuaikan di bawah:

// LED diaktifkan bunyi dengan Arduino dan NeoPixels

#sertakan

#define MIC_PIN A0 // Mikrofon dilekatkan pada pin a0 pada Leonardo

#define LED_PIN 6 // Jalur LED NeoPixel dilekatkan pada pin 6 pada Leonardo #define N_PIXELS 36 // bilangan piksel dalam helai LED !!!!!! Sesuaikan dengan jumlah piksel dalam persediaan anda. Ini betul untuk 3 cincin Neopixel !!!!!! #define N 100 // Bilangan sampel yang akan diambil setiap kali dibacaSampel dipanggil #define fadeDelay 5 // masa kelewatan untuk setiap jumlah pudar #define noiseLevel 30 // tahap cerun rata-rata bunyi mikrofon tanpa suara

// Permulaan jalur NeoPixel dengan nilai yang ditentukan di atas:

Jalur Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

sampel int [N]; // simpanan untuk set koleksi sampel

int periodFactor = 0; // menjejaki bilangan ms untuk pengiraan tempoh int t1 = -1; // kali cerun> 100 dikesan. int T; // jangka masa antara skala yang diturunkan ke milisaat dalam cerun; // kecerunan dua titik data terkumpul titik bait tempohChanged = 0; const int SwitchPinMusic = 4; // Pin untuk kedudukan suis-sensitiviti muzik const int SwitchPinSwirl = 8; // Pin untuk kedudukan suis Corak Uji (pusaran) int MusicbuttonState = 0; // Pembolehubah logik mati untuk kepekaan muzik

// Kaedah persediaan Arduino

batal persediaan () {

jalur.begin ();

ledsOff (); kelewatan (500); displayColor (Roda (100)); strip.show (); kelewatan (500); oddWheel (Roda (100)); strip.show (); kelewatan (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Beralih, JATUH);

}

// Kaedah gelung Arduino

gelung kosong () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // TINGGI jika beralih ke kepekaan Muzik MusicbuttonState = digitalRead (SwitchPinMusic); // TINGGI jika beralih ke corak Uji semasa (SwirlbuttonState == RENDAH) {readSamples (); // Jalankan rutin pensampelan muzik SwirlbuttonState = digitalRead (SwitchPinSwirl); // Periksa sama ada suis diubah} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); sambil (SwirlbuttonState == TINGGI) {Tarian (); // Jalankan corak ujian swirly rutin SwirlbuttonState = digitalRead (SwitchPinSwirl); // Periksa sama ada suis diubah

}

}

tarian kosong () {

sementara (SwirlbuttonState == TINGGI) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // White RGBW // Kirimkan piksel teater dalam… SwirlbuttonState = digitalRead (SwitchPinSwirl); teaterChase (jalur. Warna (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); teaterChase (jalur. Warna (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); teaterChase (jalur. Warna (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); pelangi (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); RainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); teaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Baca dan Proses Sampel Data dari Mic void readSamples () {untuk (int i = 0; i0) {slope = samples - sampel [i-1]; } lain {slope = sampel - sampel [N-1]; } // Periksa sama ada Slope lebih besar daripada noiseLevel - bunyi yang tidak berada pada tahap kebisingan dikesan jika (abs (cerun)> noiseLevel) {if (cerun <0) {calculPeriod (i); jika (periodChanged == 1) {displayColor (getColor (T)); }}} lain {ledsOff (); // teaterChaseRainbow (50); } periodFactor + = 1; kelewatan (1); }}

mengira tidak sah Tempoh (int i)

{if (t1 == -1) {// t1 belum ditetapkan t1 = i; } lain {// t1 ditetapkan sehingga tempoh kalkulasi int period = periodFactor * (i - t1); periodChanged = T == tempoh? 0: 1; T = tempoh; //Serial.println(T); // tetapkan semula t1 ke nilai i baru t1 = i; periodFactor = 0; }}

uint32_t getColor (tempoh int)

{if (period == -1) Return Wheel (0); lain jika (tempoh> 400) Roda kembali (5); Wheel Return yang lain (peta (tempoh -1 *, -400, -1, 50, 255)); }

kekosongan pudar ()

{untuk (int i = 0; i <5; i ++) {strip.setBrightness (110 - i * 20); strip.show (); // Kemas kini jalur kemas kini (fadeDelay); periodFactor + = fadeDelay; }}

kekosongan pudarIn ()

{strip.setBrightness (100); strip.show (); // Kemas kini jalur // pudar warna untuk (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Kemas kini jalur kemas kini (fadeDelay); periodFactor + = fadeDelay; }}

kekosongan ledsOff ()

{fadeOut (); untuk (int i = 0; i

void displayColor (warna uint32_t)

{untuk (int i = 0; i

kekosongan kekeliruan (warna uint32_t)

{untuk (int j = 0; j <256; j ++) {// kitar semua 256 warna pada roda untuk (int q = 0; q <3; q ++) {untuk (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, Roda ((i + j)% 255)); // hidupkan setiap piksel ketiga} strip.show ();

kelewatan (1);

untuk (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, 0); // matikan setiap piksel ketiga}}} fadeIn (); }

// Isi titik satu demi satu dengan warna

void colorWipe (uint32_t c, uint8_t waiting) {untuk (uint16_t i = 0; i

kekosongan pelangi (uint8_tunggu) {

uint16_t i, j;

untuk (j = 0; j <256; j ++) {untuk (i = 0; i

// Sedikit berbeza, ini menjadikan pelangi sama rata di seluruh

kekosongan pelangi kosong (uint8_t tunggu) {uint16_t i, j;

untuk (j = 0; j <256 * 5; j ++) {// 5 kitaran semua warna pada roda untuk (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); kelewatan (tunggu); }}

// Lampu merangkak gaya teater.

void theatreChase (uint32_t c, uint8_t waiting) {untuk (int j = 0; j <10; j ++) {// lakukan 10 kitaran mengejar (int q = 0; q <3; q ++) {untuk (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, c); // hidupkan setiap piksel ketiga} strip.show ();

kelewatan (tunggu);

untuk (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // matikan setiap piksel ketiga}}}}

// Lampu merangkak gaya teater dengan kesan pelangi

void theatreChaseRainbow (uint8_t waiting) {untuk (int j = 0; j <256; j ++) {// kitar semua 256 warna pada roda untuk (int q = 0; q <3; q ++) {untuk (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // hidupkan setiap piksel ketiga} strip.show ();

kelewatan (tunggu);

untuk (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // matikan setiap piksel ketiga}}}}

// Masukkan nilai 0 hingga 255 untuk mendapatkan nilai warna.

// Warna adalah peralihan r - g - b - kembali ke r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; jika (WheelPos <85) {jalur balik. Warna (255 - WheelPos * 3, 0, WheelPos * 3); } jika (WheelPos <170) {WheelPos - = 85; jalur balik. Warna (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; jalur balik. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

kekosongan Beralih () {

strip.show (); bacaSampel (); }

Sebelum saya disembelih dalam komen (ingatlah kebijakan Be Nice !!) Saya menyedari setelah saya memuat naik ini betapa cerobohnya beberapa kod saya. Tidak perlu sentiasa menguji Pin 4 dan Pin 8 untuk HIGH. Oleh kerana suisnya adalah tiang tunggal tiang tunggal, nilai satu dapat disimpulkan dari yang lain: anda hanya perlu menguji satu. Oleh itu, anda boleh melalui dan membuang setiap rujukan untuk membaca dan menulis MusicButtonState dan hanya menjalankan keseluruhan perkara dengan lebih berkesan dengan menguji SwirlButtonState, jika anda kekurangan ingatan atau meluas dengan rutin lain. Tetapi kod di atas berfungsi.

Dan jika ada yang ingin mengubah rutin audio tersebut untuk merasakan bukan hanya tahap kebisingan tetapi juga frekuensi, dan tuliskan beberapa kod halus untuk meluncur ke atas dan ke bawah spektrum cahaya sebagai tindak balas kepada pergerakan sepanjang spektrum audio, jatuhkan pautan dalam komen ke bagaimana anda melakukannya.

Selamat mencuba!

Disyorkan: