Përmbajtje:

Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812: 7 hapa
Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812: 7 hapa

Video: Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812: 7 hapa

Video: Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812: 7 hapa
Video: Përse po digjen makinat? Mekanikët tregojnë gabimet që bëjnë shoferët në Shqipëri 2024, Korrik
Anonim
Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812
Një llambë LED e humorit 1 dollar me ATtiny13 dhe WS2812

Ndiqni më shumë nga autori:

Server personal CalDAV në një kompjuter me një bord
Server personal CalDAV në një kompjuter me një bord
Server personal CalDAV në një kompjuter me një bord
Server personal CalDAV në një kompjuter me një bord
Pushtuesit LCD: një pushtues hapësinorë si lojë në ekranin e karaktereve LCD 16x2
Pushtuesit LCD: një pushtues hapësinorë si lojë në ekranin e karaktereve LCD 16x2
Pushtuesit LCD: një pushtues hapësinorë si lojë në ekranin e karaktereve LCD 16x2
Pushtuesit LCD: një pushtues hapësinorë si lojë në ekranin e karaktereve LCD 16x2
Octarine: një lojë që përputhet me ngjyrat me LED LED WS2812
Octarine: një lojë që përputhet me ngjyrat me LED LED WS2812
Octarine: një lojë që përputhet me ngjyrat me LED LED WS2812
Octarine: një lojë që përputhet me ngjyrat me LED LED WS2812

Kjo është një llambë me kosto të ulët me katër mënyra.

1. Shkëndija e ylberit. Një shkëndijë drite lëviz lart herë pas here dhe gradualisht ndryshon ngjyrën.

2. Shkëlqim ylberi. Një shkëlqim i qëndrueshëm i cili gradualisht ndryshon ngjyrën.

3. Simulimi i zjarrit të qirinjve.

4. Fikur.

Ju mund të ndryshoni modalitetet duke prekur një buton prekjeje në krye. Mënyra aktuale ruhet në kujtesën EEPROM pas fikjes.

Sa i vogël është ATtiny13?

Ideja ishte të merrnim veçori maksimale nga pajisjet minimale, diçka më komplekse sesa ndërprerësi i automatizuar ose termometri, një projekt afër buzës së këtij mikrokontrolluesi të vogël. Në fund të fundit, kufizimet ju bëjnë të mendoni krijues, apo jo? Epo, dukej si në fillim.

Më sfiduese në këtë projekt ishte futja e të gjithë kodit në ATtiny13. Mikrokontrolluesi ka një bajt flash 1K dhe vetëm 64 bajt RAM. Po, kur them "bytes", kam parasysh ato që përbëhen nga tetë bit. 64 bajt për të gjitha variablat tuaja lokale dhe rafte thirrjesh. Për ta bërë më të qartë, merrni parasysh që ne duhet të kontrollojmë 8 LED RGB. Secila prej tyre përcaktohet me 3 bajt (një për kanalin e kuq, jeshil dhe blu respektivisht). Pra, vetëm për të ruajtur gjendjen e 8 LED -ve, do të na duhet të zbatojmë një grup prej 8 strukturash 3 bajt secila dhe një tregues në fillim të këtij grupi do të marrë një bajt më shumë. Kështu, 25 nga 64 bajtë janë jashtë. Ne sapo kemi përdorur 39% të RAM -it dhe nuk e kemi filluar akoma. Për më tepër, për të ruajtur shtatë ngjyra bazë të ylberit, do t'ju duhet 7 × 3 = 21 bajt, kështu që 72% e RAM -it janë jashtë. Epo, sa i përket ngjyrave bazë, unë e teproj: ne nuk kemi nevojë për të gjitha ato në të njëjtën kohë në RAM dhe ato nuk ndryshojnë kurrë, kështu që ato mund të zbatohen si një grup konstant për tu ruajtur në flash në vend të RAM -it. Sidoqoftë, ajo jep një përshtypje të përgjithshme në lidhje me pajisjet e përdorura.

Duke kujtuar deklaratën e Knuth për optimizimin e parakohshëm, fillova të prototipizoja veçmas tre mënyra të llambës për të parë se çfarë do të ndodhte. Unë i kam testuar ato veçmas për t'u siguruar që ata punojnë siç duhet dhe secili i përshtatet mikrokontrolluesit tim. U deshën disa mbrëmje për ta realizuar atë dhe gjithçka shkoi mirë … derisa u përpoqa t'i bashkoja ato brenda deklaratës së ndërrimit. Shërbimi me madhësi avr raportoi një madhësi të seksionit të tekstit 1.5 Kb (me flamurin -s të avr-gcc). Në atë moment qëllimi im fillestar ishte të kapja ca ATtiny25 me blic 2Kb dhe ky mund të kishte qenë fundi i lumtur i kësaj historie.

Por disi ndjeva se pas një optimizimi të konsiderueshëm mund të arrija ta zvogëloja atë kod të keq në 1Kb. Sidoqoftë, u desh edhe një javë për të kuptuar se është e pamundur dhe një javë më shumë për ta arritur atë gjithsesi. Më duhej të shkurtoja një ylber në pesë ngjyra bazë (pa dallim të rëndësishëm vizual). I hoqa qafe deklaratat e rastit dhe përdor një zinxhir nëse-atëherë-nëse për të zvogëluar madhësinë e kodit binar. Animacioni i zjarrit ka nevojë për një gjenerator të numrave pseudo të rastësishëm i cili është shumë i rëndë, kështu që unë zbatova një version të thjeshtuar të LFSR me vlerë fillestare konstante. Nuk më intereson gjatësia e ciklit të plotë PRNG dhe thjesht kërkoj një ekuilibër prejardhjeje midis madhësisë së kodit dhe "animacionit realist të zjarrit". Unë gjithashtu zbatova shumë optimizime të vogla që nuk i mbaj mend tani dhe madje arrita të ndez të gjitha mënyrat përveç zjarrit në çip. Kur më mbaruan idetë, kodi im total ishte rreth 1200 bajt.

Mora afatin dhe kisha lexuar shumë për optimizimin e kodit AVR. Isha afër të heq dorë dhe të rishkruaj gjithçka në gjuhën e asamblesë, por i dhashë shansin e fundit. Gjatë nxitimit përfundimtar të optimizimit, unë kam prerë një ylber në tre ngjyra bazë dhe kam bërë që të tjerët të llogariten në fluturim, inspektova gjithçka dhe ndoqa rekomandimet e optimizimit të AVR dhe më në fund…

avrdude: shkrim flash (1004 bajt):

Shkrimi | #################################################### | 100% 0.90s

Nuk ka nevojë të thuhet se kam përdorur pothuajse të gjithë RAM -in dhe vetëm një bajt të EEPROM për të ruajtur modalitetin aktual. Unë nuk nënkuptoj se ky është një zbatim ideal dhe përfundimtar. Thjesht funksionon dhe i përshtatet mikrokontrolluesit. Jam i sigurt, ju mund ta bëni më mirë. Unë vërtet jam. Unë thjesht dua të ndaj kënaqësinë e zgjidhjes së një problemi në dukje jopraktik që ju e konsideroni gati të pamundur në fillim. "Kështu, hakimi do të thotë të eksplorosh kufijtë e asaj që është e mundur …" -Richard Stallman.

Furnizimet:

1x ATtiny13 MCU (0.28 dollarë = 0.24 dollarë për MCU në paketën SOP-8 dhe 0.04 dollarë për përshtatësin DIP8)

8 x LED WS2812 RGB (rekomandoj një dërrasë ose një copë shirit LED) (0.42 dollarë)

1x buton prekës TTP223 (0,10 dollarë)

1x Përshtatës Micro USB në DIP (0.14 dollarë)

1x rezistencë 10kΩ (<$ 0.01)

1x kondensator qeramik 100nF (<0.01 dollarë)

1x kondensator elektrolitik 10-47µF (<0.01 $)

Gjithsej <0.97 dollarë

Hapi 1: Konfigurimi i softuerit

Konfigurimi i softuerit
Konfigurimi i softuerit

Ju do të keni nevojë për zinxhir mjetesh avr-gcc për përpilimin e kodit burimor dhe mjetin avrdude për ngarkimin e ROM të mikrokontrolluesit. Procesi i instalimit është shumë i thjeshtë dhe i drejtpërdrejtë, por varet nga sistemi juaj operativ. Nëse përdorni një lloj GNU/Linux, me siguri tashmë keni paketat e duhura në pemën tuaj të depove. Kodi burimor i këtij projekti mund të shkarkohet këtu:

github.com/arduinocelentano/t13_ws2812_lamp

Ju gjithashtu do të keni nevojë për një bibliotekë light_ws2812:

github.com/cpldcpu/light_ws2812

Pasi të keni marrë zinxhirin e veglave avr-gcc dhe projektin, drejtoni terminalin tuaj dhe shkruani kodin e mëposhtëm:

cd shteg/tek/projekti

bëj

Hapi 2: Programimi i Mikrokontrolluesit

Programimi i Mikrokontrolluesit
Programimi i Mikrokontrolluesit
Programimi i Mikrokontrolluesit
Programimi i Mikrokontrolluesit
Programimi i Mikrokontrolluesit
Programimi i Mikrokontrolluesit

Nëse keni një lloj programuesi USBASP, thjesht lidheni atë me Attiny sipas përcaktimit të tij. Zakonisht do të duket kështu, por unë rekomandoj fuqimisht të kontrolloni pinout -in tuaj aktual!

Përndryshe, mund të përdorni një bord Arduino si programues. Hapni Arduino IDE dhe gjeni shembullin e Arduino ISP në menunë "File → Shembuj". Pas ngarkimit të skicës, bordi juaj Arduino vepron si programues. Komentet në kodin e skicës do t'ju japin një çelës për të përcaktuar.

Tani vrapo

bëj flash

për të ndezur MCU dhe

bëj siguresë

për të vendosur copa siguresash.

Hapi 3: Skemat

Recommended: