Innholdsfortegnelse:

En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn
En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn

Video: En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn

Video: En LED -stemningslampe på 1 dollar med ATtiny13 og WS2812: 7 trinn
Video: DIY 1кВт синусоидальный инвертор 12В на 220В EGS002, jlcpcb 2024, Juli
Anonim
En LED -stemningslampe på $ 1 med ATtiny13 og WS2812
En LED -stemningslampe på $ 1 med ATtiny13 og WS2812

Av arduinocelentano Følg mer av forfatteren:

Personlig CalDAV-server på en enkeltbordsmaskin
Personlig CalDAV-server på en enkeltbordsmaskin
Personlig CalDAV-server på en enkeltbordsmaskin
Personlig CalDAV-server på en enkeltbordsmaskin
LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning
LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning
LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning
LCD Invaders: a Space Invaders Like Game på 16x2 LCD -tegnvisning
Octarine: et fargematchende spill med WS2812 RGB -lysdioder
Octarine: et fargematchende spill med WS2812 RGB -lysdioder
Octarine: et fargematchende spill med WS2812 RGB -lysdioder
Octarine: et fargematchende spill med WS2812 RGB -lysdioder

Dette er en rimelig stemningslampe med fire moduser.

1. Rainbow gnist. En lysgnist beveger seg oppover gang på gang og endrer gradvis fargen.

2. Rainbow glød. En stabil glød som gradvis endrer fargen.

3. Simulering av stearinlys.

4. Av.

Du kan bytte modus ved å trykke på en berøringsknapp øverst. Den nåværende modusen lagres i EEPROM -minnet etter at den er slått av.

Hvor liten er ATtiny13?

Tanken var å få maksimale funksjoner fra minimum maskinvare, noe mer komplekst enn automatisert bryter eller termometer, et prosjekt nær kanten av denne lille mikrokontrolleren. Tross alt får begrensninger deg til å tenke kreativ, ikke sant? Vel, det så slik ut i begynnelsen.

Det mest utfordrende i dette prosjektet var å skyve all koden inn i ATtiny13. Mikrokontrolleren har 1K byte flash og bare 64 byte RAM. Ja, når jeg sier “byte”, mener jeg de som består av åtte bits. 64 byte for alle dine lokale variabler og anropsstabel. For å gjøre det klart, tenk på at vi må kontrollere 8 RGB -lysdioder. Hver av dem er definert av 3 byte (en for henholdsvis rød, grønn og blå kanal). Så bare for å lagre tilstanden til 8 lysdioder, må vi implementere en rekke med 8 strukturer 3 byte hver, og en peker til begynnelsen av denne matrisen vil ta en byte til. Dermed er 25 av 64 byte ute. Vi har nettopp brukt 39% av RAM og har egentlig ikke startet ennå. I tillegg trenger du 7 × 3 = 21 byte for å lagre syv grunnleggende regnbuefarger, så 72% av RAM er ute. Vel, når det gjelder grunnleggende farger, overdriver jeg: vi trenger ikke dem alle samtidig i RAM, og de endres aldri, så de kan implementeres som en konstant matrise som skal lagres i flash i stedet for RAM. Uansett, det gir et helhetsinntrykk om brukt maskinvare.

Da jeg husket Knuths uttalelse om for tidlig optimalisering, begynte jeg med å prototype tre lampemoduser hver for seg for å se hva som skjer. Jeg har testet dem separat for å sikre at de fungerer som de skal og at hver av dem passer til min mikrokontroller. Det tok et par kvelder å oppnå det, og alt gikk bra … til jeg prøvde å sette dem sammen i en switch -erklæring. avr-size verktøy rapporterte en 1,5 Kb tekstdelingsstørrelse (med -s flagg av avr-gcc). I det øyeblikket var min opprinnelige intensjon å ta litt ATtiny25 med 2Kb blits, og det kunne ha vært den lykkelige slutten på denne historien.

Men på en eller annen måte følte jeg at etter betydelig optimalisering kunne jeg klare å krympe den skitne koden til 1Kb. Imidlertid tok det en uke til å innse at det er umulig og en uke til å oppnå det uansett. Jeg måtte kutte en regnbue til fem grunnfarger (uten vesentlig visuell forskjell). Jeg kvittet meg med saksuttalelser og brukte en kjede med if-then-if for å redusere binær kodestørrelse. Brannanimasjon trenger en pseudoslått tallgenerator som er ganske stor, så jeg implementerte en forenklet versjon av LFSR med konstant startverdi. Jeg bryr meg ikke om PRNG full sykluslengde og bare på jakt etter en nedstigningsbalanse mellom kodestørrelse og "realistisk brannanimasjon". Jeg implementerte også mange mindre optimaliseringer jeg ikke husker akkurat nå, og klarte til og med å blinke alle modusene bortsett fra brann inn i brikken. Da jeg gikk tom for ideer, var min totale kode omtrent 1200 byte.

Jeg tok timeout og hadde lest mye om optimalisering av AVR -kode. Jeg var nær ved å gi opp og skrive om alt på samlingsspråk, men ga det den siste sjansen. Under det siste optimaliseringsrushetet har jeg kuttet en regnbue til tre grunnfarger og fått andre til å bli beregnet i farten, jeg inspiserte alt og fulgte AVR -optimaliseringsanbefalinger og til slutt …

avrdude: skriveblits (1004 byte):

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

Det er ikke nødvendig å si at jeg brukte nesten all RAM og bare en byte EEPROM for å lagre gjeldende modus. Jeg antyder ikke at dette er en ideell og ultimate implementering. Det fungerer bare og passer til mikrokontrolleren. Jeg er sikker på at du kan gjøre det bedre. Jeg er virkelig. Jeg vil bare dele moroa med å løse et tilsynelatende upraktisk problem du anser som nesten umulig i begynnelsen. "Derfor betyr hacking å utforske grensene for hva som er mulig …" -Richard Stallman.

Rekvisita:

1x ATtiny13 MCU ($ 0,28 = $ 0,24 for MCU i SOP-8-pakken og $ 0,04 for DIP8-adapter)

8x WS2812 RGB -lysdioder (jeg anbefaler et brett eller et stykke LED -stripe) ($ 0,42)

1x TTP223 berøringsknapp ($ 0,10)

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

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

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

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

Totalt <$ 0,97

Trinn 1: Programvareoppsett

Programvareoppsett
Programvareoppsett

Du trenger avr-gcc verktøykjede for å kompilere kildekoden og avrdude-verktøyet for å laste opp mikrokontrollerens ROM. Installasjonsprosessen er ganske enkelt og grei, men det avhenger av operativsystemet. Hvis du bruker en slags GNU/Linux, har du sannsynligvis allerede riktige pakker i lagertreet. Kildekoden til dette prosjektet kan lastes ned her:

github.com/arduinocelentano/t13_ws2812_lamp

Du trenger også et light_ws2812 bibliotek:

github.com/cpldcpu/light_ws2812

Når du har avr-gcc verktøykjede og prosjektkilder, kjører du terminalen og skriver inn følgende kode:

cd -bane/til/prosjekt

gjøre

Trinn 2: Programmering av mikrokontrolleren

Programmering av mikrokontrolleren
Programmering av mikrokontrolleren
Programmering av mikrokontrolleren
Programmering av mikrokontrolleren
Programmering av mikrokontrolleren
Programmering av mikrokontrolleren

Hvis du har en slags USBASP -programmerer, bare koble den til Attiny i henhold til pinout. Vanligvis vil det se slik ut, men jeg anbefaler på det sterkeste å sjekke ut din faktiske pinout!

Alternativt kan du bruke et Arduino -kort som programmerer. Åpne Arduino IDE og finn Arduino ISP -eksemplet i "Fil → Eksempler" -menyen. Etter at du har lastet opp skissen, fungerer Arduino -brettet som en programmerer. Kommentarene i skissekoden vil gi deg en anelse om pinout.

Nå løp

lage blits

for å blinke MCU og

lage sikring

for å sette sikringsbiter.

Anbefalt: