Sisukord:

Fancy LED müts: 5 sammu (piltidega)
Fancy LED müts: 5 sammu (piltidega)

Video: Fancy LED müts: 5 sammu (piltidega)

Video: Fancy LED müts: 5 sammu (piltidega)
Video: Обзор дома 5 звёзд c авторской отделкой и ландшафтом под кроксы 2024, November
Anonim
Image
Image
Fancy LED müts
Fancy LED müts

Olen alati tahtnud teha Arduino projekti, kuid mul pole kunagi olnud ühtegi suurepärast ideed selle jaoks enne, kui mu pere kutsuti uhkele mütsipeole. Kahe nädala pikkuse tähtajaga olin uudishimulik, kas saaksin liikumistundlikku LED -animatsioonimütsi nii planeerida kui ka teostada. Tuleb välja, et saaksin! Tõenäoliselt läksin natuke liiale, kuid kogu projekt läks maksma umbes 80 dollarit. Katsetamise ja mõningase kodeerimisega saate seda teha vähem.

Eesmärk mütsiga oli järgmine:

  1. Laske tulede komplekt liikuda mütsi esiosa keskelt tagaküljele, üks tuli mõlemal küljel
  2. Muutke valguse liikumiskiirust, mille määrab mütsi esiosa tahapoole kallutamine
  3. Laske tuledel tagurpidi, kui mütsiriba on allapoole kallutatud (st jäljendab gravitatsiooni mõju tuledele)
  4. Muutke värvi vastavalt mütsi kallutamisele vasakult paremale
  5. Tunnetage šokke ja kuvage eriefekt
  6. Tunnetage kandja pöörlemist ja näidake eriefekti
  7. Pange see täielikult mütsi sisse

Samm: vajalikud osad

Vajalikud osad
Vajalikud osad
Vajalikud osad
Vajalikud osad
Vajalikud osad
Vajalikud osad

Kasutasin järgmisi põhikomponente (kaasa arvatud sidusettevõtete Amazoni lingid):

  • Teensy LC mikrokontroller - valisin selle väikese suuruse tõttu tavalise Arduino asemel ja sellel on minu LED -ide juhtimiseks spetsiaalne ühendus ning tugev raamatukogu ja kogukonna tugi.
  • Boschi BNO055 põhine positsiooniandur - ausalt üks esimesi, mille kohta leidsin dokumentatsiooni. Seal on palju odavamaid valikuid, kuid kui olete Boschi välja selgitanud, teeb see teie jaoks palju, mida peaksite muidu koodis tegema
  • WS2812 adresseeritav LED -riba - valisin 1 meetri pikkuse ja 144 LED -i meetri kohta. Selle tiheduse omamine aitab valgusel pigem liikuda, mitte üksikuid elemente järjest süttida.

Ja järgmised väikesed komponendid:

  • Müts - sobib iga müts, millel on mütsiriba. See on 6 dollari suurune müts kohalikust poest. Kui selle taga on õmblus, on juhtmestik lihtsam läbi viia. Pöörake tähelepanu sellele, kas mütsiriba on liimitud, sest see tekitab ka lisaraskusi. See on õmmeldud mööda ülaosa, kuid alt tõmmatakse kergesti üles.
  • 4.7K oomi takistid
  • 3x AAA patareikott - kasutades 3 AAA patareid väljub pinge täpselt sellesse vahemikku, mida elektroonika soovib, mis lihtsustab asju. AAA sobib mütsi hõlpsamini kui AA ja sellel on endiselt suurepärane tööaeg.
  • Väikese läbimõõduga traat - ma kasutasin kindlat traati, mille olin paigaldanud eelmisest LED -projektist.
  • Jootekolb ja jootekolb
  • Mõni spandex, mis sobib mütsi sisemise värviga, ja niit

Soovitatav, kuid valikuline:

  • Kiirühendused aku juhtmete jaoks
  • Abistavate käte tööriist, need asjad on väga väikesed ja raskesti jootetavad

Samm: muutke mütsi

Muutke mütsi
Muutke mütsi
Muutke mütsi
Muutke mütsi
Muutke mütsi
Muutke mütsi
Muutke mütsi
Muutke mütsi

Elektroonika paigaldamiseks vajate mütsi kohta ja aku. Mu naine töötab rõivastega professionaalselt, nii et ma küsisin temalt nõu ja abi. Lõppkokkuvõttes lõime kaks spandexiga taskut. Esimene väiksem tasku esiosa suunas on suunatud nagu müts ise, nii et elektroonika paigaldamisel hoitakse asendiandurit üsna hästi paigas, kuid vajadusel saab seda hõlpsalt eemaldada. Teine tasku tagumise poole on aku hoidmine paigal.

Taskud külvati niidiga, mis sobis mütsi värviga, kõik kroonijoonega. Sõltuvalt mütsi stiilist ja materjalidest on see selle tehnika abil valmistatud YMMV -st.

Avastasime ka mütsiriba ühelt poolt endasse tõmbunud ja see oli selles kohas mütsi külge õmmeldud. Riba all olevate LED -ide käivitamiseks pidime eemaldama algse õmbluse. Ehitamise ajal hoiti seda nööpnõeltega paigal ja õmmeldi pärast valmimist sobiva niidiga.

Lõpuks avasime mütsi tagaküljel oleva õmbluse, kui see oleks bändiga kaetud. Panime LED -idega kaasas olnud juhtmestiku läbi selle õmbluse ja vooderdasime riba esimese LED -i otse õmbluse külge. Seejärel keerasime valgusdioodid mütsi ümber ja lõikasime riba maha, nii et viimane LED oleks kohe esimese kõrval. LED -riba saab kinni hoida ainult mütsiribaga, kuid sõltuvalt ribast ja materjalist peate võib -olla LED -id kinnitama õmblemise või liimimisega.

3. samm: ühendage see juhtmega

Ühendage see juhtmega
Ühendage see juhtmega

Teensy -plaat ja LED -id töötavad võimsuse tagamiseks kõikjal vahemikus 3,3–5 V. Seetõttu otsustasin kasutada 3 AAA patareid, väljundpinge 4,5v on kenasti selles vahemikus ja neil on palju tööaega LED -ide tööks programmeerimiseks. Peaksite saama üle 8 tunni tööaega.

Toite juhtmestik

Ühendasin akukarbi positiivsed ja negatiivsed juhtmed ja LED -id kokku, joodin seejärel Teensy külge sobivatesse kohtadesse. Aku positiivne osa tuleb ühendada skeemil oleva Teensy parema ülemise tihvtiga (plaadil silt Vin) ja negatiivi saab ühendada mis tahes GND -ga märgistusega. Mugavalt on see üks otse plaadi vastasküljel või otse Vin -tihvti kõrval. Tahvli täispika diagrammi leiate selle lehe allosast. Ja mõnel juhul on tahvli tellimisel kaasas paberkoopia.

Kui plaanite käivitada koodi, millel on korraga sisse lülitatud vaid mõned LED -id, saate LED -e toita Teensy enda poolt, kasutades 3,3 V väljundit ja GND -d, kuid kui proovite liiga palju energiat tarbida plaati kahjustada. Seega, et anda endale kõige rohkem võimalusi, on kõige parem ühendada LED -id otse akuallikaga.

LED -ide juhtmestik

Valisin selle projekti jaoks Teensy LC, kuna sellel on tihvt, mis muudab adresseeritavate valgusdioodide ühendamise palju lihtsamaks. Tahvli põhjas on tihvt, mis on vasakpoolsetest peeglitest teine, nööpnõel nr 17, kuid millel on ka 3,3 V. Seda nimetatakse tõmbeks ja teistel tahvlitel peate selle pinge tagamiseks takistiga juhtme ühendama. Teensy LC puhul saate selle tihvtiga otse juhtida otse oma LED -ide andmesidejuhtmesse.

Asendianduri juhtmestik

Mõned saadavalolevad BNO055 plaadid on pinge suhtes palju rangemad ja soovivad ainult 3,3 V pinget. Seetõttu ühendasin VIN -i BNO055 plaadil Teensy spetsiaalse 3,3 V väljundiga, mis on paremal kolmas nööpnõel. Seejärel saate ühendada BNO055 GND mis tahes Teensy GND -ga.

Asendiandur BNO055 kasutab Teensyga rääkimiseks I2c -d. I2c nõuab tõmbeid, nii et ma ühendasin kaks 4,7 K oomi takistit Teensy 3,3 V väljundist tihvtidele 18 ja 19. Seejärel ühendasin tihvti 19 BNO055 tahvli SCL-tihvtiga ja 18 SDA-tihvtiga.

Juhtmestiku näpunäited/nipid

Selle projekti tegemiseks kasutasin ma keerdtraati, mitte keerutatud. Tahke traadi üheks eeliseks on selliste prototüüpplaatide jootmine. Saate juhtme eemaldada, painutada 90 kraadini ja sisestada see ühe klemmi põhja alt nii, et traadi lõigatud ots jääb teie plaadi kohale. Seejärel vajate terminali hoidmiseks vaid väikest kogust joodist ja saate ülejäägi hõlpsalt ära lõigata.

Tahket traati võib olla raskem töötada, kuna see soovib jääda painutatuks. Selle projekti jaoks oli see aga eelis. Lõikasin ja vormisin oma juhtmeid nii, et asendianduri orientatsioon oleks järjepidev, kui sisestasin ja eemaldasin elektroonika mütsist näpistamiseks ja programmeerimiseks.

4. samm: programmeerimine

Nüüd, kui kõik on kokku pandud, vajate Arduinoga ühilduvat programmeerimisriista. Kasutasin tegelikku Arduino IDE -d (töötab Linuxi, Maci ja PC -ga). Teensy plaadiga liidestamiseks vajate ka tarkvara Teensyduino. See projekt kasutab intensiivselt LED -ide värvi ja asukoha programmeerimiseks FastLED -kogu.

Kalibreerimine

Esimene asi, mida soovite teha, on minna Kris Wineri suurepärase GitHubi hoidlasse BNO055 jaoks ja alla laadida tema BNO_055_Nano_Basic_AHRS_t3.ino visand. Installige see kood, kui Serial Monitor töötab, ja see annab teile teada, kas BNO055 plaat on võrgus korralikult saadaval ja läbib oma enesetestid. Samuti juhendab see teid BNO055 kalibreerimisel, mis annab teile hiljem järjepidevamad tulemused.

Alustamine Fancy LED -visandiga

Lisatud on spetsiaalselt Fancy LED -mütsi kood ja ka minu GitHubi hoidlas. Kavatsen koodile rohkem muudatusi teha ja need postitatakse GitHubi repos. Siinne fail kajastab selle juhendi avaldamise ajal koodi. Pärast eskiisi allalaadimist ja avamist peate muutma mõnda asja. Enamik olulisi väärtusi, mida muuta, on üleval #define lausetena:

Rida 24: #define NUM_LEDS 89 - muutke see LED -riba tegelikuks LED -ide arvuks

Rida 28: #define SERIAL_DEBUG false - tõenäoliselt soovite selle tõeks teha, et näeksite väljundit seeriamonitoril

Asukoha tuvastamise kood

Asukoha tuvastamine ja suurem osa teie kohandamisest algab realt 742 ja läbib 802. Saame positsiooniandurilt Pitch, Roll ja Yaw andmed ja kasutame neid väärtuste määramiseks. Sõltuvalt sellest, kuidas teie elektroonika on paigaldatud, peate võib -olla neid muutma. Kui paigaldate asendianduri kiibiga mütsi ülaosa poole ja tahvlile trükitud X kõrval olev nool osutab mütsi esiosa poole, peaksite nägema järgmist:

  • Pitch noogutab pead
  • Roll kallutab pead, nt. puudutage oma kõrva õlale
  • Nihutamine on mis suunas. näoga (põhi, lääs jne).

Kui teie plaat on paigaldatud erinevasse suunda, peate vahetama Pitch/Roll/Yaw, et need käituksid nii, nagu soovite.

Rulli seadete muutmiseks saate muuta järgmisi #define väärtusi:

  • ROLLOFFSET: kui müts on stabiilne ja nii tsentreeritud kui võimalik, kui rull pole 0, muutke seda erinevusega. S.t. kui näete rulli -20, kui teie müts on keskel, tehke see 20.
  • ROLLMAX: rullide mõõtmiseks kasutatav maksimaalne väärtus. Lihtsaim leida mütsi kandes ja paremat kõrva parema õla poole liigutades. Seeriamonitori kasutamisel on selleks vaja pikka USB -kaablit.
  • ROLLMIN: madalaim väärtus, mida kasutatakse rulli mõõtmiseks, kui kallutate oma pead vasakule

Samamoodi Pitchi puhul:

  • MAXPITCH - maksimaalne väärtus üles vaadates
  • MINPITCH - minimaalne väärtus, kui vaatate allapoole
  • PITCHCENTER - helikõrgus, kui vaatate otse ette

Kui määrate faili ülaosas SERIALDEBUG väärtuseks tõene, peaksite nägema seeriamonitori Roll/Pitch/Yaw väljundi praeguseid väärtusi, et neid väärtusi muuta.

Muud parameetrid, mida võiksite muuta

  • MAX_LED_DELAY 35 - aeglaseim, mida LED -osake suudab liigutada. See on millisekundites. See on viivitus stringis ühelt LED -ilt järgmisele liikumisel.
  • MIN_LED_DELAY 10 - paastumine, mida LED -osake saab liigutada. Nagu ülalpool, on see millisekundites.

Järeldus

Kui olete nii kaugele jõudnud, peaks teil olema täielikult toimiv ja lõbus LED -müts! Kui soovite sellega rohkem teha, on järgmisel lehel lisateavet seadete muutmise ja oma asjade tegemise kohta. samuti mõned selgitused selle kohta, mida mu ülejäänud kood teeb.

5. samm: täpsemad ja valikulised: koodi sees

Löögi ja pöörlemise tuvastamine

Löögi/tsentrifuugi tuvastamine toimub BNO055 kõrge G-sensori funktsioonide abil. Selle tundlikkust saate kohandada järgmiste ridadega dokumendis initBNO055 ():

  • Rida nr 316: BNO055_ACC_HG_DURATION - kui kaua üritus peab kestma
  • Rida #317: BNO055_ACC_HG_THRESH - kui raske peab mõju olema
  • Rida #319: BNO055_GYR_HR_Z_SET - pöörlemiskiiruse lävi
  • Rida nr 320: BNO055_GYR_DUR_Z - kui kaua pöörlemine isegi peab kestma

Mõlemad väärtused on 8 -bitised binaarsed, praegu on mõju seatud väärtusele B11000000, mis on 192 punkti 255 -st.

Löögi või keerutuse tuvastamisel määrab BNO055 väärtuse, mida kood otsib silmuse alguses:

// Tuvastage kõik katkestused, mis on käivitatud, st kõrge G -baidi tõttu intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {mõju (); } else if (intStatus> 0) {spin (); }

Otsige koodist ülal olevat rida void impact (), et muuta mõju käitumisel, või void spin (), et muuta pöörlemiskäitumist.

Abistajad

Olen loonud lihtsa abifunktsiooni (void setAllLeds ()) kõigi valgusdioodide kiireks ühevärviliseks seadistamiseks. Üks kasutab seda kõigi väljalülitamiseks:

setAllLeds (CRGB:: Must);

Või võite valida mis tahes FastLED -i raamatukogu poolt tuvastatud värvi.

setAllLeds (CRGB:: punane);

Samuti on olemas funktsioon fadeAllLeds (), mis hämardab kõiki LED -e 25%.

Osakeste klass

Juhtmestiku oluliselt lihtsustamiseks tahtsin kasutada ühte LED -de jada, kuid lasta neil käituda nagu mitu stringi. Kuna see oli minu esimene katse, tahtsin selle võimalikult lihtsana hoida, seega käsitlen ühte stringi kahena, kusjuures keskmine LED (id) on jagatud. Kuna meil võib olla paaris või paaritu arv, peame sellega arvestama. Alustan mõnest globaalsest muutujast:

/ * * Muutujad ja LED -de mahutid */ CRGB -LED -id [NUM_LEDS]; staatiline allkirjastamata int curLedDelay = MAX_LED_DELAY; staatiline int centerLed = NUM_LEDS / 2; staatiline int maxLedPos = NUM_LEDS / 2; staatiline bool oddLeds = 0; staatiline booli osakeDir = 1; staatiline bool speedDir = 1; allkirjata pikk dirCount; allkirjata pikk hueCount;

Ja natuke koodi seadistamisel ():

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

Kui meil on paarituid numbreid, tahame kasutada keskpunktina 1/2 punkti, vastasel juhul tahame 1/2 punkti - 1. Seda on lihtne näha 10 või 11 LED -iga:

  • 11 LED -i: täisarvudega 11/2 peaks olema 5. ja arvutid loevad 0 -st. Seega 0 - 4 on üks pool, 6 - 10 on teine pool ja 5 on nende vahel. Sel juhul käsitleme numbrit 5 nii, nagu see oleks osa mõlemast, st see on number 1 mõlema LED -i virtuaalse stringi jaoks
  • 10 LED -i: 10/2 on 5. Aga kuna arvutid loevad 0 -st, peame ühe eemaldama. Siis on meil pooleks 0 - 4 ja teisele 5 - 9. Esimese virtuaalse stringi number 1 on 4 ja teise virtuaalse stringi number 1 on number 5.

Siis peame oma osakeste koodis loendama meie üldisest positsioonist kuni LED -stringi tegeliku positsioonini:

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

Koodil on ka tingimused, kus osake võib suunda muuta, seega peame seda ka arvesse võtma:

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--; }}

Nii et me kasutame kavandatud suunda (particleDir), et arvutada, milline LED peaks järgmisena põlema, kuid peame ka kaaluma, kas oleme jõudnud kas LED -stringi tegelikku lõppu või keskpunkti, mis toimib ka iga virtuaalne string.

Kui oleme selle kõik selgeks saanud, süütame vajadusel järgmise tule:

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 = (keskjooneline -1) + currPos; }} ledid [Pos1] = CHSV (currHue, 255, 255); ledid [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Milleks teha sellest klass üldse? See on tegelikult üsna lihtne ja ei pea tegelikult klassis olema. Kuid mul on tulevikus kavas koodi värskendada, et korraga saaks esineda rohkem kui üks osake, ja mõned töötavad vastupidi, teised aga edasi. Ma arvan, et tsentrifuugi tuvastamiseks on palju suurepäraseid võimalusi, kasutades mitut osakest.

Soovitan: