Sadržaj:

LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812: 7 koraka
LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812: 7 koraka

Video: LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812: 7 koraka

Video: LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812: 7 koraka
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Prosinac
Anonim
LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812
LED svjetiljka za raspoloženje od 1 USD s ATtiny13 i WS2812

Autor arduinocelentanoSlijedi više od autora:

Osobni CalDAV poslužitelj na računalu s jednom pločom
Osobni CalDAV poslužitelj na računalu s jednom pločom
Osobni CalDAV poslužitelj na računalu s jednom pločom
Osobni CalDAV poslužitelj na računalu s jednom pločom
LCD Invaders: svemirski osvajači poput igre na LCD ekranu 16x2
LCD Invaders: svemirski osvajači poput igre na LCD ekranu 16x2
LCD Invaders: svemirski osvajači poput igre na LCD ekranu 16x2
LCD Invaders: svemirski osvajači poput igre na LCD ekranu 16x2
Octarine: Igra za usklađivanje boja s WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja s WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja s WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja s WS2812 RGB LED diodama

Ovo je jeftina svjetiljka za raspoloženje s četiri načina rada.

1. Iskra duge. Svjetlost se s vremena na vrijeme pomiče prema gore i postupno mijenja boju.

2. Dugin sjaj. Stabilan sjaj koji postupno mijenja boju.

3. Simulacija paljenja svijeća.

4. Isključeno.

Načine možete mijenjati dodirom na dodirnu tipku na vrhu. Trenutni način rada sprema se u memoriju EEPROM -a nakon isključivanja.

Koliko je ATtiny13 sićušan?

Ideja je bila dobiti maksimalne značajke od minimalnog hardvera, nešto složenije od automatiziranog prekidača ili termometra, projekta blizu ruba ovog malenog mikrokontrolera. Uostalom, ograničenja vas tjeraju na kreativno razmišljanje, zar ne? Pa, tako je izgledalo u početku.

Najizazovniji u ovom projektu bio je ugurati sav kôd u ATtiny13. Mikrokontroler ima 1K bajtova bljeskalice i samo 64 bajta RAM -a. Da, kad kažem "bajtovi", mislim na one koji se sastoje od osam bitova. 64 bajta za sve vaše lokalne varijable i hrpu poziva. Da bi bilo jasno, razmislite da moramo kontrolirati 8 RGB LED dioda. Svaki od njih definiran je s 3 bajta (po jedan za crveni, zeleni i plavi kanal). Dakle, samo za spremanje stanja 8 LED dioda, morat ćemo implementirati niz od 8 struktura po 3 bajta, a pokazivač na početak ovog niza trebao bi još jedan bajt. Dakle, 25 od 64 bajta je vani. Upravo smo iskoristili 39% RAM -a i još nismo započeli. Osim toga, za spremanje sedam osnovnih duginih boja trebat će vam 7 × 3 = 21 bajt, pa 72% RAM -a nema. Pa, što se tiče osnovnih boja, pretjerujem: ne trebaju nam sve odjednom u RAM -u i nikad se ne mijenjaju, pa se mogu implementirati kao stalni niz koji će se pohraniti u flash umjesto u RAM. U svakom slučaju, ostavlja opći dojam o korištenom hardveru.

Sjećajući se Knuthove izjave o prijevremenoj optimizaciji, počeo sam od prototipiranja tri načina rada lampe zasebno da vidim što se događa. Testirao sam ih zasebno kako bih se uvjerio da rade ispravno i da svaki odgovara mojem mikrokontroleru. Bilo je potrebno nekoliko večeri da se to postigne i sve je prošlo u najboljem redu … dok ih nisam pokušao sastaviti unutar izjave switch. uslužni program veličine avr prijavio je veličinu tekstualnog odjeljka od 1,5 Kb (sa -s zastavicom avr-gcc). U tom trenutku moja je prvotna namjera bila zgrabiti neki ATtiny25 s 2Kb bljeskalicom i to je mogao biti sretan kraj ove priče.

Ali nekako sam osjetio da bih nakon znatne optimizacije uspio taj usrani kôd smanjiti u 1 KB. Međutim, trebao je još tjedan dana da se shvati da je to nemoguće i još jedan tjedan da se to ipak postigne. Morao sam izrezati dugu na pet osnovnih boja (bez značajnih vizualnih razlika). Riješio sam se iskaza slučaja i upotrijebio lanac if-then-if za smanjenje veličine binarnog koda. Za animaciju vatre potreban je generator pseudo slučajnih brojeva koji je prilično glomazan, pa sam implementirao pojednostavljenu verziju LFSR -a s konstantnom početnom vrijednošću. Ne zanima me dužina cijelog ciklusa PRNG -a i samo tražim ravnotežu između veličine koda i "realne animacije vatre". Također sam implementirao mnogo manjih optimizacija kojih se trenutno ne mogu sjetiti, pa sam čak uspio sve načine rada osim vatre ubaciti u čip. Kad sam ostao bez ideja, moj ukupni kôd bio je oko 1200 bajtova.

Uzeo sam timeout i puno sam čitao o optimizaciji AVR koda. Bio sam blizu odustajanja i prepisivanja svega na asemblerskom jeziku, ali dao sam mu posljednju priliku. Tijekom konačne optimizacije, prerezao sam dugu na tri osnovne boje i natjerao druge da se računaju u hodu, pregledao sam sve i slijedio preporuke za optimizaciju AVR -a i na kraju …

avrdude: flash za pisanje (1004 bajta):

Pisanje | ################################################# | 100% 0,90s

Nema potrebe govoriti da sam za pohranu trenutnog načina rada koristio gotovo svu RAM memoriju i samo jedan bajt EEPROM -a. Ne impliciram da je ovo idealna i konačna implementacija. Samo radi i odgovara mikrokontroleru. Siguran sam da biste mogli bolje. Stvarno jesam. Samo želim podijeliti zabavu u rješavanju naizgled nepraktičnog problema koji na početku smatrate gotovo nemogućim. "Dakle, hakiranje znači istražiti granice mogućeg …" -Richard Stallman

Pribor:

1x ATINy13 MCU (0,28 USD = 0,24 USD za MCU u paketu SOP-8 i 0,04 USD za DIP8 adapter)

8x WS2812 RGB LED dioda (preporučujem ploču ili dio LED trake) (0,42 USD)

1x tipka na dodir TTP223 (0,10 USD)

1x mikro USB na DIP adapter (0,14 USD)

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

1x 100nF keramički kondenzator (<0,01 USD)

1x elektrolitski kondenzator 10–47µF (<0,01 USD)

Ukupno <0,97 USD

Korak 1: Postavljanje softvera

Postavljanje softvera
Postavljanje softvera

Trebat će vam avr-gcc lanac alata za sastavljanje izvornog koda i avrdude uslužni program za prijenos ROM-a mikrokontrolera. Postupak instalacije prilično je jednostavan i jasan, ali ovisi o vašem operacijskom sustavu. Ako koristite neku vrstu GNU -a/Linuxa, vjerojatno već imate odgovarajuće pakete u stablu spremišta. Izvorni kod ovog projekta možete preuzeti ovdje:

github.com/arduinocelentano/t13_ws2812_lamp

Trebat će vam i knjižnica light_ws2812:

github.com/cpldcpu/light_ws2812

Nakon što dobijete avr-gcc lanac alata i izvore projekata, pokrenite svoj terminal i upišite sljedeći kod:

cd put/do/projekta

napraviti

Korak 2: Programiranje mikrokontrolera

Programiranje mikrokontrolera
Programiranje mikrokontrolera
Programiranje mikrokontrolera
Programiranje mikrokontrolera
Programiranje mikrokontrolera
Programiranje mikrokontrolera

Ako imate neku vrstu USBASP programatora, samo ga spojite na Attiny prema ispisu. Obično bi to izgledalo ovako, ali toplo preporučujem da provjerite svoj stvarni pinout!

Alternativno, možete koristiti Arduino ploču kao programer. Otvorite Arduino IDE i pronađite primjer davatelja internetskih usluga Arduino u izborniku "Datoteka → Primjeri". Nakon što prenesete skicu, vaša Arduino ploča djeluje kao programer. Komentari u kodu skice dali bi vam trag za identifikaciju.

Sada trči

napravi bljesak

za bljeskanje MCU -a i

napraviti osigurač

za postavljanje bitova osigurača.

Preporučeni: