Indholdsfortegnelse:
Video: En LED -stemningslampe på $ 1 med ATtiny13 og WS2812: 7 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:25
Af arduinocelentanoFølg mere af forfatteren:
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
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
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:
Sådan bruges Neopixel Ws2812 LED eller LED STRIP eller Led Ring med Arduino: 4 trin
Sådan bruges Neopixel Ws2812 LED eller LED STRIP eller Led Ring med Arduino: Hej fyre, da Neopixel led Strip er meget populære, og det kaldes også som ws2812 led strip. De er meget populære, fordi vi i disse LED -bånd kan adressere hver enkelt LED separat, hvilket betyder, at hvis du vil have få lysdioder til at lyse i en farve
Neopixel Ws2812 Rainbow LED Glød Med M5stick-C - Kører Rainbow på Neopixel Ws2812 Brug af M5stack M5stick C Brug af Arduino IDE: 5 trin
Neopixel Ws2812 Rainbow LED Glød Med M5stick-C | Kører Rainbow på Neopixel Ws2812 Brug af M5stack M5stick C Brug af Arduino IDE: Hej fyre i denne instruktion vil vi lære at bruge neopixel ws2812 LED'er eller led strip eller led matrix eller led ring med m5stack m5stick-C udviklingstavle med Arduino IDE, og vi vil lave et regnbuemønster med det
Clemson Tiger Paw Decoration Baggrundsbelyst med WS2812 LED-strips: 5 trin (med billeder)
Clemson Tiger Paw Decoration Baggrundsbelyst Med WS2812 LED Strips: Clemsons makerpace i Watt's center har en laserskærer, og jeg ville bruge det godt. Jeg tænkte, at det ville være fedt at lave en baggrundsbelyst tigerpote, men jeg ville også gøre noget med kantbelyst akryl. Dette projekt er en kombination af begge
Højspændings alternerende okklusions træningsglas [ATtiny13]: 5 trin (med billeder)
Højspændings vekslende okklusionstræningsbriller [ATtiny13]: I min første instruktør har jeg beskrevet, hvordan man bygger en enhed, der burde være ganske nyttig for nogen, der ønsker at behandle amblyopi (dovne øjne). Designet var meget forenklet og havde nogle ulemper (det krævede brug af to batterier og væske
Liquid Crystal Glasses for Amblyopia (Alternative Occlusion Training Glasses) [ATtiny13]: 10 trin (med billeder)
Liquid Crystal Glasses for Amblyopia (Alternating Occlusion Training Glasses) [ATtiny13]: Amblyopia (dovne øjne), en synsforstyrrelse, der påvirker cirka 3% af befolkningen, normalt behandlet med simple øjenlommer eller atropindråber. Desværre lukker disse behandlingsmetoder stærkere øje i lange, uafbrudte perioder, nej