Sadržaj:

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

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

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

Autor arduinocelentanoSledi Još autora:

Lični CalDAV server na računaru sa jednom pločom
Lični CalDAV server na računaru sa jednom pločom
Lični CalDAV server na računaru sa jednom pločom
Lični CalDAV server na računaru sa 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 sa WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja sa WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja sa WS2812 RGB LED diodama
Octarine: Igra za usklađivanje boja sa WS2812 RGB LED diodama

Ovo je jeftina lampa za raspoloženje sa četiri načina rada.

1. Dugina iskra. Iskra svjetlosti se s vremena na vrijeme pomiče prema gore i postepeno mijenja boju.

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

3. Simulacija paljenja svijeća.

4. Isključeno.

Možete promijeniti način dodirivanjem dodirnog gumba na vrhu. Trenutni način rada pohranjuje se u memoriju EEPROM -a nakon isključivanja.

Koliko je ATtiny13 sićušan?

Ideja je bila da se maksimalne karakteristike dobiju iz minimalnog hardvera, nešto složenije od automatiziranog prekidača ili termometra, projekta blizu ruba ovog malenog mikrokontrolera. Uostalom, ograničenja vas tjeraju da razmišljate kreativno, zar ne? Pa, tako je izgledalo na početku.

Najizazovniji u ovom projektu bio je ugurati sav kôd u ATtiny13. Mikrokontroler ima 1K bajtova fleša i samo 64 bajta RAM -a. Da, kad kažem „bajtovi“, mislim na one koji se sastoje od osam bitova. 64 bajta za za sve vaše lokalne varijable i stek 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 će uzeti 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, tako da 72% RAM -a nema. Pa, što se tiče osnovnih boja, pretjerujem: ne trebaju nam sve odjednom u RAM -u i nikada se ne mijenjaju, pa se mogu implementirati kao konstantan niz koji se pohranjuje u flash umjesto u RAM. U svakom slučaju, ostavlja opći dojam o korištenom hardveru.

Prisjećajući se Knuthove izjave o prijevremenoj optimizaciji, krenuo 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 … sve dok ih nisam pokušao sastaviti unutar naredbe 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 mi je prvobitna namjera bila da uzmem ATtiny25 sa 2Kb blicem i to je mogao biti sretan kraj ove priče.

Ali nekako sam osjetio da ću nakon znatne optimizacije uspjeti taj usrani kôd smanjiti u 1 KB. Međutim, trebala je još jedna sedmica da se shvati da je to nemoguće i još jedna sedmica da se to ipak ostvari. Morao sam izrezati dugu na pet osnovnih boja (bez značajnih vizualnih razlika). Riješio sam se izjava o slučaju 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 sa 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đe sam implementirao mnogo manjih optimizacija kojih se trenutno ne mogu sjetiti, pa sam čak uspio prebaciti sve načine osim vatre 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, presjekao 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: blic za pisanje (1004 bajta):

Pisanje | ################################################# | 100% 0.90s

Nema potrebe reći 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 krajnja implementacija. Samo radi i odgovara mikrokontroleru. Siguran sam da biste mogli bolje. Zaista 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živanje granica mogućeg …" -Ričard Stalman.

Potrošni materijal:

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 komad LED trake) (0,42 USD)

1x TTP223 Dodirno dugme (0,10 USD)

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

1x 10kΩ 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 uslužni program avrdude za postavljanje ROM-a mikrokontrolera. Proces instalacije je prilično jednostavan i jasan, ali ovisi o vašem operativnom sistemu. Ako koristite neku vrstu GNU/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 biblioteka light_ws2812:

github.com/cpldcpu/light_ws2812

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

cd putanja 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 njegovom 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 Arduino ISP -a u izborniku “Datoteka → Primjeri”. Nakon što otpremite skicu, vaša Arduino ploča djeluje kao programer. Komentari u kodu skice dali bi vam trag za isticanje.

Sada trči

napravi blic

da biste uključili MCU i

napraviti osigurač

za postavljanje bitova osigurača.

Preporučuje se: