Sommario:

Arduino & Neopixel Bottiglia di Coca Cola Rainbow Party Light: 7 passaggi (con immagini)
Arduino & Neopixel Bottiglia di Coca Cola Rainbow Party Light: 7 passaggi (con immagini)

Video: Arduino & Neopixel Bottiglia di Coca Cola Rainbow Party Light: 7 passaggi (con immagini)

Video: Arduino & Neopixel Bottiglia di Coca Cola Rainbow Party Light: 7 passaggi (con immagini)
Video: Ucraino continua a divertirsi in spiaggia nonostante le bombe russe a Berdyansk 2024, Novembre
Anonim
Image
Image

Quindi mio figlio Doon vede una luce da festa molto bella fatta di vecchie bottiglie di coca cola e le viscere appiccicose di Glow Sticks, e chiede se possiamo farne una per il suo imminente School Exams Are Over Blowout PartAYYY!!! Dico certo, ma non preferiresti avere alcuni di quegli eleganti anelli Adafruit Neopixel di cui abbiamo letto… Mi lancia uno sguardo vuoto. Perché il fatto è che non sa di cosa sto parlando, ma papà ha individuato un'opportunità per giocare con quegli anelli Neopixel di cui ha letto, e sappiamo tutti che uno dei 10 principali motivi per cui i papà geek procreano è avere un scusa per giocare con fantastici gadget che dicono che tutti sono per i loro figli.

Questo è un progetto semplicissimo che sembra davvero fantastico. Abbiamo costruito il nostro con 3 vecchie bottiglie di coca cola, un piatto di legno e una staffa per il palo del parco giochi - roba che giace nel seminterrato - combinata con un Arduino (Leonardo nel nostro caso, ma qualsiasi scheda Genuino andrà bene!) e tre anelli Neopixel. Ho ordinato un anello a 9 LED, ma ho finito con un anello a 12 LED allo stesso prezzo. Il che era dolce, ma significava un rifacimento sui fori del pozzo: gli anelli a 12 LED sono larghi 35 mm, anziché 23 mm. Di cosa avrai bisogno:

  • Tavola Genuino/Arduino (abbiamo usato un Leonardo, ma va bene quasi qualsiasi tavola)
  • 3 anelli Neopixel (12 LED ciascuno): prendili da Adafruit e supporta quelle brave persone
  • Condensatore da 1000 µf 6,3 V o superiore
  • Resistenza da 300-500 ohm
  • Un piatto di legno, o un quadrato di legno di scarto, o qualsiasi cosa su cui puoi inserire i neopixel e appoggiarci sopra le bottiglie di coca cola
  • Una qualche forma di supporto per la piastra: una staffa per il palo del parco giochi ha funzionato benissimo per noi
  • Verruca da parete 9v
  • Foratrice da 40 mm
  • Bulloni, dadi, rondelle, distanziali
  • Filo a nucleo solido
  • Un saldatore e una saldatura
  • tagliere
  • Una custodia in plastica per Arduino. Puoi uscire e comprare una custodia di plastica davvero bella e perfettamente aderente realizzata con petrolio vecchio di milioni di anni estratto dal terreno in un ambiente fragile e fabbricato dall'altra parte del pianeta e spedito in un container a un magazzino vicino a te con tutti i porte ritagliate in perfetto allineamento e fartelo consegnare alla tua porta da un furgone che emette anidride carbonica nell'atmosfera. Oppure puoi fare quello che ho fatto io e usare una vecchia scatola di plastica scartata… in questo caso una scatola di cerotti del Madagascar che giace nell'armadietto dei medicinali… e praticarci dei fori. Qui finisce la lezione. Facciamo…

Passaggio 1: crea la base

Fai la base
Fai la base
Fai la base
Fai la base

Puoi improvvisare la tua base da qualsiasi spazzatura che hai nel tuo seminterrato, o anche solo usare una scatola di legno o qualsiasi cosa che nasconda i tuoi dispositivi elettronici.

Per prima cosa abbiamo praticato tre fori, equamente distanziati sulla piastra di legno, abbastanza grandi da contenere gli anelli Neopixel. Nell'immagine i fori sono pozzi praticati con un trapano a vanga. Alla fine, a causa delle dimensioni maggiori degli anelli a 12 LED, abbiamo dovuto praticare dei fori con una punta. Ciò significava passare completamente attraverso la piastra, e invece di incastrare bene gli anelli nei loro piccoli pozzetti finemente lavorati di 2 mm di profondità con un foro centrale per un passaggio del filo pulito, ho finito per fissare gli anelli con… ehm… nastro adesivo sul fondo del piatto. Non giudicare. Comunque non puoi vedere il fondo del piatto nel mio disegno. Ed è buio quando è acceso. E poi, cosa c'è di sbagliato nel nastro adesivo?

Avevo bisogno di spazio tra la piastra e la staffa per una breadboard sul fondo della piastra e un componente: il condensatore e per i percorsi dei cavi che sarebbero dovuti andare dalla breadboard ad Arduino, che avevo pianificato di inserire nella staffa. Quindi ho messo una serie di distanziali improvvisati sugli alberi dei bulloni per dare abbastanza spazio - circa 3 cm, l'altezza della breadboard e un po' in modo da non schiacciare il cablaggio. Ho usato due bulloni di ancoraggio di legno per angolo perché erano dell'altezza giusta e giacevano nel cassetto dell'uomo… quella scatola di viti allentate, bulloni, chiodi, maglie di catene arrugginite, raccordi per tubi flessibili, vecchie monete, oggetti inaspettatamente taglienti e ogni sorta di di bit e bob che possono magicamente salvarti un viaggio al negozio di ferramenta offrendo, se non la cosa esatta di cui hai bisogno, qualcosa che andrà bene.

Felice incidente sul palo del parco giochi che ho trovato nel seminterrato, aveva già dei buchi che attraversavano il piatto. Non c'è bisogno di forare il ferro! La base aveva quattro fori per bulloni e abbiamo praticato quattro fori svasati nella piastra di legno per abbinarli.

Abbiamo quindi verniciato a spruzzo l'intera cosa Gothic Black.

Passaggio 2: preparazione degli anelli Neopixel

Preparazione degli anelli Neopixel
Preparazione degli anelli Neopixel

Dovrai saldare i fili sui tuoi anelli neopixel: un filo di ingresso dati per tutti, un filo di uscita dati per due di essi e alimentazione e messa a terra per ciascuno. Qualunque sia la lunghezza di cui pensi di aver bisogno, aggiungine un po'. Puoi sempre tagliare il filo in eccesso, non puoi allungarne uno troppo corto. E tieni presente l'avvertimento di Adafruit:

Quando si saldano i fili a questi anelli, è necessario prestare particolare attenzione a macchie di saldatura e cortocircuiti. La distanza tra i componenti è molto stretta! Spesso è più semplice inserire il filo dalla parte anteriore e saldare sul retro.

Vorrei averlo letto prima di saldare la parte anteriore. Sono riuscito a non bruciare nessuno dei miei LED, ma ne ho bruciato il bordo in un modo che mi ha fatto sudare finché non l'ho acceso. Inoltre, se avessi letto il manuale, avrei letto anche l'avvertenza di non mettere una clip a coccodrillo sul LED. Lascia che i miei quasi naufragi siano il tuo faro.

Neopixel suona in daisy-chain, il che significa che puoi controllare tutti i loro LED contemporaneamente da un Arduino collegando un filo dall'OUT di un anello all'IN di un altro. Ogni anello necessita anche di cavi di alimentazione e di terra.

Passaggio 3: il cablaggio

Il cablaggio
Il cablaggio

Collegalo come nel Fritzing sopra: il pin 6 di Arduino porta i dati al primo anello, il Data-out da quell'anello va al Data-in del successivo, il Data-out di quello va al Data-in dell'ultimo squillo. Non è necessario il cavo di uscita dati dell'anello finale.

La capacità di 1000 µf va tra i binari positivi e negativi della breadboard. Questo cappuccio protegge gli anelli dai picchi di potenza ed è consigliato dalla sezione delle migliori pratiche di Adafruit NeoPixel Uberguide. Il resistore sui dati in ingresso al primo neopixel è consigliato anche da Adafruit: è 1K nel Fritzing ma la resistenza consigliata è 300-500 ohm.

Nella mia build, ho fatto passare i fili dai Neopixel sul retro della piastra a una breadboard fissata al centro. In questo modo devi solo far passare tre lunghi cavi nell'unità base: alimentazione, terra e dati. Ho realizzato questi cavi molto lunghi: c'è molto spazio di archiviazione nella base e rende comodo poter estrarre la scheda per la riprogrammazione.

Passaggio 4: il codice

"loading="lazy" ha detto che mio figlio voleva una versione reattiva alla musica. Ha impiegato fino al suo 18° compleanno per farlo, ma eccola qui!

Attrezzature aggiuntive:

1 polo singolo, interruttore a doppia corsa1 microfono per il controllo automatico del guadagno (ho usato MAX9184 di AdaFruit) 1 condensatore 1uF-100uF (qualsiasi valore)

Il microfono deve davvero avere il controllo automatico del guadagno affinché funzioni correttamente. L'AGC campiona costantemente il rumore ambientale e alza e abbassa la soglia che considera lo sfondo, in modo che la tua luce risponda ai picchi sullo sfondo. Il microfono di AdaFruit è geniale: puoi passare da una stanza silenziosa in cui il suono di una singola voce la attiverà alla modalità party completa con una stanza piena di adolescenti e musica a tutto volume, e riprenderà il ritmo della musica appena bene. L'alternativa, un microfono a guadagno regolabile, ha un minuscolo potenziometro sulla scheda che è incredibilmente delicato e poco pratico. Non ci vogliono molti cambiamenti nel suono ambientale per rendere l'unità inutilizzabile: luci costantemente accese o buio costantemente. AGC funziona come per magia.

Volevo l'opzione per utilizzare il modello di test swirl o la musica, quindi ho collegato il cavo centrale di un interruttore al VIN e un cavo al pin 4, l'altro al pin 8 del Leonardo. Testando quei pin per HIGH o LOW possiamo sapere in quale stato si trova l'interruttore e il codice del ramo di conseguenza.

Passaggio 7: cablaggio del microfono

Cablaggio del microfono
Cablaggio del microfono

Alimenta l'ingresso Mic, tramite quel condensatore 1-100µF, nel pin analogico 0. Se il tuo condensatore è polarizzato, il pin out va sul lato positivo (filo verde).

Grazie a CodeGirlJP per la sua routine Trinket-Color-by-Sound, che ho adattato di seguito:

// LED ad attivazione sonora con Arduino e NeoPixel

#includere

#define MIC_PIN A0 // Il microfono è collegato al pin a0 del Leonardo

#define LED_PIN 6 // Filo LED NeoPixel attaccato al pin 6 del Leonardo #define N_PIXELS 36 // numero di pixel nel filo LED !!!!!! Regola il numero di pixel nella tua configurazione. Questo è corretto per 3 anelli Neopixel !!!!!! #define N 100 // Numero di campioni da prendere ogni volta che readSamples è chiamato #define fadeDelay 5 // tempo di ritardo per ogni quantità di dissolvenza #define noiseLevel 30 // livello di pendenza del rumore medio del microfono senza suono

//Inizializza la striscia NeoPixel con i valori definiti sopra:

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

int campioni[N]; // archiviazione per un set di raccolta di campioni

int fattoreperiodo = 0; // tiene traccia del numero di ms per il calcolo del periodo int t1 = -1; // tempi di pendenza > 100 rilevati. int T; // periodo tra i tempi scalati in millisecondi int slope; // la pendenza di due punti campione di dati raccolti byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin per la posizione dell'interruttore sensibilità alla musica const int SwitchPinSwirl = 8; // Pin per la posizione dell'interruttore Test Pattern (swirl) int MusicbuttonState = 0; // Variabile logica on off per sensibilità musicale

// Metodo di configurazione di Arduino

void setup() {

strip.begin();

ledSpento(); ritardo (500); displayColor(Ruota(100)); strip.show(); ritardo (500); oddWheel(Wheel(100)); strip.show(); ritardo (500); pinMode(SwitchPinMusic, INPUT); pinMode(SwitchPinSwirl, INPUT); //attachInterrupt(4, Switched, FALLING);

}

// Metodo del ciclo Arduino

void loop() { SwirlbuttonState = digitalRead(SwitchPinSwirl); //HIGH se l'interruttore è impostato su Sensibilità alla musica MusicbuttonState = digitalRead(SwitchPinMusic); //HIGH se l'interruttore è impostato su Test pattern while (SwirlbuttonState == LOW) { readSamples(); //Esegui la routine di campionamento musicale SwirlbuttonState = digitalRead(SwitchPinSwirl); //Controlla se l'interruttore è stato modificato } SwirlbuttonState = digitalRead(SwitchPinSwirl); MusicbuttonState = digitalRead(SwitchPinMusic); while (SwirlbuttonState == HIGH) { Dance(); //Esegui la routine del modello di test swirly SwirlbuttonState = digitalRead(SwitchPinSwirl); //Controlla se l'interruttore è stato modificato

}

}

void Dance() {

while (SwirlbuttonState == HIGH) { colorWipe(strip. Color(255, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 255, 0), 50); // Verde SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // RGBW bianco // Invia un inseguimento di pixel cinematografici in… SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(127, 127, 127), 50); // White SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(127, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); arcobaleno(20); SwirlbuttonState = digitalRead(SwitchPinSwirl); RainbowCycle(20); SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChaseRainbow(50); SwirlbuttonState = digitalRead(SwitchPinSwirl); } } // Legge ed elabora dati campione dal microfono void readSamples() { for(int i=0; i0) { slope = sample - sample[i-1]; } else { pendenza = campioni - campioni[N-1]; } // Controlla se Slope è maggiore di noiseLevel - rilevato un suono che non è al livello di rumore if(abs(slope) > noiseLevel) { if(slope < 0) { calcolaPeriod(i); if(periodChanged == 1) { displayColor(getColor(T)); } } } else { ledsOff(); // theaterChaseRainbow(50); } fattoreperiodo += 1; ritardo(1); } }

void calcolaPeriodo(int i)

{ if(t1 == -1) { // t1 non è stato impostato t1 = i; } else { // t1 è stato impostato così calc period int period = periodFactor*(i - t1); periodoCambiato = T==periodo ? 0: 1; T = periodo; //Seriale.println(T); // resetta t1 al nuovo valore i t1 = i; fattoreperiodo = 0; } }

uint32_t getColor(int punto)

{ if(periodo == -1) return Ruota(0); else if(periodo > 400) return Wheel(5); else return Wheel(map(-1*period, -400, -1, 50, 255)); }

void fadeOut()

{ for(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); strip.show(); // Aggiorna il ritardo della striscia (fadeDelay); PeriodFactor +=fadeDelay; } }

void fadeIn()

{ strip.setBrightness(100); strip.show(); // Aggiorna la striscia // sfuma il colore in for(int i=0; i<5; i++) { //strip.setBrightness(20*i + 30); //striscia.mostra(); // Aggiorna il ritardo della striscia (fadeDelay); PeriodFactor+=fadeDelay; } }

led vuoti Off()

{ dissolvenza(); for(int i=0; i

void displayColor(uint32_t color)

{ for(int i=0; i

void oddWheel(uint32_t color)

{ for (int j=0; j < 256; j++) { // scorre tutti i 256 colori nella ruota for (int q=0; q < 3; q++) { for (uint16_t i=24; i < 36; i =i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255)); //attiva ogni terzo pixel } strip.show();

ritardo(1);

for (uint16_t i=24; i < 36; i=i+3) { strip.setPixelColor(i+q, 0); //disattiva ogni terzo pixel } } } fadeIn(); }

// Riempi i punti uno dopo l'altro con un colore

void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i

void rainbow(uint8_t aspetta) {

uint16_t io, j;

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

// Leggermente diverso, questo rende l'arcobaleno equamente distribuito ovunque

void rainbowCycle(uint8_t wait) { uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cicli di tutti i colori sulla ruota for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); ritardo (attesa); } }

//Luci striscianti in stile teatro.

void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //esegui 10 cicli di inseguimento per (int q=0; q < 3; q++) { for (uint16_t i= 0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //attiva ogni terzo pixel } strip.show();

ritardo (attesa);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //spegne ogni terzo pixel } } } }

//Luci striscianti in stile teatrale con effetto arcobaleno

void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // scorre tutti i 256 colori nella ruota for (int q=0; q < 3; q++) { for (uint16_t i=0;i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255)); //attiva ogni terzo pixel } strip.show();

ritardo (attesa);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //spegne ogni terzo pixel } } } }

// Immettere un valore da 0 a 255 per ottenere un valore di colore.

// I colori sono una transizione r - g - b - torna a r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip. Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(PosRuota < 170) { PosRuota -= 85; striscia di ritorno. Color(0, WheelPos * 3, 255 - WheelPos * 3); } PosizioneRuota -= 170; striscia di ritorno. Color(WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched(){

strip.show(); readSamples(); }

Prima di essere massacrato nei commenti (ricordate la politica di Be Nice!!) mi sono reso conto, dopo averlo caricato, di quanto sia sciatto il mio codice. Non è necessario testare costantemente sia il Pin 4 che il Pin 8 per HIGH. Essendo l'interruttore unipolare a due vie, il valore dell'uno può essere dedotto dall'altro: è sufficiente provarne uno. Quindi puoi esaminare e rimuovere ogni riferimento alla lettura e alla scrittura di MusicButtonState ed eseguire semplicemente l'intera operazione in modo più efficiente testando SwirlButtonState, se hai poca memoria o estendendo con altre routine. Ma il codice sopra funziona.

E se qualcuno vuole modificare quelle routine audio per rilevare non solo i livelli di rumore ma anche la frequenza, e scrivere un codice fluido per scorrere su e giù nello spettro della luce in risposta ai movimenti lungo lo spettro audio, lascia un collegamento nei commenti a come l'hai fatto.

Divertiti!

Consigliato: