Isi kandungan:

Lampu Suasana LED $ 1 Dengan ATtiny13 dan WS2812: 7 Langkah
Lampu Suasana LED $ 1 Dengan ATtiny13 dan WS2812: 7 Langkah

Video: Lampu Suasana LED $ 1 Dengan ATtiny13 dan WS2812: 7 Langkah

Video: Lampu Suasana LED $ 1 Dengan ATtiny13 dan WS2812: 7 Langkah
Video: Dynamic Flex LED Strip Light Tape Sync Voice Remote Controller 2024, November
Anonim
Lampu Mood LED $ 1 Dengan ATtiny13 dan WS2812
Lampu Mood LED $ 1 Dengan ATtiny13 dan WS2812

Oleh arduinocelentano Ikuti Lagi oleh pengarang:

Pelayan CalDAV Peribadi pada Komputer Papan Tunggal
Pelayan CalDAV Peribadi pada Komputer Papan Tunggal
Pelayan CalDAV Peribadi pada Komputer Papan Tunggal
Pelayan CalDAV Peribadi pada Komputer Papan Tunggal
LCD Invaders: Space Space Invaders Like Game pada Paparan Karakter LCD 16x2
LCD Invaders: Space Space Invaders Like Game pada Paparan Karakter LCD 16x2
LCD Invaders: Space Space Invaders Like Game pada Paparan Karakter LCD 16x2
LCD Invaders: Space Space Invaders Like Game pada Paparan Karakter LCD 16x2
Octarine: Permainan Pencocokan Warna dengan LED WS2812 RGB
Octarine: Permainan Pencocokan Warna dengan LED WS2812 RGB
Octarine: Permainan Pencocokan Warna dengan LED WS2812 RGB
Octarine: Permainan Pencocokan Warna dengan LED WS2812 RGB

Ini adalah lampu mood kos rendah dengan empat mod.

1. Percikan pelangi. Kilauan cahaya bergerak ke atas dari semasa ke semasa dan secara beransur-ansur mengubah warnanya.

2. Pelangi bercahaya. Cahaya stabil yang secara beransur-ansur mengubah warna.

3. Simulasi api lilin.

4. Mati.

Anda boleh menukar mod dengan mengetuk butang sentuh di bahagian atas. Mod semasa disimpan dalam memori EEPROM setelah dimatikan.

Berapa kecil ATtiny13?

Ideanya adalah untuk mendapatkan ciri maksimum dari perkakasan minimum, sesuatu yang lebih kompleks daripada suis automatik atau termometer, sebuah projek yang hampir dengan tepi mikrokontroler kecil ini. Lagipun, sekatan membuat anda berfikir kreatif, bukan? Awalnya, ia kelihatan seperti itu pada awalnya.

Yang paling mencabar dalam projek ini adalah memasukkan semua kod ke ATtiny13. Mikrokontroler mempunyai denyar 1K byte dan hanya 64 bait RAM. Ya, apabila saya mengatakan "bait", saya bermaksud yang terdiri daripada lapan bit. 64 bait untuk semua pemboleh ubah tempatan dan timbunan panggilan anda. Untuk memperjelasnya, pertimbangkan bahawa kita harus mengawal 8 LED RGB. Masing-masing ditentukan oleh 3 bait (masing-masing untuk saluran merah, hijau dan biru). Jadi, hanya untuk menyimpan keadaan 8 LED, kita perlu menerapkan susunan 8 struktur 3 bait masing-masing dan penunjuk ke permulaan array ini memerlukan satu bait lagi. Oleh itu, 25 daripada 64 bait habis. Kami baru menggunakan 39% RAM dan belum betul-betul memulakannya. Selain itu, untuk menyimpan tujuh warna pelangi asas, anda memerlukan 7 × 3 = 21 bait, sehingga 72% RAM habis. Nah, seperti warna asas, saya melebih-lebihkan: kita tidak memerlukan semuanya pada masa yang sama dalam RAM dan ia tidak pernah berubah, jadi ia mungkin dilaksanakan sebagai tatasusunan tetap untuk disimpan dalam flash dan bukannya RAM. Bagaimanapun, ia memberikan gambaran keseluruhan mengenai perkakasan terpakai.

Mengingati pernyataan Knuth mengenai pengoptimuman pramatang, saya mula memprotaip tiga mod lampu secara berasingan untuk melihat apa yang berlaku. Saya telah mengujinya secara berasingan untuk memastikan ia berfungsi dengan betul dan masing-masing sesuai dengan mikrokontroler saya. Ia memerlukan beberapa malam untuk menyelesaikannya dan semuanya berjalan lancar … sehingga saya cuba menyatukannya di dalam pernyataan pertukaran. utiliti ukuran avr melaporkan ukuran bahagian teks 1.5 Kb (dengan bendera -s avr-gcc). Pada masa itu, tujuan asal saya adalah untuk mengambil beberapa ATtiny25 dengan flash 2Kb dan itu mungkin merupakan akhir cerita yang gembira ini.

Tetapi entah bagaimana saya merasakan bahawa setelah pengoptimuman yang cukup besar saya dapat mengecilkan kod buruk itu menjadi 1Kb. Namun, diperlukan satu minggu lagi untuk menyedari bahawa mustahil dan satu minggu lagi untuk mencapainya. Saya terpaksa memotong pelangi kepada lima warna asas (tanpa perbezaan visual yang ketara). Saya menyingkirkan penyataan kes dan menggunakan rangkaian if-then-if untuk mengurangkan saiz kod binari. Animasi api memerlukan penjana nombor pseudorandom yang cukup besar, jadi saya menerapkan versi LFSR yang dipermudahkan dengan nilai awal yang tetap. Saya tidak peduli dengan panjang kitaran penuh PRNG dan hanya mencari keseimbangan keturunan antara saiz kod dan "animasi api realistik". Saya juga melaksanakan banyak pengoptimuman kecil yang saya tidak ingat sekarang dan bahkan berjaya mengedipkan semua mod selain menyalakan cip. Ketika saya kehabisan idea, jumlah kod saya kira-kira 1200 bait.

Saya mengambil masa habis dan telah banyak membaca mengenai pengoptimuman kod AVR. Saya hampir menyerah dan menulis semula semuanya dalam bahasa perhimpunan tetapi memberi peluang terakhir. Semasa pengoptimuman terakhir, saya telah memotong pelangi kepada tiga warna asas dan membuat yang lain dapat dikira dengan cepat, saya memeriksa semuanya dan mengikuti cadangan pengoptimuman AVR dan akhirnya…

avrdude: menulis kilat (1004 bait):

Penulisan | ################################################# | 100% 0.90s

Tidak perlu dikatakan bahawa saya menggunakan hampir semua RAM dan hanya satu bait EEPROM untuk menyimpan mod semasa. Saya tidak bermaksud bahawa ini adalah pelaksanaan yang ideal dan muktamad. Ia hanya berfungsi dan sesuai dengan mikrokontroler. Saya yakin, anda boleh melakukannya dengan lebih baik. Saya betul-betul. Saya hanya ingin berkongsi keseronokan menyelesaikan masalah yang nampaknya tidak praktikal yang anda anggap hampir mustahil pada awalnya. “Oleh itu, penggodaman bermaksud meneroka batas apa yang mungkin…” --Richard Stallman.

Bekalan:

1x ATtiny13 MCU ($ 0.28 = $ 0.24 untuk MCU dalam pakej SOP-8 dan $ 0.04 untuk Penyesuai DIP8)

8x WS2812 RGB LED (saya cadangkan papan atau sehelai jalur LED) ($ 0.42)

Butang Sentuh 1x TTP223 ($ 0.10)

1x USB Micro to DIP Adapter ($ 0.14)

Perintang 1x 10kΩ (<$ 0.01)

Kapasitor seramik 1x 100nF (<$ 0.01)

Kapasitor elektrolitik 1x 10–47µF (<$ 0.01)

Jumlah <$ 0.97

Langkah 1: Persediaan Perisian

Persediaan Perisian
Persediaan Perisian

Anda memerlukan rantai alat avr-gcc untuk menyusun kod sumber dan utiliti avrdude untuk memuat naik ROM mikrokontroler. Proses pemasangan cukup mudah dan mudah, tetapi bergantung pada sistem operasi anda. Sekiranya anda menggunakan beberapa jenis GNU / Linux, anda mungkin sudah mempunyai pakej yang sesuai di pokok repositori anda. Kod sumber projek ini boleh dimuat turun di sini:

github.com/arduinocelentano/t13_ws2812_lamp

Anda juga memerlukan perpustakaan light_ws2812:

github.com/cpldcpu/light_ws2812

Setelah anda mendapat rantai alat dan sumber projek avr-gcc, jalankan terminal anda dan taipkan kod berikut:

jalan cd / ke / projek

membuat

Langkah 2: Memprogram Pengawal Mikro

Mengaturcara Pengawal Mikro
Mengaturcara Pengawal Mikro
Mengaturcara Pengawal Mikro
Mengaturcara Pengawal Mikro
Mengaturcara Pengawal Mikro
Mengaturcara Pengawal Mikro

Sekiranya anda mempunyai semacam programmer USBASP, sambungkan sahaja ke Attiny mengikut pinoutnya. Biasanya ia kelihatan seperti ini tetapi saya sangat mengesyorkan anda melihat pinout sebenar anda!

Sebagai alternatif, anda boleh menggunakan papan Arduino sebagai pengaturcara. Buka Arduino IDE dan cari contoh Arduino ISP dalam menu "Fail → Contoh". Setelah memuat naik lakaran, papan Arduino anda bertindak sebagai pengaturcara. Komen dalam kod lakaran akan memberi anda petunjuk untuk keluar.

Sekarang jalankan

buat denyar

untuk menyalakan MCU dan

buat fius

untuk menetapkan bit fius.

Disyorkan: