Turinys:

1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812: 7 žingsniai
1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812: 7 žingsniai

Video: 1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812: 7 žingsniai

Video: 1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812: 7 žingsniai
Video: Mano darbas – stebėti mišką ir čia vyksta kažkas keisto. 2024, Lapkritis
Anonim
1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812
1 USD vertės LED nuotaikos lempa su ATtiny13 ir WS2812

Sekite daugiau autoriaus:

Asmeninis „CalDAV“serveris vienos plokštės kompiuteryje
Asmeninis „CalDAV“serveris vienos plokštės kompiuteryje
Asmeninis „CalDAV“serveris vienos plokštės kompiuteryje
Asmeninis „CalDAV“serveris vienos plokštės kompiuteryje
„LCD Invaders“: „Space Invaders Like“žaidimas 16x2 LCD simbolių ekrane
„LCD Invaders“: „Space Invaders Like“žaidimas 16x2 LCD simbolių ekrane
„LCD Invaders“: „Space Invaders Like“žaidimas 16x2 LCD simbolių ekrane
„LCD Invaders“: „Space Invaders Like“žaidimas 16x2 LCD simbolių ekrane
„Octarine“: spalvų derinimo žaidimas su WS2812 RGB šviesos diodais
„Octarine“: spalvų derinimo žaidimas su WS2812 RGB šviesos diodais
„Octarine“: spalvų derinimo žaidimas su WS2812 RGB šviesos diodais
„Octarine“: spalvų derinimo žaidimas su WS2812 RGB šviesos diodais

Tai nebrangi nuotaikos lempa su keturiais režimais.

1. Vaivorykštės kibirkštis. Šviesos kibirkštis kartkartėmis juda aukštyn ir pamažu keičia spalvą.

2. Vaivorykštės švytėjimas. Stabilus švytėjimas, kuris palaipsniui keičia spalvą.

3. Žvakių ugnies modeliavimas.

4. Išjungta.

Galite perjungti režimus, paliesdami jutiklinį mygtuką viršuje. Išjungus dabartinį režimą, jis išsaugomas EEPROM atmintyje.

Kiek mažas yra „ATtiny13“?

Idėja buvo gauti maksimalias funkcijas iš minimalios aparatinės įrangos, kažkas sudėtingesnio nei automatinis jungiklis ar termometras - projektas, esantis netoli šio mažo mikrovaldiklio krašto. Juk apribojimai verčia mąstyti kūrybingai, tiesa? Na, iš pradžių taip atrodė.

Sunkiausias šiame projekte buvo įvesti visą kodą į ATtiny13. Mikrovaldiklis turi 1K baitų blykstę ir tik 64 baitų RAM. Taip, kai sakau „baitai“, turiu omenyje tuos, kuriuos sudaro aštuoni bitai. 64 baitai visiems vietiniams kintamiesiems ir skambučių krūvai. Kad būtų aišku, apsvarstykite, kad turime valdyti 8 RGB šviesos diodus. Kiekvieną iš jų apibrėžia 3 baitai (vienas atitinkamai raudonam, žaliam ir mėlynam kanalui). Taigi, norėdami išsaugoti 8 šviesos diodų būseną, turėsime įdiegti 8 struktūrų masyvą po 3 baitus, o žymeklis į šio masyvo pradžią užtruks dar vieną baitą. Taigi išeina 25 iš 64 baitų. Mes ką tik sunaudojome 39% RAM ir dar nepradėjome. Be to, norint išsaugoti septynias pagrindines vaivorykštės spalvas, jums reikės 7 × 3 = 21 baito, taigi 72% RAM trūksta. Kalbant apie pagrindines spalvas, aš perdedu: mums nereikia visų jų vienu metu RAM ir jos niekada nesikeičia, todėl jos gali būti įdiegtos kaip pastovus masyvas, kuris turi būti saugomas blykstėje, o ne RAM. Bet kokiu atveju tai sukuria bendrą įspūdį apie naudotą aparatūrą.

Prisiminęs Knuth teiginį apie priešlaikinį optimizavimą, pradėjau nuo trijų lempų režimų prototipų kūrimo atskirai, norėdamas pamatyti, kas atsitiks. Aš juos išbandžiau atskirai, kad įsitikinčiau, ar jie veikia tinkamai ir ar kiekvienas atitinka mano mikrovaldiklį. Prireikė poros vakarų, kad tai padarytume, ir viskas klostėsi gerai … kol bandžiau juos sudėti į jungiklio pareiškimą. „avr“dydžio programa pranešė apie 1,5 Kb dydžio teksto skyrių (su -s vėliava „avr-gcc“). Tuo metu mano pirminis ketinimas buvo paimti ATtiny25 su 2 KB blykste ir tai galėjo būti laiminga šios istorijos pabaiga.

Bet kažkaip jaučiau, kad po nemažo optimizavimo sugebėsiu tą siaubingą kodą sutraukti į 1Kb. Tačiau prireikė dar vienos savaitės, kad suprastum, jog tai neįmanoma, ir dar vienos savaitės, kad tai padarytum. Turėjau iškirpti vaivorykštę iki penkių pagrindinių spalvų (be reikšmingo vizualinio skirtumo). Aš atsikratiau atvejų teiginių ir dvejetainio kodo dydžiui sumažinti panaudojau grandinę „jei tada, jei“. Gaisro animacijai reikia pseudo atsitiktinių skaičių generatoriaus, kuris yra gana didelis, todėl įdiegiau supaprastintą LFSR versiją su pastovia pradine verte. Man nerūpi viso PRNG ciklo ilgio ir tiesiog ieškau nusileidimo pusiausvyros tarp kodo dydžio ir „tikroviškos ugnies animacijos“. Aš taip pat įgyvendinau daugybę nedidelių optimizavimų, kurių dabar neprisimenu, ir netgi sugebėjau įjungti lustą visus režimus, išskyrus ugnį. Kai pritrūkau idėjų, mano bendras kodas buvo apie 1200 baitų.

Aš užtrukau laiko ir daug skaičiau apie AVR kodo optimizavimą. Buvau arti to, kad pasiduosiu ir viską perrašysiu asamblėjos kalba, tačiau suteikiau paskutinę galimybę. Paskutiniame optimizavimo skubėjime aš supjaustiau vaivorykštę į tris pagrindines spalvas ir privertiau kitas apskaičiuoti skrendant, aš viską apžiūrėjau ir laikiausi AVR optimizavimo rekomendacijų ir galiausiai …

avrdude: rašymo blykstė (1004 baitai):

Rašymas | ############################################### | 100% 0,90

Nereikia sakyti, kad dabartiniam režimui išsaugoti naudojau beveik visą RAM ir tik vieną baitą EEPROM. Aš nesakau, kad tai yra idealus ir galutinis įgyvendinimas. Jis tiesiog veikia ir tinka mikrovaldikliui. Esu tikras, kad galėtumėte tai padaryti geriau. Aš tikrai esu. Aš tik noriu pasidalinti malonumu išspręsti akivaizdžiai nepraktišką problemą, kurią iš pradžių laikote beveik neįmanoma. „Taigi įsilaužimas reiškia tirti galimybių ribas …“-Richardas Stallmanas.

Priedai:

1x ATtiny13 MCU (0,28 USD = 0,24 USD už MCU SOP-8 pakuotėje ir 0,04 USD už DIP8 adapterį)

8x WS2812 RGB šviesos diodai (rekomenduoju lentą arba LED juostos gabalą) (0,42 USD)

1x TTP223 jutiklinis mygtukas (0,10 USD)

1x „Micro USB“į DIP adapteris (0,14 USD)

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

1x 100nF keraminis kondensatorius (<0,01 USD)

1x 10–47µF elektrolitinis kondensatorius (<0,01 USD)

Iš viso <0,97 USD

1 veiksmas: programinės įrangos sąranka

Programinės įrangos sąranka
Programinės įrangos sąranka

Jums reikės „avr-gcc“įrankių grandinės, kad sudarytumėte šaltinio kodą ir „avrdude“įrankį, skirtą įkelti mikrovaldiklio ROM. Diegimo procesas yra gana paprastas ir paprastas, tačiau tai priklauso nuo jūsų operacinės sistemos. Jei naudojate tam tikrą GNU/Linux, tikriausiai jau turite tinkamų paketų saugyklų medyje. Šio projekto šaltinio kodą galite atsisiųsti čia:

github.com/arduinocelentano/t13_ws2812_lamp

Jums taip pat reikės „light_ws2812“bibliotekos:

github.com/cpldcpu/light_ws2812

Kai turėsite avr-gcc įrankių grandinę ir projekto šaltinius, paleiskite terminalą ir įveskite šį kodą:

cd kelias/į/projektą

padaryti

2 žingsnis: mikrovaldiklio programavimas

Mikrovaldiklio programavimas
Mikrovaldiklio programavimas
Mikrovaldiklio programavimas
Mikrovaldiklio programavimas
Mikrovaldiklio programavimas
Mikrovaldiklio programavimas

Jei turite tam tikrą USBASP programuotoją, tiesiog prijunkite jį prie „Attiny“pagal jo kontaktą. Paprastai tai atrodytų taip, bet primygtinai rekomenduoju patikrinti tikrąjį pinout!

Arba kaip programuotoją galite naudoti „Arduino“plokštę. Atidarykite „Arduino IDE“ir raskite „Arduino“IPT pavyzdį meniu „Failas → Pavyzdžiai“. Įkėlus eskizą, jūsų „Arduino“plokštė veikia kaip programuotojas. Eskizo kodo komentarai suteiks jums užuominą, kaip išsiaiškinti.

Dabar bėk

padaryti blykstę

kad mirksėtų MCU ir

padaryti saugiklį

saugiklių antgaliams nustatyti.

Rekomenduojamas: