Indholdsfortegnelse:

En LED -stemningslampe på $ 1 med ATtiny13 og WS2812: 7 trin
En LED -stemningslampe på $ 1 med ATtiny13 og WS2812: 7 trin

Video: En LED -stemningslampe på $ 1 med ATtiny13 og WS2812: 7 trin

Video: En LED -stemningslampe på $ 1 med ATtiny13 og WS2812: 7 trin
Video: RGB Pixel LED & it's controller teardown || Disassembly 2024, Juli
Anonim
En LED -stemningslampe på $ 1 med ATtiny13 og WS2812
En LED -stemningslampe på $ 1 med ATtiny13 og WS2812

Af arduinocelentanoFølg mere af forfatteren:

Personlig CalDAV-server på en enkelt-bordcomputer
Personlig CalDAV-server på en enkelt-bordcomputer
Personlig CalDAV-server på en enkelt-bordcomputer
Personlig CalDAV-server på en enkelt-bordcomputer
LCD Invaders: a Space Invaders Like Game på 16x2 LCD Character Display
LCD Invaders: a Space Invaders Like Game på 16x2 LCD Character Display
LCD Invaders: a Space Invaders Like Game på 16x2 LCD Character Display
LCD Invaders: a Space Invaders Like Game på 16x2 LCD Character Display
Octarine: et farvematchende spil med WS2812 RGB -lysdioder
Octarine: et farvematchende spil med WS2812 RGB -lysdioder
Octarine: et farvematchende spil med WS2812 RGB -lysdioder
Octarine: et farvematchende spil med WS2812 RGB -lysdioder

Dette er en lavstemningslampe med fire tilstande.

1. Regnbue gnist. En lysgnist bevæger sig opad gang på gang og ændrer gradvist farven.

2. Rainbow glød. En stabil glød, der gradvist ændrer farven.

3. Simulering af stearinlys.

4. Fra.

Du kan skifte tilstand ved at trykke på en berøringsknap øverst. Den aktuelle tilstand gemmes i EEPROM -hukommelsen efter slukning.

Hvor lille er ATtiny13?

Ideen var at få maksimale funktioner fra minimum hardware, noget mere komplekst end automatiseret switch eller termometer, et projekt tæt på kanten af denne lille mikrokontroller. Tross alt får restriktioner dig til at tænke kreativ, ikke? Nå, det lignede det i starten.

Det mest udfordrende i dette projekt var at skubbe al koden ind i ATtiny13. Mikrocontrolleren har 1K bytes flash og kun 64 bytes RAM. Ja, når jeg siger “bytes”, mener jeg dem, der består af otte bits. 64 bytes til alle dine lokale variabler og opkaldsstabel. For at gøre det klart, skal du overveje, at vi skal styre 8 RGB -lysdioder. Hver af dem er defineret af 3 bytes (en for henholdsvis rød, grøn og blå kanal). Så bare for at gemme tilstanden på 8 lysdioder skal vi implementere en matrix med 8 strukturer 3 bytes hver, og en markør til begyndelsen af denne matrix ville tage en byte mere. Således er 25 af 64 bytes ude. Vi har lige brugt 39% af RAM og er ikke rigtig startet endnu. Derudover har du brug for 7 × 3 = 21 bytes for at gemme syv grundlæggende regnbuefarver, så 72% af RAM er ude. Nå, hvad angår grundfarver, overdriver jeg: vi har ikke brug for dem alle på samme tid i RAM, og de ændrer sig aldrig, så de kan implementeres som et konstant array, der skal gemmes i flash i stedet for RAM. Anyway, det giver et helhedsindtryk om brugt hardware.

Da jeg huskede Knuths udtalelse om for tidlig optimering, begyndte jeg med at prototyper tre lamptilstande hver for sig for at se, hvad der sker. Jeg har testet dem separat for at sikre, at de fungerer korrekt, og at hver passer til min mikrokontroller. Det tog et par aftener at opnå det, og alt gik godt … indtil jeg forsøgte at sammensætte dem inde i switch -erklæringen. avr-size værktøj rapporterede en 1,5 Kb tekststørrelsesstørrelse (med -s flag avr-gcc). I det øjeblik var min oprindelige hensigt at få fat i noget ATtiny25 med 2Kb flash, og det kunne have været den lykkelige ende på denne historie.

Men på en eller anden måde følte jeg, at jeg efter betydelig optimering kunne klare at skrumpe den skøre kode til 1Kb. Det tog dog en uge mere at indse, at det er umuligt og en uge mere at nå det alligevel. Jeg var nødt til at klippe en regnbue til fem grundfarver (uden væsentlig visuel forskel). Jeg slap med sagsopgørelser og brugte en kæde af hvis-så-hvis for at reducere binær kodestørrelse. Brandanimation har brug for en pseudos tilfældig talgenerator, som er stort set omfangsrig, så jeg implementerede en forenklet version af LFSR med konstant startværdi. Jeg er ligeglad med PRNG fuld cykluslængde og bare på udkig efter en nedstigningsbalance mellem kodestørrelse og "realistisk brandanimation". Jeg implementerede også en masse mindre optimeringer, jeg ikke kan huske lige nu, og det lykkedes endda at blinke alle tilstande bortset fra brand i chippen. Da jeg løb tør for ideer, var min samlede kode omkring 1200 bytes.

Jeg tog timeout og havde læst meget om AVR -kodeoptimering. Jeg var tæt på at opgive og omskrive alt i samlingssprog, men gav det den sidste chance. Under det sidste optimerings rush har jeg skåret en regnbue til tre grundfarver og fået andre til at blive beregnet i farten, jeg inspicerede alt og fulgte AVR -optimeringsanbefalinger og til sidst …

avrdude: skriveflash (1004 bytes):

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

Der er ingen grund til at sige, at jeg brugte næsten al RAM og kun en byte EEPROM til at gemme den aktuelle tilstand. Jeg antyder ikke, at dette er en ideel og ultimativ implementering. Det fungerer bare og passer til mikrokontrolleren. Jeg er sikker på, du kunne gøre det bedre. Det er jeg virkelig. Jeg vil bare dele det sjove ved at løse et tilsyneladende upraktisk problem, som du anser for næsten umuligt i begyndelsen. "Således betyder hacking at undersøge grænserne for, hvad der er muligt …" -Richard Stallman.

Tilbehør:

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

8x WS2812 RGB LED'er (jeg anbefaler et bræt eller et stykke LED -stribe) ($ 0,42)

1x TTP223 Touch -knap ($ 0,10)

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

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

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

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

I alt <0,97 $

Trin 1: Softwareopsætning

Opsætning af software
Opsætning af software

Du skal bruge avr-gcc værktøjskæde til at kompilere kildekoden og avrdude-værktøjet til at uploade mikrokontrollerens ROM. Installationsprocessen er stort set enkel og ligetil, men det afhænger af dit operativsystem. Hvis du bruger en slags GNU/Linux, har du sandsynligvis allerede ordentlige pakker i dit lagertræ. Kildekoden til dette projekt kan downloades her:

github.com/arduinocelentano/t13_ws2812_lamp

Du skal også bruge et light_ws2812 bibliotek:

github.com/cpldcpu/light_ws2812

Når du har fået avr-gcc værktøjskæde og projektkilder, skal du køre din terminal og indtaste følgende kode:

cd sti/til/projekt

lave

Trin 2: Programmering af mikrokontrolleren

Programmering af mikrokontrolleren
Programmering af mikrokontrolleren
Programmering af mikrokontrolleren
Programmering af mikrokontrolleren
Programmering af mikrokontrolleren
Programmering af mikrokontrolleren

Hvis du har en slags USBASP -programmør, skal du bare slutte den til Attiny i henhold til dens pinout. Normalt ville det se sådan ud, men jeg anbefaler stærkt at tjekke din faktiske pinout!

Alternativt kan du bruge et Arduino -kort som programmerer. Åbn Arduino IDE, og find Arduino ISP -eksemplet i menuen "Filer → Eksempler". Efter at have uploadet skitsen fungerer dit Arduino -bord som programmerer. Kommentarerne i skitsekoden ville give dig en anelse om pinout.

Kør nu

lav flash

for at blinke MCU'en og

lave en sikring

for at indstille sikringsbits.

Anbefalede: