Cuprins:

O lampă LED de 1 USD, cu ATtiny13 și WS2812: 7 pași
O lampă LED de 1 USD, cu ATtiny13 și WS2812: 7 pași

Video: O lampă LED de 1 USD, cu ATtiny13 și WS2812: 7 pași

Video: O lampă LED de 1 USD, cu ATtiny13 și WS2812: 7 pași
Video: Flashlight with AVR AtTiny13 2024, Noiembrie
Anonim
O lampă LED Mood de 1 USD cu ATtiny13 și WS2812
O lampă LED Mood de 1 USD cu ATtiny13 și WS2812

De arduinocelentano Urmăriți mai multe de la autor:

Server CalDAV personal pe un computer cu o singură placă
Server CalDAV personal pe un computer cu o singură placă
Server CalDAV personal pe un computer cu o singură placă
Server CalDAV personal pe un computer cu o singură placă
LCD Invaders: un Space Invaders Like Game pe ecran LCD de caractere 16x2
LCD Invaders: un Space Invaders Like Game pe ecran LCD de caractere 16x2
LCD Invaders: un Space Invaders Like Game pe ecran LCD de caractere 16x2
LCD Invaders: un Space Invaders Like Game pe ecran LCD de caractere 16x2
Octarine: un joc de potrivire a culorilor cu LED-uri RGB WS2812
Octarine: un joc de potrivire a culorilor cu LED-uri RGB WS2812
Octarine: un joc de potrivire a culorilor cu LED-uri RGB WS2812
Octarine: un joc de potrivire a culorilor cu LED-uri RGB WS2812

Aceasta este o lampă de dispoziție low-cost cu patru moduri.

1. Scânteie curcubeu. O scânteie de lumină se mișcă în sus de fiecare dată și schimbă treptat culoarea.

2. Strălucire curcubeu. O strălucire stabilă care schimbă treptat culoarea.

3. Simularea focului de lumânare.

4. Dezactivat.

Puteți schimba modurile atingând un buton tactil din partea de sus. Modul curent este salvat în memoria EEPROM după oprire.

Cât de mic este ATtiny13?

Ideea a fost de a obține caracteristici maxime de la hardware minim, ceva mai complex decât comutatorul automat sau termometrul, un proiect aproape de marginea acestui mic microcontroler. La urma urmei, restricțiile te fac să crezi creativ, nu? Ei bine, la început arăta așa.

Cea mai provocatoare din acest proiect a fost să introducă tot codul în ATtiny13. Microcontrolerul are 1K octeți bliț și doar 64 octeți RAM. Da, când spun „octeți”, mă refer la cei constând din opt biți. 64 de octeți pentru toate variabilele locale și stiva de apeluri. Pentru a clarifica, considerați că trebuie să controlăm 8 LED-uri RGB. Fiecare dintre ele este definit de 3 octeți (unul pentru canalul roșu, verde și respectiv albastru). Deci, doar pentru a stoca starea a 8 LED-uri, va trebui să implementăm o matrice de 8 structuri de câte 3 octeți și un pointer la începutul acestei matrice ar mai lua un octet. Astfel, 25 din 64 de octeți sunt în afara. Tocmai am folosit 39% din RAM și încă nu am început. În plus, pentru a stoca șapte culori de curcubeu de bază, veți avea nevoie de 7 × 3 = 21 octeți, astfel încât 72% din RAM sunt scoase. Ei bine, în ceea ce privește culorile de bază, exagerez: nu avem nevoie de toate în același timp în RAM și ele nu se schimbă niciodată, așa că pot fi implementate ca o matrice constantă pentru a fi stocate în flash în loc de RAM. Oricum, oferă o impresie generală despre hardware-ul folosit.

Amintindu-mi afirmația lui Knuth despre optimizarea prematură, am început să fac prototipuri pentru trei moduri de lampă separat pentru a vedea ce se întâmplă. Le-am testat separat pentru a mă asigura că funcționează corect și că fiecare se potrivește cu microcontrolerul meu. A fost nevoie de câteva seri pentru a-l realiza și totul a mers bine … până când am încercat să le pun împreună în declarația switch. utilitarul avr-size a raportat o dimensiune a secțiunii de text de 1,5 Kb (cu steagul -s al avr-gcc). În acel moment, intenția mea inițială era să iau niște ATtiny25 cu bliț de 2 KB și acesta ar fi putut fi sfârșitul fericit al acestei povești.

Dar cumva am simțit că, după o optimizare considerabilă, am reușit să micșorez codul ăla în 1Kb. Cu toate acestea, a durat încă o săptămână pentru a realiza că este imposibil și încă o săptămână pentru a-l realiza. A trebuit să tai un curcubeu la cinci culori de bază (fără diferențe vizuale semnificative). Am scăpat de declarațiile de caz și am folosit un lanț de if-then-if pentru a reduce dimensiunea codului binar. Animația de foc are nevoie de un generator de numere pseudorandom, care este destul de voluminoasă, așa că am implementat o versiune simplificată a LFSR cu valoare inițială constantă. Nu-mi pasă de durata completă a ciclului PRNG și căut doar un echilibru de coborâre între dimensiunea codului și „animație realistă de foc”. Am implementat, de asemenea, o mulțime de optimizări minore pe care nu mi le amintesc chiar acum și chiar am reușit să blochez toate modurile, în afară de focul în cip. Când am rămas fără idei, codul meu total era de aproximativ 1200 de octeți.

Mi-am luat timeout și citisem multe despre optimizarea codului AVR. Eram aproape să renunț și să rescriu totul în limbaj de asamblare, dar i-am dat ultima șansă. În cursa finală de optimizare, am tăiat un curcubeu în trei culori de bază și am făcut ca altele să fie calculate din mers, am inspectat totul și am urmat recomandările de optimizare AVR și, în cele din urmă …

avrdude: scriere flash (1004 octeți):

Scrierea | ###################################################### | 100% 0,90

Nu este necesar să spunem că am folosit aproape toată memoria RAM și doar un octet de EEPROM pentru a stoca modul curent. Nu implic că aceasta este o implementare ideală și finală. Doar funcționează și se potrivește microcontrolerului. Sunt sigur că ai putea să o faci mai bine. Chiar sunt. Vreau doar să împărtășesc distracția de a rezolva o problemă aparent impracticabilă pe care o considerați aproape imposibilă la început. „Astfel, hacking înseamnă explorarea limitelor a ceea ce este posibil …” - Richard Stallman.

Provizii:

1x ATtiny13 MCU (0,28 USD = 0,24 USD pentru MCU în pachetul SOP-8 și 0,04 USD pentru adaptorul DIP8)

8 LED-uri RGB WS2812 (recomand o placă sau o bucată de bandă LED) (0,42 USD)

1x buton tactil TTP223 (0,10 USD)

1x adaptor Micro USB la DIP (0,14 USD)

1x rezistor de 10kΩ (<0,01 USD)

1x condensator ceramic 100nF (<0,01 USD)

1x condensator electrolitic 10–47µF (<0,01 USD)

Total <0,97 USD

Pasul 1: Configurare software

Configurare software
Configurare software

Veți avea nevoie de lanțul de instrumente avr-gcc pentru compilarea codului sursă și utilitarul avrdude pentru încărcarea ROM-ului microcontrolerului. Procesul de instalare este destul de simplu și simplu, dar depinde de sistemul de operare. Dacă utilizați un fel de GNU / Linux, probabil că aveți deja pachete adecvate în arborele depozitului. Codul sursă al acestui proiect poate fi descărcat de aici:

github.com/arduinocelentano/t13_ws2812_lamp

De asemenea, veți avea nevoie de o bibliotecă light_ws2812:

github.com/cpldcpu/light_ws2812

După ce ați obținut avr-gcc toolchain și surse de proiect, rulați terminalul și tastați următorul cod:

calea cd / către / proiect

face

Pasul 2: Programarea microcontrolerului

Programarea microcontrolerului
Programarea microcontrolerului
Programarea microcontrolerului
Programarea microcontrolerului
Programarea microcontrolerului
Programarea microcontrolerului

Dacă aveți un fel de programator USBASP, conectați-l la Attiny în funcție de pinout-ul său. De obicei, ar arăta așa, dar vă recomand cu tărie să verificați pinout-ul dvs. real!

Alternativ, puteți utiliza o placă Arduino ca programator. Deschideți Arduino IDE și găsiți exemplul Arduino ISP în meniul „Fișier → Exemple”. După încărcarea schiței, placa dvs. Arduino acționează ca un programator. Comentariile din codul de schiță vă vor oferi un indiciu de identificare.

Acum fugi

face flash

pentru a clipi MCU și

face siguranță

pentru a seta biți de siguranță.

Recomandat: