Taula de continguts:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 passos (amb imatges)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 passos (amb imatges)

Vídeo: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 passos (amb imatges)

Vídeo: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 passos (amb imatges)
Vídeo: Arduino & Neopixel Coke Bottle Party Light 2024, Desembre
Anonim
Image
Image

Així, doncs, el meu fill Doon observa una llum de festa molt divertida feta de velles ampolles de coca-cola i les entranyes de Glow Sticks, i em pregunta si podem fer-ne una per als seus propers exàmens escolars que acaben de ser partits! Ho dic segur, però no preferiríeu tenir alguns d'aquests anells de Neopixel Adafruit que hem estat llegint? … Em fa una mirada en blanc. Perquè el fet és que no sap de què parlo, però el pare ha vist l'oportunitat de jugar amb els anells de Neopixel sobre els quals ha estat llegint, i tots sabem que un dels deu motius principals que procreuen els pares frikis és tenir excusa per jugar amb aparells divertits que diuen que tots són per als seus fills.

Es tracta d’un projecte súper senzill que té un aspecte fantàstic. Vam construir la nostra de 3 ampolles de coc antigues, una placa de fusta i un suport per a llocs de jocs (coses que es troben al soterrani) combinades amb un Arduino (Leonardo en el nostre cas, però qualsevol tauler Genuino farà) i tres anells Neopixel. Vaig demanar un anell de 9 LED, però vaig acabar amb un anell de 12 LED pel mateix preu. La qual cosa va ser dolça, però va significar una remodelació als forats del pou: els anells de 12 LED tenen una amplada de 35 mm, enfront dels 23 mm. Què necessiteu:

  • Tauler Genuino / Arduino (Hem utilitzat un Leonardo, però gairebé qualsevol tauler ho farà)
  • 3 anells de Neopixel (12 LED cadascun): obtingueu-los a Adafruit i doneu suport a aquestes bones persones
  • Condensador de 1000 µf 6.3v o superior
  • Resistència de 300-500 ohm
  • Un plat de fusta, o un quadrat de fusta, o qualsevol cosa en què pugueu col·locar els neopíxels i asseure-hi les ampolles de coc
  • Alguna forma de muntatge per a la placa: un suport per a llocs de jocs ens va funcionar molt bé
  • Berruga de paret de 9v
  • Forat de 40 mm
  • Perns, femelles, volanderes, separadors
  • Filferro de nucli sòlid
  • Un soldador i soldador
  • Taula de pa
  • Una funda de plàstic per a l'Arduino. Podeu sortir a comprar una funda de plàstic realment maca i perfecta, fabricada amb petroli de milions d’anys foradat del terra en un entorn fràgil i fabricat a l’altra banda del planeta i enviat en un contenidor a un magatzem proper amb els ports es tallen en perfecta alineació i el porten a la porta mitjançant una furgoneta que llança diòxid de carboni a l'atmosfera. O podeu fer el que vaig fer i fer servir una antiga caixa de plàstic rebutjada … en aquest cas, una caixa d’ajuda de banda de Madagascar estesa al gabinet de medicaments … i practicar-hi uns forats. Aquí acaba la conferència. Fem-ho…

Pas 1: feu la base

Feu la base
Feu la base
Feu la base
Feu la base

Podeu improvisar la vostra base a partir de les escombraries que tingueu al soterrani, o fins i tot utilitzar una caixa de fusta o qualsevol cosa que amagui la vostra electrònica.

Primer hem foradat tres forats, uniformement espaiats a la placa de fusta, prou grans perquè els anells de Neopixel s'hi asseguin. A la imatge, els forats són pous perforats amb un trepant de pala. Al final, a causa de la mida més gran dels anells de 12 LED, vam haver de foradar amb una broca. Això volia dir recórrer tota la placa i, en lloc d’acoblar els anells als petits pous de 2 mm de profunditat amb un forat central per fer un bon filferro, vaig acabar assegurant els anells amb … ehm … Cinta adhesiva per la part inferior del plat. No jutgeu. De totes maneres, no es pot veure la part inferior de la placa. I és fosc quan està encès. I, a més, què passa amb la cinta adhesiva?

Necessitava una separació entre la placa i el suport per a una placa de suport a la part inferior de la placa i un component, el condensador, i per als cables que haurien d’anar des de la placa de pa a Arduino, que tenia previst posar dins del suport. Per tant, he posat un conjunt d’espaciadors improvisats als eixos dels cargols per donar prou espai: uns 3 cm, l’alçada de la placa i una mica perquè no aixafeu el cablejat. Vaig utilitzar dos parabolts d’ancoratge de fusta per cantonada perquè tenien l’alçada adequada i estaven al calaix de l’home … aquella caixa de cargols solts, parabolts, claus, cadenes rovellades, acoblaments de mànega, monedes velles, objectes inesperadament esmolats i tota mena de trossos que us poden estalviar màgicament un viatge a la ferreteria oferint, si no el que necessiteu, una cosa que us anirà bé.

Feliç accident pel lloc del pati que vaig trobar al soterrani, ja que tenia forats que travessaven la placa. No cal foradar planxa! La base tenia quatre forats de cargol i vam foradar quatre forats contrafonsats a la placa de fusta perquè coincidissin.

A continuació, vam pintar amb esprai tot el tema Gothic Black.

Pas 2: Preparació dels anells de Neopixel

Preparació dels anells de Neopixel
Preparació dels anells de Neopixel

Haureu de soldar cables als vostres anells de neopíxels: un cable d’entrada de dades per a tots ells, un cable de sortida de dades per a dos d’ells i alimentació i connexió a terra per a cadascun. Afegiu-ne la mida que cregueu que necessiteu. Sempre es pot tallar l'excés de fil, no es pot estirar un que sigui massa curt. I tingueu en compte l’advertència d’Adafruit:

Quan soldeu cables a aquests anells, heu d’estar molt atents a les pantalles de soldadura i als curtcircuits. L'espai entre components és molt reduït. Sovint és més fàcil inserir el cable per davant i soldar per la part posterior.

M’agradaria llegir-ho abans de soldar al davant. Vaig aconseguir no cremar cap dels meus LEDs, però vaig escaldar-ne la vora de manera que em feia suar fins que el vaig encendre. A més, si hagués llegit el bon manual, també hauria llegit l'advertència de no posar cap clip de cocodril al LED. Deixeu que els meus gairebé naufragis siguin el vostre far.

Neopixel sona en cadena de margarides, cosa que significa que podeu controlar tots els LEDs simultàniament des d’un Arduino connectant un cable des de la sortida d’un anell a l’entrada d’un altre. Cada anell també necessita cables d’alimentació i de terra.

Pas 3: el cablejat

El cablejat
El cablejat

Connecteu-lo com a Fritzing anterior: el pin 6 de l'Arduino porta les dades al primer timbre, la sortida de dades d'aquest anell va a la data-in del següent, la data-out d'aquest va al Entrada de dades de l’últim timbre. No necessiteu el cable de sortida de dades de l'anell final.

La capacitat de 1000 µf va entre els rails positius i negatius de la placa. Aquesta tapa protegeix els anells contra pics de potència i és recomanada per la secció de bones pràctiques de Adafruit NeoPixel Uberguide. Adafruit també recomana la resistència de les dades del primer neopíxel: és de 1 K a Fritzing, però la resistència recomanada és de 300 a 500 ohms.

A la meva construcció, vaig passar els cables des dels Neopixels per la part posterior de la placa fins a una placa fixada al centre. D’aquesta manera només haureu d’executar tres cables llargs cap a la unitat base: alimentació, terra i dades. He fet que aquests cables siguin molt llargs: hi ha molt espai d'emmagatzematge a la base i fa que sigui convenient treure la placa per reprogramar-la.

Pas 4: el codi

"loading =" mandrós "va esmentar que el meu fill en volia una versió reactiva per a la música. Vaig trigar el seu 18è aniversari a conèixer-la, però aquí està!

Equips addicionals:

1 commutador monopolar de doble tir 1 micròfon de control de guany automàtic (he utilitzat el MAX9184 d’AdaFruit) 1 condensador 1uF-100uF (qualsevol valor)

El micròfon ha de tenir un control de guany automàtic perquè funcioni correctament. AGC mostra constantment el soroll ambiental i augmenta i baixa el llindar que considera de fons, de manera que la llum respondrà a les pujades d’aquest fons. El micròfon d’AdaFruit és brillant: es pot passar d’una habitació silenciosa en què el so d’una sola veu l’activarà al mode de festa complet, amb una sala plena d’adolescents i amb música sonora, i agafarà el ritme de la música bé. L’alternativa, un micròfon de guany ajustable, té un petit potenciòmetre a la placa que és increïblement delicat i complicat. No cal un gran canvi en el so ambiental per fer inútil la unitat: les llums s’encenen constantment o es fan fosques constantment. AGC funciona com a màgia.

Volia l'opció d'utilitzar el patró de prova de remolí o música, així que vaig connectar el cable central d'un commutador a VIN i un cable al pin 4 i l'altre al pin 8 del Leonardo. En provar aquests pins per ALT o BAIX, podem saber en quin estat es troba el commutador i el codi de sucursal en conseqüència.

Pas 7: Connexió del micròfon

Connexió del micròfon
Connexió del micròfon

Introduïu l'entrada de micròfon, mitjançant aquest condensador de 1-100µF, al pin analògic 0. Si el condensador està polaritzat, el pin de sortida passa al costat positiu (fil verd).

Gràcies a CodeGirlJP per la seva rutina Trinket-Color-by-Sound, que vaig adaptar a continuació:

// LEDs activats per so amb Arduino i NeoPixels

#incloure

#define MIC_PIN A0 // El micròfon està connectat al pin a0 del Leonardo

#define LED_PIN 6 // Cadena LED NeoPixel connectada al pin 6 del Leonardo #define N_PIXELS 36 // nombre de píxels a la cadena LED !!!!!! Ajusteu-lo al nombre de píxels de la configuració. Això és correcte per a 3 anells de Neopixel !!!!!! #define N 100 // Nombre de mostres que es prenen cada vegada que es llegeixen Les mostres s’anomenen #define fadeDelay 5 // temps de demora per a cada quantitat de fade #define noiseLevel 30 // nivell de pendent del soroll mitjà del micròfon sense so

// Inicialitzeu la tira NeoPixel amb els valors definits anteriorment:

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

mostres int [N]; // emmagatzematge per a un conjunt de col·leccions de mostres

int periodFactor = 0; // fer un seguiment del nombre de ms per al càlcul del període int t1 = -1; // temps de pendent> 100 detectats. int T; // període entre temps reduïts a mil·lisegons de pendent int; // el pendent de dues dades recollides mostren punts de byte període Canviat = 0; const int SwitchPinMusic = 4; // Pin per a la posició del commutador música-sensibilitat const int SwitchPinSwirl = 8; // Pin per a la posició del commutador Patró de prova (remolí) int MusicbuttonState = 0; // Variable lògica activada per a la sensibilitat de la música

// Mètode de configuració d'Arduino

configuració nul·la () {

strip.begin ();

ledsOff (); retard (500); displayColor (Roda (100)); strip.show (); retard (500); oddWheel (Wheel (100)); strip.show (); retard (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, commutat, CAU);

}

// Mètode de bucle Arduino

bucle buit () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH si el commutador està configurat a Music sensitive MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH si el commutador es defineix com a patró de prova mentre (SwirlbuttonState == LOW) {readSamples (); // Executeu la rutina de mostreig de música SwirlbuttonState = digitalRead (SwitchPinSwirl); // Comproveu si s'ha canviat l'interruptor} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Executeu la rutina de patrons de prova swirbuttonState = digitalRead (SwitchPinSwirl); // Comproveu si s'ha canviat l'interruptor

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {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); // RGBW blanc // Envieu una persecució de píxels de teatre a … SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (strip. Color (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (strip. Color (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); theatreChase (strip. Color (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); arc de Sant Martí (20); SwirlbuttonState = DigitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = DigitalRead (SwitchPinSwirl); theatreChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Llegir i processar dades de mostra de Mic void readSamples () {for (int i = 0; i0) {pendent = samples - samples [i-1]; } else {pendent = mostres - mostres [N-1]; } // Comproveu si Pendent superior a noiseLevel: so que no està al nivell de soroll detectat if (abs (pendent)> noiseLevel) {if (pendent <0) {calculatePeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theaterChaseRainbow (50); } factorFactor + = 1; retard (1); }}

void calculatePeriod (int i)

{if (t1 == -1) {// t1 no s'ha definit t1 = i; } else {// t1 es va establir de manera que calc period int period = periodFactor * (i - t1); periodChanged = T == punt? 0: 1; T = punt; //Serial.println(T); // restableix t1 al valor i nou t1 = i; periodFactor = 0; }}

uint32_t getColor (període int)

{if (període == -1) roda de retorn (0); en cas contrari, si (punt> 400) torna la roda (5); else return Wheel (mapa (-1 * període, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i * 20); strip.show (); // Actualització del retard de la tira (fadeDelay); periodFactor + = fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Actualitza la tira // esvaeix el color per a (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Actualització del retard de la tira (fadeDelay); periodFactor + = fadeDelay; }}

void ledsOff ()

{ desaparèixer(); per a (int i = 0; i

void displayColor (color uint32_t)

{for (int i = 0; i

void oddWheel (color uint32_t)

{for (int j = 0; j <256; j ++) {// cicle els 256 colors de la roda per a (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // activeu cada tercer píxel a} strip.show ();

retard (1);

per a (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, 0); // apagueu cada tercer píxel}}} fadeIn (); }

// Ompliu els punts un darrere l’altre d’un color

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

arc de Sant Martí buit (uint8_t espera) {

uint16_t i, j;

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

// Lleugerament diferent, això fa que l’arc de Sant Martí estigui distribuït per igual

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

for (j = 0; j <256 * 5; j ++) {// 5 cicles de tots els colors de la roda per a (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); retard (esperar); }}

// Llums de rastreig estil teatral.

void theatreChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// fer 10 cicles de persecució per (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, c); // activa cada tercer píxel a} strip.show ();

retard (esperar);

per a (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // apagueu cada tercer píxel}}}}

// Llums de rastreig estil teatral amb efecte arc de Sant Martí

void theatreChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// cicle tots els 256 colors de la roda 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)); // activa cada tercer píxel a} strip.show ();

retard (esperar);

per a (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // apagueu cada tercer píxel}}}}

// Introduïu un valor de 0 a 255 per obtenir un valor de color.

// Els colors són una transició 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 (WheelPos <170) {WheelPos - = 85; tira de retorn. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; tira de retorn. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Abans de ser destruït pels comentaris (recordeu la política de Be Nice !!), després de penjar això, em vaig adonar de com de descuidat és el meu codi. No cal provar constantment el pin 4 i el pin 8 de HIGH. Com que l’interruptor és de doble tir monopolar, el valor d’un es pot inferir de l’altre: només cal provar-ne un. Per tant, podeu revisar i eliminar totes les referències a la lectura i escriptura de MusicButtonState i simplement executar-ho tot de manera més eficaç provant SwirlButtonState, si teniu poca memòria o amplieu amb altres rutines. Però el codi anterior funciona.

I si algú vol modificar aquestes rutines d’àudio per percebre no només els nivells de soroll sinó també la freqüència, i escriure algun codi suau per lliscar cap amunt i cap avall de l’espectre de llum en resposta als moviments al llarg de l’espectre d’àudio, deixeu anar un enllaç als comentaris a com ho vas fer.

Gaudeix-ne!

Recomanat: