Innholdsfortegnelse:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trinn (med bilder)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trinn (med bilder)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trinn (med bilder)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 trinn (med bilder)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, November
Anonim
Image
Image

Så sønnen min Doon oppdager et veldig kult festlys laget av gamle koksflasker og de seige innsidene i Glow Sticks, og spør om vi kan lage en til hans kommende skoleeksamen er over utblåsning DELAYYY !!! Jeg sier det sikkert, men vil du ikke heller ha noen av de sprudlende Adafruit Neopixel -ringene vi har lest om … Han ser meg tom. Fordi han ikke vet hva jeg snakker om, men pappa har sett en mulighet til å leke med de Neopixel -ringene han har lest om, og vi vet alle at en av de 10 viktigste grunnene til at geek -pappaer formerer seg er å ha en unnskyldning for å leke med kule gadgets de forteller at alle er for barna sine.

Dette er et superenkelt prosjekt som ser veldig bra ut. Vi bygde vår av 3 gamle koksflasker, en tallerken og en lekeplassbrakett - ting som ligger i kjelleren - kombinert med en Arduino (Leonardo i vårt tilfelle, men et hvilket som helst Genuino -bord vil gjøre!) Og tre Neopixel -ringer. Jeg bestilte en 9-LED-ring, men endte opp med en 12-LED-ring til samme pris. Som var søtt, men betydde en overgang på brønnhullene-12-LED-ringene er 35 mm brede, i motsetning til 23 mm. Dette trenger du:

  • Genuino/Arduino bord (Vi brukte et Leonardo, men nesten alle brett vil gjøre)
  • 3 Neopixel -ringer (12 lysdioder hver): få dem fra Adafruit, og støtt de fine menneskene
  • 1000 µf 6.3v eller bedre kondensator
  • 300-500 ohm motstand
  • En treplate, eller en firkant med skrapved, eller noe du kan sette neopikslene i og sette koksflaskene på toppen
  • En eller annen form for montering for tallerkenen - en lekeplassbrakett fungerte bra for oss
  • 9v veggvorter
  • 40 mm hullborer
  • Bolter, muttere, skiver, avstandsstykker
  • Solid kjernetråd
  • Et loddejern og loddetinn
  • Brødbrett
  • Et plasthus til Arduino. Du kan gå ut og kjøpe virkelig fin, perfekt tilpasset plastkasse laget av millioner år gammel petroleum boret ut av bakken i et skjørt miljø og produsert på den andre siden av planeten og sendt i en beholder til et lager i nærheten av deg med alt porter kuttet ut i perfekt justering og få det levert på døren av en varebil som spytter karbondioksid ut i atmosfæren. Eller du kan gjøre det jeg gjorde og bruke en gammel kassert plastboks.. i dette tilfellet en Madagaskar bandasjeboks liggende i medisinskapet … og bore noen hull i den. Her avslutter foredraget. La oss lage…

Trinn 1: Lag basen

Lag basen
Lag basen
Lag basen
Lag basen

Du kan improvisere basen din fra det søppelet du har i din egen kjeller, eller bare bruke en trekasse eller noe som vil skjule elektronikken din.

Først boret vi tre hull, jevnt fordelt på treplaten, store nok til at Neopixel -ringene kunne sitte i. På bildet er hullene boret med en spadebor. Til slutt, på grunn av den større størrelsen på 12-LED-ringene, måtte vi bore hull med en borekrone. Dette betydde å gå helt gjennom tallerkenen, og i stedet for å stramme ringene pent inn i de fint utformede små 2 mm dype brønnene med et senterhull for et pent trådløp, endte jeg med å sikre ringene med … ahem … Duct tape over bunnen av tallerkenen. Ikke døm. Du kan uansett ikke se bunnen av tallerkenen i designet mitt. Og det er mørkt når det er på. Og dessuten - hva er galt med gaffatape?

Jeg trengte klaring mellom platen og braketten for et brødbrett på bunnen av tallerkenen og en komponent - kondensatoren, og for trådløpene som måtte gå fra brødbrettet til Arduino, som jeg planla å sette inne i braketten. Så jeg la et sett med provisoriske avstandsstykker på boltakslene for å gi nok klaring - ca 3 cm, høyden på brødbrettet og litt, slik at du ikke knuser ledningene. Jeg brukte to ankerbolter av tre per hjørne fordi de var i riktig høyde og lå i manneskuffen … den esken med løse skruer, bolter, spiker, rustne kjettinglenker, slangekoblinger, gamle mynter, uventet skarpe gjenstander og all slags av biter og bobs som på magisk vis kan spare deg for en tur til jernvarehandelen ved å tilby, om ikke akkurat det du trenger, noe som vil gjøre det helt fint.

Glad ulykke om lekeplassposten jeg fant i kjelleren var at den allerede hadde hull som gikk gjennom tallerkenen. Du trenger ikke å bore jern! Basen hadde fire bolthull, og vi boret fire motsenkede hull i treplaten for å matche.

Vi sprayet deretter det hele Gothic Black.

Trinn 2: Klargjøring av Neopixel -ringene

Forbereder Neopixel -ringene
Forbereder Neopixel -ringene

Du må lodde ledninger på neopikselringene dine: en Data-In-ledning for dem alle, en Data-Out-ledning for to av dem og strøm og jord for hver. Uansett lengde du tror du trenger, legg til litt. Du kan alltid kutte av overflødig ledning, du kan ikke strekke en for kort. Og vær oppmerksom på advarselen fra Adafruit:

Når du lodder ledninger til disse ringene, må du være ekstra årvåken om loddeskiver og kortslutninger. Avstanden mellom komponentene er veldig stram! Det er ofte lettest å sette inn ledningen foran og loddetinn på baksiden.

Jeg skulle ønske jeg leste det før jeg loddet på forsiden. Jeg klarte ikke å brenne ut noen av lysdiodene mine, men jeg svidd kanten av en på en måte som fikk meg til å svette til jeg slo den på. Hadde jeg også lest den fine manualen, hadde jeg også lest advarselen om ikke å sette et krokodilleklipp på LED -en. La mine nesten-skipsvrak være fyret ditt.

Neopixel ringer daisy-chain, noe som betyr at du kan kontrollere alle lysdiodene deres samtidig fra en Arduino ved å koble en ledning fra UT på en ring til IN på en annen. Hver ring trenger strøm og jordledninger også.

Trinn 3: Kabling

Kabling
Kabling

Koble det til som i Fritzing ovenfor-pin 6 i Arduino tar dataene til den første ringen, Data-out fra den ringen går til Data-in av den neste, Data-out av den ene går til Data-in for den siste ringen. Du trenger ikke data-out-ledningen til den siste ringen.

Kapasiteten på 1000 µf går mellom de positive og negative skinnene på brødbrettet. Denne hetten beskytter ringene mot kraftpinner og anbefales av Adafruit NeoPixel Uberguides seksjon for beste praksis. Motstanden på dataene i den første neopiksen anbefales også av Adafruit-den er 1K i Fritzing, men anbefalt motstand er 300-500 ohm.

I min konstruksjon kjørte jeg ledningene fra Neopixels over baksiden av tallerkenen til et brødbrett festet i midten. På den måten trenger du bare å kjøre tre lange ledninger ned i baseenheten: strøm, bakke og data. Jeg gjorde disse ledningene superlange-det er rikelig med lagringsplass i basen, og det gjør det praktisk å kunne trekke brettet ut for omprogrammering.

Trinn 4: Koden

"loading =" lat "nevnte at sønnen min ønsket en musikkreaktiv versjon av dette. Tok til 18-årsdagen for å få det til, men her er det!

Ekstra utstyr:

1 Enpolet, dobbel kastbryter 1 Automatisk forsterkningskontrollmikrofon (jeg brukte AdaFruit's MAX9184) 1 1uF-100uF kondensator (hvilken som helst verdi)

Mikrofonen må virkelig ha automatisk forsterkningskontroll for at dette skal fungere skikkelig. AGC vil konstant prøve omgivelsesstøyen og øke og senke terskelen som den anser som bakgrunn, slik at lyset ditt vil reagere på pigger mot den bakgrunnen. AdaFruit's mikrofon er strålende: du kan gå fra et stille rom der lyden av en enkelt stemme vil utløse den til full festmodus med et rom fullt av tenåringer og musikk som bråker, og det vil ta opp musikken fint. Alternativet, en justerbar forsterkningsmikrofon, har et lite potensiometer på brettet som er umulig delikat og vanskelig. Det krever ikke mye endring i omgivelseslyden for å gjøre enheten ubrukelig: lyser konstant eller mørkt hele tiden. AGC fungerer som magi.

Jeg ville ha muligheten til å bruke virveltestmønsteret eller musikken, så jeg koblet midtledningen til en bryter til VIN og den ene ledningen til pinne 4 den andre til pinne 8 på Leonardo. Ved å teste disse pinnene for HIGH eller LOW kan vi vite hvilken tilstand bryteren er i, og grenkode deretter.

Trinn 7: Koble til mikrofonen

Kabling av mikrofonen
Kabling av mikrofonen

Før mikrofoninngangen via den 1-100µF kondensatoren til den analoge pinnen 0. Hvis kondensatoren er polarisert, går utpinnen til den positive siden (grønn ledning).

Takk til CodeGirlJP for hennes Trinket-Color-by-Sound-rutine, som jeg tilpasset nedenfor:

// Lydaktiverte lysdioder med Arduino og NeoPixels

#inkludere

#define MIC_PIN A0 // Mikrofon er festet til pin a0 på Leonardo

#define LED_PIN 6 // NeoPixel LED -streng festet til pin 6 på Leonardo #define N_PIXELS 36 // antall piksler i LED -streng !!!!!! Juster til antall piksler i oppsettet. Dette er riktig for 3 Neopixel -ringer !!!!!! #define N 100 // Antall prøver som skal tas hver gang du leser Prøver kalles #define fadeDelay 5 // forsinkelsestid for hver fade mengde #definer støy Nivå 30 // skråningsnivå for gjennomsnittlig mikrofonstøy uten lyd

// Initialiser NeoPixel -stripen med de definerte verdiene ovenfor:

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

int prøver [N]; // lagring for et prøvesamlingssett

int periodFactor = 0; // holde oversikt over antall ms for periodeberegning int t1 = -1; // skråningstider> 100 oppdaget. int T; // periode mellom tider skalert til millisekunder int skråning; // skråningen av to innsamlede dataprøvepunkter byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin for bryterposisjon musikkfølsomhet const int SwitchPinSwirl = 8; // Pin for bryterposisjon Testmønster (virvel) int MusicbuttonState = 0; // På av logikkvariabel for musikkfølsomhet

// Arduino -oppsettsmetode

ugyldig oppsett () {

strip.begin ();

ledsOff (); forsinkelse (500); displayColor (hjul (100)); strip.show (); forsinkelse (500); oddWheel (hjul (100)); strip.show (); forsinkelse (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Arduino loop -metode

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HØY hvis bryteren er satt til Musikkfølsomhet MusicbuttonState = digitalRead (SwitchPinMusic); // HØY hvis bryteren er satt til Testmønster mens (SwirlbuttonState == LOW) {readSamples (); // Kjør musikken sampling rutine SwirlbuttonState = digitalRead (SwitchPinSwirl); // Sjekk om bryteren ble endret} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); mens (SwirlbuttonState == HIGH) {Dance (); // Kjør rutinemessig swirlbuttonState = digitalRead (SwitchPinSwirl); // Sjekk om bryteren ble endret

}

}

void Dance () {

mens (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); // Hvit RGBW // Send en teaterpikseljakt i … 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); regnbue (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }}} // Les og behandle prøvedata fra Mic void readSamples () {for (int i = 0; i0) {slope = samples - samples [i -1]; } annet {skråning = prøver - prøver [N -1]; } // Sjekk om Slope større enn noiseLevel - lyd som ikke er på støynivå oppdaget hvis (abs (helling)> noiseLevel) {if (helling <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} annet {ledsOff (); // theaterChaseRainbow (50); } periodFactor += 1; forsinkelse (1); }}

ugyldig beregningsperiode (int i)

{hvis (t1 == -1) {// t1 ikke er angitt t1 = i; } annet {// t1 ble angitt, så kalkulasjonsperiode int periode = periodeFaktor*(i - t1); periodChanged = T == periode? 0: 1; T = periode; //Serial.println(T); // tilbakestill t1 til ny i -verdi t1 = i; periodFactor = 0; }}

uint32_t getColor (int periode)

{if (periode == -1) returhjul (0); ellers hvis (periode> 400) returhjul (5); ellers returhjul (kart (-1*periode, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Oppdater stripeforsinkelse (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Oppdater stripe // fade farge inn for (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Oppdater stripeforsinkelse (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

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

void displayColor (uint32_t farge)

{for (int i = 0; i

void oddWheel (uint32_t farge)

{for (int j = 0; j <256; j ++) {// syklus alle 256 farger i hjulet 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)); // slå på hver tredje piksel} strip.show ();

forsinkelse (1);

for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // slå av hver tredje piksel}}} fadeIn (); }

// Fyll prikkene etter hverandre med en farge

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

ugyldig regnbue (uint8_t vent) {

uint16_t i, j;

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

// Litt annerledes, dette gjør regnbuen jevnt fordelt overalt

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

for (j = 0; j <256*5; j ++) {// 5 sykluser med alle farger på hjulet for (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); forsinkelse (vent); }}

// Krypelys i teaterstil.

void theaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// gjør 10 sykluser med jakt etter (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // slå på hver tredje piksel} strip.show ();

forsinkelse (vent);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // slå av hver tredje piksel}}}}

// Krypelys i teaterstil med regnbueeffekt

void theaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// syklus alle 256 farger i hjulet 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)); // slå på hver tredje piksel} strip.show ();

forsinkelse (vent);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // slå av hver tredje piksel}}}}

// Skriv inn en verdi 0 til 255 for å få en fargeverdi.

// Fargene er en overgang r - g - b - tilbake til r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; hvis (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } hvis (WheelPos <170) {WheelPos -= 85; returlist. Farge (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; returlist. Farge (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Før jeg blir slaktet i kommentarene (husk retningslinjene for Vær hyggelig !!) innså jeg etter at jeg hadde lastet opp dette hvor slurvete noen av kodene mine er. Det er ikke nødvendig å konstant teste både Pin 4 og Pin 8 for HIGH. Siden bryteren er enkeltpolet dobbeltkast, kan verdien av den ene utledes av den andre: du trenger bare å teste en. Så du kan gå gjennom og fjerne hver referanse til å lese og skrive MusicButtonState og ganske enkelt kjøre hele saken mer effektivt ved å teste SwirlButtonState, hvis du har lite minne eller utvider med andre rutiner. Men koden ovenfor fungerer.

Og hvis noen ønsker å finjustere disse lydrutinene for ikke bare å kjenne på støynivå, men også frekvens, og skrive litt glatt kode for å skyve opp og ned i lysspekteret som svar på bevegelser langs lydspekteret, må du slippe en lenke i kommentarene til hvordan du gjorde det.

Nyt!

Anbefalt: