Obsah:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 kroků (s obrázky)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 kroků (s obrázky)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 kroků (s obrázky)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 kroků (s obrázky)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Listopad
Anonim
Image
Image

Takže můj syn Doon si všiml velmi cool párty světla vyrobeného ze starých koksových lahví a mazlavého vnitřku Glow Sticks a zeptal se, jestli bychom mohli udělat jeden pro jeho nadcházející školní zkoušky jsou u konce Blowout PartAYYY !!! Říkám jistě, ale nechtěli byste raději nějaké ty spiffy prsteny Adafruit Neopixel, o kterých jsme četli … Věnoval mi prázdný pohled. Protože faktem je, že neví, o čem mluvím, ale táta si všiml příležitosti hrát s těmi Neopixelovými prsteny, o kterých ON četl, a my všichni víme jeden z top 10 důvodů, proč geekové tátové plodí, že mají výmluva na hraní se skvělými gadgety, o kterých říkají, že jsou všichni pro své děti.

Jedná se o super jednoduchý projekt, který vypadá opravdu skvěle. Postavili jsme naše 3 staré koksové láhve, dřevěnou desku a držák na hřiště - věci ležící ve sklepě - v kombinaci s Arduinem (v našem případě Leonardo, ale jakákoli deska Genuino to zvládne!) A třemi kroužky Neopixel. Objednal jsem si 9-LED prsten, ale skončil jsem s 12-LED prstenem za stejnou cenu. Což bylo milé, ale znamenalo to překopání jamek-12-LED kroužky jsou široké 35 mm, na rozdíl od 23 mm. Co budete potřebovat:

  • Deska Genuino/Arduino (Použili jsme Leonardo, ale téměř každá deska to zvládne)
  • 3 prstence Neopixel (každý po 12 LED): získejte je od Adafruit a podpořte ty jemné lidi
  • 1000 µf 6,3 V nebo lepší kondenzátor
  • Odpor 300-500 ohmů
  • Dřevěný talíř nebo čtverec šrotu nebo cokoli, do čeho můžete vložit neopixely a posadit koksové lahve nahoře
  • Nějaká forma držáku na desku - držák na sloupek na hřiště pro nás fungoval skvěle
  • 9v stěnová bradavice
  • 40mm vrták
  • Šrouby, matice, podložky, distanční podložky
  • Drát z pevného jádra
  • Páječka a pájka
  • Prkénko
  • Plastové pouzdro pro Arduino. Můžete jít ven a koupit si opravdu pěkné, perfektně padnoucí plastové pouzdro vyrobené z milion let staré ropy vyvrtané ze země v nějakém křehkém prostředí a vyrobené na druhé straně planety a odeslané v kontejneru do skladu poblíž vás se všemi porty vyřezané v dokonalém souladu a nechat je doručit k vašim dveřím dodávkou chrlící oxid uhličitý do atmosféry. Nebo můžete udělat to, co jsem udělal já, a použít starou vyřazenou plastovou krabičku … v tomto případě madagaskarskou krabičku s pomocníkem ležící v lékárničce… a vyvrtat do ní několik děr. Zde přednáška končí. UDĚLEJME…

Krok 1: Vytvořte základnu

Vytvořte základnu
Vytvořte základnu
Vytvořte základnu
Vytvořte základnu

Můžete improvizovat svou základnu z jakéhokoli harampádí, které máte ve svém vlastním suterénu, nebo dokonce použít dřevěnou krabici nebo cokoli, co skryje vaši elektroniku.

Nejprve jsme vyvrtali tři otvory, rovnoměrně rozmístěné na dřevěné desce, dostatečně velké, aby do nich mohly zapadnout prsteny Neopixel. Na obrázku jsou otvory vrtané vrtákem s rýčem. Nakonec jsme kvůli větší velikosti 12-LED prstenců museli vyvrtat otvory vrtákem. To znamenalo projít celou deskou a místo toho, abych prsteny pěkně přitiskl do jejich jemně vytvořených malých 2 mm hlubokých jamek se středovým otvorem pro úhledný běh drátu, skončil jsem tím, že jsem zajistil prsteny… ehm… lepicí páskou přes dno talíře. Nesuď. V mém návrhu stejně nemůžete vidět dno talíře. A když je zapnuto, je tma. A kromě toho - co je špatného na lepicí pásce?

Potřeboval jsem vůli mezi deskou a držákem pro prkénko na dně desky a jednu součást - kondenzátor, a pro vedení drátu, které by musely jít z prkénka do Arduina, které jsem plánoval dát do držáku. Takže jsem na hřídele šroubů nasadil sadu provizorních rozpěr, aby byla zajištěna dostatečná vůle - asi 3 cm, výška prkénka a trochu, abyste nerozdrtili kabeláž. Použil jsem dva dřevěné kotevní šrouby na roh, protože měly správnou výšku a ležely v zásuvce pro muže … ta krabice uvolněných šroubů, šroubů, hřebíků, rezavých řetězových článků, hadicových spojek, starých mincí, nečekaně ostrých předmětů a všeho možného bitů a bobů, které vám mohou magicky ušetřit výlet do železářství tím, že nabídnou, ne -li přesně to, co potřebujete, něco, co bude fungovat dobře.

Šťastná nehoda ohledně příspěvku na hřiště, který jsem našel ve sklepě, už měl díry protékající deskou. Není třeba vrtat železo! Základna měla čtyři otvory pro šrouby a do dřevěné desky jsme vyvrtali čtyři protipotopené otvory, aby odpovídaly.

Celou věc jsme pak nastříkali na Gothic Black.

Krok 2: Příprava prstenů Neopixelu

Příprava Neopixelových prstenů
Příprava Neopixelových prstenů

Na své neopixelové prstence budete muset připájet vodiče: pro všechny datový vstup, pro dva datový výstupní a pro každý napájení a uzemnění. Ať už si myslíte, že potřebujete jakoukoli délku, přidejte ji. Přebytečný drát můžete vždy odříznout, příliš krátký natáhnout nemůžete. A uvědomte si varování od Adafruit:

Při pájení vodičů k těmto kroužkům musíte být velmi ostražití ohledně pájecích kuliček a zkratů. Rozteč mezi součástmi je velmi těsná! Často je nejjednodušší vložit drát zepředu a pájet na zadní stranu.

Přál bych si, abych si to přečetl, než jsem připájel dopředu. Podařilo se mi nespálit žádnou ze svých LED, ale okraj jedné jsem spálil tak, že jsem se potil, dokud jsem nezapnul. Také, kdybych si přečetl jemný manuál, přečetl bych si také varování, aby se na LED diodu nedal aligátorový klip. Nechte mé blízké vraky být vaším majákem.

Neopixel kroužky daisy-chain, což znamená, že můžete ovládat všechny jejich LED současně z Arduina připojením vodiče z OUT jednoho prstence do IN druhého. Každý prsten také potřebuje napájecí a zemnící vodiče.

Krok 3: Zapojení

Zapojení
Zapojení

Zapojte jej, jak je popsáno výše-Fritzing výše-pin 6 Arduina přenese data do prvního kruhu, výstup dat z tohoto kruhu přejde do vstupu dat dalšího, výstup dat z tohoto kruhu do Data z posledního zvonění. Nepotřebujete datový výstupní kabel posledního prstenu.

Kapacita 1 000 µf přechází mezi kladnými a zápornými kolejnicemi prkénka. Tato čepice chrání prsteny před napětím a je doporučena v sekci osvědčených postupů Adafruit NeoPixel Uberguide. Odpor na Data v prvním neopixelu doporučuje také Adafruit-je to 1K ve Fritzing, ale doporučený odpor je 300-500 ohmů.

V mé stavbě jsem vedl dráty z Neopixelů přes zadní část desky na prkénko upevněné uprostřed. Tímto způsobem stačí k základní jednotce vést tři dlouhé vodiče: napájení, uzemnění a data. Udělal jsem tyto dráty superdlouhé-v základně je spousta úložného prostoru a je pohodlné mít možnost vytáhnout desku ven pro přeprogramování.

Krok 4: Kód

"loading =" líný "zmínil, že můj syn chtěl jeho verzi reagující na hudbu. Trvalo to do jeho 18. narozenin, než se k tomu dostal, ale je to tady!

Další vybavení:

1 jednopólový přepínač s dvojitým hodem

Aby správně fungoval, musí mít mikrofon automatické řízení zisku. AGC bude neustále vzorkovat okolní hluk a zvyšovat a snižovat prahovou hodnotu, kterou považuje za pozadí, takže vaše světlo bude reagovat na špičky na tomto pozadí. Mikrofon AdaFruit je brilantní: můžete přejít z tiché místnosti, ve které zvuk jediného hlasu spustí režim plné párty s místností plnou teenagerů a hukotem hudby, a zachytí rytmus hudby. pokuta. Alternativa, nastavitelný zisk mikrofonu, má na desce malý potenciometr, který je neuvěřitelně jemný a chabý. Nepotřebuje mnoho změn v okolním zvuku, aby byla jednotka zbytečná: světla neustále svítí nebo trvale ztmavují. AGC funguje jako kouzlo.

Chtěl jsem možnost použít vířivý testovací vzor nebo hudbu, proto jsem zapojil středový vodič přepínače na VIN a jeden vodič na pin 4 druhý na pin 8 Leonarda. Testováním těchto pinů na HIGH nebo LOW můžeme vědět, ve kterém stavu se přepínač nachází, a podle toho kód pobočky.

Krok 7: Zapojení mikrofonu

Zapojení mikrofonu
Zapojení mikrofonu

Zaveďte mikrofonní vstup přes kondenzátor 1-100 µF do analogového pinu 0. Pokud je váš kondenzátor polarizovaný, výstupní kolík jde na kladnou stranu (zelený vodič).

Díky CodeGirlJP za její rutinu Trinket-Color-by-Sound, kterou jsem upravil níže:

// Zvukově aktivované LED diody s Arduino a NeoPixels

#zahrnout

#define MIC_PIN A0 // Mikrofon je připojen ke kolíku a0 na Leonardu

#define LED_PIN 6 // NeoPixel LED vlákno připojené ke kolíku 6 na Leonardo #define N_PIXELS 36 // počet pixelů v LED vlákně !!!!!! Upravte počet pixelů v nastavení. To je správné pro 3 prsteny Neopixel !!!!!! #define N 100 // Počet vzorků, které je třeba odebrat při každém čteníSamples se nazývá #define fadeDelay 5 // doba zpoždění pro každé množství fade #define noiseLevel 30 // úroveň sklonu průměrného mikrofonního šumu bez zvuku

// Inicializujte proužek NeoPixel s definovanými hodnotami výše:

Proužek Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int vzorky [N]; // úložiště pro sadu kolekce vzorků

int periodFactor = 0; // sledovat počet ms pro výpočet období int t1 = -1; // zjištěny časy sklonu> 100. int T; // perioda mezi časy škálovanými na milisekundy int sklon; // sklon dvou shromážděných datových vzorků bodů byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin pro polohu přepínače citlivost na hudbu const int SwitchPinSwirl = 8; // Pin pro polohu přepínače Testovací vzorek (víření) int MusicbuttonState = 0; // Logická proměnná vypnuto pro citlivost hudby

// Způsob nastavení Arduina

neplatné nastavení () {

strip.begin ();

ledsOff (); zpoždění (500); displayColor (kolo (100)); strip.show (); zpoždění (500); oddWheel (Wheel (100)); strip.show (); zpoždění (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Switched, FALLING);

}

// Metoda smyčky Arduino

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // VYSOKÉ, pokud je přepínač nastaven na Citlivost hudby MusicbuttonState = digitalRead (SwitchPinMusic); // VYSOKÝ, pokud je přepínač nastaven na Testovací vzorek while (SwirlbuttonState == LOW) {readSamples (); // Spusťte rutinu vzorkování hudby SwirlbuttonState = digitalRead (SwitchPinSwirl); // Zkontrolujte, zda byl přepínač změněn} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Spusťte rutinní testovací vzor SwirlbuttonState = digitalRead (SwitchPinSwirl); // Zkontrolujte, zda byl přepínač změněn

}

}

prázdný tanec () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (proužek. Barva (0, 255, 0), 50); // Zelená SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (proužek. Barva (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Bílá RGBW // Pošlete divadelní pixelovou honičku v … 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); duha (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); divadloChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Čtení a zpracování vzorových dat z Mic void readSamples () {for (int i = 0; i0) {sklon = vzorky - vzorky [i -1]; } else {sklon = vzorky - vzorky [N -1]; } // Zkontrolovat, zda je sklon větší než noiseLevel - zvuk, který není na úrovni hluku, detekován if (abs (sklon)> noiseLevel) {if (sklon <0) {vypočítatPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} else {ledsOff (); // TheaterChaseRainbow (50); } periodFactor += 1; zpoždění (1); }}

neplatné vypočítat období (int i)

{if (t1 == -1) {// t1 nebylo nastaveno t1 = i; } else {// t1 bylo nastaveno, takže vypočítat období int period = periodFactor*(i - t1); periodChanged = T == období? 0: 1; T = tečka; //Serial.println(T); // reset t1 na novou hodnotu i t1 = i; periodFactor = 0; }}

uint32_t getColor (int období)

{if (period == -1) return Wheel (0); else if (period> 400) return Wheel (5); else return Wheel (mapa (-1*perioda, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Aktualizace zpoždění pásu (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Aktualizujte proužek // vyblednutí barvy pro (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Aktualizace zpoždění pásu (fadeDelay); periodFactor+= fadeDelay; }}

prázdné LED diody Vypnuto ()

{ odeznít(); pro (int i = 0; i

zrušit displayColor (barva uint32_t)

{for (int i = 0; i

void oddWheel (barva uint32_t)

{for (int j = 0; j <256; j ++) {// cyklus všech 256 barev v kolečku pro (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Wheel ((i+j) % 255)); // zapnutí každého třetího pixelu} strip.show ();

zpoždění (1);

pro (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // vypnout každý třetí pixel}}} fadeIn (); }

// Vyplňte tečky jednu za druhou barvou

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

prázdná duha (uint8_t čekat) {

uint16_t i, j;

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

// Mírně odlišná, díky čemuž je duha rovnoměrně rozložena po celém těle

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

for (j = 0; j <256*5; j ++) {// 5 cyklů všech barev na kolečku pro (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); zpoždění (čekání); }}

// Plazivá světla v divadelním stylu.

void TheaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// do 10 cyklů honění za (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // zapnutí každého třetího pixelu} strip.show ();

zpoždění (čekání);

pro (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // vypněte každý třetí pixel}}}}

// Plazivá světla v divadelním stylu s duhovým efektem

void TheaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// cyklus všech 256 barev v kolečku pro (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)); // zapnutí každého třetího pixelu} strip.show ();

zpoždění (čekání);

pro (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // vypněte každý třetí pixel}}}}

// Zadáním hodnoty 0 až 255 získáte hodnotu barvy.

// Barvy jsou přechodem r - g - b - zpět na 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; zpětný proužek. Barva (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; zpětný proužek. Barva (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Přepnuto () {

strip.show (); readSamples (); }

Než se nechám porazit v komentářích (pamatujte na zásady Be Nice !!) Po nahrání jsem si uvědomil, jak je můj kód nedbalý. Není třeba neustále testovat, jak pin 4, tak pin 8 na HIGH. Protože přepínač je jednopólový dvojitý hod, hodnotu jednoho lze odvodit z druhého: stačí vyzkoušet jeden. Takže byste mohli projít a odstranit všechny odkazy na čtení a psaní MusicButtonState a jednoduše spustit celou věc efektivněji testováním SwirlButtonState, pokud máte málo paměti nebo rozšiřujete o další rutiny. Ale výše uvedený kód funguje.

A pokud někdo chce vyladit tyto zvukové rutiny tak, aby snímaly nejen úroveň hluku, ale také frekvenci, a napsat nějaký hladký kód, který bude klouzat po světelném spektru nahoru a dolů v reakci na pohyby podél zvukového spektra, napište do komentářů odkaz na jak jsi to udělal

Užívat si!

Doporučuje: