Turinys:

Išgalvota LED skrybėlė: 5 žingsniai (su nuotraukomis)
Išgalvota LED skrybėlė: 5 žingsniai (su nuotraukomis)

Video: Išgalvota LED skrybėlė: 5 žingsniai (su nuotraukomis)

Video: Išgalvota LED skrybėlė: 5 žingsniai (su nuotraukomis)
Video: Переход. Я нашёл нечто страшное в доме своего дяди. Джеральд Даррелл 2024, Lapkritis
Anonim
Image
Image
Išskirtinė LED skrybėlė
Išskirtinė LED skrybėlė

Aš visada norėjau atlikti „Arduino“projektą, bet niekada neturėjau jokių puikių idėjų, kol mano šeima nebuvo pakviesta į išgalvotą skrybėlių vakarėlį. Praėjus dviem savaitėms, man buvo įdomu, ar galėčiau suplanuoti ir įvykdyti judesiui jautrią LED animacijos skrybėlę. Pasirodo, galėčiau! Tikriausiai šiek tiek persistengiau, tačiau visas projektas kainavo apie 80 USD. Eksperimentuodami ir koduodami galite tai padaryti pigiau.

Tikslas su skrybėle buvo toks:

  1. Leiskite žibintams pereiti nuo skrybėlės priekio į centrą iki galo, po vieną šviesą kiekvienoje pusėje
  2. Pakeiskite šviesos judėjimo greitį, kurį lemia skrybėlės priekis į galą
  3. Leiskite žibintams pasikeisti, kai skrybėlių juosta buvo pakreipta žemyn (t. Y. Imituokite gravitacijos poveikį žibintams)
  4. Pakeiskite spalvą pagal skrybėlės pakreipimą iš kairės į dešinę
  5. Jausmas sukrečia ir parodo ypatingą efektą
  6. Pajuskite, kaip dėvėtojas sukasi, ir parodykite specialų efektą
  7. Turėkite jį visiškai skrybėlėje

1 žingsnis: reikalingos dalys

Reikalingos dalys
Reikalingos dalys
Reikalingos dalys
Reikalingos dalys
Reikalingos dalys
Reikalingos dalys

Naudojau šiuos pagrindinius komponentus (įtrauktos nesusijusios „Amazon“nuorodos):

  • „Teensy LC“mikrovaldiklis - aš jį pasirinkau, o ne įprastą „Arduino“dėl mažo dydžio, jis turi specialų ryšį, skirtą valdyti mano šviesos diodus, taip pat stiprią biblioteką ir bendruomenės palaikymą.
  • „Bosch BNO055“padėties jutiklis - sąžiningai vienas iš pirmųjų radau dokumentus. Yra daug pigesnių variantų, tačiau kai išsiaiškinsite „Bosch“, tai jums padarys daug, ką kitu atveju turėtumėte padaryti kodu
  • WS2812 adresuojama LED juostelė - pasirinkau 1 metro ilgį su 144 šviesos diodais vienam metrui. Šis tankis padeda šviesai atrodyti labiau judančiai, o ne atskiriems elementams užsidegti iš eilės.

Ir šie nedideli komponentai:

  • Skrybėlė - tiks bet kokia skrybėlė su skrybėle. Tai 6 USD skrybėlė iš vietinės parduotuvės. Jei užpakalinėje dalyje yra siūlė, laidus bus lengviau ištraukti. Atkreipkite dėmesį, ar skrybėlių juosta yra priklijuota, nes tai taip pat sukels papildomų sunkumų. Šis siuvamas išilgai viršaus, tačiau apačia lengvai ištraukiama.
  • 4,7 K omų rezistoriai
  • 3x AAA baterijų dėklas - naudojant 3 AAA baterijas, įtampa yra tiksliai tokia, kokios nori elektronika, o tai supaprastina dalykus. AAA tinka skrybėlėms lengviau nei AA ir vis dar puikiai veikia.
  • Mažo skersmens viela - naudojau kietą vielą, kurią buvau nutiesęs iš ankstesnio LED projekto.
  • Lituoklis ir lituoklis
  • Šiek tiek elastano, atitinkančio skrybėlės vidinę spalvą, ir siūlai

Siūloma, bet neprivaloma:

  • Greitos akumuliatoriaus laidų jungtys
  • Pagalbos rankų įrankis, šie dalykai yra labai maži ir sunkiai lituoti

2 žingsnis: pakeiskite skrybėlę

Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę
Pakeiskite skrybėlę

Jums reikės vietos skrybėlėje, kad galėtumėte sumontuoti elektroniką, ir vietos akumuliatoriui. Mano žmona profesionaliai dirba su drabužiais, todėl paprašiau jos patarimo ir pagalbos. Galiausiai sukūrėme dvi kišenes su spandeksu. Pirmoji mažesnė kišenė priekyje yra nukreipta kaip pati skrybėlė, todėl, kai sumontuota elektronika, padėties jutiklis gana gerai laikosi, tačiau prireikus gali būti lengvai nuimamas. Antroji kišenė į galą yra akumuliatoriaus laikymas vietoje.

Kišenės buvo apsėtos siūlais, atitinkančiais skrybėlės spalvą, visą karūnos liniją. Atsižvelgiant į skrybėlių stilių ir medžiagas, ši technika pagaminta iš YMMV.

Mes taip pat atradome skrybėlių juostą, įstrigusią iš vienos pusės, ir toje vietoje ji buvo visiškai prisiūta prie skrybėlės. Norėdami paleisti šviesos diodus po juostele, turėjome pašalinti pradinę siūlę. Statybos metu jis buvo laikomas smeigtukais, o pasibaigus siuvamas atitinkamu siūlu.

Galiausiai atidarėme siūlę kepurės gale, jei ją uždengė juosta. Per tą siūlę ištraukėme laidus, gautus kartu su šviesos diodais, ir išklojome pirmąjį šviesos diodą juostelėje, kad būtų tiesiai ant siūlės. Tada mes apvyniojome šviesos diodus aplink skrybėlę ir nukirpėme juostelę, kad paskutinis šviesos diodas būtų šalia pirmojo. Šviesos diodų juostelę galima laikyti tik su skrybėlių juosta, tačiau, priklausomai nuo juostos ir medžiagos, gali tekti pritvirtinti šviesos diodus siuvant ar klijuojant.

3 žingsnis: prijunkite laidą

Sujunkite laidą
Sujunkite laidą

„Teensy“plokštė ir šviesos diodai galios nuo 3.3 iki 5 V. Štai kodėl aš nusprendžiau naudoti 3 AAA baterijas, 4,5 V išėjimo įtampa yra toje pačioje diapazone, ir jie turi daug veikimo laiko, kaip užprogramavau šviesos diodus. Turėtumėte turėti daugiau nei 8 valandų veikimo laiko.

Elektros laidų prijungimas

Sujungiau teigiamus ir neigiamus laidus iš akumuliatoriaus dėžės ir šviesos diodų, tada lituojau ant „Teensy“atitinkamose vietose. Akumuliatoriaus teigiamas elementas turi būti prijungtas prie diagramos viršutinio dešiniojo „Teensy“kaiščio (pažymėtas „Vin“lentoje), o neigiamasis gali būti prijungtas prie bet kurio kaiščio, pažymėto GND. Patogiai vienas yra tiesiai priešingoje lentos pusėje arba šalia Vin kaiščio. Visą lentos „pinout“diagramą rasite šio puslapio apačioje. Kai kuriais atvejais užsakant lentą pridedama popierinė kopija.

Jei planuojate paleisti kodą, kuriame vienu metu įjungiami tik keli šviesos diodai, galite įjungti šviesos diodus iš paties „Teensy“, naudodami 3,3 V išvestį ir GND, tačiau jei bandysite pritraukti per daug energijos, galite sugadinti lentą. Taigi, norėdami suteikti sau daugiausiai galimybių, geriausia prijungti šviesos diodus tiesiai prie akumuliatoriaus šaltinio.

Šviesos diodų prijungimas

Šiam projektui pasirinkau „Teensy LC“, nes jame yra kaištis, kuris žymiai palengvina adresuojamų šviesos diodų prijungimą. Lentos apačioje yra kaištis, kuris yra antras nuo kairiojo veidrodžio kaiščio Nr. 17, bet taip pat turi 3,3 V. Tai vadinama traukimu, o kitose plokštėse turėsite prijungti rezistorių, kad užtikrintumėte tą įtampą. „Teensy LC“atveju galite tiesiog pervesti iš to kaiščio tiesiai į savo šviesos diodų duomenų laidą.

Padėties jutiklio prijungimas

Kai kurios turimos BNO055 plokštės yra daug griežtesnės įtampos ir nori tik 3,3 V. Dėl šios priežasties prijungiau „Vin“prie BNO055 plokštės iš 3,3 V išvesties „Teensy“, kuri yra trečiasis kaištis dešinėje. Tada galite prijungti BNO055 GND prie bet kurio „Teensy“GND.

BNO055 padėties jutiklis naudoja I2c kalbėdamas su „Teensy“. „I2c“reikia prisitraukti, todėl aš prijungiau du 4,7 K omų rezistorius iš 3,3 V išvesties „Teensy“prie 18 ir 19. kaiščių. Tada prijungiau 19 kaištį prie SCN kaiščio BNO055 plokštėje ir 18 prie SDA kaiščio.

Elektros instaliacijos patarimai/gudrybės

Šiam projektui aš naudoju kietą vielą, o ne susuktą. Vienas iš kietos vielos privalumų yra litavimas prie tokių prototipinių plokščių. Galite nuimti vielą, sulenkti ją iki 90 laipsnių ir įkišti per vieno iš gnybtų apačią taip, kad nupjautas vielos galas būtų prilipęs virš lentos. Tada jums reikia tik nedidelio kiekio lituoklio, kad jį laikytumėte prie terminalo, ir galite lengvai nupjauti perteklių.

Su kieta viela gali būti sunkiau dirbti, nes ji nori likti tokia, kokia yra sulenkta. Tačiau šiam projektui tai buvo privalumas. Aš nukirpiau ir suformavau savo laidus taip, kad padėties jutiklio orientacija būtų vienoda, kai įkišau ir išėmiau elektroniką nuo skrybėlės, kad būtų galima pataisyti ir programuoti.

4 žingsnis: programavimas

Dabar, kai viskas yra surinkta, jums reikės su „Arduino“suderinamo programavimo įrankio. Aš naudojau tikrąjį „Arduino IDE“(veikia su „Linux“, „Mac“ir kompiuteriu). Jums taip pat reikės „Teensyduino“programinės įrangos, kad galėtumėte prisijungti prie „Teensy“plokštės. Šis projektas intensyviai naudoja „FastLED“biblioteką šviesos diodų spalvų ir padėties programavimui.

Kalibravimas

Pirmas dalykas, kurį norėsite padaryti, yra eiti į puikią Kriso Winerio „BNO055“„GitHub“saugyklą ir atsisiųsti jo BNO_055_Nano_Basic_AHRS_t3.ino eskizą. Įdiekite šį kodą, kai veikia serijinis monitorius, ir jis jums pasakys, ar BNO055 plokštė tinkamai prijungta prie interneto ir išlaikė savikontrolę. Tai taip pat padės jums kalibruoti BNO055, kuris vėliau duos nuoseklesnius rezultatus.

Darbo su Fancy LED eskizu pradžia

Pridėtas „Fancy LED“skrybėlės kodas, taip pat mano „GitHub“saugykloje. Aš planuoju atlikti daugiau kodo pakeitimų ir jie bus paskelbti „GitHub“repo. Čia esantis failas atspindi kodą, kai buvo paskelbta ši instrukcija. Atsisiuntę ir atidarę eskizą, turėsite pakeisti keletą dalykų. Dauguma svarbių vertybių, kurias reikia pakeisti, yra viršuje kaip #define teiginiai:

24 eilutė: #define NUM_LEDS 89 - pakeiskite tai į faktinį LED juostelių skaičių

28 eilutė: #define SERIAL_DEBUG false - tikriausiai norėsite tai padaryti tiesa, kad galėtumėte matyti išvestį serijiniame monitoriuje

Pozicijos aptikimo kodas

Padėties aptikimas ir didžioji dalis jūsų koregavimo prasideda 742 eilutėje ir eina per 802. Mes gauname Pitch, Roll ir Yaw duomenis iš padėties jutiklio ir naudojame juos vertėms nustatyti. Priklausomai nuo to, kaip sumontuota jūsų elektronika, gali tekti juos pakeisti. Jei padėties jutiklį montuojate taip, kad lustas būtų skrybėlės viršuje, o ant lentos išspausdinta rodyklė šalia X nukreipta į skrybėlės priekį, turėtumėte matyti:

  • Pikas linkteli galva
  • Ritinys pakreipia galvą, pvz. paliesk ausį prie peties
  • Sukimasis į kurią pusę. priešais jus (šiaurėje, vakaruose ir kt.).

Jei jūsų lenta yra sumontuota kitokia kryptimi, turėsite pakeisti posūkį/ritinį/pasukimą, kad jie elgtųsi taip, kaip norėtumėte.

Norėdami koreguoti ritinio nustatymus, galite pakeisti šias #define reikšmes:

  • ROLLOFFSET: jei skrybėlė yra stabili ir kiek įmanoma centre, jei ritinys nėra 0, pakeiskite tai skirtumu. T.y. jei matote „Roll“esant -20, kai skrybėlė yra centre, padarykite tai 20.
  • ROLLMAX: didžiausia vertė, naudojama ritiniui matuoti. Lengviausia rasti dėvint skrybėlę ir judant dešinę ausį link dešinio peties. Norint tai padaryti naudojant serijinį monitorių, jums reikės ilgo USB kabelio.
  • ROLLMIN: mažiausia vertė, naudojama ritiniui matuoti, kai pakreipiate galvą į kairę

Panašiai ir „Pitch“:

  • MAXPITCH - didžiausia vertė žiūrint į viršų
  • MINPITCH - minimali vertė žiūrint žemyn
  • PITCHCENTER - pikio vertė, kai žiūrite tiesiai į priekį

Jei failo viršuje nustatysite „SERIALDEBUG“į „true“, turėtumėte matyti esamas „Roll/Pitch/Yaw“išvesties reikšmes serijiniame monitoriuje, kad būtų lengviau pataisyti šias vertes.

Kiti parametrai, kuriuos galbūt norėsite pakeisti

  • MAX_LED_DELAY 35 - lėčiausias šviesos diodų dalelių judėjimas. Tai yra milisekundės. Tai yra vėlavimas pereiti nuo vieno šviesos diodo prie kito eilutėje.
  • MIN_LED_DELAY 10 - nevalgius, kurį šviesos diodų dalelė gali pajudinti. Kaip ir aukščiau, tai yra milisekundės.

Išvada

Jei nuėjote taip toli, turėtumėte turėti visiškai veikiančią ir linksmą LED skrybėlę! Jei norite su juo daugiau nuveikti, kitame puslapyje pateikiama išsami informacija apie nustatymų keitimą ir savo veiksmų atlikimą. taip pat paaiškinimas, ką daro likęs mano kodas.

5 veiksmas: išplėstinis ir pasirinktinis: kodo viduje

Smūgio ir sukimosi aptikimas

Smūgio/sukimosi aptikimas atliekamas naudojant BNO055 didelio G jutiklio funkcijas. Jo jautrumą galite patobulinti šiomis „initBNO055“() eilutėmis:

  • 316 eilutė: BNO055_ACC_HG_DURATION - kiek laiko turi trukti įvykis
  • 317 eilutė: BNO055_ACC_HG_THRESH - koks stiprus poveikis turi būti
  • 319 eilutė: BNO055_GYR_HR_Z_SET - sukimosi greičio slenkstis
  • 320 eilutė: BNO055_GYR_DUR_Z - kiek laiko rotacija turi trukti

Abi vertės yra 8 bitų dvejetainės, šiuo metu poveikis nustatytas į B11000000, tai yra 192 iš 255.

Aptikus smūgį ar sukimąsi, BNO055 nustato vertę, kurios kodas ieško ties ciklo pradžioje:

// Aptikti visus suaktyvintus pertraukimus, t.y. dėl didelio G baito intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {poveikis (); } else if (intStatus> 0) {spin (); }

Ieškokite aukščiau esančios eilutės „void impact“(), kad pakeistumėte poveikį poveikiui, arba void spin (), jei norite pakeisti sukimosi elgseną.

Pagalbininkai

Sukūriau paprastą pagalbinę funkciją (void setAllLeds ()), skirta greitai nustatyti visus šviesos diodus į vieną spalvą. Vienas iš jų gali juos išjungti:

setAllLeds (CRGB:: Juoda);

Arba galite pasirinkti bet kokią „FastLED“bibliotekos atpažįstamą spalvą:

setAllLeds (CRGB:: Raudona);

Taip pat yra funkcija „fadeAllLeds ()“, kuri pritemdys visus šviesos diodus 25%.

Dalelių klasė

Norėdami labai supaprastinti laidų prijungimą, norėjau naudoti vieną šviesos diodų eilutę, tačiau jie turi veikti kaip kelios eilutės. Kadangi tai buvo mano pirmasis bandymas, norėjau, kad jis būtų kuo paprastesnis, todėl vieną eilutę laikau dviem, o vidurinis (-i) šviesos diodas (-ai) būtų padalintas. Kadangi galime turėti lyginį arba nelyginį skaičių, turime tai apsvarstyti. Pradėsiu nuo kai kurių pasaulinių kintamųjų:

/ * * Šviesos diodų kintamasis ir talpyklos */ CRGB šviesos diodai [NUM_LEDS]; statinis unsigned int curLedDelay = MAX_LED_DELAY; static int centreLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; statinė boolio dalelėDir = 1; statinis bool speedDir = 1; nepasirašytas ilgas dirCount; unsigned long hueCount;

Ir šiek tiek kodo sąrankoje ():

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

Jei turime nelyginius skaičius, norime naudoti 1/2 tašką kaip vidurį, kitaip norime 1/2 taško - 1. Tai lengva pamatyti naudojant 10 arba 11 šviesos diodų:

  • 11 šviesos diodų: 11/2 su sveikais skaičiais turėtų būti vertinami iki 5. o kompiuteriai skaičiuojami nuo 0. Taigi 0 - 4 yra viena pusė, 6 - 10 yra kita pusė, o 5 yra tarp jų. Šiuo atveju Nr. 5 mes elgiamės taip, lyg tai būtų abiejų dalis, t. Y. Jis yra Nr. 1 abiem virtualioms šviesos diodų eilutėms
  • 10 šviesos diodų: 10/2 yra 5. Bet kadangi kompiuteriai skaičiuojami nuo 0, turime vieną pašalinti. Tada vienai pusei turime 0 - 4, o kitai - 5 - 9. Pirmoji virtuali eilutė #1 bus 4, o antroji virtuali eilutė #1 bus #5.

Tada mūsų dalelių kode turime skaičiuoti nuo bendros padėties iki faktinių LED eilutės pozicijų:

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

Kodas taip pat turi sąlygas, kai dalelė gali pakeisti kryptį, todėl mes taip pat turime į tai atsižvelgti:

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 = centreLed; } else if ((currPos == 0) && (! oddLeds)) {currPos = centreLed - 1; } else {currPos--; }}

Taigi mes naudojame numatytą kryptį (particleDir), kad apskaičiuotume, kuris šviesos diodas turėtų užsidegti toliau, tačiau taip pat turime apsvarstyti, ar pasiekėme tikrąjį LED eilutės galą, ar mūsų centrinį tašką, kuris taip pat veikia kaip galas kiekviena virtuali eilutė.

Kai viską išsiaiškinome, prireikus užsidegame kita šviesa:

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

Kam tai apskritai paversti klase? Kaip yra, tai yra gana paprasta ir tikrai nereikia būti klasėje. Tačiau ateityje planuoju atnaujinti kodą, kad vienu metu atsirastų daugiau nei viena dalelė, o kai kurie veiks atvirkščiai, o kiti - į priekį. Manau, kad yra keletas tikrai puikių sukimosi aptikimo galimybių naudojant kelias daleles.

Rekomenduojamas: