Sisällysluettelo:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 vaihetta (kuvilla)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 vaihetta (kuvilla)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 vaihetta (kuvilla)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 vaihetta (kuvilla)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Heinäkuu
Anonim
Image
Image

Joten poikani Doon havaitsee erittäin viileän juhlavalon, joka on tehty vanhoista koksipulloista ja Glow Sticksin karkeista sisätiloista, ja kysyy, voisimmeko tehdä sellaisen hänen tuleville koulukokeille, jotka ovat ohi PartAYYY !!! Sanon varmasti, mutta eikö teillä olisi mieluummin joitain niistä haikeista Adafruit Neopixel -sormuksista, joista olemme lukeneet… Hän katsoo minua tyhjänä. Koska tosiasia on, että hän ei tiedä, mistä puhun, mutta isä on huomannut mahdollisuuden leikkiä niiden Neopixel -renkaiden kanssa, joista hän on lukenut, ja me kaikki tiedämme yhden kymmenestä tärkeimmästä syystä, miksi nörttien isät synnyttävät tekosyy leikkiä viileillä gadgeteilla, joiden he sanovat kaikkien olevan lastensa puolesta.

Tämä on erittäin yksinkertainen projekti, joka näyttää todella hyvältä. Rakensimme omamme kolmesta vanhasta koksipullosta, puulevystä ja leikkipaikkakannattimesta - tavaraa, joka makasi kellarissa - yhdistettynä Arduinoon (meidän tapauksessamme Leonardo, mutta mikä tahansa Genuino -levy sopii!) Ja kolmeen Neopixel -renkaaseen. Tilasin 9-LED-renkaan, mutta päädyin 12-LED-renkaaseen samaan hintaan. Mikä oli makeaa, mutta tarkoitti kaivoaukkojen läpivientiä-12-LED-renkaat ovat 35 mm leveitä, toisin kuin 23 mm. Mitä tarvitset:

  • Genuino/Arduino -levy (Käytimme Leonardoa, mutta melkein mikä tahansa lauta käy)
  • 3 Neopixel -rengasta (12 LEDiä): hanki ne Adafruitilta ja tue niitä hienoja ihmisiä
  • 1000 µf 6.3v tai parempi kondensaattori
  • 300-500 ohmin vastus
  • Puinen lautanen, ruutupuun neliö tai mitä tahansa, johon voit asettaa neopikselit ja istuttaa koksipullot päälle
  • Jonkinlainen kiinnityslevy - leikkikentän kiinnike toimi meille hyvin
  • 9v seinä syylä
  • 40mm reikäporaus
  • Pultit, mutterit, aluslevyt, välikkeet
  • Kiinteä johdinlanka
  • Juotin ja juote
  • Leipälauta
  • Muovikotelo Arduinolle. Voit mennä ulos ja ostaa todella hienon, täysin sopivan muovikotelon, joka on valmistettu miljoonasta vanhasta maaöljystä, joka on porattu maasta hauraassa ympäristössä ja joka on valmistettu planeetan toisella puolella ja lähetetty astiassa lähellä olevaan varastoon portit on katkaistu täydellisesti ja toimita se kotiovellesi pakettiautolla, joka puhaltaa hiilidioksidia ilmakehään. Tai voit tehdä sen, mitä minä tein, ja käyttää vanhaa käytettyä muovilaatikkoa, tässä tapauksessa Madagaskarin vyöhykelaatikkoa, joka makaa lääkekaapissa … ja porata siihen muutama reikä. Tässä luento päättyy. Tehdään…

Vaihe 1: Tee pohja

Tee pohja
Tee pohja
Tee pohja
Tee pohja

Voit improvisoida tukikohtasi kaikesta roskasta, jonka sinulla on omassa kellarissasi, tai jopa käyttää vain puulaatikkoa tai mitä tahansa, joka piilottaa elektroniikkasi.

Poraamme ensin kolme reikää, jotka on sijoitettu tasaisesti puulevyyn, riittävän suuret Neopixel -renkaille. Kuvassa reiät ovat kaivoja, jotka on porattu lapioilla. Lopulta 12 LED-renkaiden suuremman koon vuoksi jouduimme poraamaan reikiä poranterällä. Tämä tarkoitti menemistä koko levyn läpi ja sen sijaan, että renkaat olisivat mukavasti kiinni niiden hienosti muotoilluissa pienissä 2 mm: n syvennyksissä, joissa oli keskireikä siistille lankajohdolle, päädyin varmistamaan renkaat… ahem… teippi pohjan poikki levystä. Älä tuomitse. Et voi kuitenkaan nähdä levyn pohjaa suunnittelussani. Ja se on pimeä, kun se on päällä. Ja lisäksi - mitä vikaa teipissä?

Tarvitsin levyn ja kannattimen väliin levyn pohjassa olevan leipälevyn ja yhden komponentin - kondensaattorin - sekä johtoajoille, jotka joutuisivat siirtymään leipälevyltä Arduinolle, jonka aioin laittaa kiinnikkeeseen. Joten laitoin joukon väliaikaisia välikappaleita pulttiakseleihin, jotta saadaan riittävästi tilaa - noin 3 cm, leipälevyn korkeus ja vähän, jotta et murskaa johtoja. Käytin kahta puista ankkuripulttia kulmaa kohden, koska ne olivat oikean korkeuden ja makasivat mieslaatikossa… tuossa laatikossa löysiä ruuveja, pultteja, nauloja, ruosteisia ketjunlenkkejä, letkuliittimiä, vanhoja kolikoita, odottamattoman teräviä esineitä ja kaikenlaista palasia, jotka voivat maagisesti säästää matkan rautakauppaan tarjoamalla, jos ei juuri sitä, mitä tarvitset, jotain, joka toimii hienosti.

Onnellinen onnettomuus kellarissa löytämästäni leikkikenttäpostauksesta, koska siinä oli jo reikiä levyn läpi. Ei tarvitse porata rautaa! Pohjassa oli neljä pultinreikää, ja porasimme puulevyyn neljä vastakkaista reikää vastaamaan.

Sitten ruiskutimme koko jutun goottilaiseksi mustaksi.

Vaihe 2: Neopixel -renkaiden valmistelu

Neopixel -renkaiden valmistelu
Neopixel -renkaiden valmistelu

Sinun on juotettava johdot neopikselirenkaisiin: Data-In-johto kaikille, Data-Out-johto kahdelle ja virta ja maadoitus kullekin. Riippumatta pituudesta, jota luulet tarvitsevasi, lisää joitakin. Voit aina katkaista ylimääräisen langan, et voi venyttää liian lyhyttä. Ja ole tietoinen Adafruutin varoituksesta:

Kun juotat johtoja näihin renkaisiin, sinun on oltava erityisen valpas juotoslohkojen ja oikosulkujen suhteen. Osien välinen etäisyys on erittäin tiukka! Johto on usein helpoin asentaa etupuolelta ja juottaa taakse.

Haluaisin lukea sen ennen kuin juotin eteen. En onnistunut polttamaan mitään LED -valojani, mutta paahdoin yhden reunan tavalla, joka sai minut hikoilemaan, kunnes käynnistin sen. Lisäksi, jos olisin lukenut hienon käsikirjan, olisin lukenut myös varoituksen olla asettamatta alligaattoripidikettä LEDiin. Olkoon melkein haaksirikkouteni majakkasi.

Neopixel soi ketjulla, mikä tarkoittaa, että voit ohjata kaikkia niiden LED-valoja samanaikaisesti Arduinosta yhdistämällä johdin yhden renkaan OUT-liittimestä toisen IN-liittimeen. Jokainen rengas tarvitsee myös virta- ja maadoitusjohdot.

Vaihe 3: Johdotus

Johdotus
Johdotus

Johda se kuten yllä olevassa Fritzingissä-Arduinon nasta 6 vie tiedot ensimmäiseen renkaaseen, tuosta renkaasta tuleva data menee seuraavan datan sisäänmenoon, sen data menee ulos Viimeisen soiton data. Et tarvitse viimeisen renkaan tiedonsiirtojohtoa.

1000 µf: n kapasiteetti kulkee leipälevyn positiivisten ja negatiivisten kiskojen välillä. Tämä korkki suojaa renkaita sähköpiikeiltä, ja sitä suosittelee Adafruit NeoPixel Uberguiden parhaiden käytäntöjen osio. Adafruit suosittelee myös ensimmäisen neopikselin tietojen vastusta-se on 1K Fritzingissä, mutta suositeltu vastus on 300-500 ohmia.

Rakennuksessani vedin johdot Neopixeleistä levyn takaosan yli keskelle kiinnitettyyn leipälautaan. Tällä tavalla sinun on vedettävä vain kolme pitkää johtoa alayksikköön: virta, maa ja data. Tein nämä johdot erittäin pitkiksi-pohjassa on runsaasti tallennustilaa, ja se tekee käteväksi levyn vetämisen ulos uudelleenohjelmointia varten.

Vaihe 4: Koodi

"loading =" laiska "mainitsi, että poikani halusi musiikista reagoivan version tästä. Kesti 18-vuotissyntymäpäivänsä päästäkseen siihen käsiksi, mutta tässä se on!

Lisävarusteet:

1 yksinapainen, kaksoiskytkin 1 automaattinen vahvistuksen säätömikrofoni (käytin AdaFruitin MAX9184) 1 1uF-100uF kondensaattori (mikä tahansa arvo)

Mikrofonissa on todella oltava automaattinen vahvistuksen säätö, jotta tämä toimisi kunnolla. AGC ottaa jatkuvasti näytteitä ympäristön melusta ja nostaa ja laskee taustana pitämäänsä kynnystä, joten valosi reagoi piikkeihin kyseistä taustaa vasten. AdaFruitin mikrofoni on loistava: voit siirtyä hiljaisesta huoneesta, jossa yhden äänen ääni laukaisee sen, täysin juhlatilaan, jossa huone on täynnä teini-ikäisiä ja musiikkia soi, ja se ottaa musiikin tahdin hieno. Vaihtoehto, säädettävä vahvistusmikrofoni, sisältää pienen potentiometrin, joka on mahdottoman herkkä ja hankala. Yksikön käyttämättömyyteen ei tarvita paljon muutoksia ympäristön äänessä: valot palavat jatkuvasti tai pimeä jatkuvasti. AGC toimii kuin taika.

Halusin vaihtoehdon käyttää pyörrekoestuskuviota tai musiikkia, joten kytkin kytkimen keskijohdon VIN -asentoon ja yhden johdon nastaan 4, toisen Leonardo -napaan. Kokeilemalla näitä nastoja HIGH tai LOW, voimme tietää, missä tilassa kytkin on, ja haarakoodin sen mukaisesti.

Vaihe 7: Mikrofonin kytkeminen

Mikrofonin kytkeminen
Mikrofonin kytkeminen

Syötä Mic-tulo 1-100µF: n kondensaattorin kautta analogiseen nastaan 0. Jos kondensaattori on polarisoitunut, ulostulonappi siirtyy positiiviselle puolelle (vihreä johto).

Kiitos CodeGirlJP: lle hänen Trinket-Color-by-Sound-rutiinistaan, jonka olen mukauttanut alla:

// Ääniaktivoidut LEDit Arduinon ja NeoPixelin kanssa

#sisältää

#define MIC_PIN A0 // Mikrofoni on liitetty Leonardo -laitteen nastaan a0

#define LED_PIN 6 // NeoPixel -LED -nauha, joka on kiinnitetty Leonardon nastaan 6 #define N_PIXELS 36 // pikselimäärä LED -säikeessä !!!!!! Säädä asetusten pikselimäärä. Tämä pätee kolmeen Neopixel -renkaaseen !!!!!! #define N 100 // Joka kerta luettavien näytteiden lukumäärä Näytteitä kutsutaan #define fadeDelay 5 // viiveajaksi jokaiselle häipymismäärälle #define noiseLevel 30 // keskimääräisen mikrofonin melutaso ilman ääntä

// Alusta NeoPixel -liuska edellä määritellyillä arvoilla:

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

int näytteet [N]; // näytteenkeräysjoukon tallennustila

int periodFactor = 0; // seurata ms -lukua jakson laskennassa int t1 = -1; // kaltevuusajat> 100 havaittu. int T; // ajanjakso, joka on skaalattu millisekunteihin int kaltevuudessa; // kahden kerätyn datanäytepisteen kaltevuus tavu periodChanged = 0; const int SwitchPinMusic = 4; // Nasta kytkimen asentoon musiikkiherkkyys const int SwitchPinSwirl = 8; // Kytkimen asennon nasta Testimalli (pyörre) int MusicbuttonState = 0; // On off -logiikan muuttuja musiikin herkkyydelle

// Arduino -asennusmenetelmä

void setup () {

strip.begin ();

ledsOff (); viive (500); displayColor (Pyörä (100)); strip.show (); viive (500); oddWheel (Pyörä (100)); strip.show (); viive (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); // attachInterrupt (4, Kytketty, FALLING);

}

// Arduino -silmukkamenetelmä

void loop () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // KORKEA, jos kytkin on asetettu musiikkiherkkyyteen MusicbuttonState = digitalRead (SwitchPinMusic); // KORKEA, jos kytkin on asetettu testikuvioon, kun (SwirlbuttonState == LOW) {readSamples (); // Suorita musiikin näytteenottorutiini SwirlbuttonState = digitalRead (SwitchPinSwirl); // Tarkista, onko kytkin vaihdettu} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) {Dance (); // Suorita pyörivän testikuvion rutiini SwirlbuttonState = digitalRead (SwitchPinSwirl); // Tarkista, onko kytkin vaihdettu

}

}

mitätön tanssi () {

while (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (nauha. Väri (0, 255, 0), 50); // Green SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (nauha. Väri (0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(nauha. Väri (0, 0, 0, 255), 50); // Valkoinen RGBW // Lähetä teatterin pikselijakso… SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (nauha. Väri (127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (nauha. Väri (127, 0, 0), 50); // Red SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (nauha. Väri (0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); sateenkaari (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); sateenkaariSykli (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); teatteriVaiheSateenkaari (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Lue ja käsittele näytetietoja Mic void readSamples () {for (int i = 0; i0) {slope = sample - näytteet [i -1]; } else {kaltevuus = näytteet - näytteet [N -1]; } // Tarkista, onko kaltevuus suurempi kuin kohinaTaso - havaitaan ääni, joka ei ole melutasolla, jos (abs (kaltevuus)> noiseLevel) {if (kaltevuus <0) {calcPeriod (i); if (periodChanged == 1) {displayColor (getColor (T)); }}} muu {ledsOff (); // teatteriKausiSateenkaari (50); } periodFactor += 1; viive (1); }}

mitätön laskentajakso (int i)

{jos (t1 == -1) {// t1 ei ole asetettu t1 = i; } muu {// t1 asetettiin niin, että lasketaan jakso int period = periodFactor*(i - t1); periodChanged = T == piste? 0: 1; T = piste; //Sarja.println (T); // nollaa t1 uuteen i -arvoon t1 = i; periodFactor = 0; }}

uint32_t getColor (int piste)

{if (period == -1) return Wheel (0); muuten jos (jakso> 400) palautuspyörä (5); muuten palautuspyörä (kartta (-1*jakso, -400, -1, 50, 255)); }

void fadeOut ()

{for (int i = 0; i <5; i ++) {strip.setBrightness (110 - i*20); strip.show (); // Päivitä nauhan viive (fadeDelay); periodFactor += fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Päivitä nauha // häivytä väri (int i = 0; i <5; i ++) {//strip.setBrightness(20*i+30); //strip.show (); // Päivitä nauhan viive (fadeDelay); periodFactor+= fadeDelay; }}

mitätön ledsOff ()

{ kadota näkyvistä(); varten (int i = 0; i

tyhjä näyttö Väri (uint32_t väri)

{varten (int i = 0; i

void oddWheel (uint32_t väri)

{for (int j = 0; j <256; j ++) {// kierrä kaikki 256 väriä pyörässä for (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, Wheel ((i+j) % 255)); // käännä joka kolmas pikseli päälle} strip.show ();

viive (1);

for (uint16_t i = 24; i <36; i = i+3) {strip.setPixelColor (i+q, 0); // sammuta joka kolmas pikseli}}} fadeIn (); }

// Täytä pisteet peräkkäin värillä

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

mitätön sateenkaari (uint8_t wait) {

uint16_t i, j;

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

// Hieman erilainen, tämä tekee sateenkaaren tasaisesti jakautuneeksi kaikkialle

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

for (j = 0; j <256*5; j ++) {// 5 sykliä kaikissa pyörän väreissä (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); viive (odota); }}

// Teatterityyliset ryömivät valot.

void theatreChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// tee 10 jahdasykliä (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, c); // käännä joka kolmas pikseli päälle} strip.show ();

viive (odota);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // sammuta joka kolmas pikseli}}}}

// Teatterityyliset ryömivä valot, joissa on sateenkaariefekti

void theatreChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// kiertää kaikki 256 väriä pyörässä for (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)); // käännä joka kolmas pikseli päälle} strip.show ();

viive (odota);

for (uint16_t i = 0; i <strip.numPixels (); i = i+3) {strip.setPixelColor (i+q, 0); // sammuta joka kolmas pikseli}}}}

// Syötä arvo 0–255 saadaksesi väriarvon.

// Värit ovat siirtymä r - g - b - takaisin r: ään. uint32_t Pyörä (tavua WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } jos (WheelPos <170) {WheelPos -= 85; palautusliuska. Väri (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; palautusliuska. Väri (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Ennen kuin minut teurastettiin kommenteissa (muista Be Nice -käytäntö !!), tajusin lähettämiseni jälkeen, kuinka huolimaton osa koodistani on. Sinun ei tarvitse jatkuvasti testata sekä nasta 4 että nasta 8 korkealle. Koska kytkin on yksinapainen kaksoisheitto, toisen arvo voidaan päätellä toisesta: sinun tarvitsee vain testata yksi. Joten voit käydä läpi ja poistaa kaikki viittaukset MusicButtonStaten lukemiseen ja kirjoittamiseen ja yksinkertaisesti suorittaa koko asian tehokkaammin testaamalla SwirlButtonState, jos muistisi on vähissä tai jos käytät muita rutiineja. Mutta yllä oleva koodi toimii.

Ja jos joku haluaa säätää näitä äänirutiineja aistimaan paitsi melutasot myös taajuuden, ja kirjoittamaan sujuvaa koodia liukumaan ylös ja alas valospektrissä vastauksena äänispektrin liikkeisiin, pudota linkki kommentteihin miten teit sen.

Nauttia!

Suositeltava: