Tartalomjegyzék:

Arduino & Neopixel kokszüveg Rainbow Party Light: 7 lépés (képekkel)
Arduino & Neopixel kokszüveg Rainbow Party Light: 7 lépés (képekkel)

Videó: Arduino & Neopixel kokszüveg Rainbow Party Light: 7 lépés (képekkel)

Videó: Arduino & Neopixel kokszüveg Rainbow Party Light: 7 lépés (képekkel)
Videó: Подключаем модули NeoPixel на базе WS2812B светодиодов к Arduino 2024, Július
Anonim
Image
Image

Doon fiam tehát egy nagyon jó partifényt lát, amely régi kokszpalackokból és a Glow Sticks gubancos belsejéből készül, és megkérdezi, hogy készíthetünk -e egyet a közelgő iskolai vizsgákra, amelyek túlfúlnak PartAYYY !!! Biztos vagyok benne, de nem szeretné, ha megkapná azokat a csípős Adafruit Neopixel gyűrűket, amelyekről már olvastunk… Ő üres tekintettel néz rám. Mert valójában nem tudja, miről beszélek, de apa látott egy lehetőséget, hogy játsszon azokkal a Neopixel -gyűrűkkel, amelyekről ő olvasott, és mindannyian tudjuk, hogy az első 10 ok, amiért a geek apák szaporodnak, kifogás, hogy olyan klassz kütyükkel játszanak, amelyekről azt mondják, hogy mindenki a gyerekeinek szól.

Ez egy szuper-egyszerű projekt, ami igazán jól néz ki. Felépítettük a miénk 3 régi kokszosüvegből, egy fából készült tányérból és egy játszótéri oszloptartóból - az alagsorban heverő cuccokból - egy Arduino -val (esetünkben Leonardo, de minden Genuino -tábla megteszi!) És három Neopixel -gyűrűvel kombinálva. Rendeltem egy 9 LED-es gyűrűt, de végül 12 LED-es gyűrűt kaptam ugyanazon az áron. Ami édes volt, de átmenetet jelentett a kútlyukakon-a 12 LED-es gyűrűk 35 mm szélesek, szemben a 23 mm-rel. Amire szüksége lesz:

  • Genuino/Arduino tábla (Leonardo -t használtunk, de szinte minden tábla megteszi)
  • 3 Neopixel gyűrű (egyenként 12 LED): szerezze be őket az Adafruitból, és támogassa azokat a finom embereket
  • 1000 µf 6.3v vagy jobb kondenzátor
  • 300-500 ohmos ellenállás
  • Egy fából készült tányér, vagy egy négyzetnyi rongyfa, vagy bármi, amibe belehelyezheti a neopixeleket, és ráhelyezheti a kokszpalackokat
  • A lemez bizonyos rögzítési formái - egy játszótéri oszlopkonzol remekül működött számunkra
  • 9v fali szemölcs
  • 40 mm-es lyukfúró
  • Csavarok, anyák, alátétek, távtartók
  • Szilárd magos huzal
  • Forrasztópáka és forrasztópáka
  • Kenyeretábla
  • Műanyag tok az Arduino számára. Kimehetsz, és vásárolhatsz egy igazán szép, tökéletesen illeszkedő műanyag tokot, amely millió éves kőolajból készült, amelyet a talajból fúrtak ki valamilyen törékeny környezetben, és amelyet a bolygó túloldalán gyártottak, és konténerben szállítottak egy közeli raktárba az összes A portok tökéletesen illeszkednek, és széndioxidot kibocsátó furgonnal szállítják az ajtóhoz. Vagy megteheti, amit én tettem, és használhat egy régi eldobott műanyag dobozt. Ebben az esetben egy madagaszkári pólyássegítő dobozt, amely a gyógyszeres szekrényben hever… és fúrjon néhány lyukat. Itt ér véget az előadás. Csináljuk…

Lépés: Készítse el az alapot

Készítse el az alapot
Készítse el az alapot
Készítse el az alapot
Készítse el az alapot

Ön improvizálhatja bázisát a szemétből, amit a saját pincéjében talál, vagy akár csak egy fadobozt vagy bármit, ami elrejti az elektronikáját.

Először három lyukat fúrtunk, egyenletesen elosztva a falemezen, elég nagyokat ahhoz, hogy a Neopixel gyűrűk beférjenek. A képen a lyukak ásófúróval fúrt kutak. Végül a 12 LED-es gyűrűk nagyobb mérete miatt furattal kellett fúrni egy furatot. Ez azt jelentette, hogy végig kell menni a lemezen, és ahelyett, hogy a gyűrűket szépen beillesztenék a finoman kidolgozott kis, 2 mm mély lyukaikba, középen lévő lyukkal a tiszta huzalmenethez, végül a gyűrűket… ahm… ragasztószalaggal rögzítettem a lemezről. Ne ítélkezz. Amúgy nem látja a lemez alját a tervezésemben. És sötét van, amikor be van kapcsolva. És emellett - mi a baj a ragasztószalaggal?

Szükségem volt a lemez és a konzol közötti távolságra a lemez alján lévő kenyérlaphoz és az egyik komponenshez - a kondenzátorhoz, valamint a huzalfutásokhoz, amelyeknek a kenyértábláról az Arduino -ra kell menniük, és amelyet a konzolba terveztem. Ezért egy sor rögtönzött távtartót tettem fel a csavar tengelyekre, hogy elegendő szabadságot biztosítsanak - kb. 3 cm, a kenyérlap magassága és egy kicsit, hogy ne törje össze a vezetékeket. Két fa horgonycsavart használtam sarkonként, mert azok megfelelő magasságban voltak, és a férfi fiókban hevertek … az a doboz laza csavarok, csavarok, szögek, rozsdás láncszemek, tömlőcsatlakozók, régi érmék, váratlanul éles tárgyak és mindenféle módon bitekből és bobokból, amelyek varázslatosan megmenthetik a hardverboltba való utazást, ha felkínálják, ha nem pontosan azt, amire szüksége van, valamit, ami remekül sikerül.

Boldog baleset volt az alagsorban talált játszótéri bejegyzés kapcsán, mert már lyukak futottak át a lemezen. Nem kell vasat fúrni! Az alap négy csavarlyukkal rendelkezett, és négy fúrólyukat fúrtunk a falemezen.

Ezután gótikus feketére festettük az egészet.

2. lépés: A neopixel gyűrűk előkészítése

A neopixel gyűrűk előkészítése
A neopixel gyűrűk előkészítése

A vezetékeket forrasztania kell a neopixelgyűrűkhöz: egy adatbeviteli vezetéket mindegyikhez, egy adatkimeneti vezetéket kettőhöz, valamint áramot és földelést mindegyikhez. Bármilyen hosszúságra gondol, szüksége van, adjon hozzá néhányat. A felesleges drótot mindig levághatja, túl rövidet nem nyújthat. És vegye figyelembe az Adafruit figyelmeztetését:

Amikor huzalokat forraszt ezekhez a gyűrűkhöz, fokozottan ügyelnie kell a forrasztási foltokra és a rövidzárlatokra. Az alkatrészek közötti távolság nagyon szűk! Gyakran a legegyszerűbb a vezetéket elölről behelyezni, a hátoldalon pedig forrasztani.

Szeretném, ha ezt elolvasnám, mielőtt a frontra forrasztottam volna. Sikerült nem égnem egyik LED -del sem, de az egyik szélét úgy perzseltem meg, hogy izzadni kezdtem, amíg be nem kapcsoltam. Továbbá, ha elolvastam volna a finom kézikönyvet, elolvastam volna a figyelmeztetést is, hogy ne tegyen alligátorcsipeszt a LED -re. Hadd legyenek hajótöréseim a világítótornyotok.

A Neopixel margaréta-láncot tartalmaz, ami azt jelenti, hogy az összes LED-jüket egyidejűleg vezérelheti egy Arduino-ból, ha egy vezetéket csatlakoztat az egyik gyűrű OUT-jából a másik IN-be. Minden gyűrűnek szüksége van táp- és földvezetékekre is.

3. lépés: A huzalozás

A vezetékek
A vezetékek

Csatlakoztassa, mint a fenti Fritzingben-az Arduino 6. csapja az adatokat az első csengetéshez viszi, a gyűrűből származó adatok a következő adatbeviteléhez, a másik adatai pedig a Az utolsó csengetés adatbevitele. Nincs szüksége az utolsó gyűrű adatkimeneti vezetékére.

Az 1000 µf kapacitás a kenyérlap pozitív és negatív sínei között mozog. Ez a sapka megvédi a gyűrűket az áramütéstől, és ezt ajánlja az Adafruit NeoPixel Uberguide legjobb gyakorlatok című része. Az első neopixel adataiban szereplő ellenállást az Adafruit is ajánlja-a Fritzingben 1K, de az ajánlott ellenállás 300-500 ohm.

Építésem során a Neopixels vezetékeit a lemez hátulján keresztül a középen rögzített kenyérsütő lapra futtattam. Így csak három hosszú vezetéket kell levezetnie az alapegységbe: tápellátás, földelés és adat. Ezeket a vezetékeket szuperhosszúvá tettem-rengeteg tárhely van az alapban, és kényelmesen ki tudja húzni a táblát az újraprogramozáshoz.

4. lépés: A kód

A "loading =" lusta "megemlítette, hogy a fiam ennek a zenére reagáló változatát akarta. A 18. születésnapjáig tartott, hogy megkerülje, de itt van!

További felszerelések:

1 egypólusú, dupla dobáskapcsoló 1 automatikus erősítésvezérlő mikrofon (az AdaFruit MAX9184-et használtam)

A mikrofonnak valóban rendelkeznie kell automatikus erősítés -szabályozással, hogy ez megfelelően működjön. Az AGC folyamatosan mintát vesz a környezeti zajoktól, és megemeli és lecsökkenti a háttérnek tekintett küszöböt, így a fény reagál a tüskékre a háttérben. Az AdaFruit mikrofonja ragyogó: egy csendes helyiségből, amelyben egyetlen hang hangja váltja ki, teljes buli módba léphet, ahol egy tinédzserekkel és zenével teli szoba van, és felveszi a zene ütemét bírság. Az alternatíva, az állítható erősítésű mikrofon egy apró potenciométert tartalmaz a táblán, amely lehetetlenül finom és izgalmas. Nem kell sok változás a környezeti hangon ahhoz, hogy használhatatlanná tegye az egységet: folyamatosan világít vagy folyamatosan sötétedik. Az AGC varázslatosan működik.

Szerettem volna az örvényvizsgálati minta vagy a zene használatának lehetőségét, ezért a kapcsoló középső vezetékét VIN -re, az egyik vezetéket a 4 -es, a másikat a Leonardo 8 -as tűjére kötöttem. Ha ezeket a csapokat HIGH vagy LOW értékre teszteli, akkor megtudhatjuk, hogy a kapcsoló melyik állapotban van, és ennek megfelelően az elágazási kódot.

7. lépés: A mikrofon bekötése

A mikrofon bekötése
A mikrofon bekötése

Vezesse a mikrofon bemenetét ezen az 1-100µF kondenzátoron keresztül a 0. analóg érintkezőbe. Ha a kondenzátor polarizált, a kimeneti csap a pozitív oldalra kerül (zöld vezeték).

Köszönöm CodeGirlJP-nek a Trinket-Color-by-Sound rutinját, amelyet az alábbiakban módosítottam:

// Hanggal aktivált LED -ek az Arduino és a NeoPixels segítségével

#befoglalni

#define MIC_PIN A0 // A mikrofon a Leonardo a0 tűjéhez van csatlakoztatva

#define LED_PIN 6 // NeoPixel LED szál a Leonardo 6. tűjéhez erősítve #define N_PIXELS 36 // a LED szálban lévő pixelek száma !!!!!! Állítsa be a beállítási képpontok számát. Ez 3 Neopixel gyűrűre igaz !!!!!! #define N 100 // Minden egyes leolvasáskor vett minták száma

// Inicializálja a NeoPixel szalagot a fenti értékekkel:

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

int minták [N]; // mintagyűjtemény -készlet tárolása

int periodFactor = 0; // nyomon követni az ms számot a periódus kiszámításához int t1 = -1; //> 100 meredekség ideje észlelve. int T; // időtartam közötti időtartam ezredmásodpercre skálázva int lejtőn; // két összegyűjtött adatminta pont meredeksége byte periodChanged = 0; const int SwitchPinMusic = 4; // Tű a kapcsolópozícióhoz zeneérzékenység const int SwitchPinSwirl = 8; // Tű a kapcsoló helyzetéhez Teszt minta (örvény) int MusicbuttonState = 0; // On off logikai változó a zene érzékenységéhez

// Arduino beállítási módszer

void setup () {

strip.begin ();

ledsOff (); késleltetés (500); displayColor (Kerék (100)); strip.show (); késleltetés (500); páratlan kerék (kerék (100)); strip.show (); késleltetés (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Arduino hurok módszer

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // HIGH, ha a kapcsoló zenei érzékenységre van állítva MusicbuttonState = digitalRead (SwitchPinMusic); // HIGH, ha a kapcsoló tesztmintára van állítva, miközben (SwirlbuttonState == LOW) {readSamples (); // Zene mintavételi rutin futtatása SwirlbuttonState = digitalRead (SwitchPinSwirl); // Ellenőrizze, hogy a kapcsoló megváltozott -e} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Futtassa a kavargó tesztminta rutinját SwirlbuttonState = digitalRead (SwitchPinSwirl); // Ellenőrizze, hogy a kapcsoló nem változott -e

}

}

void Dance () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (csík. Szín (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (csík. Szín (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Fehér RGBW // Színházi pixel üldözés küldése… SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (szalag. Szín (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (szalag. Szín (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (szalag. Szín (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); szivárvány (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); szivárványCiklus (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); színházChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Mintaadatok olvasása és feldolgozása a Mic void readSamples () {for (int i = 0; i0) {slope =minták - minták [i -1]; } else {lejtés = minták - minták [N -1]; } // Ellenőrizze, hogy a lejtés nagyobb -e a zajszintnél - a zaj szintjén nem lévő hang észlelve, ha (abs (lejtés)> noiseLevel) {if (lejtés <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // színházChaseRainbow (50); } periodFactor += 1; késleltetés (1); }}

void calcPeriod (int i)

{if (t1 == -1) {// t1 nincs beállítva t1 = i; } else {// t1 úgy lett beállítva, hogy periódus számítása int period = periodFactor*(i - t1); periodChanged = T == időszak? 0: 1; T = pont; // Sorozat.println (T); // t1 visszaállítása új i értékre t1 = i; periodFactor = 0; }}

uint32_t getColor (int periódus)

{if (időszak == -1) visszatérő kerék (0); különben ha (időszak> 400) visszatérő kerék (5); else return Wheel (térkép (-1*időszak, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Frissítési késleltetés (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Csík frissítése // szín elhalványítása a (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Frissítési késleltetés (fadeDelay); periodFactor+= fadeDelay; }}

void ledsOff ()

{ fokozatosan halkít(); mert (int i = 0; i

void displayColor (uint32_t color)

{for (int i = 0; i

void oddWheel (uint32_t szín)

{for (int j = 0; j <256; j ++) {// a kerék összes 256 színének ciklusa (int q = 0; q <3; q ++) {esetén (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Kerék ((i+j) % 255)); // minden harmadik pixel bekapcsolása} strip.show ();

késleltetés (1);

for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // minden harmadik pixel kikapcsolása}}} fadeIn (); }

// Töltse fel a pontokat egymás után egy színnel

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

void rainbow (uint8_t wait) {

uint16_t i, j;

(j = 0; j <256; j ++) {esetén (i = 0; i

// Kicsit más, ezért a szivárvány egyenletesen oszlik el az egészben

void rainbowCycle (uint8_t várjon) {uint16_t i, j;

for (j = 0; j <256*5; j ++) {// 5 ciklus minden színben a keréken (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); késleltetés (várakozás); }}

// Színházi stílusú mászó fények.

void TheaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// végezzen 10 üldözési ciklust (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // minden harmadik pixel bekapcsolása} strip.show ();

késleltetés (várakozás);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // minden harmadik képpont kikapcsolása}}}}

// Színházi stílusú kúszófények szivárványos hatással

void theatreChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// a kerék összes 256 színének ciklusa (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, Kerék ((i+j) % 255)); // minden harmadik pixel bekapcsolása} strip.show ();

késleltetés (várakozás);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // minden harmadik képpont kikapcsolása}}}}

// Adjon meg egy 0 és 255 közötti értéket, hogy színértéket kapjon.

// A színek átmenet r - g - b - vissza r. uint32_t Kerék (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos -= 85; visszatérő csík. Szín (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; visszatérő csík. Szín (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Mielőtt lemészárolnak a megjegyzésekben (ne feledje a Be Nice irányelvet !!), a feltöltés után rájöttem, hogy a kódom milyen hanyag. Nem kell folyamatosan tesztelni mind a 4 -es, mind a 8 -as tűt a MAGAS -ért. Mivel a kapcsoló egypólusú dupla dobás, az egyik értéke a másikból következtethető: csak az egyiket kell tesztelnie. Tehát átnézheti és eltávolíthatja a MusicButtonState olvasására és írására vonatkozó összes hivatkozást, és egyszerűen futtathatja az egészet hatékonyabban a SwirlButtonState tesztelésével, ha kevés a memória, vagy más rutinokkal bővíti. De a fenti kód működik.

És ha valaki szeretné módosítani ezeket az audio rutinokat, hogy ne csak a zajszintet, hanem a frekvenciát is érzékelje, és írjon valami sima kódot a fényspektrum felfelé és lefelé csúsztatására az audiospektrum mentén történő mozgások hatására, dobjon egy linket a megjegyzésekben hogy csináltad.

Élvezd!

Ajánlott: