INHOUDSOPGAWE:

N LED -bui van $ 1 met ATtiny13 en WS2812: 7 stappe
N LED -bui van $ 1 met ATtiny13 en WS2812: 7 stappe

Video: N LED -bui van $ 1 met ATtiny13 en WS2812: 7 stappe

Video: N LED -bui van $ 1 met ATtiny13 en WS2812: 7 stappe
Video: LDT LightatNight Test 4: Zonsondergang 2024, November
Anonim
'N LED bui van $ 1 met ATtiny13 en WS2812
'N LED bui van $ 1 met ATtiny13 en WS2812

Deur arduinocelentano Volg meer deur die skrywer:

Persoonlike CalDAV-bediener op 'n enkelbordrekenaar
Persoonlike CalDAV-bediener op 'n enkelbordrekenaar
Persoonlike CalDAV-bediener op 'n enkelbordrekenaar
Persoonlike CalDAV-bediener op 'n enkelbordrekenaar
LCD Invaders: 'n Space Invaders Like Game op 'n 16x2 LCD -karakterskerm
LCD Invaders: 'n Space Invaders Like Game op 'n 16x2 LCD -karakterskerm
LCD Invaders: 'n Space Invaders Like Game op 'n 16x2 LCD -karakterskerm
LCD Invaders: 'n Space Invaders Like Game op 'n 16x2 LCD -karakterskerm
Octarine: 'n kleurbypassende spel met WS2812 RGB -LED's
Octarine: 'n kleurbypassende spel met WS2812 RGB -LED's
Octarine: 'n kleurbypassende spel met WS2812 RGB -LED's
Octarine: 'n kleurbypassende spel met WS2812 RGB -LED's

Dit is 'n goedkoop stemmingslamp met vier modusse.

1. Reënboogvonk. 'N Vonk van lig beweeg keer op keer opwaarts en verander geleidelik die kleur.

2. Rainbow gloei. 'N Stabiele gloed wat geleidelik die kleur verander.

3. Kersvuur simulasie.

4. Af.

U kan van modus verander deur op die aanraakknoppie bo -aan te tik. Die huidige modus word in EEPROM -geheue gestoor nadat dit afgeskakel is.

Hoe klein is ATtiny13?

Die idee was om maksimum funksies te verkry van minimum hardeware, iets ingewikkelder as outomatiese skakelaar of termometer, 'n projek naby die rand van hierdie klein mikrobeheerder. Beperkings laat jou tog kreatief dink, nie waar nie? Wel, dit het in die begin so gelyk.

Die uitdagendste in hierdie projek was om al die kode in ATtiny13 te skuif. Die mikrobeheerder het 1K grepe flits en slegs 64 grepe RAM. Ja, as ek 'grepe' sê, bedoel ek dié wat uit agt bis bestaan. 64 grepe vir al u plaaslike veranderlikes en oproepstapel. Om dit duidelik te maak, oorweeg ons dat ons 8 RGB -LED's moet beheer. Elkeen van hulle word gedefinieer deur 3 grepe (een vir onderskeidelik rooi, groen en blou kanaal). Dus, net om die toestand van 8 LED's op te slaan, moet ons 'n skikking van 8 strukture van 3 grepe elk implementeer, en 'n aanwyser na die begin van hierdie skikking sal nog een byte verg. Dus is 25 van 64 grepe uit. Ons het pas 39% RAM gebruik en nog nie regtig begin nie. Om sewe basiese reënboogkleure te stoor, benodig u 7 × 3 = 21 grepe, dus is 72% van die RAM op. Wat basiese kleure betref, ek oordryf: ons het hulle nie almal terselfdertyd in RAM nodig nie, en hulle verander nooit, daarom kan hulle geïmplementeer word as 'n konstante skikking wat in flash in plaas van RAM gestoor moet word. Dit gee in elk geval 'n algehele indruk oor gebruikte hardeware.

Toe ek Knuth se stelling oor voortydige optimalisering onthou, het ek begin om drie lampmodusse afsonderlik te prototipeer om te sien wat gebeur. Ek het dit afsonderlik getoets om seker te maak dat dit behoorlik werk en dat elkeen by my mikrobeheerder pas. Dit het 'n paar aande geneem om dit te bereik, en alles het goed afgeloop … totdat ek probeer het om dit in die skakelaarverklaring saam te stel. avr-size nut berig 'n teksgrootte van 1,5 Kb (met -s vlag van avr-gcc). Op daardie oomblik was my oorspronklike bedoeling om ATtiny25 met 2Kb -flits te gryp, en dit kon die gelukkige einde van hierdie verhaal gewees het.

Maar op die een of ander manier het ek gevoel dat ek na 'n aansienlike optimalisering die slegte kode in 1Kb kon krimp. Dit het egter nog 'n week geneem om te besef dat dit onmoontlik is en nog 'n week om dit te bereik. Ek moes 'n reënboog in vyf basiese kleure sny (sonder noemenswaardige visuele verskil). Ek het van die verklarings ontslae geraak en 'n ketting van if-then-if gebruik om die grootte van die binêre kode te verminder. Vuuranimasie benodig 'n pseudo -ewekansige getalgenerator wat taamlik omvangryk is, so ek het 'n vereenvoudigde weergawe van LFSR met konstante aanvanklike waarde geïmplementeer. Ek gee nie om vir PRNG se volle sikluslengte nie en soek net 'n afdraande balans tussen kodegrootte en 'realistiese vuuranimasie'. Ek het ook baie klein optimerings geïmplementeer wat ek nie nou kan onthou nie, en selfs daarin geslaag om al die modi, behalwe vuur, in die chip te flits. Toe ek sonder idees was, was my totale kode ongeveer 1200 grepe.

Ek het tyd geneem en ek het baie gelees oor die optimalisering van AVR -kode. Ek was naby daaraan om op te gee en alles in monteringstaal te herskryf, maar het dit die laaste kans gegee. Tydens die laaste optimalisasie -stormloop het ek 'n reënboog in drie basiese kleure gesny en ander vinnig laat bereken, ek het alles nagegaan en AVR -aanbevelings gevolg en uiteindelik …

avrdude: skryfflits (1004 grepe):

Skryf | #################################################### | 100% 0.90s

Dit is nie nodig om te sê dat ek byna al die RAM en net een byte EEPROM gebruik het om die huidige modus op te slaan. Ek impliseer nie dat dit 'n ideale en uiteindelike implementering is nie. Dit werk net en pas by die mikrobeheerder. Ek is seker, jy kan dit beter doen. Ek is regtig. Ek wil net die plesier deel om 'n skynbaar onpraktiese probleem op te los wat u aan die begin amper onmoontlik vind. 'Inbraak beteken dus om die grense van wat moontlik is te ondersoek …' -Richard Stallman.

Benodighede:

1x ATtiny13 MCU ($ 0,28 = $ 0,24 vir MCU in SOP-8-pakket en $ 0,04 vir DIP8-adapter)

8x WS2812 RGB LED's (ek beveel 'n bord of 'n stuk LED -streep aan) ($ 0,42)

1x TTP223 aanraakknoppie ($ 0,10)

1x Micro USB na DIP -adapter ($ 0,14)

1x 10kΩ weerstand (<$ 0,01)

1x 100nF keramiek kondensator (<$ 0,01)

1x 10–47µF elektrolitiese kondensator (<$ 0,01)

Totaal <$ 0,97

Stap 1: Opstel van sagteware

Opstelling van sagteware
Opstelling van sagteware

U benodig avr-gcc-werktuigketting om die bronkode en avrdude-nut saam te stel om die ROM van die mikrobeheerder op te laai. Die installasieproses is redelik eenvoudig en eenvoudig, maar dit hang af van u bedryfstelsel. As u 'n soort GNU/Linux gebruik, het u waarskynlik reeds die regte pakkette in u bewaarplekboom. Die bronkode van hierdie projek kan hier afgelaai word:

github.com/arduinocelentano/t13_ws2812_lamp

U benodig ook 'n light_ws2812 -biblioteek:

github.com/cpldcpu/light_ws2812

Sodra u avr-gcc toolchain en projekbronne gekry het, voer u terminale uit en tik die volgende kode:

cd pad/na/projek

maak

Stap 2: Programmering van die mikrobeheerder

Programmering van die mikrobeheerder
Programmering van die mikrobeheerder
Programmering van die mikrobeheerder
Programmering van die mikrobeheerder
Programmering van die mikrobeheerder
Programmering van die mikrobeheerder

As u 'n USBASP -programmeerder het, koppel dit dan net aan Attiny volgens die pinout. Gewoonlik sou dit so lyk, maar ek beveel sterk aan dat u u werklike pinout nagaan!

Alternatiewelik kan u 'n Arduino -bord as programmeerder gebruik. Maak Arduino IDE oop en vind die voorbeeld van Arduino ISP in die menu "File → voorbeelde". Nadat u die skets opgelaai het, tree u Arduino -bord op as 'n programmeerder. Die opmerkings in die sketskode gee u 'n idee om vas te stel.

Nou hardloop

flits maak

om die MCU te flits en

maak lont

om lontstukke in te stel.

Aanbeveel: