Daftar Isi:

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

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

Video: Lampu Suasana Hati LED $1 Dengan ATtiny13 dan WS2812: 7 Langkah
Video: Hyderson Lampu Led Strip 5050 5M RGB SET | Link Pembelian Di Deskripsi 2024, November
Anonim
Lampu Mood LED $1 Dengan ATtiny13 dan WS2812
Lampu Mood LED $1 Dengan ATtiny13 dan WS2812

Oleh arduinocelentanoFollow More by the author:

Server CalDAV Pribadi di Komputer Papan Tunggal
Server CalDAV Pribadi di Komputer Papan Tunggal
Server CalDAV Pribadi di Komputer Papan Tunggal
Server CalDAV Pribadi di Komputer Papan Tunggal
LCD Invaders: Space Invaders Seperti Game di Layar Karakter LCD 16x2
LCD Invaders: Space Invaders Seperti Game di Layar Karakter LCD 16x2
LCD Invaders: Space Invaders Seperti Game di Layar Karakter LCD 16x2
LCD Invaders: Space Invaders Seperti Game di Layar Karakter LCD 16x2
Octarine: Game Mencocokkan Warna dengan LED RGB WS2812
Octarine: Game Mencocokkan Warna dengan LED RGB WS2812
Octarine: Game Mencocokkan Warna dengan LED RGB WS2812
Octarine: Game Mencocokkan Warna dengan LED RGB WS2812

Ini adalah lampu mood murah dengan empat mode.

1. Percikan pelangi. Sebuah percikan cahaya bergerak ke atas dari waktu ke waktu dan secara bertahap berubah warna.

2. Cahaya pelangi. Sebuah cahaya stabil yang secara bertahap mengubah warna.

3. Simulasi api lilin.

4. Mati.

Anda dapat beralih mode dengan mengetuk tombol sentuh di bagian atas. Mode saat ini disimpan dalam memori EEPROM setelah dimatikan.

Seberapa kecil ATtiny13?

Idenya adalah untuk mendapatkan fitur maksimal dari perangkat keras minimum, sesuatu yang lebih kompleks daripada sakelar atau termometer otomatis, sebuah proyek yang dekat dengan tepi mikrokontroler kecil ini. Lagi pula, pembatasan membuat Anda berpikir kreatif, bukan? Yah, itu tampak seperti itu pada awalnya.

Yang paling menantang dalam proyek ini adalah memasukkan semua kode ke ATtiny13. Mikrokontroler memiliki flash 1K byte dan hanya 64 byte RAM. Ya, ketika saya mengatakan "byte", maksud saya yang terdiri dari delapan bit. 64 byte untuk semua variabel lokal Anda dan tumpukan panggilan. Untuk memperjelas, pertimbangkan kita harus mengontrol 8 LED RGB. Masing-masing ditentukan oleh 3 byte (masing-masing satu untuk saluran merah, hijau dan biru). Jadi, hanya untuk menyimpan status 8 LED, kita perlu mengimplementasikan larik 8 struktur masing-masing 3 byte dan penunjuk ke awal larik ini akan membutuhkan satu byte lagi. Jadi, 25 dari 64 byte keluar. Kami baru saja menggunakan 39% RAM dan belum benar-benar memulai. Selain itu, untuk menyimpan tujuh warna pelangi dasar, Anda memerlukan 7×3 = 21 byte, sehingga 72% RAM habis. Nah, untuk warna dasar, saya melebih-lebihkan: kita tidak membutuhkan semuanya secara bersamaan di RAM dan warnanya tidak pernah berubah, jadi warna-warna tersebut dapat diimplementasikan sebagai array konstan untuk disimpan dalam flash alih-alih RAM. Bagaimanapun, itu memberi kesan keseluruhan tentang perangkat keras yang digunakan.

Mengingat pernyataan Knuth tentang optimasi prematur, saya mulai membuat prototipe tiga mode lampu secara terpisah untuk melihat apa yang terjadi. Saya telah mengujinya secara terpisah untuk memastikan mereka berfungsi dengan baik dan masing-masing cocok dengan mikrokontroler saya. Butuh beberapa malam untuk menyelesaikannya dan semuanya berjalan dengan baik … sampai saya mencoba menggabungkannya ke dalam pernyataan switch. utilitas avr-size melaporkan ukuran bagian teks 1,5 Kb (dengan tanda -s dari avr-gcc). Pada saat itu niat awal saya adalah untuk mengambil beberapa ATtiny25 dengan flash 2Kb dan itu bisa menjadi akhir yang bahagia dari cerita ini.

Tapi entah bagaimana saya merasa bahwa setelah optimasi yang cukup besar saya bisa mengatur untuk mengecilkan kode jelek itu menjadi 1Kb. Namun, butuh satu minggu lagi untuk menyadari bahwa itu tidak mungkin dan satu minggu lagi untuk mencapainya. Saya harus memotong pelangi menjadi lima warna dasar (tanpa perbedaan visual yang signifikan). Saya menyingkirkan pernyataan kasus dan menggunakan rantai if-then-if untuk mengurangi ukuran kode biner. Animasi api membutuhkan generator nomor pseudorandom yang cukup banyak, jadi saya menerapkan versi LFSR yang disederhanakan dengan nilai awal yang konstan. Saya tidak peduli dengan panjang siklus penuh PRNG dan hanya mencari keseimbangan antara ukuran kode dan "animasi api realistis". Saya juga menerapkan banyak optimasi kecil yang saya tidak ingat sekarang dan bahkan berhasil mem-flash semua mode selain api ke dalam chip. Ketika saya kehabisan ide, total kode saya sekitar 1200 byte.

Saya mengambil waktu habis dan telah membaca banyak tentang pengoptimalan kode AVR. Saya hampir menyerah dan menulis ulang semuanya dalam bahasa rakitan tetapi memberikannya kesempatan terakhir. Selama terburu-buru pengoptimalan terakhir, saya telah memotong pelangi menjadi tiga warna dasar dan membuat yang lain dihitung dengan cepat, saya memeriksa semuanya dan mengikuti rekomendasi pengoptimalan AVR dan akhirnya…

avrdude: menulis flash (1004 byte):

Menulis | ############################################################# | 100% 0.90 detik

Tidak perlu dikatakan bahwa saya menggunakan hampir semua RAM dan hanya satu byte EEPROM untuk menyimpan mode saat ini. Saya tidak menyiratkan bahwa ini adalah implementasi yang ideal dan utama. Ini hanya bekerja dan cocok dengan mikrokontroler. Saya yakin, Anda bisa melakukannya dengan lebih baik. saya benar-benar. Saya hanya ingin berbagi kesenangan memecahkan masalah yang tampaknya tidak praktis yang Anda anggap hampir mustahil di awal. “Jadi, meretas berarti menjelajahi batas dari apa yang mungkin…” --Richard Stallman.

Perlengkapan:

1x ATtiny13 MCU ($0,28 = $0,24 untuk MCU dalam paket SOP-8 dan $0,04 untuk Adaptor DIP8)

8x WS2812 RGB LED (Saya merekomendasikan papan atau strip LED) ($0,42)

1x TTP223 Tombol sentuh ($0,10)

1x Micro USB ke Adaptor DIP ($0,14)

1x 10kΩ resistor (<$0,01)

1x 100nF kapasitor keramik (<$0,01)

1x 10–47µF kapasitor elektrolitik (<$0,01)

Jumlah <$0,97

Langkah 1: Pengaturan Perangkat Lunak

Pengaturan Perangkat Lunak
Pengaturan Perangkat Lunak

Anda memerlukan rantai alat avr-gcc untuk mengkompilasi kode sumber dan utilitas avrdude untuk mengunggah ROM mikrokontroler. Proses instalasi cukup sederhana dan mudah, tetapi itu tergantung pada sistem operasi Anda. Jika Anda menggunakan semacam GNU/Linux, Anda mungkin sudah memiliki paket yang tepat di pohon repositori Anda. Kode sumber proyek ini dapat diunduh di sini:

github.com/arduinocelentano/t13_ws2812_lamp

Anda juga memerlukan pustaka light_ws2812:

github.com/cpldcpu/light_ws2812

Setelah Anda mendapatkan rantai alat dan sumber proyek avr-gcc, jalankan terminal Anda dan ketik kode berikut:

cd jalur/ke/proyek

membuat

Langkah 2: Pemrograman Mikrokontroler

Memprogram Mikrokontroler
Memprogram Mikrokontroler
Memprogram Mikrokontroler
Memprogram Mikrokontroler
Memprogram Mikrokontroler
Memprogram Mikrokontroler

Jika Anda memiliki semacam programmer USBASP, hubungkan saja ke Attiny sesuai dengan pinout-nya. Biasanya akan terlihat seperti ini, tetapi saya sangat menyarankan untuk memeriksa pinout Anda yang sebenarnya!

Atau, Anda dapat menggunakan papan Arduino sebagai programmer. Buka Arduino IDE dan temukan contoh Arduino ISP di menu “File→Examples”. Setelah mengunggah sketsa, papan Arduino Anda bertindak sebagai programmer. Komentar dalam kode sketsa akan memberi Anda petunjuk untuk pinout.

Sekarang lari

membuat flash

untuk mem-flash MCU dan

membuat sekering

untuk mengatur bit sekering.

Direkomendasikan: