Kazalo:

Arduino in Neopixel steklenica koksa iz steklenice Rainbow Party Light: 7 korakov (s slikami)
Arduino in Neopixel steklenica koksa iz steklenice Rainbow Party Light: 7 korakov (s slikami)

Video: Arduino in Neopixel steklenica koksa iz steklenice Rainbow Party Light: 7 korakov (s slikami)

Video: Arduino in Neopixel steklenica koksa iz steklenice Rainbow Party Light: 7 korakov (s slikami)
Video: Теперь печатаю на 3д принтере круглосуточно с бесплатным пластиком из бутылок! #shorts 2024, November
Anonim
Image
Image

Tako moj sin Doon opazi zelo kul luč za zabave iz starih steklenic koksa in umazanih drobov svetlečih palic ter vpraša, ali ga lahko naredimo za njegove prihajajoče šolske izpite. Rečem zagotovo, toda ne bi raje imeli nekaj tistih bleščečih prstanov iz adafruta, neopiksel, o katerih smo brali … On me ne pogleda. Ker dejstvo je, da ne ve, o čem govorim, toda oče je opazil priložnost, da se poigra s tistimi prstani Neopixel, o katerih je bral, in vsi poznamo enega izmed desetih najboljših razlogov, zakaj se geek očeti razmnožujejo, da imajo izgovor za igranje s kul pripomočki, za katere pravijo, da so vsi za svoje otroke.

To je zelo preprost projekt, ki izgleda res super. Zgradili smo svoje 3 stare steklenice koksa, leseno ploščo in nosilec za igrišče - stvari, ki ležijo v kleti - v kombinaciji z Arduinom (v našem primeru Leonardo, vendar bo ustrezala vsaka plošča Genuino!) In tremi obročki Neopixel. Naročil sem 9-LED obroč, a na koncu z 12-LED obročem za isto ceno. Kar je bilo sladko, vendar je pomenilo preoblikovanje lukenj-12-LED obroči so široki 35 mm, v nasprotju s 23 mm. Kaj potrebujete:

  • Genuino/Arduino plošča (uporabili smo Leonardo, vendar bo skoraj vsaka plošča primerna)
  • 3 obročki Neopixel (po 12 LED): kupite jih pri Adafruit in podprite tiste dobre ljudi
  • 1000 µf 6,3 V ali boljši kondenzator
  • Upor 300-500 ohmov
  • Lesena plošča ali kvadrat odpadnega lesa ali karkoli, v kar lahko postavite neopiksele in nanje položite steklenice koksa
  • Neka oblika pritrditve za ploščo - nosilec za otroško igrišče nam je odlično uspel
  • 9v stenska bradavica
  • 40 mm luknjač
  • Vijaki, matice, podložke, distančniki
  • Žica s trdnim jedrom
  • Spajkalnik in spajkalnik
  • Ogledna plošča
  • Plastično ohišje za Arduino. Lahko greš ven in kupiš res lepo, popolnoma prilegajočo se plastično ohišje iz milijon let starega nafte, ki je bilo izvrtano iz zemlje v nekem krhkem okolju in izdelano na drugi strani planeta ter poslano v zabojniku v skladišče blizu tebe z vsemi vrata izrežite v popolni poravnavi in jih dostavite do vaših vrat s kombijem, ki izpušča ogljikov dioksid v ozračje. Ali pa naredite tako, kot sem jaz, in uporabite staro zavrženo plastično škatlo.. v tem primeru škatlo z madagaskarskim trakom, ki leži okrog v omari z zdravili … in vanjo izvrtajte nekaj lukenj. Tu se predavanje konča. Naredimo…

1. korak: naredite podlago

Naredite si bazo
Naredite si bazo
Naredite si bazo
Naredite si bazo

Svojo bazo lahko improvizirate iz kakršnega koli smeti, ki jo imate v svoji kleti, ali celo uporabite leseno škatlo ali karkoli, kar bo prikrilo vašo elektroniko.

Najprej smo izvrtali tri luknje, enakomerno razporejene na leseni plošči, ki so dovolj velike, da se lahko namestijo obroči Neopixel. Na sliki so luknje izvrtane z lopato. Na koncu smo morali zaradi večje velikosti 12-LED obročev izvrtati luknje s svedrom. To je pomenilo, da sem šel skozi celotno ploščo in namesto, da bi prstane lepo vtaknil v njihove fino izdelane majhne 2 mm globoke vdolbinice s sredinsko luknjo za čeden vod, sem na koncu pritrdil obroče z… hm… lepilnim trakom po dnu plošče. Ne sodite. V mojem dizajnu tako ali tako ne vidite dna plošče. In ko je vklopljeno, je temno. In poleg tega - kaj je narobe z lepilnim trakom?

Potreboval sem razmik med ploščo in nosilcem za ploščo na dnu plošče in eno komponento - kondenzator ter za žice, ki bi morale iti od plošče do Arduina, ki sem ga nameraval postaviti v nosilec. Zato sem na gredi vijakov postavil komplet improviziranih distančnikov, da bi zagotovili dovolj prostora - približno 3 cm, višino plošče in malo, da ne zlomite ožičenja. Uporabil sem dva lesena sidrna vijaka na vogalu, ker sta imela pravo višino in sta ležala v moškem predalu … tista škatla z razrahljanimi vijaki, vijaki, žeblji, zarjavelimi verigami, spojkami za cevi, starimi kovanci, nepričakovano ostrimi predmeti in vse bitov in bobov, ki vam lahko čarobno prihranijo pot v trgovino s strojno opremo, tako da ponudite, če ne ravno tisto, kar potrebujete, nekaj, kar bo odlično.

Vesela nesreča pri igrišču za igrišče, ki sem ga našel v kleti, je bilo, da so skozi ploščo že tekle luknje. Ni potrebno vrtati železa! Podstavek je imel štiri luknje za vijake, v leseni plošči pa smo izvrtali štiri luknje.

Nato smo celotno stvar poškropili z gotsko črno.

2. korak: Priprava obročev Neopixel

Priprava prstanov Neopixel
Priprava prstanov Neopixel

Na neopixel obroče boste morali spajkati žice: žica za vnos podatkov za vse, žica za izhod podatkov za dva od njih ter napajanje in ozemljitev za vsakega. Ne glede na dolžino, ki jo potrebujete, jo dodajte. Odvečno žico lahko vedno odrežete, niti prekratke ne morete raztegniti. Zavedajte se opozorila Adafruit:

Pri spajkanju žic na te obroče morate biti še posebej pozorni na spajkanje in kratke stike. Razmik med komponentami je zelo majhen! Pogosto je najlažje vstaviti žico s sprednje strani in spajkati na zadnji strani.

Želim si, da bi to prebral, preden sem spajkal spredaj. Uspelo mi je, da nobena LED dioda ni pregorela, vendar sem rob ene opekel tako, da sem se potil, dokler je nisem prižgal. Če bi prebral natančen priročnik, bi prebral tudi opozorilo, naj na LED ne prilegam zaponke iz aligatorja. Naj bodo moje skoraj ladijske razbitine vaš svetilnik.

Neopixel obroči marjetico, kar pomeni, da lahko hkrati upravljate vse njihove LED diode iz Arduina tako, da priključite žico iz izhoda enega obroča v vhod drugega. Vsak obroč potrebuje tudi napajanje in ozemljitvene žice.

3. korak: Ožičenje

Ožičenje
Ožičenje

Priključite ga tako, kot je opisano zgoraj v Fritzingu-pin 6 Arduina odpelje podatke v prvi obroč, podatki iz tega obroča gredo v vnos podatkov naslednjega, izhod podatkov iz tega pa v Podatki o zadnjem zvonjenju. Ne potrebujete podatkovne žice zadnjega obroča.

Zmogljivost 1000 µf je med pozitivnimi in negativnimi tirnicami plošče. Ta pokrovček ščiti obroče pred napetostmi in ga priporoča oddelek za najboljšo prakso Adafruit NeoPixel Uberguide. Upor na podatkih v prvem neopikselu priporoča tudi Adafruit-v Fritzingu je 1K, vendar je priporočeni upor 300-500 ohmov.

Pri izdelavi sem žice napeljal od neopikslov preko zadnje strani plošče do plošče, pritrjene na sredini. Na ta način morate v osnovno enoto speljati samo tri dolge žice: napajanje, ozemljitev in prenos podatkov. Te žice sem naredil zelo dolge-v podstavku je veliko prostora za shranjevanje, zato je priročno, da lahko ploščo izvlečete za ponovno programiranje.

4. korak: Koda

"loading =" lazy "je omenil, da je moj sin želel glasbeno odzivno različico tega. Do svojega 18. rojstnega dne je potreboval, da bi se temu izognil, a tukaj je!

Dodatna oprema:

1 enopolno, stikalo z dvojnim metom 1 mikrofon za samodejni nadzor ojačanja (uporabil sem AdaFruit-ov MAX9184) 1 1uF-100uF kondenzator (poljubna vrednost)

Mikrofon mora imeti za pravilno delovanje samodejni nadzor ojačanja. AGC bo nenehno vzorčil hrup iz okolice in dvignil in znižal prag, za katerega meni, da je ozadje, zato se bo vaša svetloba odzvala na konice v tem ozadju. Mikrofon AdaFruit je sijajen: lahko greste iz tihe sobe, v kateri ga bo zvok enega samega glasu sprožil, v način polne zabave, v katerem je soba polna najstnikov in glasna glasba, ki bo pravkar ujel utrip glasbe V redu. Alternativa, nastavljiv ojačevalni mikrofon, ima na plošči majhen potenciometer, ki je neverjetno občutljiv in neprijeten. Ne potrebuje veliko sprememb v zvoku okolice, da bi bila enota neuporabna: luči stalno prižgane ali nenehno temne. AGC deluje kot čarovnija.

Želel sem možnost uporabe vrtinčnega preskusnega vzorca ali glasbe, zato sem osrednji kabel stikala povezal na VIN in en vod na pin 4, drugi na pin 8 Leonarda. S preizkušanjem teh zatičev za VEČJO ali NIZKO lahko ugotovimo, v katerem stanju je stikalo, in ustrezno kodo podružnice.

7. korak: Priključite mikrofon

Ožičenje mikrofona
Ožičenje mikrofona

Vhod mikrofona preko tega kondenzatorja 1-100 µF vstavite v analogni pin 0. Če je vaš kondenzator polariziran, gre izhod na pozitivno stran (zelena žica).

Hvala CodeGirlJP za njeno rutino Trinket-Color-by-Sound, ki sem jo prilagodila spodaj:

// Zvočno aktivirane LED z Arduino in NeoPixels

#vključi

#define MIC_PIN A0 // Mikrofon je priključen na pin a0 na Leonardu

#define LED_PIN 6 // NeoPixel LED pramen pritrjen na pin 6 na Leonardu #define N_PIXELS 36 // število slikovnih pik v LED nizu !!!!!! Prilagodite se na število slikovnih pik v nastavitvah. To drži za 3 obroče Neopixel !!!!!! #define N 100 // Število vzorcev, ki jih je treba vzeti ob vsakem branjuVzorci se imenujejo #define fadeDelay 5 // čas zakasnitve za vsako količino bledenja #define noiseLevel 30 // raven naklona povprečnega hrupa mikrofona brez zvoka

// Inicializirajte trak NeoPixel z zgoraj definiranimi vrednostmi:

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

int vzorci [N]; // shramba za zbirko vzorcev

int periodFactor = 0; // spremljamo število ms pri izračunu obdobja int t1 = -1; // zaznani časi nagiba> 100. int T; // obdobje med časi, merjeno na milisekunde int strmina; // naklon dveh zbranih podatkovnih točk vzorčne točke periodChanged = 0; const int SwitchPinMusic = 4; // Pin za stikalo za glasbo občutljivost const int SwitchPinSwirl = 8; // Pin za položaj stikala Test Pattern (swirl) int MusicbuttonState = 0; // Vklopljeno izklopljeno logično spremenljivko za občutljivost glasbe

// Način nastavitve Arduino

void setup () {

strip.begin ();

ledsOff (); zamuda (500); displayColor (kolo (100)); strip.show (); zamuda (500); oddWheel (kolo (100)); strip.show (); zamuda (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, preklopljeno, FALLING);

}

// Metoda zanke Arduino

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // VISOKO, če je stikalo nastavljeno na občutljivost za glasbo MusicbuttonState = digitalRead (SwitchPinMusic); // VISOKO, če je stikalo nastavljeno na Testni vzorec while (SwirlbuttonState == LOW) {readSamples (); // Zaženite rutino vzorčenja glasbe SwirlbuttonState = digitalRead (SwitchPinSwirl); // Preverite, ali je bilo stikalo spremenjeno} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalno branje (SwitchPinMusic); medtem ko (SwirlbuttonState == HIGH) {Dance (); // Zaženite rutino preskusnega vzorca SwirlbuttonState = digitalRead (SwitchPinSwirl); // Preverite, ali je stikalo zamenjano

}

}

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); // Bela RGBW // Pošiljanje lova na slikovne pike v gledališču… 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); mavrica (20); SwirlbuttonState = digitalno branje (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalno branje (SwitchPinSwirl); gledališčeChaseRainbow (50); SwirlbuttonState = digitalno branje (SwitchPinSwirl); }} // Branje in obdelava vzorčnih podatkov iz Mic void readSamples () {for (int i = 0; i0) {slope = vzorci - vzorci [i -1]; } else {strmina = vzorci - vzorci [N -1]; } // Preveri, če je Slope večji od noiseLevel - zvok, ki ni na ravni hrupa, če (abs (nagib)> noiseLevel) {if (naklon <0) {CalculiPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // gledališčeChaseRainbow (50); } periodFactor += 1; zamuda (1); }}

void IzračunPeriod (int i)

{if (t1 == -1) {// t1 ni nastavljeno t1 = i; } else {// t1 je bilo nastavljeno tako calc period int period = periodFactor*(i - t1); periodChanged = T == period? 0: 1; T = obdobje; //Serial.println(T); // ponastavimo t1 na novo vrednost i t = i; periodFactor = 0; }}

uint32_t getColor (int obdobje)

{if (period == -1) return Wheel (0); sicer, če (obdobje> 400) vrne kolo (5); else return Wheel (zemljevid (-1*pika, -400, -1, 50, 255)); }

void fadeOut ()

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

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Posodobi trak // zbledi barva za (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Posodobitev zakasnitve traku (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{ zbledeti(); za (int i = 0; i

void displayColor (barva uint32_t)

{for (int i = 0; i

void oddWheel (barva uint32_t)

{for (int j = 0; j <256; j ++) {// cikel vseh 256 barv v kolesu za (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, kolo ((i+j) % 255)); // vklopi vsak tretji pik} strip.show ();

zamuda (1);

za (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // izklopi vsak tretji slikovni pik}}} fadeIn (); }

// Pike napolnimo eno za drugo z barvo

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

void rainbow (uint8_t wait) {

uint16_t i, j;

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

// Nekoliko drugače, zaradi česar je mavrica enakomerno razporejena po vsem

void rainbowCycle (uint8_t čakanje) {uint16_t i, j;

za (j = 0; j <256*5; j ++) {// 5 ciklov vseh barv na kolesu za (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); zamuda (čakanje); }}

// Plazeče luči v gledališkem stilu.

void theatreChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// naredi 10 ciklov lova za (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // vklopi vsak tretji pik} strip.show ();

zamuda (čakanje);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // izklopi vsak tretji slikovni pik}}}}

// Plazeče luči v gledališkem stilu z mavričnim učinkom

void theatreChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// cikel vseh 256 barv v kolesu za (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, kolo ((i+j) % 255)); // vklopi vsak tretji pik} strip.show ();

zamuda (čakanje);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // izklopi vsak tretji slikovni pik}}}}

// Vnesite vrednost od 0 do 255, da dobite barvno vrednost.

// Barve so prehod r - g - b - nazaj v r. uint32_t kolo (bajt WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {povratni trak. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos -= 85; povratni trak. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; povratni trak. Barva (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Preklopljeno () {

strip.show (); readSamples (); }

Preden sem bil zaklan v komentarjih (ne pozabite na politiko Be Nice !!) sem po tem, ko sem naložil to, spoznal, kako je nekaj moje kode neumno. Pin 4 in 8 ni treba stalno testirati na HIGH. Ker je stikalo enopolni dvojni met, lahko vrednost enega sklepamo iz drugega: preizkusiti morate samo enega. Tako bi lahko šli skozi in odstranili vsako sklicevanje na branje in pisanje MusicButtonState ter preprosto vse učinkoviteje zagnali s preizkušanjem SwirlButtonState, če vam primanjkuje pomnilnika ali razširjate z drugimi rutinami. Toda zgornja koda deluje.

In če želi kdo prilagoditi te zvočne rutine, da zazna ne le raven hrupa, ampak tudi frekvenco, in napiše neko gladko kodo, da se kot premik po zvočnem spektru pomakne navzgor in navzdol po svetlobnem spektru, naj v komentarjih spusti povezavo kako ti je uspelo.

Uživajte!

Priporočena: