Semuanya dimulai dengan fakta bahwa penulis membeli perangkat menarik di pasar sekunder - Smart Response XE (
Perangkat ini dihentikan produksinya beberapa tahun yang lalu, dan apa yang dibeli sekolah seharga $100-$200 masing-masing kini bermunculan di eBay dengan harga $10 atau kurang. Perangkat keras di sana sangat cocok untuk eksperimen culun:
- papan ketik 60 tombol
- tampilan dengan resolusi 384x136, 2 bit per piksel - mirip dengan BC, CGA, tetapi 4 bukan warna, tetapi gradasi kecerahan
- mikrokontroler ATmega128RFA1 (memori flash 128 kB, ROM 4 kB, RAM 16 kB, transceiver 802.15.4)
- eksternal (sehubungan dengan mikrokontroler, bukan seluruh perangkat) memori flash 1 megabit (128 kilobyte) dengan antarmuka SPI
- kompartemen untuk 4 elemen AAA.
Dari namanya mikrokontroler terlihat jelas bahwa ia termasuk dalam keluarga AVR, yang berarti membuat perangkat yang kompatibel dengan Arduino bukanlah tugas yang sepele...
Dari berita seterusnya
Namun penulis lebih tertarik pada kesempatan untuk tidak bermain di perangkat, tetapi untuk belajar:
- memori flash dengan antarmuka serial SPI
- bootloader untuk AVR
- standar 802.15.4
Penulis memulai dengan menulis
Ini cukup untuk mengunggah bootloader Arduino, tetapi bukan sketsanya - port serial tidak terhubung di sana, jadi Anda tetap tidak dapat melakukannya tanpa membuka casing. Selain itu, jalur TX0 dan RX0 pada port serial pertama digabungkan dengan jalur polling matriks keyboard, yaitu jalur yang melakukan polling tombol fungsi di sisi layar. Tapi apa yang bisa Anda lakukan - penulis membuat ini:
Dia membawa jalur JTAG ke sana, dan sekarang tidak perlu membuka tempat baterai. Dan agar sketsa dapat diunggah, saya menghubungkan kedua port serial ke konektor yang sama, juga menambahkan sakelar, karena dengan baterai terpasang, secara fisik tidak mungkin mematikan perangkat dengan cara lain apa pun.
Butuh waktu cukup lama untuk bekerja dengan besi solder, pisau serbaguna, dan lem. Secara umum, mengunggah sketsa “melalui udara” jauh lebih nyaman, kita perlu segera menciptakan sesuatu untuk ini.
Arduino IDE menggunakan program untuk mengunggah sketsa
Setelah mencoba berbagai cara untuk mengatasi masalah ini, penulis menemukan yang berikut ini. Perangkat ini memiliki memori flash 128 KB dengan antarmuka SPI - kami menerima data melalui kabel (ingat bahwa penulis sudah memiliki satu perangkat dengan konektor di sampingnya), gunakan memori ini sebagai buffer, dan kirim data melalui radio saluran ke perangkat lain. Halo dari Cybiko.
Setelah menulis kode untuk bekerja dengan saluran radio, serta font, ukuran loader menjadi lebih dari 4 kilobyte. Oleh karena itu, nilai HFUSE harus diubah dari 0xDA menjadi 0xD8. Sekarang bootloader bisa mencapai panjang 8 kilobyte, dan alamat awalnya sekarang 0x1E000. Hal ini tercermin dalam Makefile, tetapi juga harus diperhitungkan saat mengisi
Transceiver 802.15.4 di ATmega128RFA1 awalnya dirancang untuk beroperasi menggunakan protokol
Ternyata channel 15 dan 26 paling tidak rentan terhadap gangguan dari WiFi, Penulis memilih yang kedua. Penafian: penerjemah tidak mengetahui apakah diperbolehkan menyederhanakan ZigBee dengan cara ini. Mungkin kita harus melakukan lebih banyak pemrograman dan mengimplementasikannya sepenuhnya?
Pada perangkat pertama, perlu diimplementasikan mesin keadaan terbatas yang mengirimkan data melalui protokol STK500. Sebagian besar, pesan yang dikirim dan diterima bersifat mandiri, namun ada juga yang terikat dengan pesan yang melewati saluran sebelumnya. Deskripsi dialog diberikan
Komponen penting dari dialog ini adalah transmisi paket yang dimaksudkan untuk ditulis ke memori flash perangkat tujuan. Untuk mikrokontroler sederhana keluarga AVR, ukuran halamannya adalah 128 byte, tetapi untuk ATmega128RFA1 adalah 256. Dan untuk memori flash yang dihubungkan melalui protokol SPI sama saja. Program di perangkat pertama, saat mengunggah sketsa, tidak langsung mentransfernya ke perangkat kedua, tetapi menulisnya ke memori ini. Ketika Arduino IDE memeriksa kebenaran entri, maka dikirimkan apa yang tertulis di sana. Sekarang kita perlu mengirimkan data yang diterima melalui saluran radio ke perangkat kedua. Pada saat yang sama, peralihan dari penerimaan ke transmisi dan sebaliknya cukup sering terjadi. Protokol STK500 tidak mempedulikan penundaan, tetapi tidak mentolerir kehilangan data (aneh, tetapi disebutkan di atas bahwa penundaan juga mempengaruhi transfer data). Dan kerugian selama transmisi nirkabel tidak bisa dihindari. ATmega128RFA1 memiliki implementasi perangkat keras bawaan untuk permintaan berulang ketika ada keraguan tentang kebenaran transfer, tetapi penulis memutuskan untuk menerapkan hal yang sama dalam perangkat lunaknya sendiri. Dia mengembangkan sebuah protokol di mana lebih banyak data mengalir ke satu arah dibandingkan yang lain.
Itu tidak sempurna, tapi berhasil. Halaman 256-byte dibagi menjadi empat segmen, yang masing-masing ditransmisikan melalui udara sebagai sebuah paket. Sebuah paket dapat menampung hingga 125 byte data ditambah satu byte untuk panjangnya dan dua byte untuk CRC. Jadi fragmen sepanjang 64 byte beserta nomor halaman dan segmen (dari 0 hingga 3) ditempatkan di sana. Perangkat penerima memiliki variabel yang memungkinkannya melacak berapa banyak segmen yang telah diterima, dan ketika keempatnya tiba, perangkat pengirim menerima konfirmasi bahwa seluruh halaman telah diterima. Tidak ada konfirmasi (CRC tidak cocok) - kirim ulang seluruh halaman. Kecepatannya bahkan lebih besar dibandingkan saat transmisi melalui kabel. Melihat:
Namun secara umum, perlu disediakan cara yang nyaman untuk menghubungkan kabel ke perangkat untuk mengunggah sketsa dan melaluinya. Misalnya, tempatkan di dalam konverter antarmuka pada CP2102, seperti pada foto, dan rekatkan ke papan sehingga dapat menahan gaya saat menghubungkan dan melepaskan kabel Micro USB.
Ia juga memiliki stabilizer 3,3 volt (dan cara menggunakannya di perangkat dengan catu daya 6 volt - asalkan memiliki stabilizer yang sama, dan Anda dapat menambahkan dua dioda untuk secara otomatis memilih mana yang akan memberi daya pada perangkat) . Ketiga LED harus dilepas dari papan konverter antarmuka, jika tidak maka akan membebani baterai tambahan saat mengoperasikannya, dan juga mengganggu polling keyboard dan bekerja dengan memori flash dengan antarmuka SPI.
Mengejar suatu tujuan ternyata lebih menarik daripada mencapainya (dan tidak perlu lelucon tentang bus). Penulis belajar banyak tentang bootloader AVR, memori flash SPI, protokol STK500 dan standar 802.15.4.
Semua kode lain selain perpustakaan yang dijelaskan di atas adalah -
Sumber: www.habr.com