
Semuanya dimulai dengan akuisisi oleh penulis di pasar sekunder perangkat yang menarik - Smart Response XE (
deskripsi singkat ). Ini ditujukan untuk sekolah: setiap siswa di kelas menerima perangkat yang mirip dengan buku catatan elektronik atau penerjemah tahun sembilan puluhan, guru mengajukan pertanyaan, dan siswa mengetik di keyboard perangkat jawaban yang diterima melalui saluran radio (802.15,4) ke penerima yang terhubung ke PC guru.
Dukungan untuk perangkat ini dihentikan beberapa tahun yang lalu, dan fakta bahwa sekolah membeli masing-masing $ 100-200, sekarang muncul di eBay seharga 10 atau kurang. Besi di sana sangat cocok untuk percobaan geek:
- Keyboard 60 tombol
- tampilan dengan resolusi 384x136, 2 bit per piksel - mirip dengan BK, CGA, tetapi 4 bukan warna, tetapi gradasi kecerahan
- Mikrokontroler ATmega128RFA1 (memori flash 128 kB, ROM 4 kB, RAM 16 kB, transceiver standar 802.15.4)
- eksternal (berkenaan dengan mikrokontroler, dan bukan seluruh perangkat) memori flash 1 megabyte (128 kilobyte) dengan SPI
- kompartemen untuk 4 elemen AAA.
Dengan nama mikrokontroler, jelas bahwa itu milik keluarga AVR, yang berarti membuat perangkat yang kompatibel dengan Arduino adalah lebih dari sekadar tugas sepele ...
Dari berita di
Hackaday, penulis menemukan bahwa mereka
telah melakukan ini (tautan yang sama mengatakan apa yang harus terhubung), memiliki kesempatan untuk menjalankan permainan untuk Arduboy:
Tetapi penulis lebih tertarik pada kesempatan untuk tidak bermain di perangkat, tetapi untuk belajar:
- serial flash SPI
- pengunduh untuk AVR
- standar 802.15.4
Penulis mulai dengan menulis
perpustakaan (GPL v3) yang memungkinkan Anda untuk menginisialisasi tampilan, menampilkan teks dan persegi panjang, dan juga mengakses memori flash dengan antarmuka SPI. Kemudian ia mulai memunculkan ide-ide untuk penggunaan praktis perangkat ini: terminal multi-player yang kompatibel dengan VT-100 yang berukuran saku. Setelah membuat ulang tiga perangkat, ia memutuskan untuk "mengajar" mereka cara membuat sketsa "melalui udara". Yang tidak hanya menarik, tetapi juga sangat nyaman: sulit untuk membuka penutup perangkat setiap kali, dan di bawah penutup baterai hanya ada celah yang memungkinkan Anda untuk menghubungkan programmer JTAG ke papan tulis.

Ini cukup untuk mengisi bootloader Arduino, tetapi bukan sketsa - port serial tidak dihasilkan di sana, Anda masih tidak dapat melakukannya tanpa membuka kasing. Juga, garis TX0 dan RX0 dari port serial pertama diselaraskan dengan garis pemungutan suara dari matriks keyboard, yaitu, yang sepanjang tombol fungsi disurvei ke sisi tampilan. Tetapi apa yang harus dilakukan - penulis membuat ini:

Di sana ia mengeluarkan jalur JTAG, dan sekarang tidak perlu membuka kompartemen baterai. Dan untuk dapat mengisi sketsa, saya membawa kedua port serial ke konektor yang sama, menambahkan juga saklar, karena ketika baterai dipasang, perangkat tidak dapat dimatikan secara fisik dengan cara yang berbeda.
Butuh waktu cukup lama untuk bekerja dengan besi solder, pisau klerikal, dan pistol lem. Secara umum, menuangkan sketsa "di udara" jauh lebih nyaman, sangat mendesak untuk menciptakan sesuatu untuk ini.
Arduino IDE menggunakan
avrdude untuk mengisi sketsa. Ini berinteraksi dengan mikrokontroler melalui protokol
STK500 , yang memungkinkan Anda mentransfer file di kedua arah. Ini tidak kompatibel dengan saluran di mana penundaan variabel, distorsi dan kehilangan data mungkin terjadi. Jika ada sesuatu yang berbunyi atau gemerisik di saluran serial, Anda bisa menjadi gila dalam mencari penyebab. Pernah penulis tersiksa selama setengah hari sampai dia menyadari bahwa masalahnya ada pada kabel yang buruk, serta konverter yang berubah-ubah dari antarmuka CP2102. Bahkan mikrokontroler dengan konverter antarmuka bawaan, misalnya, ATmega32u4, kadang-kadang bisa sangat nakal. Setiap pengguna Arduino memperhatikan bahwa kesalahan saat mengunggah sketsa tidak jarang terjadi. Kadang-kadang rekaman berjalan dengan baik, dan kesalahan terdeteksi selama pembacaan verifikasi. Ini tidak berarti bahwa ada kesalahan saat menulis - kegagalan itu saat membaca. Sekarang bayangkan ketika bekerja "di udara" hal yang sama akan terjadi, tetapi jauh lebih sering.
Setelah mencoba berbagai cara untuk mengatasi masalah ini, penulis datang dengan yang berikut. Perangkat ini memiliki memori flash 128 kilobyte dengan antarmuka SPI - kami menerima data melalui kabel (ingat bahwa penulis sudah memiliki satu perangkat dengan konektor di samping), kami menggunakan memori ini sebagai penyangga, dan mengirim data ke perangkat lain melalui saluran radio. Halo dari Cybiko.
Setelah menulis kode untuk bekerja dengan saluran radio, serta font, bootloader menjadi lebih dari 4 kilobyte. Oleh karena itu, nilai HFUSE harus diubah dari 0xDA ke 0xD8. Sekarang bootloader dapat mencapai 8 kilobyte, dan alamat awal telah menjadi 0x1E000. Ini tercermin dalam Makefile, tetapi harus diperhitungkan saat mengisi
bootloader dengan avrdude.
Transceiver standar 802.15.4 pada ATmega128RFA1 pada awalnya dirancang untuk beroperasi pada protokol
ZigBee , yang agak rumit, jadi penulis memutuskan untuk hanya mengirim paket saja. Ini adalah perangkat keras yang diimplementasikan dalam ATmega128RFA1, jadi diperlukan sedikit kode. Juga, untuk kesederhanaan, penulis memutuskan untuk menggunakan saluran tetap, mencegahnya memilihnya secara manual. Standar 802.15.4 mendukung 16 saluran dengan angka dari 11 hingga 26. Mereka cukup tersumbat, beberapa juga tumpang tindih saluran WiFi (merah menunjukkan saluran ZigBee, biru, hijau dan kuning - WiFi).

Ternyata saluran 15 dan 26 adalah yang paling rentan terhadap gangguan dari WiFi. Penulis memilih yang kedua. Penafian: Penerjemah tidak tahu apakah ZigBee sangat disederhanakan. Mungkin perlu sedikit lebih banyak pemrograman dan implementasi penuhnya?
Pada perangkat pertama, perlu untuk menerapkan mesin negara yang mentransmisikan data menggunakan protokol STK500. Sebagian besar, pesan yang dikirim dan diterima bersifat swasembada, tetapi beberapa terkait dengan pesan yang telah melewati saluran sebelumnya. Deskripsi dialog diberikan di
sini .
Komponen penting dari dialog ini adalah transfer paket yang ditujukan untuk menulis ke memori flash perangkat tujuan. Mikrokontroler sederhana dari keluarga AVR memiliki ukuran halaman 128 byte, tetapi ATmega128RFA1 memiliki ukuran 256. Dan memori flash yang menghubungkan melalui protokol SPI memiliki ukuran yang sama. Program di perangkat pertama saat menuangkan sketsa tidak segera mentransfernya ke yang kedua, tetapi menulisnya ke memori ini. Ketika Arduino IDE memeriksa kebenaran rekaman, mereka mengirimkannya apa yang tertulis di sana. Sekarang Anda perlu mentransfer data yang diterima melalui udara ke perangkat kedua. Pada saat yang sama, beralih dari penerimaan ke transmisi dan sebaliknya terjadi cukup sering. Protokol STK500 acuh tak acuh terhadap penundaan, tetapi tidak mentolerir kehilangan data (aneh, tetapi dikatakan di atas bahwa keterlambatan dalam transmisi data juga mempengaruhi). Dan kerugian dalam transmisi nirkabel tidak bisa dihindari. ATmega128RFA1 memiliki implementasi perangkat keras built-in dari permintaan berulang dengan keraguan tentang transmisi yang benar, tetapi penulis memutuskan untuk mengimplementasikan program yang sama secara mandiri. Dia mengembangkan protokol di mana lebih banyak data lewat di satu arah daripada di yang lain.
Itu tidak sempurna, tetapi semuanya bekerja. Halaman 256-byte dibagi menjadi empat segmen, yang masing-masing ditransmisikan melalui udara sebagai sebuah paket. Sebuah paket menampung hingga 125 byte data plus satu byte panjang dan dua CRC. Jadi fragmen 64 byte panjang bersama dengan nomor halaman dan segmen (dari 0 hingga 3) ditempatkan di sana. Di perangkat penerima, disediakan variabel yang memungkinkan Anda melacak berapa segmen yang diterima, dan ketika keempat segmen tersebut tiba, konfirmasi dikirim ke perangkat pengirim bahwa seluruh halaman telah diterima. Tidak ada konfirmasi (CRC tidak cocok) - kirim kembali seluruh halaman. Kecepatan pada saat yang sama ternyata lebih dari ketika mentransmisikan melalui kabel. Lihat:
Tetapi sebenarnya, akan diperlukan untuk menyediakan cara yang nyaman untuk menghubungkan perangkat kabel ke perangkat untuk mengisi sketsa dan di atasnya. Misalnya, letakkan di dalam konverter antarmuka seperti itu pada CP2102, seperti pada foto, dan tempelkan pada papan sehingga dapat menahan gaya saat menghubungkan dan melepaskan kabel Micro USB.

Ini juga memiliki stabilisator 3,3 volt (dan cara menggunakannya di perangkat dengan catu daya 6 volt - jika saja ada stabilizer yang sama, dan Anda dapat menambahkan dua dioda untuk secara otomatis memilih dari mana perangkat akan dihidupkan) Ketiga LED harus dihapus dari papan konverter antarmuka, jika tidak mereka akan memuat baterai tambahan saat bekerja dari mereka, dan juga mengganggu polling keyboard dan bekerja dengan memori flash dengan antarmuka SPI.
Pengejaran tujuan ternyata lebih menarik daripada pencapaiannya (dan Anda tidak perlu bercanda tentang bus). Penulis belajar banyak tentang bootloader untuk AVR, memori flash dengan SPI, protokol STK500 dan standar 802.15.4.
Semua kode lain selain perpustakaan yang dijelaskan di atas ada di
sini , dan itu juga di bawah GPL v3. Twitter penulis ada di
sini .