INHOUDSOPGAWE:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 stappe (met foto's)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 stappe (met foto's)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 stappe (met foto's)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 stappe (met foto's)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Julie
Anonim
Image
Image

So sien my seun Doon 'n baie lekker partytjie -lig wat gemaak is van ou coke -bottels en die lomp binnegoed van Glow Sticks, en vra of ons een kan maak vir sy komende skooleksamens is verby! Ek sê seker, maar sou jy nie liewer 'n paar van die pittige Adafruit Neopixel -ringe wou hê waaroor ons gelees het nie … Hy kyk my leeg. Omdat hy eintlik nie weet waarvan ek praat nie, maar pa het 'n geleentheid gesien om met die Neopixel -ringe te speel waaroor hy gelees het, en ons weet almal dat een van die tien belangrikste redes waarom geekvaders voortplant, 'n verskoning om te speel met cool gadgets wat hulle vertel dat almal vir hul kinders is.

Dit is 'n super-eenvoudige projek wat regtig wonderlik lyk. Ons het ons eie 3 coke -bottels, 'n houtbord en 'n speelplek vir die speelgoed gebou - goed wat in die kelder lê - gekombineer met 'n Arduino (Leonardo in ons geval, maar enige Genuino -bord sal dit doen!) En drie Neopixel -ringe. Ek het 'n 9-LED-ring bestel, maar uiteindelik 'n 12-LED-ring vir dieselfde prys. Dit was soet, maar dit beteken 'n oorskakeling in die putgate-die 12-LED-ringe is 35 mm breed, in teenstelling met 23 mm. Wat jy nodig het:

  • Genuino/Arduino bord (ons het 'n Leonardo gebruik, maar byna enige bord sal dit doen)
  • 3 Neopixel -ringe (elk 12 LED's): kry dit by Adafruit en ondersteun die goeie mense
  • 1000 µf 6.3v of beter kapasitor
  • 300-500 ohm weerstand
  • 'N Houtbord, of 'n vierkant skroothout, of enigiets waarin u die neopixels kan sit en die coke -bottels bo -op sit
  • Een of ander vorm van 'n houer vir die bord - 'n speelhoutbeugel het uitstekend vir ons gewerk
  • 9v muur vrat
  • 40 mm gatboorder
  • Boute, moere, ringe, afstandhouers
  • Soliede kerndraad
  • 'N Soldeerbout en soldeersel
  • Broodbord
  • 'N Plastiekkas vir die Arduino. U kan uitgaan en 'n baie mooi pasgemaakte plastiekhouer koop, gemaak van 'n miljoen jaar oue petroleum wat in 'n brose omgewing uit die grond geboor is en aan die ander kant van die planeet vervaardig word en in 'n houer na 'n pakhuis naby u gestuur word. poorte word perfek in lyn gebring en by u deur afgelewer deur 'n bakkie wat koolstofdioksied in die atmosfeer spuit. Of u kan doen wat ek gedoen het en 'n ou weggooide plastiekboks gebruik.. in hierdie geval 'n Madagaskar -doos wat in die medisynekas rondlê … en 'n paar gate daarin boor. Hier eindig die lesing. Kom ons maak…

Stap 1: Maak die basis

Maak die basis
Maak die basis
Maak die basis
Maak die basis

U kan u basis improviseer uit die gemors wat u in u eie kelder het, of selfs 'n houtkas of enigiets gebruik wat u elektronika kan verberg.

Eers boor ons drie gate, eweredig op die houtplaat, groot genoeg om die Neopixel -ringe in te sit. In die prentjie word die gate met 'n graafboor geboor. As gevolg van die groter grootte van die 12-LED-ringe, moes ons uiteindelik gate met 'n boorpunt boor. Dit het beteken dat ek deur die bord moes gaan, en in plaas daarvan om die ringe mooi in hul fyn gemaakte 2 mm-diep putte te steek met 'n middelgat vir 'n netjiese draadloop, het ek die ringe verseker met … ahem … Plakband oor die onderkant van die bord. Moenie oordeel nie. U kan in elk geval nie die onderkant van die bord in my ontwerp sien nie. En dit is donker as dit aan is. En buitendien - wat is fout met kleeflint?

Ek het speling nodig tussen die bord en die bracket vir 'n broodbord aan die onderkant van die bord en 'n komponent - die kapasitor, en vir die drade wat van broodbord na Arduino moes gaan, wat ek van plan was om binne die bracket te plaas. Ek plaas dus 'n stel tydelike afstandhouers op die boutskagte om genoeg speling te gee - ongeveer 3 cm, die hoogte van die broodbord en 'n bietjie sodat u nie die bedrading verpletter nie. Ek het twee houtankerboute per hoek gebruik, want dit was op die regte hoogte en lê in die manlaai … die boks los skroewe, boute, spykers, geroeste kettings, slangkoppelinge, ou muntstukke, onverwags skerp voorwerpe en allerhande stukkies wat u op 'n wonderlike manier 'n reis na die hardewarewinkel kan bespaar deur iets, wat nie goed sal doen nie, indien nie presies wat u nodig het nie.

Gelukkige ongeluk oor die speelplek wat ek in die kelder gevind het, was dat daar al gate deur die bord geloop het. U hoef nie yster te boor nie! Die basis het vier boutgate gehad, en ons het vier gate wat in die hout gesink is, in die houtplaat geboor.

Daarna het ons die hele Gotiese swart gespuit.

Stap 2: Berei die Neopixel -ringe voor

Berei die Neopixel -ringe voor
Berei die Neopixel -ringe voor

U moet drade aan u neopixelringe soldeer: 'n Data-In-draad vir almal, 'n Data-Out-draad vir twee van hulle en krag en grond vir elkeen. Watter lengte jy ook al dink nodig, voeg 'n bietjie by. U kan altyd oortollige draad afsny; u kan nie een te kort rek nie. En let op die waarskuwing van Adafruit:

As u drade aan hierdie ringe soldeer, moet u ekstra waaksaam wees oor soldeerbolle en kortsluitings. Die afstand tussen komponente is baie streng! Dit is dikwels die maklikste om die draad van voor en soldeer aan die agterkant in te steek.

Ek wens ek het dit gelees voordat ek aan die voorkant gesoldeer het. Ek het daarin geslaag om nie een van my LED's uit te brand nie, maar ek het die rand van die een geskroei op 'n manier wat my laat sweet het totdat ek dit aangeskakel het. As ek die fyn handleiding gelees het, sou ek ook die waarskuwing gelees het om nie 'n krokodilknip op die LED te plaas nie. Laat my byna skeepswrakke u vuurtoring wees.

Neopixel lui 'n daisy-chain, wat beteken dat u al hul LED's gelyktydig vanaf 'n Arduino kan beheer deur 'n draad van die OUT van een ring na die IN van 'n ander te verbind. Elke ring benodig ook krag- en aarddrade.

Stap 3: Die bedrading

Die bedrading
Die bedrading

Verbind dit soos in die Fritzing hierbo-pen 6 van die Arduino neem die data na die eerste ring, die data-out van die ring gaan na die Data-in van die volgende, die data-out van die een gaan na die Data-in van die laaste ring. U het nie die data-out-draad van die finale ring nodig nie.

Die kapasiteit van 1000 µf loop tussen die positiewe en negatiewe rails van die broodbord. Hierdie dop beskerm die ringe teen kragpieke en word aanbeveel deur die Adafruit NeoPixel Uberguide-afdeling met die beste praktyk. Die weerstand op die data in die eerste neopixel word ook deur Adafruit aanbeveel-dit is 1K in die Fritzing, maar die aanbevole weerstand is 300-500 ohm.

In my gebou het ek die drade van die Neopixels oor die agterkant van die bord na 'n broodbord in die middel gehardloop. Op hierdie manier hoef u slegs drie lang drade in die basiseenheid in te voer: krag, grond en data. Ek het hierdie drade baie lank gemaak-daar is genoeg stoorplek in die basis, en dit is baie gerieflik om die bord uit te trek vir herprogrammering.

Stap 4: Die kode

"loading =" lui "het genoem dat my seun 'n musiekreaktiewe weergawe hiervan wou hê. Het tot op sy 18de verjaardag gevat om dit reg te kry, maar dit is hier!

Bykomende stukke toerusting:

1 enkelpaal, dubbele gooi-skakelaar1 outomatiese mikrofoon vir beheer (ek het AdaFruit se MAX9184 gebruik) 1 1uF-100uF kapasitor (enige waarde)

Die mikrofoon moet regtig outomatiese versterkingsbeheer hê om te kan funksioneer. AGC sal voortdurend die omringende geraas proe en die drempel wat hy as agtergrond beskou, verhoog en verlaag, sodat u lig reageer op spykers teen die agtergrond. Die mikrofoon van AdaFruit is briljant: jy kan uit 'n stil kamer gaan waarin die geluid van 'n enkele stem dit na 'n vol partytjie-modus laat gaan, met 'n kamer vol tieners en musiek wat blaas, en dit sal die maat van die musiek net optel fyn. Die alternatief, 'n verstelbare versterkingsmikrofoon, het 'n klein potensiometer op die bord wat onmoontlik delikaat en vaag is. Dit verg nie veel verandering in die omringende klank om die eenheid nutteloos te maak nie: ligte brand konstant of donker voortdurend. AGC werk soos towerkuns.

Ek wou die opsie hê om die werveltoetspatroon of musiek te gebruik, en ek het die middelkabel van 'n skakelaar na VIN en die een na pen 4, die ander na pen 8 van die Leonardo gekoppel. Deur die penne vir HOOG of LAAG te toets, kan ons weet in watter toestand die skakelaar is, en die kode daarvolgens vertak.

Stap 7: Bedraad die mikrofoon

Die bedrading van die mikrofoon
Die bedrading van die mikrofoon

Voer die mikrofooninvoer via die 1-100µF-kondensator in die analoog pen 0. As u kondensator gepolariseer is, gaan die uitpen na die positiewe kant (groen draad).

Dankie aan CodeGirlJP vir haar Trinket-Color-by-Sound-roetine, wat ek hieronder aangepas het:

// Klank geaktiveerde LED's met die Arduino en NeoPixels

#insluit

#define MIC_PIN A0 // Mikrofoon is vasgemaak aan pen a0 op die Leonardo

#define LED_PIN 6 // NeoPixel LED -string vasgemaak aan pen 6 op die Leonardo #define N_PIXELS 36 // aantal pixels in LED -string !!!!!! Pas aan by die aantal pixels in u opstelling. Dit is korrek vir 3 Neopixel -ringe !!!!!! #define N 100 // Aantal monsters wat elke keer geneem moet word lees Monsters word genoem #definieer fade Vertraging 5 // vertragingstyd vir elke vervaag hoeveelheid #definieer geraas Vlak 30 // hellingvlak van gemiddelde mikrofoon geraas sonder klank

// Initialiseer die NeoPixel -strook met die gedefinieerde waardes hierbo:

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

int monsters [N]; // berging vir 'n monsterversamelingstel

int periodFactor = 0; // hou die aantal ms dop vir tydsberekening int t1 = -1; // tye van helling> 100 opgespoor. int T; // tydperk tussen tye afgeskaal tot millisekondes int helling; // die helling van twee versamelde data monster punte byte periodChanged = 0; const int SwitchPinMusic = 4; // Speld vir skakelaarposisie musiekgevoeligheid const int SwitchPinSwirl = 8; // Speld vir skakelaarposisie Toetspatroon (werveling) int MusicbuttonState = 0; // Aan -af -logiese veranderlike vir musieksensitiwiteit

// Metode vir die opstel van Arduino

ongeldige opstelling () {

strip.begin ();

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

}

// Arduino -lusmetode

leemte -lus () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HOOG as die skakelaar ingestel is op Musiekgevoeligheid MusicbuttonState = digitalRead (SwitchPinMusic); // HOOG as skakelaar op toetspatroon gestel terwyl (SwirlbuttonState == LOW) {readSamples (); // Begin die musiekmonsterroetine SwirlbuttonState = digitalRead (SwitchPinSwirl); // Kyk of die skakelaar verander is} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); terwyl (SwirlbuttonState == HOOG) {Dance (); // Begin die roetine SwirlbuttonState = digitaal lees (SwitchPinSwirl); // Kyk of die skakelaar verander is

}

}

leegte dans () {

terwyl (SwirlbuttonState == HOOG) {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); // Wit RGBW // Stuur 'n teater -pixel -jaagtog 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); reënboog (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }}} // Lees en verwerk steekproefdata van Mic void readSamples () {for (int i = 0; i0) {slope = monsters - monsters [i -1]; } anders {helling = monsters - monsters [N -1]; } // Kontroleer of helling groter is as noiseLevel - klank wat nie op die geraasvlak waargeneem word nie as (abs (helling)> noiseLevel) {if (helling <0) {calcPeriod (i); as (periodChanged == 1) {displayColor (getColor (T)); }}} anders {ledsOff (); // theaterChaseRainbow (50); } periodFactor += 1; vertraging (1); }}

leegte bereken tydperk (int i)

{as (t1 == -1) {// t1 nie gestel is nie t1 = i; } anders {// t1 is gestel sodat calc period int period = periodFactor*(i - t1); periodChanged = T == periode? 0: 1; T = tydperk; //Serial.println(T); // stel t1 terug na nuwe i -waarde t1 = i; periodFactor = 0; }}

uint32_t getColor (int periode)

{as (periode == -1) retourwiel (0); anders as (periode> 400) retoerwiel (5); anders terugwiel (kaart (-1*periode, -400, -1, 50, 255)); }

leegte fadeOut ()

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

leegte vervaag In ()

{strip.setBrightness (100); strip.show (); // Werk strook op/vervaag kleur vir (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Werk strookvertraging op (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{ verdof(); vir (int i = 0; i

leeg displayColor (uint32_t kleur)

{vir (int i = 0; i

void oddWheel (uint32_t kleur)

{vir (int j = 0; j <256; j ++) {// sikluseer al 256 kleure in die wiel vir (int q = 0; q <3; q ++) {vir (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, wiel ((i+j) % 255)); // skakel elke derde pixel aan} strip.show ();

vertraging (1);

vir (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // skakel elke derde pixel af}}} fadeIn (); }

// Vul die kolletjies een na die ander met 'n kleur

void colorWipe (uint32_t c, uint8_t wag) {vir (uint16_t i = 0; i

leë reënboog (wag nie) {

uint16_t i, j;

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

// Iets anders, dit maak die reënboog eweredig versprei

leegte rainbowCycle (uint8_t wag) {uint16_t i, j;

vir (j = 0; j <256*5; j ++) {// 5 siklusse van alle kleure op wiel vir (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); vertraag (wag); }}

// Kruipligte in teaterstyl.

void theaterChase (uint32_t c, uint8_t wag) {vir (int j = 0; j <10; j ++) {// doen 10 siklusse van jaag na (int q = 0; q <3; q ++) {vir (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // skakel elke derde pixel aan} strip.show ();

vertraag (wag);

vir (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // skakel elke derde pixel uit}}}}

// Kruipligte in teaterstyl met reënboog-effek

void theaterChaseRainbow (uint8_t wag) {vir (int j = 0; j <256; j ++) {// sikluseer al 256 kleure in die wiel vir (int q = 0; q <3; q ++) {vir (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Wheel ((i+j) % 255)); // skakel elke derde pixel aan} strip.show ();

vertraag (wag);

vir (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // skakel elke derde pixel uit}}}}

// Voer 'n waarde 0 tot 255 in om 'n kleurwaarde te kry.

// Die kleure is 'n oorgang r - g - b - terug na r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } as (WheelPos <170) {WheelPos -= 85; retourstrook. Kleur (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; retourstrook. Kleur (WheelPos * 3, 255 - WheelPos * 3, 0); }

leegte Wissel () {

strip.show (); readSamples (); }

Voordat ek in die kommentaar geslag word (onthou die Be Nice -beleid !!) het ek besef nadat ek dit opgelaai het, hoe slordig sommige van my kode is. Dit is nie nodig om beide Pin 4 en Pin 8 voortdurend vir HOOG te toets nie. Aangesien die skakelaar 'n enkelpolige dubbele gooi is, kan die waarde van die een uit die ander afgelei word: u hoef slegs een te toets. U kan dus elke verwysing na die lees en skryf van die MusicButtonState verwyder en eenvoudig die hele ding doeltreffender uitvoer deur SwirlButtonState te toets, as u te min geheue het of met ander roetines werk. Maar die kode hierbo werk.

En as iemand die klankroetines wil aanpas om nie net die geraasvlakke nie, maar ook die frekwensie te sien, en 'n gladde kode wil skryf om op en af in die ligspektrum te skuif in reaksie op bewegings langs die klankspektrum, laat 'n skakel in die kommentaar hoe jy dit gedoen het.

Geniet dit!

Aanbeveel: