Fancy LED šešir: 5 koraka (sa slikama)
Fancy LED šešir: 5 koraka (sa slikama)
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 pozvana na otmjenu zabavu sa šeširima. S rokom isporuke od dvije sedmice, zanimalo me je mogu li i 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 to biste mogli učiniti za manje.

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

  1. Neka se svjetla pomaknu sa središnje strane šešira prema natrag, po jedno svjetlo sa svake strane
  2. Promijenite brzinu kretanja svjetlosti 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šajte utjecaj gravitacije na svjetla)
  4. Promijenite boju na osnovu nagiba šešira slijeva nadesno
  5. Osetite šokove i prikažite poseban efekat
  6. Osetite kako se nosilac vrti i prikažite poseban efekat
  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 nepovezane Amazon veze):

  • Teensy LC mikrokontroler - odabrao sam ovo umjesto običnog Arduina zbog njegove male veličine, koji ima posebnu vezu za kontrolu LED dioda, kao i snažnu podršku biblioteke i zajednice.
  • Bosch pozicijski senzor zasnovan na BNO055 - iskreno jedan od prvih na kojima sam našao dokumentaciju. Postoje mnogo jeftinije opcije, međutim kada shvatite Bosch, to vam čini mnogo toga što biste inače morali učiniti u kodu
  • WS2812 adresabilna LED traka - odabrao sam dužinu 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 pojedinačni elementi svijetle u nizu.

I sljedeće manje komponente:

  • Šešir - svaki šešir sa trakom za glavu će odgovarati. 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 ako je ljepljiva traka zalijepljena jer će to uzrokovati i dodatne poteškoće. Ovaj je ušiven po vrhu, ali se dno lako podiže.
  • 4.7K ohmski otpornici
  • 3x AAA kućište za baterije - pomoću 3 AAA baterije izlaz napona je točno u rasponu koji elektronika želi, što pojednostavljuje stvari. AAA se lakše uklapa u šešir od AA i još uvijek ima odlično 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 konektori 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. Moja supruga profesionalno radi s 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, ali se može lako ukloniti ako je potrebno. Drugi džep straga je za držanje baterije na mjestu.

Džepovi su bili posejani 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 i da je na tom mjestu u potpunosti prišivena za šešir. Morali smo ukloniti originalni šav kako bismo LED diode pokrenuli ispod trake. Tokom izgradnje držana je na mestu pomoću igala, 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 poredali prvu LED diodu u traci koja se nalazi točno na šavu. Zatim smo omotali LED diode oko šešira i odrezali traku tako da posljednja LED bude tik uz prvu. LED traka se može držati na mjestu samo s trakom za šešir, međutim, ovisno o vašoj traci 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 će raditi 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 sam lemio na Teensy na odgovarajućim mjestima. Pozitivnu bateriju potrebno je spojiti na gornji desni pin Teensy -a na dijagramu (označen Vin na ploči), a negativan se može spojiti na bilo koji pin označen sa GND. Prikladno je da se nalazi jedan direktno 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 odjednom, možete napajati LED diode iz samog Teensyja, koristeći izlaz od 3,3 V i GND, međutim 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 direktno 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 je pin koji je drugi od lijevog ogledala Pin #17, ali takođe 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 samo 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 sa 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 povezivanje, 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 izradu ovog projekta koristio sam čvrstu žicu umjesto nasukanih. 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 lema da biste ga pričvrstili za terminal, a višak možete jednostavno odrezati.

Sa čvrstom žicom može biti teže raditi 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 sa š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 sa Linux, Mac i PC). Trebat će vam i softver Teensyduino za povezivanje s Teensy pločom. Ovaj projekt u velikoj mjeri koristi FastLED biblioteku za programiranje boja i položaja LED dioda.

Kalibracija

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

Početak rada sa Fancy LED skicom

Kod za Fancy LED šešir posebno je priložen, a takođe 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:

Red 24: #define NUM_LEDS 89 - promijenite ovo na stvarni broj LED dioda na vašoj LED traci

Red 28: #define SERIAL_DEBUG false - vjerovatno ćete htjeti ovo 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 prilagodbi započinje na liniji 742, a prolazi kroz 802. Dobijamo podatke o visini tona, zaokretu i zakretu 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
  • U kojem smjeru je zavijanje. sa kojim ste okrenuti (sjever, zapad itd.).

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

Da biste prilagodili postavke 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 kada vam je šešir centriran, učinite ovo 20.
  • ROLLMAX: najveća vrijednost za mjerenje valjaka. Najlakše ćete pronaći nošenjem šešira i pomicanjem desnog uha prema desnom ramenu. Za to će vam trebati dugačak USB kabel dok koristite serijski monitor.
  • ROLLMIN: najniža vrijednost za mjerenje valjanja, za vrijeme naginjanja glave ulijevo

Slično, za Pitch:

  • MAXPITCH - maksimalna vrijednost kada gledate prema gore
  • MINPITCH - minimalna vrijednost kada gledate prema dolje
  • PITCHCENTER - vrijednost koraka kada 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 možda želite promijeniti

  • MAX_LED_DELAY 35 - najsporije što se LED čestica može kretati. Ovo je u milisekundama. To je kašnjenje prelaska s jedne LED na drugu u nizu.
  • MIN_LED_DELAY 10 - posti se da se LED čestica može pomicati. Kao i gore, to je 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 šta radi ostatak mog koda.

Korak 5: Napredno i izborno: Unutar koda

Otkrivanje udara i centrifuge

Otkrivanje udara/okretanja vrši se pomoću funkcija senzora visokog G na BNO055. Osetljivost možete podesiti sledećim redovima u initBNO055 ():

  • Red #316: BNO055_ACC_HG_DURATION - koliko događaj mora trajati
  • Red #317: BNO055_ACC_HG_THRESH - koliko jak uticaj treba biti
  • Red #319: BNO055_GYR_HR_Z_SET - prag brzine rotacije
  • Red #320: BNO055_GYR_DUR_Z - koliko rotacija uopće mora trajati

Obje vrijednosti su 8 -bitne binarne, trenutno 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 pokrenutih, 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 udaru ili void spin () za promjenu ponašanja okretanja.

Pomoćnici

Napravio sam jednostavnu pomoćnu funkciju (void setAllLeds ()) za brzo postavljanje svih LED dioda u jednu boju. Pomoću njih možete ih sve isključiti:

setAllLeds (CRGB:: Crno);

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

setAllLeds (CRGB:: Crveno);

Postoji 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 mi je ovo bio prvi pokušaj, želio sam to učiniti što je moguće jednostavnijim, pa jedan niz tretiram kao dva, pri čemu će srednja LED dioda biti dio. Budući da možemo imati paran ili neparan broj, moramo to uzeti u obzir. Počinjem s nekim globalnim varijablama:

/ * * Varijabla i kontejneri za LED diode */ CRGB LED diode [NUM_LEDS]; statički nepotpisani int curLedDelay = MAX_LED_DELAY; statički int centerLed = NUM_LEDS / 2; statički int maxLedPos = NUM_LEDS / 2; statički 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čunari broje od 0. Dakle, 0 - 4 je jedna polovina, 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čunari 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 našem kodu čestica moramo odbrojati od naše ukupne pozicije do stvarnih pozicija 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--; }}

Zato koristimo predviđeni smjer (particleDir) da izračunamo koja LED dioda bi trebala biti sljedeća upaljena, 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.

Kad sve to shvatimo, 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 zaista biti u klasi. Međutim, u budućnosti imam planove za ažuriranje koda kako bi se omogućilo pojavljivanje više od jedne čestice odjednom, a neke bi mogle raditi obrnuto, dok druge idu naprijed. Mislim da postoje neke zaista velike mogućnosti za detekciju spina pomoću više čestica.