Sadržaj:

Fancy LED šešir: 5 koraka (sa slikama)
Fancy LED šešir: 5 koraka (sa slikama)

Video: Fancy LED šešir: 5 koraka (sa slikama)

Video: Fancy LED šešir: 5 koraka (sa slikama)
Video: Калина красная (4К, драма, реж. Василий Шукшин, 1973 г.) 2024, Studeni
Anonim
Image
Image
Fancy LED šešir
Fancy LED šešir

Oduvijek sam želio raditi Arduino projekt, ali nikad nisam imao sjajnih ideja za to sve dok moja obitelj nije bila pozvana na otmjenu zabavu sa šeširima. S dva tjedna vremena bio sam znatiželjan mogu li planirati i izvesti šešir LED animacije osjetljiv na pokrete. Ispostavilo se da mogu! Vjerojatno sam malo pretjerao, ali ukupni projekt koštao je oko 80 USD. Uz eksperimentiranje i malo kodiranja mogli biste to učiniti za manje.

Cilj sa šeširom bio je sljedeći:

  1. Neka se svjetla pomaknu sa središnje strane šešira prema stražnjoj strani, po jedno svjetlo sa svake strane
  2. Promijenite brzinu kretanja svjetla koju diktira nagib šešira sprijeda prema natrag
  3. Dopustite svjetlima da se okreću unatrag kada je traka šešira nagnuta prema dolje (tj. Oponaša učinak gravitacije na svjetla)
  4. Promijenite boju na temelju nagiba šešira slijeva nadesno
  5. Osjetite šokove i pokažite poseban efekt
  6. Osjetite kako se nosilac vrti i pokažite poseban efekt
  7. Neka ga potpuno sadrži u šeširu

Korak 1: Potrebni dijelovi

Potrebni dijelovi
Potrebni dijelovi
Potrebni dijelovi
Potrebni dijelovi
Potrebni dijelovi
Potrebni dijelovi

Koristio sam sljedeće glavne komponente (uključene su i veze koje nisu povezane s Amazonom):

  • Teensy LC mikrokontroler - odabrao sam ovo umjesto običnog Arduina zbog njegove male veličine, koji ima posebnu vezu za upravljanje LED diodama, kao i snažnu podršku knjižnice i zajednice.
  • Bosch pozicijski senzor zasnovan na BNO055 - iskreno jedan od prvih na kojima sam našao dokumentaciju. Postoje mnogo jeftinije opcije, no kad shvatite Bosch, to vam čini mnogo toga što biste inače morali učiniti u kodu
  • WS2812 adresabilna LED traka - odabrao sam duljinu od 1 metra sa 144 LED diode po metru. Takva gustoća pomaže svjetlu da više izgleda kao da se kreće, umjesto da pojedini elementi svijetle u nizu.

I sljedeće manje komponente:

  • Šešir - svaki šešir s trakom za glavu će biti dovoljan. Ovo je šešir od 6 USD iz lokalne trgovine. Ako ima šav straga, bit će lakše provesti ožičenje. Obratite pažnju na to je li ljepljena traka za šešir jer će to također uzrokovati dodatne poteškoće. Ovaj je sašiven po vrhu, ali se dno lako podiže.
  • 4.7K ohmski otpornici
  • 3x AAA kućište baterije - pomoću 3 AAA baterije izlaz daje napon točno u rasponu koji elektronika želi, što pojednostavljuje stvari. AAA se lakše uklapa u šešir od AA i još uvijek ima izvrsno vrijeme izvođenja.
  • Žica malog kolosijeka - Koristio sam neku čvrstu žicu koju sam položio iz prethodnog LED projekta.
  • Lemilica i lemljenje
  • Neki spandex koji odgovara unutrašnjoj boji šešira i konca

Predloženo, ali izborno:

  • Brzi priključci za žice akumulatora
  • Pomoću alata Hands Hands, ove su stvari vrlo male i teško ih je lemiti

Korak 2: Izmijenite šešir

Izmijenite šešir
Izmijenite šešir
Izmijenite šešir
Izmijenite šešir
Izmijenite šešir
Izmijenite šešir
Izmijenite šešir
Izmijenite šešir

Trebat će vam mjesto u šeširu za postavljanje elektronike i mjesto za bateriju. Supruga se profesionalno bavi odjećom, pa sam je zamolio za savjet i pomoć. Na kraju smo stvorili dva džepa sa spandeksom. Prvi manji džep prema naprijed usmjeren je poput samog šešira, tako da se nakon instaliranja elektronike pozicijski senzor prilično dobro drži na mjestu, no može se lako ukloniti ako je potrebno. Drugi džep straga drži bateriju na mjestu.

Džepovi su bili zasijani koncem koji je odgovarao boji šešira, a svi su bili dugački. Ovisno o stilu šešira i materijala, izrađen je od YMMV -a ovom tehnikom.

Također smo otkrili da se traka za šešir uvlači u sebe s jedne strane, a na tom je mjestu u potpunosti prišivena za šešir. Morali smo ukloniti izvorni šav kako bismo LED diode pokrenuli ispod trake. Tijekom gradnje držana je iglama, a zatim je sašivena odgovarajućim koncem kada je završena.

Na kraju smo otvorili šav na stražnjoj strani šešira gdje ga prekriva traka. Provukli smo žičani kabelski svežanj koji je došao s LED diodama kroz taj šav i obložio prvu LED diodu u traci koja se nalazi točno na šavu. Zatim smo omotale LED diode oko šešira i odrezale traku tako da posljednja LED bude tik uz prvu. LED traka može se držati na mjestu samo s trakom za šešir, međutim, ovisno o vašem pojasu i materijalu, možda ćete morati pričvrstiti LED diode šivanjem ili lijepljenjem.

Korak 3: Povežite ga

Ožičite to
Ožičite to

Teensy ploča i LED diode radit će za napajanje od 3.3v do 5v. Zato sam se odlučio za korištenje 3 AAA baterije, izlazni napon od 4,5v je lijepo u tom rasponu, a oni imaju dovoljno vremena rada za način na koji sam programirao LED diode za rad. Trebali biste biti u mogućnosti izdržati više od 8 sati rada.

Ožičenje napajanja

Ožičio sam pozitivne i negativne vodiče iz kutije za baterije i LED dioda, a zatim lemio na Teensy na odgovarajućim mjestima. Pozitivnu bateriju potrebno je spojiti na gornji desni pin Teensyja na dijagramu (označen Vin na ploči), a negativni se može spojiti na bilo koji pin označen kao GND. Prikladno je da se nalazi jedan izravno na suprotnoj strani ploče, ili tik uz Vin pin. Potpuni dijagram iscrtavanja ploče nalazi se na dnu ove stranice. U nekim slučajevima, papirna kopija je uključena kada naručite ploču.

Ako planirate pokrenuti kôd koji ima uključeno samo nekoliko LED dioda u isto vrijeme, možete napajati LED diode iz samog Teensyja, koristeći izlaz od 3,3 V i GND, no ako pokušate izvući previše energije, možete oštetiti ploču. Stoga, kako biste sebi dali najviše mogućnosti, najbolje je da LED diode priključite izravno na izvor baterije.

Ožičenje LED dioda

Za ovaj projekt odabrao sam Teensy LC jer ima pin koji znatno olakšava povezivanje adresabilnih LED dioda. Na dnu ploče igla koja je druga od lijevog ogledala Pin #17, ali također ima 3.3v na sebi. To se naziva povlačenjem, a na drugim pločama morate priključiti otpornik da biste osigurali taj napon. U slučaju Teensy LC -a, možete jednostavno spojiti žicu s tog pina ravno na podatkovnu žicu LED dioda.

Ožičenje senzora položaja

Neke od dostupnih ploča BNO055 mnogo su strožije po naponu i žele samo 3.3V. Zbog toga sam spojio Vin na ploču BNO055 s namjenskog izlaza od 3,3 V na Teensyju, što je treći pin dolje desno. Zatim možete spojiti GND na BNO055 na bilo koji GND na Teensyju.

Senzor položaja BNO055 koristi I2c za razgovor s Teensyjem. I2c zahtijeva pull-upove, pa sam spojio dva otpornika od 4,7K ohma sa 3,3v izlaza na Teensyju na pinove 18 i 19. Zatim sam spojio pin 19 na SCL pin na ploči BNO055, a 18 na SDA pin.

Savjeti/trikovi za ožičenje

Za ovaj projekt koristila sam čvrstu žicu, a ne nasukanu. Jedna prednost čvrste žice je lemljenje na ovakve prototipne ploče. Možete skinuti žicu, saviti je za 90 stupnjeva i umetnuti je kroz dno jednog od priključaka tako da odrezani kraj žice strši iznad vaše ploče. Tada vam je potrebna samo mala količina lemljenja da biste ga držali na terminalu, a višak možete jednostavno odrezati.

Čvrsta žica može biti teža za rad jer teži da ostane savijena. Međutim, za ovaj projekt to je bila prednost. Prerezao sam i oblikovao svoje žice na takav način da je orijentacija pozicijskog senzora bila dosljedna dok sam umetao i vadio elektroniku iz šešira za dotjerivanje i programiranje.

Korak 4: Programiranje

Sada kada je sve sastavljeno, trebat će vam Arduino kompatibilan programski alat. Koristio sam stvarni Arduino IDE (radi s Linuxom, Mac -om i računalom). Također će vam trebati softver Teensyduino za povezivanje s Teensy pločom. Ovaj projekt u velikoj mjeri koristi FastLED knjižnicu za programiranje boja i položaja LED dioda.

Kalibriranje

Prvo što ćete htjeti učiniti je otići u odlično GitHub spremište Krisa Winnera za BNO055 i preuzeti njegovu skicu BNO_055_Nano_Basic_AHRS_t3.ino. Instalirajte taj kôd dok je serijski monitor pokrenut i reći će vam je li ploča BNO055 ispravno uključena i prolazi li samotestiranje. Također će vas provesti kroz kalibriranje BNO055, što će vam kasnije dati dosljednije rezultate.

Početak rada sa Fancy LED skicom

Kôd za Fancy LED šešir posebno je priložen, a također i na mom GitHub spremištu. Planiram napraviti dodatne prilagodbe koda i oni će biti objavljeni na GitHub repo -u. Datoteka ovdje odražava kôd kada je ovaj Instructable objavljen. Nakon preuzimanja i otvaranja skice, potrebno je promijeniti nekoliko stvari. Većina važnih vrijednosti koje treba promijeniti su na samom vrhu kao #define izjave:

Redak 24: #define NUM_LEDS 89 - promijenite ovo u stvarni broj LED dioda na LED traci

Red 28: #define SERIAL_DEBUG false - vjerojatno ćete to htjeti učiniti istinitim, tako da možete vidjeti izlaz na serijskom monitoru

Kôd za otkrivanje položaja

Otkrivanje položaja i većina vaših dotjerivanja započinje na retku 742, a prolazi kroz 802. Dobivamo podatke Pitch, Roll i Yaw od senzora položaja i pomoću njih postavljamo vrijednosti. Ovisno o tome kako je vaša elektronika montirana, možda ćete ih morati promijeniti. Ako senzor položaja postavite s čipom prema vrhu šešira, a strelica pored X ispisana na ploči usmjerena prema prednjem dijelu šešira, trebali biste vidjeti sljedeće:

  • Pitch kima glavom
  • Roll naginje glavu, npr. dodirnite uho ramenom
  • Jau u kojem smjeru. s kojim ste okrenuti (sjever, zapad itd.).

Ako je vaša ploča postavljena u drugom smjeru, morat ćete zamijeniti Pitch/Roll/Yaw kako bi se ponašali kako želite.

Za prilagodbu postavki role možete promijeniti sljedeće #define vrijednosti:

  • ROLLOFFSET: sa stabilnim šeširom i centriranim što može biti, ako Roll nije 0, promijenite ovo za razliku. Tj. ako vidite Roll na -20 kad vam je šešir centriran, učinite ovo 20.
  • ROLLMAX: najveća vrijednost za mjerenje valjaka. Najjednostavnije je pronaći nošenjem šešira i pomicanjem desnog uha prema desnom ramenu. Za to će vam trebati dugi USB kabel dok koristite serijski monitor.
  • ROLLMIN: najniža vrijednost za mjerenje valjanja, za naginjanje glave ulijevo

Slično, za Pitch:

  • MAXPITCH - najveća vrijednost kada gledate prema gore
  • MINPITCH - minimalna vrijednost kada gledate prema dolje
  • PITCHCENTER - vrijednost tona kad gledate ravno naprijed

Ako postavite SERIALDEBUG na true na vrhu datoteke, trebali biste vidjeti trenutne vrijednosti za Roll/Pitch/Yaw izlaz na serijskom monitoru kako biste lakše prilagodili ove vrijednosti.

Ostale parametre koje želite promijeniti

  • MAX_LED_DELAY 35 - najsporije da se LED čestica može pomicati. Ovo je u milisekundama. To je kašnjenje prelaska s jedne LED na drugu u nizu.
  • MIN_LED_DELAY 10 - post koji se LED čestica može pomicati. Kao što je gore navedeno u milisekundama.

Zaključak

Ako ste otišli tako daleko, trebali biste imati potpuno funkcionalan i zabavan LED šešir! Ako želite učiniti više s tim, sljedeća stranica sadrži neke napredne informacije o promjeni postavki i obavljanju vlastitih stvari. kao i neko objašnjenje što radi ostatak mog koda.

Korak 5: Napredno i izborno: Unutar koda

Otkrivanje udara i centrifuge

Otkrivanje udara/vrtnje vrši se pomoću funkcija senzora visokog G na BNO055. Osjetljivost možete prilagoditi sljedećim redovima u initBNO055 ():

  • Redak 316: BNO055_ACC_HG_DURATION - koliko događaj mora trajati
  • Redak 317: BNO055_ACC_HG_THRESH - koliko težak treba biti utjecaj
  • Redak 319: BNO055_GYR_HR_Z_SET - prag brzine vrtnje
  • Redak 320: BNO055_GYR_DUR_Z - koliko rotacija uopće mora trajati

Obje su vrijednosti 8 -bitne binarne, trenutačno je utjecaj postavljen na B11000000, što je 192 od 255.

Kada se otkrije udar ili vrtnja, BNO055 postavlja vrijednost koju kôd traži odmah na početku petlje:

// Otkrivanje bilo kakvih prekida koji se aktiviraju, tj. Zbog visokog G bajta intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {utjecaj (); } else if (intStatus> 0) {spin (); }

Potražite gornju liniju void impact () u kodu za promjenu ponašanja pri udarcu ili void spin () za promjenu ponašanja centrifuge.

Pomagači

Napravio sam jednostavnu pomoćnu funkciju (void setAllLeds ()) za brzo postavljanje svih LED dioda u jednu boju. Njima se svi isključuju:

setAllLeds (CRGB:: Crno);

Ili možete odabrati bilo koju boju prepoznatu od FastLED biblioteke:

setAllLeds (CRGB:: Crveno);

Tu je i funkcija fadeAllLeds () koja će zatamniti sve LED diode za 25%.

Klasa čestica

Kako bih uvelike pojednostavio ožičenje, htio sam koristiti jedan niz LED dioda, ali da se ponašaju kao više žica. Budući da je ovo bio moj prvi pokušaj, želio sam ga držati što jednostavnijim, pa jedan niz tretiram kao dva, pri čemu će biti dio srednjih LED dioda. Budući da možemo imati paran ili neparan broj, moramo to uzeti u obzir. Počinjem s nekim globalnim varijablama:

/ * * Varijabla i spremnici za LED diode */ CRGB LED diode [NUM_LEDS]; statički nepotpisani int curLedDelay = MAX_LED_DELAY; statički int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; statička bool česticaDir = 1; statička bool brzinaDir = 1; nepotpisani dugi dirCount; unsigned long hueCount;

I neki kod u setup ():

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

Ako imamo neparne brojeve, želimo koristiti 1/2 točku kao sredinu, inače želimo 1/2 točku - 1. To je lako vidjeti s 10 ili 11 LED dioda:

  • 11 LED dioda: 11/2 s cijelim brojevima treba procijeniti na 5. a računala broje od 0. Dakle, 0 - 4 je jedna polovica, 6 - 10 je druga polovica, a 5 je između njih. U ovom slučaju tretiramo #5 kao da je dio oba, tj. #1 je za oba virtualna niza LED -a
  • 10 LED dioda: 10/2 je 5. No, budući da računala broje od 0, moramo ukloniti jednu. Zatim imamo 0 - 4 za jednu polovicu, a 5 - 9 za drugu polovicu. #1 za prvi virtualni niz bit će 4, a #1 za drugi virtualni niz bit će #5.

Zatim u kodu čestica moramo odbrojati od našeg ukupnog položaja do stvarnih položaja na LED nizu:

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

Kôd također ima uvjete u kojima čestica može promijeniti smjer pa moramo to uzeti u obzir i:

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

Stoga koristimo predviđeni smjer (particleDir) da izračunamo koja bi LED dioda trebala biti upaljena sljedeća, ali također moramo uzeti u obzir jesmo li došli do stvarnog kraja LED niza ili naše središnje točke, koja također djeluje kao kraj za svaki od virtualnih nizova.

Nakon što smo sve to shvatili, po potrebi palimo sljedeće svjetlo:

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 diode [Pos1] = CHSV (currHue, 255, 255); LED diode [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Zašto ovo uopće činiti razredom? Ovako je, ovo je prilično jednostavno i ne mora biti u klasi. Međutim, u budućnosti planiram ažurirati kôd kako bi se omogućilo pojavljivanje više od jedne čestice odjednom, a neki bi trebali raditi obrnuto, dok drugi idu naprijed. Mislim da postoje neke zaista velike mogućnosti za detekciju spina pomoću više čestica.

Preporučeni: