Daftar Isi:
- Perlengkapan
- Langkah 1: Sirkuit
- Langkah 2: Diagram Waktu
- Langkah 3: Pemrograman. Makro dan Definisi
- Langkah 4: Pemrograman. Loop Utama
- Langkah 5: Pemrograman. Fungsi Bantu
- Langkah 6: Pemrograman. Rutinitas Protothread
- Langkah 7: Internal
Video: Attiny85 Pemrograman Bersamaan atau Labu Dengan Mata Berwarna-warni: 7 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:53
Oleh jumbleviewJumbleview.infoIkuti Lainnya oleh penulis:
Tentang: Saya bekerja sebagai insinyur perangkat lunak di salah satu perusahaan Bay Area (California). Setiap kali saya punya waktu, saya suka memprogram pengontrol mikro, membuat mainan mekanis, dan membuat beberapa proyek perbaikan rumah. Selengkapnya Tentang jumbleview »
Proyek ini menunjukkan cara mengontrol dua LED anoda umum tiga warna 10mm (mata warna-warni Labu Halloween Glitter) dengan chip Attiny85. Tujuan dari proyek ini adalah untuk memperkenalkan pembaca ke dalam seni pemrograman bersamaan dan penggunaan perpustakaan protothreads Adam Dunkels. Proyek ini mengasumsikan bahwa pembaca mengetahui tentang pengontrol AVR 8-bit, dapat menulis beberapa program C dan memiliki beberapa pengalaman dengan studio Atmel.
Kode proyek diterbitkan di GitHub:
Perlengkapan
Sebelum memprogram seseorang masih perlu membangun sirkuit. Berikut adalah komponennya:
- Pengontrol Attiny85 (pemasok elektronik apa pun).
- Dua tiga warna 10mm LED dengan anoda umum. Adafruit LED
- Resistor 100 Ohm, 120 Ohm, 150 Ohm 0,125 atau 0,250 Wt (pemasok elektronik apa saja).
- Enam Pin header untuk antarmuka AVR ISP. Dapat dibuat dari tajuk Adafruit ini
- Beberapa papan roti atau papan template tercetak. Saya menggunakan yang ini
- Antarmuka AVR ISP MKII dan Atmel Studio 6.1 (Versi yang lebih baru juga berfungsi).
Langkah 1: Sirkuit
Desain menggunakan lima pin chip:
- Dua pin digunakan untuk mengontrol anoda: setiap anoda LED terpasang ke pin khusus.
- Tiga pin terpasang (melalui resistor) ke katoda LED (warna katoda yang sama dari setiap led yang terpasang pada pin yang sama)
Orang akan bertanya: mengapa tidak menggunakan semua enam pin masuk/keluar dari chip sehingga anoda LED akan terhubung langsung ke +5 v dan setiap katoda akan memiliki pin khusus? Itu akan membuat pemrograman menjadi mudah. Sayangnya, ada masalah: pin PB5 (RESET) adalah pin yang lemah yang mampu menyediakan arus hanya ~2 mA, sementara ada kebutuhan untuk memiliki ~20 mA.
Tentu saja orang dapat membangun penguat transistor untuk pin yang lemah ini, tetapi saya sendiri bila memungkinkan lebih suka memecahkan masalah melalui kode.
Langkah 2: Diagram Waktu
Diagram waktu membantu kita memahami apa yang kita butuhkan untuk memprogram.
Dua baris teratas pada diagram menunjukkan perubahan tegangan pada anoda LED. Tegangan pada pin yang terhubung ke anoda LED berosilasi dengan frekuensi ~ 250 Hz. Osilasi tegangan untuk LED kiri ini adalah kebalikan dari osilasi LED kanan. Ketika tegangan pada anoda tinggi, LED yang sesuai bisa terang. Ketika rendah, LED yang sesuai akan berwarna gelap. Itu berarti setiap LED mungkin terang selama interval 2 milidetik dan gelap selama 2 milidetik lainnya. Karena mata manusia memiliki inersia, kedipan 250 Hz tidak terlihat oleh pengamat. Tiga baris bawah pada diagram menunjukkan perubahan tegangan pada pin yang terhubung ke katoda LED. Mari kita lihat pada kolom diagram pertama. Ini menunjukkan kasus ketika LED kiri berwarna merah dan LED kanan berwarna hijau. Di sini katoda MERAH tetap rendah sementara anoda kiri tinggi, katoda HIJAU tetap rendah sementara anoda kanan tinggi, dan katoda BIRU tetap rendah sepanjang waktu. Kolom lain pada diagram menunjukkan kombinasi tegangan katoda dan anoda untuk berbagai warna.
Seperti yang bisa kita lihat ada saling ketergantungan pada status pin. Tanpa kerangka kerja itu tidak akan mudah untuk diselesaikan. Dan di situlah perpustakaan protothread berguna.
Langkah 3: Pemrograman. Makro dan Definisi
Contoh dalam langkah-langkah pemrograman mewakili versi yang sedikit disederhanakan. Program dipersingkat, dan beberapa definisi simbolis diganti dengan konstanta eksplisit.
Mari kita mulai dari awal. Program termasuk file yang datang dengan Atmel Studio serta header perpustakaan protothread. Selanjutnya ada dua makro untuk memanipulasi level pin dan beberapa definisi untuk memberi nama logis pada sinyal pin. Sejauh ini tidak ada yang istimewa.
Langkah 4: Pemrograman. Loop Utama
Kemudian mari kita lihat bagian akhir untuk melihat apa isi prosedur utama.
Fungsi utama setelah melakukan beberapa inisialisasi tetap dalam loop selamanya. Dalam loop itu membuat langkah selanjutnya:
- Memanggil rutin protothread untuk LED kiri. Ini mengubah beberapa tegangan pin.
- Buat penundaan dua milidetik. Tidak ada perubahan tegangan pin.
- Memanggil protothread untuk LED yang tepat. Ini mengubah beberapa tegangan pin.
- Buat penundaan 2 MS. Tidak ada perubahan tegangan pin.
Langkah 5: Pemrograman. Fungsi Bantu
Sebelum kita mulai membahas protothreads, kita perlu melihat beberapa fungsi helper. Pertama ada fungsi untuk mengatur warna tertentu. Mereka langsung. Ada banyak fungsi seperti jumlah warna yang didukung (tujuh) dan satu lagi fungsi untuk mengatur gelap LED (NoColor).
Dan ada satu lagi fungsi yang akan langsung dipanggil oleh rutin protothread. Namanya adalah DoAndCountdown().
Secara teknis penggunaan fungsi seperti itu tidak wajib tetapi saya merasa nyaman. Ini memiliki tiga argumen:
- Pointer untuk berfungsi mengatur warna LED (seperti RedColor atau GreenColor atau dll)
- Nilai awal penghitung terbalik: jumlah berapa kali fungsi ini harus dipanggil pada tahap protothread tertentu.
- Pointer untuk membalikkan counter. Diasumsikan bahwa ketika terjadi perubahan warna maka pencacah terbalik adalah 0, maka pada iterasi pertama kode akan diberikan ke nilai awal pencacah tersebut. Setelah setiap penghitung iterasi dikurangi.
Fungsi DoAndCountdown() mengembalikan nilai penghitung terbalik.
Langkah 6: Pemrograman. Rutinitas Protothread
Dan inilah inti kerangka kerja: rutin protothread. Demi kesederhanaan contoh dibatasi hanya pada tiga langkah: untuk perubahan warna menjadi MERAH, menjadi HIJAU, dan menjadi BIRU.
Fungsi dipanggil dengan dua argumen:
- Pointer ke struktur protothread. Struktur itu diinisialisasi oleh main sebelum loop utama dimulai.
- Pointer untuk membalikkan counter. Itu disetel ke 0 oleh main sebelum loop utama dimulai.
Fungsi mengatur voltase untuk membuat LED kiri aktif dan kemudian memulai segmen protothread. Segmen ini berada di antara makro PT_BEGIN dan PT_END. Di dalamnya ada beberapa kode yang dalam kasus kami hanya mengulang makro PT_WAIT_UNTIL. Makro ini melakukan selanjutnya:
- Pemanggilan fungsi DoAndCountdown. Itu mengatur tegangan pada katoda LED untuk memancarkan warna tertentu.
- Hasil yang dikembalikan dibandingkan dengan 0. Jika kondisinya 'salah', fungsi protothread segera kembali dan menghasilkan kontrol ke loop utama.
- Saat protothread dipanggil di lain waktu, protothread kembali mengeksekusi kode sebelum PT_BEGIN, lalu melompat langsung ke dalam makro PT_WAIT_UNTIL tempat protothread kembali terakhir kali.
- Tindakan tersebut diulang sampai hasil DoAndCountdown adalah 0. Dalam hal ini tidak ada pengembalian, program tetap berada di protothread dan mengeksekusi baris kode berikutnya. Dalam kasus kami ini adalah PT_WAIT_UNTIL berikutnya tetapi secara umum bisa jadi hampir semua kode C.
- Pada eksekusi awal pencacah terbalik PT_WAIT_UNTIL kedua adalah 0, jadi prosedur DoAndCountdown() setel ke nilai awal. Makro kedua lagi akan dieksekusi 250 kali hingga penghitung pembalikan mencapai 0.
- Status struct pt disetel ulang segera setelah kontrol mencapai makro PT_END. Ketika fungsi protothread dipanggil, segmen protothread berikutnya mulai mengeksekusi baris kode tepat setelah PT_BEGIN.
Ada rutinitas protothread serupa untuk LED kanan. Dalam contoh kami, ini hanya memberlakukan urutan warna yang berbeda, tetapi jika kami dapat melakukannya dengan cara yang sama sekali berbeda: tidak ada sambungan ketat antara rutin LED kiri dan kanan.
Langkah 7: Internal
Seluruh program kurang dari 200 baris kode (dengan komentar dan baris kosong) dan membutuhkan kurang dari 20% dari memori kode Attiny85. Jika diperlukan, dimungkinkan untuk menggunakan di sini beberapa rutinitas protothread lagi dan menetapkan logika yang jauh lebih rumit untuk mereka.
Pustaka Protothreads adalah bentuk paling sederhana dari pemrograman konkuren komputer. Pemrograman serentak adalah pendekatan yang memungkinkan untuk membagi program menjadi bagian-bagian logis: kadang-kadang disebut coroutine, kadang-kadang thread, kadang-kadang tugas. Prinsipnya adalah bahwa setiap tugas tersebut dapat berbagi kekuatan prosesor yang sama sambil menjaga kode kurang lebih linier dan independen dari bagian lain. Tugas dari sudut pandang logis dapat dieksekusi secara bersamaan.
Untuk sistem lanjutan, kontrol tugas-tugas tersebut dilakukan baik oleh kernel sistem operasi atau oleh runtime bahasa yang disematkan ke dalam eksekusi oleh kompiler. Tetapi dalam kasus programer aplikasi protothreads mengontrolnya secara manual dengan menggunakan perpustakaan makro protothreads dalam rutinitas tugas dan menjalankan rutinitas tersebut (biasanya di luar loop utama).
Anda mungkin ingin tahu cara kerja protothread? Di mana keajaiban tersembunyi? Protothread bergantung pada fitur bahasa C khusus: fakta bahwa pernyataan kasus switch C dapat disematkan ke dalam if atau blok lain (seperti while atau for). Detail dapat Anda temukan di situs Adam Dunkels
Bagian dalam elektronik dari proyek ini sangat sederhana. Foto di atas memberi Anda beberapa petunjuk. Saya yakin Anda bisa lebih baik.
Direkomendasikan:
Labu Halloween Dengan Mata Animatronik Bergerak - Labu Ini Bisa Memutar Mata!: 10 Langkah (dengan Gambar)
Labu Halloween Dengan Mata Animatronik Bergerak | Labu Ini Dapat Memutar Matanya!: Dalam Instruksi ini, Anda akan belajar cara membuat labu Halloween yang menakutkan semua orang saat matanya bergerak. Sesuaikan jarak pemicu sensor ultrasonik ke nilai yang tepat (langkah 9), dan labu Anda akan membatu siapa saja yang berani mengambil cand
Buat Bug Mata-mata Anda Sendiri (Perekam Suara Arduino): 5 Langkah (dengan Gambar)
Make Your Own Spy Bug (Arduino Voice Recorder): Dalam proyek ini saya akan menunjukkan kepada Anda bagaimana saya menggabungkan Arduino Pro Mini dengan beberapa komponen pelengkap untuk membuat perekam suara yang juga dapat disalahgunakan sebagai bug mata-mata. Ini memiliki waktu berjalan sekitar 9 jam, kecil dan sangat mudah
Pelindung Mata: Pelindung Mata yang Dipicu Suara: 9 Langkah (dengan Gambar)
Pelindung Mata: Pelindung Mata yang Dipicu Suara: Pelindung Mata adalah pelindung mata yang dipicu oleh suara Desibel Tinggi yang didukung Arduino. Ini mendeteksi suara alat berat dan menurunkan kacamata pelindung mata saat peralatan sedang digunakan. Garis BesarPada langkah pertama, saya akan menjelaskan Inspirati
Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah
Bagaimana Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler.: Saya tahu apa yang Anda pikirkan: "Hah? Ada banyak Instructables tentang cara menggunakan mikrokontroler untuk mengukur frekuensi sinyal. Menguap." Tapi tunggu, ada hal baru dalam hal ini: Saya menjelaskan metode pengukuran frekuensi yang jauh lebih tinggi daripada mikro
Mata Labu Seram Animasi: 9 Langkah (dengan Gambar)
Animated Spooky Pumpkin Eyes: Beberapa tahun yang lalu ketika mencari inspirasi untuk animasi Halloween prop baru, kami menemukan sebuah video dari kontributor YouTube 68percentwater yang disebut Arduino Servo Pumpkin. Video ini persis seperti yang kami cari, namun, beberapa