Kazalo:

Fancy LED Hat: 5 korakov (s slikami)
Fancy LED Hat: 5 korakov (s slikami)

Video: Fancy LED Hat: 5 korakov (s slikami)

Video: Fancy LED Hat: 5 korakov (s slikami)
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, November
Anonim
Image
Image
Fancy LED klobuk
Fancy LED klobuk

Vedno sem si želel narediti projekt Arduino, vendar nikoli nisem imel dobrih idej, dokler moja družina ni bila povabljena na zabavno zabavo s klobuki. Ob dveh tednih časa me je zanimalo, ali lahko načrtujem in izvedem LED animacijski klobuk, občutljiv na gibanje. Izkazalo se je, da bi lahko! Verjetno sem malo pretiraval, vendar je skupni projekt stal okoli 80 dolarjev. Z eksperimentiranjem in nekaj kodiranja bi to lahko storili za manj.

Cilj s klobukom je bil naslednji:

  1. Naj se svetilke premaknejo od sredine sprednjega dela klobuka nazaj, po ena luč na vsaki strani
  2. Spremenite hitrost potovanja svetlobe, ki jo narekuje nagib klobuka spredaj nazaj
  3. Pustite, da se luči obrnejo, ko je klobuk nagnjen navzdol (tj. Posnemajte učinek gravitacije na luči)
  4. Spremenite barvo glede na nagib klobuka od leve proti desni
  5. Občutite šoke in pokažite poseben učinek
  6. Občutite, kako se nosilec vrti, in pokažite poseben učinek
  7. Naj bo popolnoma v klobuku

Korak: Potrebni deli

Potrebni deli
Potrebni deli
Potrebni deli
Potrebni deli
Potrebni deli
Potrebni deli

Uporabil sem naslednje glavne komponente (vključno z ne-povezanimi povezavami Amazon):

  • Teensy LC mikrokrmilnik - tega sem izbral pred običajnim Arduinom zaradi njegove majhnosti in s posebno povezavo za krmiljenje LED diod ter močno podporo knjižnice in skupnosti.
  • Bosch pozicijski senzor na osnovi BNO055 - iskreno eden prvih, na katerem sem našel dokumentacijo. Obstajajo veliko cenejše možnosti, vendar ko enkrat ugotovite Bosch, vam to veliko naredi, kar bi sicer morali narediti v kodi
  • Naslovljiv LED trak WS2812 - Izbral sem dolžino 1 meter s 144 LED na meter. Zaradi te gostote svetloba izgleda bolj kot da se premika, namesto da se posamezni elementi prižgejo v zaporedju.

In naslednje manjše komponente:

  • Klobuk - primeren bo vsak klobuk s klobukom. To je klobuk za 6 USD iz lokalne trgovine. Če ima zadaj šiv, bo ožičenje lažje prebiti. Bodite pozorni, če je trak za klobuk zlepljen, saj bo to povzročilo tudi dodatne težave. Ta je prišit vzdolž vrha, vendar se dno zlahka potegne navzgor.
  • 4,7K ohmski upori
  • 3x ohišje za baterije AAA - z uporabo 3 baterij AAA je napetost natančno v območju, ki ga želi elektronika, kar poenostavi stvari. AAA se lažje prilega klobuku kot AA in ima še vedno odličen čas delovanja.
  • Žica majhnega profila - uporabil sem nekaj trdne žice, ki sem jo položil iz prejšnjega projekta LED.
  • Spajkalnik in spajkanje
  • Nekaj spandeksa, ki ustreza notranji barvi klobuka in niti

Predlagano, vendar neobvezno:

  • Hitri priključki za žice akumulatorja
  • V pomoč orodju Hands, so te stvari zelo majhne in jih je težko spajkati

2. korak: Spremenite klobuk

Spremenite klobuk
Spremenite klobuk
Spremenite klobuk
Spremenite klobuk
Spremenite klobuk
Spremenite klobuk
Spremenite klobuk
Spremenite klobuk

Za namestitev elektronike boste potrebovali mesto v klobuku in prostor za baterijo. Žena se z oblačili profesionalno ukvarja, zato sem jo prosil za nasvet in pomoč. Na koncu smo ustvarili dva žepa s spandeksom. Prvi manjši žep spredaj je usmerjen kot klobuk sam, tako da je pozicijski senzor ob namestitvi elektronike precej dobro pritrjen na mestu, vendar ga je mogoče po potrebi enostavno odstraniti. Drugi žep na zadnji strani je namenjen shranjevanju baterije.

Žepi so bili posejani z nitjo, ki se je ujemala z barvo klobuka, vsi so bili dolgi. Odvisno od sloga klobuka in materialov je s to tehniko izdelan iz YMMV.

Odkrili smo tudi, da se klobuk na eni strani zatakne vase in je bil na tem mestu popolnoma prišit k klobuku. Odstraniti smo morali prvotni šiv, da smo LED diode poganjali pod trakom. Med gradnjo je bil pritrjen na mestu z zatiči, nato pa je bil po zaključku prišit z ustrezno nitjo.

Končno smo odprli šiv na zadnji strani klobuka, kjer ga pokriva trak. Žico, ki je prišla z LED diodami, smo napeli skozi ta šiv in obložili prvo LED v traku, ki je ravno na šivu. LED smo nato ovili okoli klobuka in odrezali trak, tako da je zadnja LED tik ob prvi. LED trak lahko pritrdite samo s klobukom, vendar boste glede na pas in material morda morali LED pritrditi s šivanjem ali lepljenjem.

3. korak: Povežite ga

Ožičite ga
Ožičite ga

Teensy plošča in LED diode bodo delovale pri napetosti od 3,3 V do 5 V. Zato sem se odločil za uporabo 3 AAA baterij, izhodna napetost 4,5v je v tem razponu lepo in imajo veliko časa delovanja za način, kako sem nastavil delovanje LED. Morali bi imeti več kot 8 ur delovanja.

Ožičenje napajanja

Pozitivne in negativne kable sem povezal iz škatle za baterije in LED, nato pa jih na ustreznih mestih spajkal na Teensy. Pozitiv iz baterije je treba priključiti na zgornji desni zatič Teensyja na diagramu (z oznako Vin na plošči), minus pa lahko priključite na kateri koli pin z oznako GND. Priročno je, da je ena neposredno na nasprotni strani plošče ali tik ob zatiču Vin. Celoten diagram izkrcanja za ploščo najdete na dnu te strani. V nekaterih primerih je papirna kopija vključena, ko naročite tablo.

Če nameravate izvajati kodo, ki ima hkrati vklopljenih le nekaj LED, lahko LED napajate iz samega Teensyja z izhodom 3,3 V in GND, če pa poskusite potegniti preveč energije, lahko poškodujte ploščo. Zato, da si zagotovite največ možnosti, je najbolje, da LED priklopite neposredno na vir baterije.

Ožičenje LED

Za ta projekt sem se odločil za Teensy LC, saj ima pin, ki olajša priklop naslovljivih LED. Na dnu plošče je zatič, ki je drugi od levega ogledala Pin #17, na njem pa je tudi 3.3v. To se imenuje pull-up, na drugih ploščah pa bi morali priključiti upor, da zagotovite to napetost. V primeru Teensy LC lahko samo povežete s tega zatiča naravnost na podatkovno žico LED.

Ožičenje senzorja položaja

Nekatere plošče BNO055, ki so na voljo, so glede napetosti veliko strožje in želijo le 3,3 V. Zaradi tega sem povezal Vin na plošči BNO055 z namenskega izhoda 3.3V na Teensyju, ki je tretji pin spodaj na desni. Nato lahko GND na BNO055 povežete s katerim koli GND na Teensyju.

Senzor položaja BNO055 uporablja I2c za pogovor s Teensyjem. I2c zahteva vlečenje, zato sem dva 4,7K ohmska upora povezal z izhoda 3,3 V na Teensyju na zatiča 18 in 19. Nato sem priključil pin 19 na SCL pin na plošči BNO055 in 18 na pin SDA.

Nasveti/triki za ožičenje

Za izvedbo tega projekta sem namesto nasedle uporabil trdno žico. Ena prednost trdne žice je med spajkanjem na takšne prototipne plošče. Odstranite lahko nekaj žice, jo upognite na 90 stopinj in jo vstavite skozi dno enega od priključkov, tako da odrezan konec žice štrli nad vašo ploščo. Za pritrditev na terminal potrebujete le majhno količino spajkanja, presežek pa lahko preprosto odrežete.

Delo s trdno žico je lahko težje, saj želi ostati tako, kot je upognjeno. Toda za ta projekt je bila to prednost. Žice sem prerezal in oblikoval tako, da bi bila orientacija pozicijskega senzorja skladna, ko sem elektroniko vstavljala in odstranjevala iz klobuka za prilagoditev in programiranje.

4. korak: Programiranje

Zdaj, ko je vse sestavljeno, boste potrebovali programsko orodje, združljivo z Arduino. Uporabil sem dejansko Arduino IDE (deluje z Linuxom, Macom in računalnikom). Za vmesnik s ploščo Teensy boste potrebovali tudi programsko opremo Teensyduino. Ta projekt močno uporablja knjižnico FastLED za programiranje barv in položaja LED.

Umerjanje

Prva stvar, ki jo želite storiti, je, da obiščete odlično skladišče GitHub Kris Winerja za BNO055 in prenesete njegovo skico BNO_055_Nano_Basic_AHRS_t3.ino. Namestite to kodo pri delujočem serijskem monitorju in pokazal vam bo, ali je plošča BNO055 pravilno povezana in opravi samotestiranje. Vodil vas bo tudi skozi umerjanje BNO055, kar vam bo kasneje dalo bolj dosledne rezultate.

Začnite s skico Fancy LED

Koda za Fancy LED klobuk je priložena in tudi v mojem skladišču GitHub. Načrtujem, da bom kodo še bolj prilagodil, te pa bodo objavljene v repoju GitHub. Tukaj datoteka odraža kodo, ko je bil ta Instructable objavljen. Ko prenesete in odprete skico, morate spremeniti nekaj stvari. Večina pomembnih vrednot, ki jih je treba spremeniti, je v samem vrhu kot izjave #define:

Vrstica 24: #define NUM_LEDS 89 - spremenite to na dejansko število LED na vašem LED traku

Vrstica 28: #define SERIAL_DEBUG false - to boste verjetno želeli uresničiti, da boste lahko videli izpis na serijskem monitorju

Koda za zaznavanje položaja

Zaznavanje položaja in večina vaših nastavitev se začne pri vrstici 742 in gre skozi 802. Podatke Pitch, Roll in Yaw dobimo od senzorja položaja in jih uporabimo za nastavitev vrednosti. Odvisno od namestitve elektronike jih boste morda morali spremeniti. Če senzor položaja namestite s čipom proti vrhu klobuka in puščica poleg X, natisnjena na plošči, usmerjena proti sprednjemu delu klobuka, bi morali videti naslednje:

  • Pitch vam prikima z glavo
  • Roll nagiba glavo, npr. dotaknite se ušesa ob rami
  • Ja, v katero smer. s katerimi se soočate (sever, zahod itd.).

Če je vaša plošča nameščena v drugačni orientaciji, boste morali zamenjati Pitch/Roll/Yaw, da se bodo obnašali, kot želite.

Če želite prilagoditi nastavitve zvitka, lahko spremenite naslednje vrednosti #define:

  • ROLLOFFSET: če je klobuk stabilen in čim bolj centriran, če Roll ni 0, spremenite to za razliko. Tj. če vidite Roll pri -20, ko je klobuk centriran, naredite to 20.
  • ROLLMAX: največja vrednost za merjenje valja. Najlažje ga najdete tako, da nosite klobuk in premaknete desno uho proti desni rami. Če želite to narediti med uporabo serijskega monitorja, potrebujete dolg kabel USB.
  • ROLLMIN: najnižja vrednost za merjenje valja, ko nagnete glavo levo

Podobno za Pitch:

  • MAXPITCH - največja vrednost, ko gledate navzgor
  • MINPITCH - najmanjša vrednost, ko gledate navzdol
  • PITCHCENTER - vrednost smole, ko gledate naravnost

Če nastavite SERIALDEBUG na true na vrhu datoteke, bi morali videti trenutne vrednosti za izhod Roll/Pitch/Yaw za serijski monitor, da bi te vrednosti prilagodili.

Druge parametre, ki jih boste morda želeli spremeniti

  • MAX_LED_DELAY 35 - najpočasnejši premik LED delcev. To je v milisekundah. To je zamuda pri prehodu z ene LED na naslednjo v nizu.
  • MIN_LED_DELAY 10 - na tešče, da se lahko delci LED premikajo. Kot zgoraj je v milisekundah.

Zaključek

Če ste šli tako daleč, bi morali imeti popolnoma delujoč in zabaven LED klobuk! Če želite z njo narediti več, je na naslednji strani nekaj naprednih informacij o spreminjanju nastavitev in lastnih opravilih. pa tudi nekaj razlage, kaj počne preostala moja koda.

5. korak: Napredno in izbirno: znotraj kode

Odkrivanje udarcev in ožemanja

Odkrivanje udarcev/ožemanja se izvede s funkcijo senzorja z visokim G na BNO055. Občutljivost le -te lahko spremenite z naslednjimi vrsticami v initBNO055 ():

  • Vrstica #316: BNO055_ACC_HG_DURATION - koliko časa mora trajati dogodek
  • Vrstica #317: BNO055_ACC_HG_THRESH - kako močan mora biti vpliv
  • Vrstica #319: BNO055_GYR_HR_Z_SET - prag hitrosti vrtenja
  • Vrstica #320: BNO055_GYR_DUR_Z - kako dolgo mora trajati rotacija

Obe vrednosti sta 8 -bitni binarni, trenutno je vpliv nastavljen na B11000000, kar je 192 od 255.

Ko zazna udar ali vrtenje, BNO055 nastavi vrednost, ki jo koda poišče takoj na začetku zanke:

// Zaznamo vse sprožene prekinitve, to je zaradi visokega bajta G intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {vpliv (); } else if (intStatus> 0) {spin (); }

Poiščite vrstico void impact () zgoraj v kodi, da spremenite obnašanje ob udarcu, ali void spin (), da spremenite vedenje vrtenja.

Pomočniki

Ustvaril sem preprosto pomožno funkcijo (void setAllLeds ()) za hitro nastavitev vseh LED v eno barvo. Z eno jih izključite:

setAllLeds (CRGB:: Črna);

Lahko pa izberete katero koli barvo, ki jo prepozna knjižnica FastLED:

setAllLeds (CRGB:: Rdeča);

Obstaja tudi funkcija fadeAllLeds (), ki zatemni vse LED za 25%.

Razred delcev

Za močno poenostavitev ožičenja sem želel uporabiti en sam niz LED, vendar naj se obnašajo kot več nizov. Ker je bil to moj prvi poskus, sem želel, da bi bil čim bolj preprost, zato eno vrstico obravnavam kot dve, pri čemer bi bila srednja LED dioda tam razdeljena. Ker imamo lahko sodo ali liho število, moramo to upoštevati. Začnem z nekaterimi globalnimi spremenljivkami:

/ * * Spremenljivka in vsebniki za LED diode */ LED lučke CRGB [NUM_LEDS]; statični brez podpisa int curLedDelay = MAX_LED_DELAY; statični int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; statični boolski delecDir = 1; statična boolna hitrostDir = 1; brez podpisa dolg dirCount; brez podpisa dolg odtenek hueCount;

In nekaj kode v setup ():

če (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } else {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Če imamo lihe številke, želimo uporabiti 1/2 točko kot sredino, sicer pa 1/2 točko - 1. To je enostavno videti z 10 ali 11 LED:

  • 11 LED: 11/2 s celimi števili mora oceniti na 5. in računalniki štejejo od 0. Torej 0 - 4 je ena polovica, 6 - 10 je druga polovica, 5 pa je med njimi. V tem primeru obravnavamo #5, kot da je del obeh, to je #1 za oba navidezna niza LED
  • 10 LED: 10/2 je 5. Toda ker računalniki štejejo od 0, moramo enega odstraniti. Nato imamo 0 - 4 za eno polovico in 5 - 9 za drugo polovico. #1 za prvi navidezni niz bo 4, #1 za drugi navidezni niz pa #5.

Nato moramo v kodi delcev nekaj šteti od našega celotnega položaja do dejanskih položajev na nizu LED:

if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Koda ima tudi pogoje, v katerih lahko delci spremenijo smer, zato moramo to upoštevati tudi:

if (particleDir) {if ((currPos == NUM_LEDS/2) && oddLeds) {currPos = 0; } else if ((currPos == NUM_LEDS/2 - 1) && (! oddLeds)) {currPos = 0; } else {currPos ++; }} else {if ((currPos == 0) && oddLeds) {currPos = centerLed; } else if ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Zato uporabljamo predvideno smer (particleDir), da izračunamo, katera LED naj bo naslednja prižgana, vendar moramo upoštevati tudi, ali smo dosegli pravi konec LED niza ali našo središčno točko, ki deluje tudi kot konec vsakega od navideznih nizov.

Ko vse to ugotovimo, po potrebi prižgemo naslednjo luč:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} else {if (oddLeds) {Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else {Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; }} LED [Pos1] = CHSV (currHue, 255, 255); LED [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Zakaj bi sploh naredili ta razred? Tako, kot je, je precej preprosto in ni nujno, da je v razredu. Vendar imam v prihodnosti načrte za posodobitev kode, ki bo omogočila pojav več kot enega delca hkrati, pri čemer bodo nekateri delali v obratni smeri, medtem ko bodo drugi napredovali. Mislim, da obstaja nekaj res velikih možnosti za zaznavanje vrtenja z uporabo več delcev.

Priporočena: