Obsah:

A $ 1 LED nálada s ATtiny13 a WS2812: 7 krokov
A $ 1 LED nálada s ATtiny13 a WS2812: 7 krokov

Video: A $ 1 LED nálada s ATtiny13 a WS2812: 7 krokov

Video: A $ 1 LED nálada s ATtiny13 a WS2812: 7 krokov
Video: Управление подсветкой на адресных светодиодах WS2812 с дисплея Nextion 2024, December
Anonim
LED lampa nálady za 1 dolár s ATtiny13 a WS2812
LED lampa nálady za 1 dolár s ATtiny13 a WS2812

Od arduinocelentano Nasledovať viac od autora:

Osobný server CalDAV na jednom počítači
Osobný server CalDAV na jednom počítači
Osobný server CalDAV na jednom počítači
Osobný server CalDAV na jednom počítači
LCD Invaders: Vesmírna útočníci ako hra na 16x2 LCD znakovom displeji
LCD Invaders: Vesmírna útočníci ako hra na 16x2 LCD znakovom displeji
LCD Invaders: Vesmírna útočníci ako hra na 16x2 LCD znakovom displeji
LCD Invaders: Vesmírna útočníci ako hra na 16x2 LCD znakovom displeji
Octarine: hra na zladenie farieb s LED diódami WS2812 RGB
Octarine: hra na zladenie farieb s LED diódami WS2812 RGB
Octarine: hra na zladenie farieb s LED diódami WS2812 RGB
Octarine: hra na zladenie farieb s LED diódami WS2812 RGB

Jedná sa o lacnú náladovú lampu so štyrmi režimami.

1. Dúhová iskra. Iskra svetla sa z času na čas pohybuje nahor a postupne mení farbu.

2. Dúhová žiara. Stabilná žiara, ktorá postupne mení farbu.

3. Simulácia požiaru sviečky.

4. Vypnuté.

Režimy môžete prepínať klepnutím na dotykové tlačidlo v hornej časti. Aktuálny režim sa po vypnutí uloží do pamäte EEPROM.

Aký malý je ATtiny13?

Cieľom bolo získať maximálne funkcie z minimálneho hardvéru, niečoho zložitejšieho ako automatizovaný prepínač alebo teplomer, projekt blízko okraja tohto drobného mikrokontroléra. Koniec koncov, obmedzenia vás nútia myslieť kreatívne, však? No na začiatku to tak vyzeralo.

Najnáročnejšie v tomto projekte bolo vložiť celý kód do ATtiny13. Mikrokontrolér má 1 kB bajtov a iba 64 bajtov RAM. Áno, keď hovorím „bajty“, mám na mysli tie, ktoré pozostávajú z ôsmich bitov. 64 bajtov pre všetky vaše lokálne premenné a zásobník hovorov. Aby bolo jasné, vezmite do úvahy, že musíme ovládať 8 RGB LED diód. Každý z nich je definovaný 3 bytmi (jeden pre červený, zelený a modrý kanál). Aby sme teda uložili stav 8 LED diód, budeme musieť implementovať pole 8 štruktúr po 3 bajty a ukazovateľ na začiatok tohto poľa by potreboval ešte jeden bajt. Vyšlo teda 25 zo 64 bajtov. Práve sme použili 39% pamäte RAM a ešte sme nezačali. Na uloženie siedmich základných dúhových farieb budete navyše potrebovať 7 × 3 = 21 bajtov, takže 72% pamäte RAM je mimo. No, pokiaľ ide o základné farby, preháňam: nepotrebujeme všetky súčasne v RAM a nikdy sa nemenia, takže môžu byť implementované ako konštantné pole na ukladanie do pamäte flash namiesto pamäte RAM. Každopádne to vytvára celkový dojem o použitom hardvéri.

Spomínajúc na Knuthovo vyhlásenie o predčasnej optimalizácii som začal s prototypovaním troch režimov žiaroviek oddelene, aby som zistil, čo sa stane. Testoval som ich samostatne, aby som sa ubezpečil, že fungujú správne a každý z nich vyhovuje môjmu mikrokontroléru. Trvalo to pár večerov, kým sa to podarilo a všetko šlo dobre … kým som sa ich nepokúsil dať dohromady do príkazu switch. Obslužný program avr-size nahlásil veľkosť sekcie textu 1,5 kB (s príznakom -s avr-gcc). V tej chvíli bol môj pôvodný zámer chytiť nejaký ATtiny25 s 2 kB bleskom a to mohol byť šťastný koniec tohto príbehu.

Ale nejako som cítil, že po značnej optimalizácii sa mi podarilo ten mizerný kód zmenšiť na 1 kB. Trvalo však ešte jeden týždeň, kým ste si uvedomili, že je to nemožné, a ešte jeden týždeň, kým ste to dosiahli. Dúhu som musel skrátiť na päť základných farieb (bez výrazného vizuálneho rozdielu). Zbavil som sa pádových príkazov a na zmenšenie veľkosti binárneho kódu som použil reťazec if-then-if. Animácia ohňa potrebuje generátor pseudonáhodných čísel, ktorý je dosť objemný, takže som implementoval zjednodušenú verziu LFSR s konštantnou počiatočnou hodnotou. Nezaujíma ma dĺžka celého cyklu PRNG a iba hľadanie rovnováhy zostupu medzi veľkosťou kódu a „realistickou animáciou ohňa“. Implementoval som tiež veľa drobných optimalizácií, na ktoré si teraz nemôžem spomenúť, a dokonca sa mi podarilo do čipu preniesť všetky režimy okrem ohňa. Keď mi došli nápady, môj celkový kód bol asi 1200 bajtov.

Vzal som si časový limit a veľa som čítal o optimalizácii kódu AVR. Bol som blízko toho, aby som sa všetkého vzdal a prepísal všetko v montážnom jazyku, ale dal som tomu poslednú šancu. Počas záverečného optimalizačného spěchu som skrátil dúhu na tri základné farby a nechal som vypočítať ďalšie za chodu, všetko som skontroloval a sledoval odporúčania optimalizácie AVR a nakoniec …

priemer: zápis blesku (1004 bajtov):

Písanie | ###################################################################### ####### | 100% 0,90 s

Nie je potrebné hovoriť, že som na uloženie aktuálneho režimu použil takmer celú pamäť RAM a iba jeden bajt EEPROM. Neznamená to, že je to ideálna a konečná implementácia. Jednoducho to funguje a pasuje na mikrokontrolér. Som si istý, že to môžeš urobiť lepšie. Naozaj som. Chcem sa len podeliť o zábavu pri riešení zdanlivo nepraktického problému, ktorý na začiatku považujete za takmer nemožný. "Hacking teda znamená preskúmať hranice toho, čo je možné …" -Richard Stallman.

Zásoby:

1x ATtiny13 MCU (0,28 dolára = 0,24 dolára za MCU v balení SOP-8 a 0,04 dolára za adaptér DIP8)

8x LED diódy WS2812 RGB (odporúčam dosku alebo kus pruhu LED) (0,42 dolára)

1x Dotykové tlačidlo TTP223 (0,10 USD)

1x adaptér Micro USB na DIP (0,14 USD)

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

1x keramický kondenzátor 100nF (<0,01 dolára)

1x 10–47 µF elektrolytický kondenzátor (<0,01 USD)

Spolu <0,97 USD

Krok 1: Nastavenie softvéru

Nastavenie softvéru
Nastavenie softvéru

Na kompiláciu zdrojového kódu budete potrebovať reťazec nástrojov avr-gcc a na odoslanie pamäte ROM mikrokontroléra pomocný program avrdude. Proces inštalácie je veľmi jednoduchý a priamy, ale závisí od vášho operačného systému. Ak používate nejaký druh GNU/Linux, pravdepodobne už máte v strome úložiska správne balíky. Zdrojový kód tohto projektu je možné stiahnuť tu:

github.com/arduinocelentano/t13_ws2812_lamp

Budete tiež potrebovať knižnicu light_ws2812:

github.com/cpldcpu/light_ws2812

Hneď ako získate zdroje reťazcov nástrojov a projektov avr-gcc, spustite terminál a zadajte nasledujúci kód:

cesta CD/do/projektu

urobiť

Krok 2: Programovanie mikrokontroléra

Programovanie mikrokontroléra
Programovanie mikrokontroléra
Programovanie mikrokontroléra
Programovanie mikrokontroléra
Programovanie mikrokontroléra
Programovanie mikrokontroléra

Ak máte nejaký programátor USBASP, jednoducho ho pripojte k Attiny podľa jeho vývodu. Obvykle by to vyzeralo takto, ale dôrazne odporúčam skontrolovať si skutočný výstup!

Alternatívne môžete ako programátor použiť dosku Arduino. Otvorte Arduino IDE a v ponuke „Súbor → Príklady“nájdite príklad Arduino ISP. Po nahraní náčrtu funguje vaša doska Arduino ako programátor. Komentáre v kóde náčrtu vám poskytnú návod na výstup.

Teraz bežte

urobiť blesk

bliká MCU a

urobiť poistku

nastaviť poistkové bity.

Krok 3: Schémy

Odporúča: