Cuprins:

Arduino și Neopixel Coke Bottle Rainbow Party Light: 7 pași (cu imagini)
Arduino și Neopixel Coke Bottle Rainbow Party Light: 7 pași (cu imagini)

Video: Arduino și Neopixel Coke Bottle Rainbow Party Light: 7 pași (cu imagini)

Video: Arduino și Neopixel Coke Bottle Rainbow Party Light: 7 pași (cu imagini)
Video: 3D Printed Pin Support Challenge 😱 2024, Iulie
Anonim
Image
Image

Așadar, fiul meu Doon observă o lumină de petrecere foarte tare, făcută din sticle vechi de cocs și adâncurile gooey ale Glow Sticks și mă întreabă dacă putem face una pentru viitoarele sale examene școlare sunt terminate. Zic sigur, dar nu ai prefera să ai câteva dintre acele inele neofixice Adafruit despre care am citit … El îmi aruncă o privire goală. De fapt, el nu știe despre ce vorbesc, dar tata a văzut ocazia să se joace cu acele inele de Neopixel despre care a citit și știm cu toții unul dintre primele 10 motive pe care tătii geek le procreau este să aibă un scuzați să vă jucați cu gadgeturi grozave pe care le spun tuturor că sunt pentru copiii lor.

Acesta este un proiect super-simplu, care arată foarte bine. Am construit-o pe a noastră din 3 sticle vechi de cocs, o placă de lemn și un suport pentru loc de joacă - lucruri care se află în subsol - combinate cu un Arduino (Leonardo în cazul nostru, dar orice placă Genuino va face!) Și trei inele Neopixel. Am comandat un inel cu 9 LED-uri, dar am ajuns cu un inel cu 12 LED-uri la același preț. Ceea ce a fost dulce, dar a însemnat o reparație pe găurile de sondă - inelele cu 12 LED-uri au o lățime de 35 mm, spre deosebire de 23 mm. De ce veți avea nevoie:

  • Placă Genuino / Arduino (Am folosit un Leonardo, dar aproape orice placă o va face)
  • 3 inele Neopixel (12 LED-uri fiecare): obțineți-le de la Adafruit și susțineți acei oameni buni
  • Condensator 1000 µf 6.3v sau mai bun
  • Rezistor de 300-500 ohmi
  • O farfurie de lemn sau un pătrat de fier vechi sau orice altceva în care puteți pune neopixeli și așezați sticlele de cocs deasupra
  • O anumită formă de montaj pentru placă - o consolă de post de joacă a funcționat excelent pentru noi
  • Negi de perete 9v
  • Gaură de 40 mm
  • Șuruburi, piulițe, șaibe, distanțieri
  • Sârmă cu miez solid
  • Un fier de lipit și lipit
  • Pană de pâine
  • O carcasă din plastic pentru Arduino. Puteți ieși și cumpărați o cutie de plastic foarte potrivită, perfectă, fabricată din petrol vechi de milioane de ani, forat din pământ într-un mediu fragil și fabricat de cealaltă parte a planetei și expediat într-un container într-un depozit de lângă dvs., cu toate orificiile decupate într-o aliniere perfectă și să fie livrate la ușa ta de către o dubiță care aruncă dioxid de carbon în atmosferă. Sau poți să faci ceea ce am făcut și să folosești o cutie veche de plastic aruncată.. în acest caz o cutie cu bandă de protecție din Madagascar, așezată în dulapul cu medicamente … și găuri câteva găuri în ea. Aici se încheie prelegerea. Să facem…

Pasul 1: Faceți baza

Faceți baza
Faceți baza
Faceți baza
Faceți baza

Puteți să vă improvizați baza din orice gunoi pe care îl aveți în subsol sau chiar să folosiți doar o cutie de lemn sau orice altceva care vă va ascunde electronica.

Mai întâi am forat trei găuri, distanțate uniform pe placa de lemn, suficient de mari pentru ca inelele Neopixel să poată sta. În imagine, găurile sunt puțuri găurite cu un burghiu cu pică. În cele din urmă, din cauza dimensiunii mai mari a inelelor cu 12 LED-uri, a trebuit să forăm găuri cu un burghiu. Aceasta însemna să parcurg tot drumul prin farfurie și, în loc să strâng inelele frumos în puțurile lor mici, adânci de 2 mm, cu o gaură centrală pentru o sârmă îngrijită, am ajuns să fixez inelele cu … ahem … Bandă adezivă pe partea inferioară a farfuriei. Nu judeca. Oricum nu puteți vedea fundul plăcii în designul meu. Și este întuneric când este aprins. Și în plus - ce este în neregulă cu banda adezivă?

Aveam nevoie de spațiu liber între placă și consolă pentru o placă de prindere pe partea inferioară a plăcii și o componentă - condensatorul și pentru cablurile care ar trebui să meargă de la placă de prindere la Arduino, pe care intenționam să le pun în interiorul suportului. Așa că am pus un set de distanțieri improvizate pe arborii șuruburilor pentru a da suficient spațiu - aproximativ 3cm, înălțimea plăcii și puțin pentru a nu zdrobi cablajul. Am folosit două șuruburi de ancorare din lemn pentru fiecare colț, deoarece acestea erau la înălțimea potrivită și se întindeau în sertarul pentru bărbați … acea cutie de șuruburi libere, șuruburi, cuie, lanțuri ruginite, cuplaje pentru furtun, monede vechi, obiecte ascuțite neașteptat și tot felul de biți și boburi care vă pot salva în mod magic o excursie la magazinul de hardware oferind, dacă nu chiar lucrul exact de care aveți nevoie, ceva care va merge bine.

Accident fericit despre postul de joacă pe care l-am găsit în subsol a fost că avea deja găuri care treceau prin farfurie. Nu este nevoie să găuriți fierul! Baza avea patru găuri de șuruburi și am forat patru găuri contra-scufundate în placa de lemn pentru a se potrivi.

Apoi am vopsit spray-ul întreg Gothic Black.

Pasul 2: Pregătirea inelelor Neopixel

Pregătirea inelelor Neopixel
Pregătirea inelelor Neopixel

Va trebui să lipiți firele pe inelele de neopixeli: un fir de intrare de date pentru toate, un fir de ieșire de date pentru două dintre ele și alimentare și împământare pentru fiecare. Indiferent de lungimea pe care crezi că ai nevoie, adaugă-o. Puteți oricând să tăiați excesul de sârmă, nu puteți întinde unul prea scurt. Și fiți conștienți de avertismentul Adafruit:

Când lipiți firele la aceste inele, trebuie să fiți extrem de vigilenți cu privire la bloburile de lipit și la scurtcircuite. Distanța dintre componente este foarte strânsă! Este adesea cel mai ușor să introduceți firul din față și să lipiți în spate.

Mi-aș dori să citesc asta înainte să mă lipesc în față. Am reușit să nu-mi ard niciunul dintre LED-urile, dar am ars marginea unuia într-un mod care mă făcea să transpire până când l-am aprins. De asemenea, dacă aș fi citit manualul fin, aș fi citit și avertismentul de a nu pune un clip de aligator pe LED. Lăsați ca naufragiile mele aproape să fie farul vostru.

Neopixel sună lanț de margaretă, ceea ce înseamnă că puteți controla toate LED-urile lor simultan de la un Arduino conectând un fir de la OUT-ul unui inel la IN-ul altuia. Fiecare inel are nevoie și de fire de alimentare și de împământare.

Pasul 3: Cablarea

Cablarea
Cablarea

Conectați-l ca în Fritzing de mai sus - pinul 6 al Arduino duce datele la primul inel, Data-out din acel inel merge la Data-in a următorului, Data-out al aceluia merge la Data-in a ultimului inel. Nu aveți nevoie de firul de ieșire a datelor din inelul final.

Capacitatea de 1000 µf merge între șinele pozitive și negative ale panoului de control. Acest capac protejează inelele de vârfurile de putere și este recomandat de secțiunea de bune practici Adafruit NeoPixel Uberguide. Rezistorul de pe datele din primul neopixel este, de asemenea, recomandat de Adafruit - este 1K în Fritzing, dar rezistența recomandată este de 300-500 ohmi.

În construcția mea, am rulat firele de la Neopixeli pe partea din spate a plăcii până la o panou fixat în centru. În acest fel, trebuie să rulați doar trei fire lungi în unitatea de bază: alimentare, masă și date. Am făcut aceste fire foarte lungi - există o mulțime de spațiu de stocare în bază și este convenabil să puteți scoate placa pentru reprogramare.

Pasul 4: Codul

„loading =„ leneș”a menționat că fiul meu a dorit o versiune muzical-reactivă a acestuia. A durat până la împlinirea a 18 ani pentru a ajunge la asta, dar iată-l!

Echipamente suplimentare:

1 comutator monopolar, dublu aruncare 1 microfon automat de control al câștigului (am folosit MAX9184 AdaFruit) 1 condensator 1uF-100uF (orice valoare)

Microfonul trebuie să aibă un control automat al câștigului pentru ca acest lucru să funcționeze corect. AGC va testa în mod constant zgomotul ambiental și va ridica și reduce pragul pe care îl consideră fundal, astfel încât lumina dvs. va răspunde la vârfuri pe acel fundal. Microfonul AdaFruit este strălucitor: puteți trece dintr-o cameră silențioasă în care sunetul unei singure voci îl va declanșa în modul de petrecere completă, cu o cameră plină de adolescenți și muzică puternică și va prelua ritmul muzicii doar amenda. Alternativa, un microfon cu câștig reglabil, are un mic potențiometru pe placă, care este imposibil de delicat și complicat. Nu este nevoie de prea multe schimbări în sunetul ambiental pentru a face unitatea inutilă: luminile aprinse constant sau întunecate în mod constant. AGC funcționează ca magia.

Am vrut opțiunea de a folosi modelul de testare a turbulenței sau muzica, așa că am conectat cablul central al unui comutator la VIN și unul la pinul 4 celălalt la pinul 8 al Leonardo. Testând acei pini pentru HIGH sau LOW putem ști în ce stare se află comutatorul și codul de ramură în consecință.

Pasul 7: Cablarea microfonului

Cablarea microfonului
Cablarea microfonului

Introduceți intrarea microfonului, prin intermediul acelui condensator 1-100µF, în pinul analogic 0. Dacă condensatorul dvs. este polarizat, pinul de ieșire se îndreaptă spre partea pozitivă (fir verde).

Mulțumim CodeGirlJP pentru rutina Trinket-Color-by-Sound, pe care am adaptat-o mai jos:

// LED-uri activate de sunet cu Arduino și NeoPixels

#include

#define MIC_PIN A0 // Microfonul este atașat la pinul a0 de pe Leonardo

#define LED_PIN 6 // Șuvița LED NeoPixel atașată pinului 6 de pe Leonardo #define N_PIXELS 36 // numărul de pixeli în șuvița LED !!!!!! Ajustați-l la numărul de pixeli din configurare. Acest lucru este corect pentru 3 inele Neopixel !!!!!! #define N 100 // Numărul de eșantioane de preluat de fiecare dată citit Eșantioanele se numesc #define fadeDelay 5 // timp de întârziere pentru fiecare cantitate de decolorare #define noiseLevel 30 // panta nivelului mediu de zgomot mic fără sunet

// Inițializați banda NeoPixel cu valorile definite mai sus:

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

probe int [N]; // stocare pentru un set de colectare a probelor

int periodFactor = 0; // țineți evidența numărului de ms pentru calculul perioadei int t1 = -1; // ori de pantă> 100 detectate. int T; // perioadă între timp scalat la milisecunde panta int; // panta a două date colectate eșantion puncte octet perioadă Modificat = 0; const int SwitchPinMusic = 4; // Pin pentru poziția comutatorului muzică-sensibilitate const int SwitchPinSwirl = 8; // Pin pentru poziția comutatorului Test Pattern (swirl) int MusicbuttonState = 0; // Variabilă logică oprită pentru sensibilitatea muzicii

// Metoda de configurare Arduino

configurare nulă () {

strip.begin ();

ledsOff (); întârziere (500); displayColor (Roată (100)); strip.show (); întârziere (500); oddWheel (Roată (100)); strip.show (); întârziere (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Metoda buclei Arduino

bucla void () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH dacă comutatorul este setat la Music sensitive MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH dacă comutatorul este setat la Test pattern în timp ce (SwirlbuttonState == LOW) {readSamples (); // Rulați rutina de eșantionare a muzicii SwirlbuttonState = digitalRead (SwitchPinSwirl); // Verificați dacă comutatorul a fost schimbat} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Rulați rutina de testare swirly SwirlbuttonState = digitalRead (SwitchPinSwirl); // Verificați dacă comutatorul a fost schimbat

}

}

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 alb // Trimite o urmărire a pixelilor de teatru în … 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); curcubeu (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); RainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); theaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Citiți și prelucrați eșantionul de date de la Mic void readSamples () {for (int i = 0; i0) {pantă = samples - samples [i-1]; } else {pantă = mostre - mostre [N-1]; } // Verificați dacă Panta mai mare decât noiseLevel - sunet care nu este detectat la nivelul de zgomot if (abs (panta)> noiseLevel) {if (panta <0) {calculatePeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // theaterChaseRainbow (50); } periodFactor + = 1; întârziere (1); }}

void calculatePeriod (int i)

{if (t1 == -1) {// t1 nu a fost setat t1 = i; } else {// t1 a fost setat astfel încât calc perioadă int period = periodFactor * (i - t1); periodChanged = T == perioada? 0: 1; T = punct; //Serial.println(T); // resetați t1 la noua valoare i t1 = i; periodFactor = 0; }}

uint32_t getColor (perioada int)

{if (period == -1) roată return (0); altfel dacă (perioada> 400) roata de întoarcere (5); else return Wheel (hartă (-1 * perioadă, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i * 20); strip.show (); // Actualizați întârzierea benzii (fadeDelay); periodFactor + = fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Actualizați banda // fade color in for (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Actualizați întârzierea benzii (fadeDelay); periodFactor + = fadeDelay; }}

void ledsOff ()

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

display nul Culoare (uint32_t color)

{pentru (int i = 0; i

void oddWheel (uint32_t color)

{pentru (int j = 0; j <256; j ++) {// ciclați toate cele 256 de culori din roată pentru (int q = 0; q <3; q ++) {pentru (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // porniți fiecare al treilea pixel pe} strip.show ();

întârziere (1);

pentru (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, 0); // opriți fiecare al treilea pixel}}} fadeIn (); }

// Umpleți punctele unul după altul cu o culoare

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

gol curcubeu (uint8_t așteptați) {

uint16_t i, j;

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

// Ușor diferit, acest lucru face ca curcubeul să fie distribuit în mod egal peste tot

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

for (j = 0; j <256 * 5; j ++) {// 5 cicluri de toate culorile pe roată pentru (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); întârziere (așteptați); }}

// Lumini târâtoare în stil teatru.

void theatreChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// faceți 10 cicluri de urmărire pentru (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, c); // porniți fiecare al treilea pixel pe} strip.show ();

întârziere (așteptați);

pentru (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // opriți fiecare al treilea pixel}}}}

// Lumini târâtoare în stil teatru cu efect curcubeu

void theatreChaseRainbow (uint8_t așteptați) {for (int j = 0; j <256; j ++) {// ciclați toate cele 256 de culori din roată pentru (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)); // porniți fiecare al treilea pixel pe} strip.show ();

întârziere (așteptați);

pentru (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, 0); // opriți fiecare al treilea pixel}}}}

// Introduceți o valoare de la 0 la 255 pentru a obține o valoare a culorii.

// Culorile sunt o tranziție r - g - b - înapoi la 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; bandă de întoarcere. Culoare (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; bandă de întoarcere. Culoare (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Comutat () {

strip.show (); readSamples (); }

Înainte de a fi ucis în comentarii (amintiți-vă de politica Be Nice !!) mi-am dat seama după ce am încărcat acest lucru cât de neglijent este un cod al meu. Nu este nevoie să testați constant atât pinul 4, cât și pinul 8 pentru HIGH. Deoarece comutatorul este cu un singur aruncare dublu, valoarea unuia poate fi dedusă din cealaltă: trebuie doar să testați una. Așadar, puteți parcurge și elimina fiecare referință la citirea și scrierea MusicButtonState și pur și simplu să rulați totul mai eficient testând SwirlButtonState, dacă aveți slabă memorie sau extindeți cu alte rutine. Dar codul de mai sus funcționează.

Și dacă cineva dorește să ajusteze acele rutine audio pentru a simți nu doar nivelurile de zgomot, ci și frecvența și să scrie un cod neted pentru a aluneca în sus și în jos spectrul luminii ca răspuns la mișcările de-a lungul spectrului audio, introduceți un link în comentarii la cum ai făcut-o.

Bucurați-vă!

Recomandat: