Talaan ng mga Nilalaman:

Isang $ 1 LED Mood Lamp Na May ATtiny13 at WS2812: 7 Hakbang
Isang $ 1 LED Mood Lamp Na May ATtiny13 at WS2812: 7 Hakbang

Video: Isang $ 1 LED Mood Lamp Na May ATtiny13 at WS2812: 7 Hakbang

Video: Isang $ 1 LED Mood Lamp Na May ATtiny13 at WS2812: 7 Hakbang
Video: LCD Multifunctional Alarm Clock - How to set Date and Time 2024, Nobyembre
Anonim
Isang $ 1 LED Mood Lamp na may ATtiny13 at WS2812
Isang $ 1 LED Mood Lamp na may ATtiny13 at WS2812

Sundin ang Higit pa ng may-akda:

Personal na CalDAV Server sa isang Single-Board Computer
Personal na CalDAV Server sa isang Single-Board Computer
Personal na CalDAV Server sa isang Single-Board Computer
Personal na CalDAV Server sa isang Single-Board Computer
LCD Invaders: isang Space Invaders Tulad ng Laro sa 16x2 LCD Character Display
LCD Invaders: isang Space Invaders Tulad ng Laro sa 16x2 LCD Character Display
LCD Invaders: isang Space Invaders Tulad ng Laro sa 16x2 LCD Character Display
LCD Invaders: isang Space Invaders Tulad ng Laro sa 16x2 LCD Character Display
Octarine: isang Kulay ng Pagtutugma ng Laro na may WS2812 RGB LEDs
Octarine: isang Kulay ng Pagtutugma ng Laro na may WS2812 RGB LEDs
Octarine: isang Kulay ng Pagtutugma ng Laro na may WS2812 RGB LEDs
Octarine: isang Kulay ng Pagtutugma ng Laro na may WS2812 RGB LEDs

Ito ay isang low-cost mood lamp na may apat na mga mode.

1. Rainbow spark. Ang isang spark ng ilaw ay gumagalaw paitaas pagkatapos ng oras at unti-unting binabago ang kulay.

2. Rainbow glow. Isang matatag na glow na unti-unting nagbabago ng kulay.

3. Simula ng sunog ng kandila.

4. Patay.

Maaari kang magpalit ng mga mode sa pamamagitan ng pag-tap sa isang pindutan ng ugnayan sa itaas. Ang kasalukuyang mode ay nai-save sa memorya ng EEPROM pagkatapos patayin.

Gaano kaliit ang ATtiny13?

Ang ideya ay upang makakuha ng pinakamataas na tampok mula sa minimum na hardware, isang bagay na mas kumplikado kaysa sa awtomatikong switch o thermometer, isang proyekto na malapit sa gilid ng maliit na microcontroller na ito. Pagkatapos ng lahat, ang mga paghihigpit sa tingin mo ay malikhain, tama ba? Kaya, mukhang ito sa simula.

Ang pinaka-mapaghamong sa proyektong ito ay upang itulak ang lahat ng mga code sa ATtiny13. Ang microcontroller ay may 1K bytes flash at 64 bytes RAM lamang. Oo, kapag sinabi kong "bytes", ang ibig kong sabihin ay ang binubuo ng walong piraso. 64 bytes para sa lahat ng iyong lokal na variable at call stack. Upang linawin ito, isaalang-alang kailangan nating kontrolin ang 8 RGB LEDs. Ang bawat isa sa kanila ay tinukoy ng 3 bytes (isa para sa pula, berde at asul na channel ayon sa pagkakabanggit). Kaya, upang maiimbak lamang ang estado ng 8 LEDs, kakailanganin naming magpatupad ng isang hanay ng 8 istraktura ng 3 bytes bawat isa at ang isang pointer sa simula ng array na ito ay tatagal ng isa pang byte. Samakatuwid, 25 ng 64 bytes ay wala. Ginamit lamang namin ang 39% ng RAM at hindi pa talaga nagsisimula. Bilang karagdagan, upang maiimbak ang pitong pangunahing mga kulay ng bahaghari, kakailanganin mo ang 7 × 3 = 21 bytes, kaya't 72% ng RAM ang wala. Sa gayon, tungkol sa mga pangunahing kulay, pinalalaki ko: hindi namin kailangan ang lahat ng mga ito nang sabay sa RAM at hindi sila nagbabago, kaya maaari silang ipatupad bilang isang pare-pareho na array na maiimbak sa flash sa halip na RAM. Gayunpaman, nagbibigay ito ng pangkalahatang impression tungkol sa ginamit na hardware.

Naaalala ang pahayag ni Knuth tungkol sa maagang pag-optimize, nagsimula ako mula sa pag-prototype ng tatlong mga mode ng lampara nang hiwalay upang makita kung ano ang nangyayari. Hiwalay kong sinubukan ang mga ito upang matiyak na gumagana ang mga ito nang maayos at ang bawat isa ay akma sa aking microcontroller. Tumagal ng ilang gabi upang magawa ito at naging maayos ang lahat … hanggang sa sinubukan kong pagsabayin sila sa loob ng switch statement. Ang avr-size utility ay nag-ulat ng laki ng seksyon ng teksto na 1.5 Kb (na may -s flag ng avr-gcc). Sa sandaling iyon ang aking orihinal na hangarin ay upang grab ang ilang ATtiny25 na may 2Kb flash at maaaring iyon ang masayang wakas ng kuwentong ito.

Ngunit sa paanuman ay naramdaman ko na pagkatapos ng malaki ang pag-optimize ay maaari kong pamahalaan upang pag-urong ang crappy code sa 1Kb. Gayunpaman, tumagal ng isa pang linggo upang mapagtanto na imposible at isa pang linggo upang magawa rin ito. Kailangan kong gupitin ang isang bahaghari sa limang pangunahing mga kulay (nang walang makabuluhang pagkakaiba sa paningin). Inalis ko ang mga pahayag ng kaso at gumamit ng isang kadena ng kung-pagkatapos-kung bawasan ang laki ng binary code. Ang animasyon sa apoy ay nangangailangan ng isang pseudorandom number generator na medyo malaki, kaya ipinatupad ko ang isang pinasimple na bersyon ng LFSR na may pare-pareho ang paunang halaga. Wala akong pakialam sa PRNG buong haba ng ikot at naghahanap lamang ng isang balanse sa paglapag sa pagitan ng laki ng code at "makatotohanang animasyon sa sunog". Nagpatupad din ako ng maraming menor de edad na mga pag-optimize na hindi ko matandaan ngayon at nagawa pang i-flash ang lahat ng mga mode bukod sa apoy sa maliit na tilad. Nang maubusan ako ng mga ideya, ang aking kabuuang code ay tungkol sa 1200 bytes.

Nag-timeout ako at maraming binabasa tungkol sa pag-optimize ng AVR code. Malapit na akong sumuko at muling isulat ang lahat sa wika ng pagpupulong ngunit binigyan ko ito ng huling pagkakataon. Sa panahon ng pangwakas na pagmamadali, pinutol ko ang isang bahaghari sa tatlong pangunahing mga kulay at ginawa ang iba upang makalkula nang mabilis, sinuri ko ang lahat at sinundan ang mga rekomendasyon sa pag-optimize ng AVR at sa wakas…

avrdude: pagsusulat ng flash (1004 bytes):

Pagsusulat | ###Oooooooooooooooo | 100% 0.90s

Hindi na kailangang sabihin na ginamit ko ang halos lahat ng RAM at isang byte lamang ng EEPROM upang mag-imbak ng kasalukuyang mode. Hindi ko ipahiwatig na ito ay isang perpekto at panghuli na pagpapatupad. Gumagana lamang ito at umaangkop sa microcontroller. Sigurado ako, mas magagawa mo ito. Ako talaga. Nais ko lamang ibahagi ang kasiyahan ng paglutas ng isang tila hindi praktikal na problema na itinuturing mong halos imposible sa simula. "Sa gayon, ang pag-hack ay nangangahulugang pagtuklas sa mga limitasyon ng kung ano ang posible …" --Richard Stallman.

Mga Pantustos:

1x ATtiny13 MCU ($ 0.28 = $ 0.24 para sa MCU sa SOP-8 na pakete at $ 0.04 para sa DIP8 Adapter)

8x WS2812 RGB LEDs (Inirerekumenda ko ang isang board o isang piraso ng LED stripe) ($ 0.42)

1x TTP223 Touch button ($ 0.10)

1x Micro USB sa DIP Adapter ($ 0.14)

1x 10kΩ risistor (<$ 0.01)

1x 100nF ceramic capacitor (<$ 0.01)

1x 10–47µF electrolytic capacitor (<$ 0.01)

Kabuuang <$ 0.97

Hakbang 1: Pag-setup ng Software

Pag-setup ng Software
Pag-setup ng Software

Kakailanganin mo ang avr-gcc toolchain para sa pag-compile ng source code at avrdude utility para sa pag-upload ng ROM ng microcontroller. Ang proseso ng pag-install ay medyo simple at prangka, ngunit depende ito sa iyong operating system. Kung gumagamit ka ng ilang uri ng GNU / Linux, marahil ay mayroon ka nang tamang mga pakete sa iyong puno ng pag-iimbak. Ang source code ng proyektong ito ay maaaring ma-download dito:

github.com/arduinocelentano/t13_ws2812_lamp

Kakailanganin mo rin ang isang light_ws2812 library:

github.com/cpldcpu/light_ws2812

Kapag nakuha mo na ang avr-gcc toolchain at mga mapagkukunan ng proyekto, patakbuhin ang iyong terminal at i-type ang sumusunod na code:

path ng cd / sa / proyekto

gumawa

Hakbang 2: Programming ang Microcontroller

Programming ang Microcontroller
Programming ang Microcontroller
Programming ang Microcontroller
Programming ang Microcontroller
Programming ang Microcontroller
Programming ang Microcontroller

Kung mayroon kang isang uri ng programmer ng USBASP, ikonekta lamang ito sa Attiny alinsunod sa pinout nito. Karaniwan ay ganito ang hitsura nito ngunit masidhi kong inirerekumenda na suriin ang iyong aktwal na pinout!

Bilang kahalili, maaari kang gumamit ng isang Arduino board bilang isang programmer. Buksan ang Arduino IDE at hanapin ang halimbawa ng Arduino ISP sa menu ng "File → Mga Halimbawa". Matapos i-upload ang sketch, ang iyong Arduino board ay kumikilos bilang isang programmer. Ang mga komento sa sketch code ay magbibigay sa iyo ng isang bakas sa pag-pinout.

Tumakbo ngayon

gumawa ng flash

upang i-flash ang MCU at

gumawa ng piyus

upang itakda ang mga piyus ng piyus.

Hakbang 3: Mga Skematika

Inirerekumendang: