Seperti banyak produk buatan rumah lainnya, saya secara teratur menggunakan mikrokontroler AVR untuk semua jenis kerajinan amatir. Dan berkat konsep Arduino, kerajinan tangan ini sekarang memiliki tampilan yang elegan juga. Memang, untuk sekitar 300-400 rubel, kami mendapatkan papan multi-layer miniatur dengan topeng, layar silks dan dengan periferal untuk mikrokontroler yang benar-benar dibesarkan di atasnya (apalagi, dalam versi SMD!). Saya tidak berbicara tentang semua jenis plug-in dari seri "Arduino" yang sama: sensor, pengontrol, display dan seluruh rangkaian, periferal tambahan yang sangat kami butuhkan. Dan lagi, semuanya juga murah dan dalam kinerja yang sangat baik. Sebenarnya tidak perlu lagi mengembangbiakkan sesuatu dan menyolder pada "lutut".
Tetapi semua berbagai kerajinan amatir ini, tentu saja memerlukan
pemrograman pendahuluan. Dan kemudian, dengan berbagai perbaikan, saya terus menerus harus merombak kerajinan ini. Jelas bahwa lebih mudah untuk melakukan ini dari jarak jauh daripada terus-menerus menyeret mereka ke programmer biasa. Secara umum, berkat platform Arduino yang sama, ada banyak opsi di sini: Bluetooth, ZigBee, saluran radio dengan protokol pribadi Anda, IR, dan bahkan Wi-Fi. Semuanya memungkinkan Anda membuat kontak nirkabel dengan mikrokontroler Anda. Tetapi kita akan berhenti pada opsi terakhir. Ada empat alasan utama:
1: modern, Internet hal!
2: ada router nirkabel di setiap apartemen, daftarkan perangkat Anda di jaringan rumah dan voila!
3: kerajinan Anda membuat lompatan revolusioner dalam perkembangannya; mereka tidak hanya dapat diprogram dari jarak jauh, mereka sekarang juga dapat berkomunikasi dengan dunia di sekitar mereka: jam elektronik secara mandiri mengambil waktu yang tepat dari jam server NTP, perangkat eksekutif dikendalikan dari ujung kota atau negara, perangkat pendaftaran menyimpan data yang terakumulasi dalam cloud dll. dll.
4: ada serangkaian chip ESP8266 yang luar biasa yang
tidak mudah untuk mengimplementasikan semua ini.
Selanjutnya, dalam artikel ini, menggunakan contoh lengan mekanik pada servos, pemrograman jarak jauh dan pertukaran data dengan PC (atau apa pun) dengan perangkat berbasis mikrokontroler AVR akan dibongkar dan diperagakan. Saya ingin segera mencatat bahwa semua program yang tercantum di sini adalah murni demonstrasi dan tidak memiliki nilai komersial. Oleh karena itu, klaim, seperti mengapa programmer begitu dikebiri dan fungsionalnya buruk atau mengapa tidak ada layanan tambahan di mana-mana, tidak diterima. Karena kode terbuka, siapa pun dapat menyelesaikannya atas kebijakan mereka sendiri, tetapi saya masih memiliki cukup untuk bekerja.
Diasumsikan bahwa pembaca sudah terbiasa dengan kedua modul Arduino (perisai) dan koneksi dan firmware dari ESP8266. Bahkan, sejumlah besar materi telah diposting di Web menjelaskan dasar-dasar bekerja dengan perangkat ini dan saya tidak ingin mengulanginya di sini. Untuk pemula, di akhir artikel ada daftar tautan bermanfaat tentang masalah ini, di mana Anda dapat menemukan banyak informasi
, mengapa semuanya tidak bekerja untuk Anda . Dari pengalaman saya sebagai mantan insinyur elektronik, saya secara bertanggung jawab dapat menyatakan bahwa 99% masalah adalah sebagai berikut:
1. Kontak yang buruk. Karena "Arduino" perisai menyiratkan beralih satu sama lain melalui kabel dari jenis "ayah-ibu", dan bukan melalui penyolderan, sangat sering sesuatu, di suatu tempat, hilang. Lihat itu. Dan memang, seperti kata mereka, elektronik adalah ilmu kontak.
2. Masalah daya. Jangan memasok daya 5 volt di tempat 3.3 diperlukan. Terkadang asap berasal dari ESP8266. Meskipun, di sisi lain, itu mencerna sinyal logis dari perangkat lima volt tanpa masalah.
3. Masalah dengan daya yang cukup. ESP8266 memiliki sifat keji dan kadang-kadang dapat mengkonsumsi hampir tiga ratus milliamps, meskipun sebelum itu dapat dipenuhi dengan tiga puluh. Dengan demikian, papan 3.3 volt lemah stabilizer "Arduino", yang Anda dapat menambahkan hingga tidak ada, itu terhubung, segera tenggelam ke nilai-nilai mikroskopis. Dan Anda tidak bisa mengerti mengapa itu bekerja, maka tidak.
4. Kebingungan dengan kesimpulan. Selalu periksa sinyal mana yang pergi ke mana. Penerima RXD harus terhubung ke pemancar TXD, serta TXD ke RXD, tetapi MOSI harus terhubung ke MOSI, dan MISO ke MISO, dan seterusnya.
5. Jangan mengandalkan resistor pull-up dalam sirkuit di ESP8266, selalu tarik kabel ke nol atau daya, melalui resistor eksternal 5-10 kilo-ohm, dan bukan hanya pelompat. Kalau tidak, Anda bisa, paling-paling, mendapatkan konsumsi saat ini yang belum pernah terjadi sebelumnya, dan kemudian mencium bau tidak enak dari plastik yang terbakar.
6. Shoals perangkat lunak. Karena perangkat lunak untuk pengguna individu ditulis oleh penggemar yang sama, gangguan dari firmware itu sendiri dan bug muncul secara berkala ketika memperbarui versi dari firmware yang sama. Itu diperlakukan dengan merangkak di forum yang relevan, kadang-kadang bahkan dalam bahasa Inggris. Beberapa kawan bahkan mengklaim bahwa chip ESP itu sendiri lembab seperti cuaca di St. Petersburg, tetapi di sisi lain ada juga pendapat bahwa sejak 2014 (tahun pertama kali dirilis), situasi dengan ini telah meningkat secara dramatis (tidak seperti cuaca).
7. Gangguan misterius. Ini adalah fenomena yang jarang terjadi, namun menguras tenaga. Misalnya, saya tidak punya perangkat "Arduino" jarak jauh. Sebaliknya, itu terjadi tetapi dengan kesalahan. Tapi itu berjalan tanpa kesalahan jika kabel dari programmer tergantung padanya (tetapi tanpa programmer itu sendiri). "AHA," kataku pada diri sendiri, dan menyolder kapasitor 15 pF antara pin transfer data dan pin sinkronisasi. Semuanya berhasil. Tapi hari itu terbunuh.
Jadi, mari kita mulai dengan yang paling sederhana. Kami memiliki mekanis ekstremitas MechArm (tapi bukan apa yang dirakit Howard Volovits) di Cina dan komputer pribadi dengan Windows. Tugasnya adalah mem-flash program secara jarak jauh dan mengelolanya dari komputer.

Untuk pengontrol kontrol, kami mengambil syal Arduino Nano miniatur yang lucu dengan batu ATmega328P. Papan ini dengan sempurna didorong ke lengan mekanik.

Sekarang kami memutuskan bagaimana kami akan memprogramnya. Ada tiga metode utama yang paling cocok untuk firmware jarak jauh: melalui antarmuka SPI, melalui bootloader bawaan, melalui port JTAG.
Opsi termudah tentu saja adalah bootloader bawaan (bootloader). Ini adalah memori pra-terdaftar di FLASH, sebuah program yang menerima kode sesuai dengan protokol tertentu (misalnya, menggunakan UART paling sederhana) dan menulisnya ke lokasi program yang dimuat dengan perintah khusus. Ini berfungsi, misalnya, bootloader ARDUINO IDE. Setelah reset atau mulai, bootloader menunggu beberapa saat untuk menerima data dan jika tidak menunggu, ia memulai eksekusi program dari alamat nol. Jika datanya tiba, dia menulisnya di bagian program. Setelah reset berikutnya, program yang diunduh mulai berjalan. Secara detail, mungkin saya jelaskan secara tidak akurat, tetapi intinya hanya itu. Akibatnya, kita hanya membutuhkan tiga output untuk pemrograman: penerima RTD, reset RESET, dan GND ground. Secara umum, pemancar TRD juga digunakan untuk memverifikasi program yang direkam, tetapi untuk aplikasi demonstrasi sederhana (bukan untuk pembangkit listrik tenaga nuklir), verifikasi dapat dihilangkan.
Loader itu sendiri ditulis dalam bahasa assembly, ada contoh loader sederhana di lembar data pada AVR. Anda dapat menggali bootloader yang ada jika berada di domain publik dan cukup menggunakannya dalam bentuk siap pakai jika protokol yang digunakan diketahui. Satu-satunya peringatan adalah bahwa Anda perlu mengkonfigurasi AVR dalam mode khusus dengan mem-flash bit sekering khusus, yang dilakukan oleh programmer normal, dan kemudian Anda juga dapat menjahit bootloader ke dalam memori mikrokontroler (yaitu, Anda tidak dapat melakukannya tanpa programmer sekali).
Opsi kedua adalah pemrograman melalui antarmuka SPI serial. Tidak ada bootloader internal di sini, tetapi kami memprogram dengan mengirimkan perintah khusus dan kemudian data melalui antarmuka yang disebutkan di atas. Di sini kita memiliki bootloader eksternal, tetapi Anda masih perlu menulisnya. Selain RESET dan GND, empat output MOSI tambahan digunakan untuk transmisi, MISO - data, sinkronisasi SLK, pemilihan chip CS. Namun secara umum, Anda juga dapat menghapus MISO dan CS. Data hanya akan diterima (maka tidak akan ada verifikasi program), dan kami hanya memiliki satu kristal.
Setiap pendekatan memiliki pro dan kontra (dan saya tidak mempertimbangkan JTAG sama sekali, karena kehidupan manusia pendek). Tetapi pada akhirnya, saya condong ke SPI karena saya terlalu malas untuk menulis di assembler, tetapi saya tidak menemukan bootloader siap pakai terbuka (saya hanya tidak terlihat baik-baik saja).
Untuk membangun saluran nirkabel, saya, seperti yang telah disebutkan, memilih chip ESP8266 yang saat ini dikenal luas - mikrokontroler, atau lebih tepatnya, seluruh SoC (System-on-Chip) dari pabrikan Espressif Cina dengan antarmuka Wi-Fi. Selain Wi-Fi, itu dibedakan oleh kemampuan untuk menjalankan program dari memori flash eksternal. Dan khusus untuk proyek saya, saya mengambil ESP8266-07 dengan memori 512 KB.

Secara umum, ESP8266 apa pun cocok di mana ada kaki tambahan untuk menerapkan SPI. Oleh karena itu, ESP8266-01 yang paling sederhana tidak cocok untuk kita, karena ESP8266 sangat sedikit untuk port input / output. Tetapi di sisi lain, perbedaan harga kurang dari seratus rubel, dan mereka tersedia sama. Nah, papan debug besar dengan ESP, di mana banyak periferal untuk kenyamanan, juga tidak cocok untuk kita, karena mereka tidak masuk ke tempat kita ingin mendorong mereka ke lengan mekanik kita.
Esensi global dari gagasan itu secara umum adalah sebagai berikut. Tubuh program yang dimuat ke dalam mikrokontroler ditransfer dari komputer ke ESP secara nirkabel melalui WI-FI (dalam jaringan rumah Anda). Dan ESP sudah menggunakan kabel menggunakan antarmuka SPI menulis program ini langsung ke memori FLASH mikrokontroler. Kemudian secara alami me-reset dan memungkinkan program yang dimuat untuk dieksekusi. Selain itu, ESP harus memiliki unit independen, yang juga mengelola pertukaran data dengan mikrokontroler, karena kami ingin tidak hanya program, tetapi juga bertukar data dengan itu. Khususnya, untuk proyek dengan MechArm, setelah merekam program, kami masih mengirimkan sinyal kontrol servo untuk mengatur gerakan ini. Oleh karena itu, pada ESP itu sendiri, disarankan bagi kita untuk meningkatkan server TCP untuk transfer program dan server UDP untuk mengendalikan MechArm. Karenanya, server ini bergabung dengan jaringan rumah dan mendengarkan dengan cermat apakah ada orang yang ingin mengunggah kode baru ke MechaArm atau melambaikannya kepada seseorang.
Jadi, saya temukan di Web bahwa firmware sudah memungkinkan Anda untuk memprogram AVR melalui udara, tetapi ada masalah utama adalah untuk apa lagi firmware ini tidak lagi dapat digunakan. Setelah pemrograman, kami ingin berkomunikasi dengan AVR juga dari jarak jauh.
Perangkat lunak apa yang akan kita gunakan:
Untuk PC, saya menulis semuanya di JAVA,
IntelliJ IDEA . Tetapi pada dasarnya, Anda dapat melakukan apa saja, hal utama bagi kami adalah menulis klien yang akan mengirim program untuk menginstal AVR ke ESP8266.
Saya sendiri menulis program untuk AVR di
ATMEL STUDIO , dalam bahasa C, jarang dalam assembler. Saya tidak menggunakan sketsa Arduino pada prinsipnya, hampir semua perpustakaan yang diperlukan ditulis dalam satu atau dua jam, dengan pemahaman penuh tentang pekerjaannya. Saya sudah mencoba sketsa, tetapi selama Anda tidak memiliki sistem operasi pada AVR, sketsa akan mengambil periferal dari teman dan secara teratur gagal. Ya, IDE Arduino sendiri, dibandingkan dengan ATMEL STUDIO, tentu saja merupakan hal yang sangat primitif. Tapi di sini pertanyaannya, tentu saja, kontroversial, untuk humaniora dan anak sekolah akan lebih menyenangkan dan lebih mudah, mungkin, dengan sketsa.
Untuk pemrograman ESP8266, saya menggunakan firmware NodeMCU, dan saya menulis program di Lua. Tidak, saya ingin sekali menulis dalam Java dan C, tetapi tidak ada dalam ESP. Bahasa Lu sebagaimana diterapkan pada tugas kita tidak sulit, untuk menguasai beberapa hal sepele. Dan sebenarnya, untuk mengunduh program dan men-debug-nya di ESP, saya menggunakan
IDE ESPlorer . Produk domestik gratis (tetapi Anda dapat menyumbangkannya kepada penulis), yang tentu saja tidak dapat dibandingkan dengan lingkungan yang disebutkan di atas, tetapi seperti kata kuda hadiah ... Tetapi untuk menggunakan ESPlorer dan menulis di LUA, pertama-tama kita perlu mengganti firmware dasar (dipasok dari pabrikan) dalam chip ESP8266 ke yang baru. Program NODE MCU PyFlasher akan membantu kami dalam usaha ini. Maksud saya, itu akan membantu untuk merombaknya. Dan kami akan membuat sendiri firmware dan mendapatkannya di tangan situs pembuat:
NodeMCU . Dan Anda dapat membaca lebih lanjut tentang proses ini di
sini:Semuanya sangat mudah diakses dan dimengerti. Kami menambahkan dukungan SPI dan operasi bit ke pustaka dasar (dalam LUA, dalam kasus kami, operasi bit kelebihan beban dan tidak berguna dari mereka). Banyak perpustakaan tidak boleh dimasukkan ke dalam firmware perpustakaan, karena karena adanya berbagai perangkat lunak pada ESP8266, hanya ada sedikit memori yang tersisa, beberapa jenis 20 kB yang menyedihkan.
Tentu saja, Anda bisa mengambil firmware yang sudah jadi, yang banyak di antaranya sudah nongkrong di Internet, tapi saya tidak merekomendasikannya. Setidaknya karena beberapa dari mereka tidak memiliki dukungan untuk operasi bit (dan kami membutuhkannya) dan tidak ada peraturan laju transfer data melalui SPI.
Dengan demikian, mereka ditransmisikan secara default pada kecepatan 40 MHz dibagi dengan beberapa koefisien kecil dan karena itu AVR tidak punya waktu untuk mencernanya.
Siapa yang terlalu malas untuk membuat firmware, Anda dapat mengunduh milik saya dari
cloud .
Sekarang kita memiliki firmware dan kita perlu memuatnya ke dalam ESP8266, bukan basis. Untuk melakukan ini, kita memerlukan adaptor USB sederhana - UART.
Kami menghubungkan kaki-kaki TXD ke RXD, dan RXD ke TXD, kami membuat landasan bersama, tetapi sepertinya tidak menggunakan output daya 3,3 V yang nyaman pada adaptor. Dalam kebanyakan kasus, ESP8266 akan mengeringkannya sepenuhnya. Karena itu, kami memberinya makan secara terpisah. Kemudian kita menempatkan ESP ke mode pemrograman (GP0 ke tanah, kalau ada yang lupa) dan menjalankan
Pyodeslas NODE MCU .

Yang penting, jangan lupa untuk menghapus memori flash (ya, menghapus semua data), jika tidak, tergantung pada versi firmware, setelah pemrograman, sampah yang tidak perlu mungkin tetap ada dalam memori, yang pada gilirannya akan membuang sampah ke konsol selama pekerjaan lebih lanjut. Sebelum itu, saya menggunakan perangkat lunak, di mana tidak ada pilihan untuk menghapus memori sebelumnya, saya sangat tersiksa, karena tidak ada yang berhasil. Dan peti mati baru saja dibuka, hanya kebenaran di forum bahasa Inggris dari pencipta NODE MCU.
Setelah memperoleh firmware yang diperlukan, kami sekarang dapat menulis dan men-debug program LUA (ada juga MicroPython, tetapi saya tidak menggunakannya) menggunakan API yang sangat nyaman dari NODE MCU. Kami meluncurkan ESPlorer yang telah disebutkan.

Kami juga mengkonfigurasinya untuk bekerja dengan ESP8266, mengatur parameter koneksi serial. Semuanya cukup sederhana dan berulang kali dinyatakan di Internet.
Sekarang kami menulis program di LUA, yang kemudian kami unggah ke ESP8266:
Lua bootloader untuk AVR ditulis ke ESP8266<b>function InstrProgrammingEnable ()
Di mana fungsi yang relevan melakukan tindakan berikut:
function InstrProgrammingEnable () - menempatkan mikrokontroler dalam mode pemrograman dengan perintah khusus yang dikirim melalui SPI.
function ProgrammingEnable () - cukup reset AVR selama 25 ms sebelum memulai pemrograman
function ProgrammingDisable () - setelah akhir pemrograman, kami menerjemahkan output SPI di ESP8266 ke keadaan tidak aktif sehingga mereka tidak mengganggu kami ketika mengeksekusi kode pada mikrokontroler (tiba-tiba mereka digunakan di sana)
function InstrFlashErase () - kami menghapus memori flash pada mikrokontroler sebelum pemrograman. Mengapa ini perlu dijelaskan tidak perlu.
function InstrStorePAGE (H, address, data) - perintah ini menulis byte program ke buffer internal mikrokontroler. Tetapi ini bukan catatan flash itu sendiri, karena flash ditulis di sini halaman demi halaman pada 128 byte.
function InstrWriteFLASH (page_address_low, page_address_high) - tetapi ini adalah catatan kilat dan itu membutuhkan waktu, perhatikan waktu tunda 5.000 μs.
function Programming (payload) - fungsi terbesar dan paling penting menggunakan fungsi-fungsi di atas. Dibutuhkan program yang ditransmisikan dalam potongan 1024 byte, membaginya menjadi byte dan membentuk alamat untuk mereka, kemudian mengirimkannya ke mikrokontroler di buffer internal dan menginisialisasi catatan flash setiap 128 byte. Lalu ia mengambil kode kilobyte berikutnya dan mengulangi operasi, secara alami dengan offset di alamat, sehingga untuk menulis lebih jauh dan tidak menimpa yang direkam. Pada awalnya, saya mencoba meneruskan seluruh program, tetapi ketika saya melebihi 6 kilobyte di ESP8266, memori yang tersedia berakhir dan macet. Satu kilobyte ternyata menjadi unit yang paling nyaman, karena itu dibagi dengan rapi menjadi beberapa bagian dan mudah ditransmisikan melalui TCP (kita masih perlu mendapatkannya dari komputer). Ukuran yang lebih besar juga tidak diperlukan, TCP, Anda tahu, dalam versi saat ini membatasi paket yang ditransmisikan ke 1500 atau byte (tetapi untuk beberapa alasan 1440 ditransmisikan kepada saya, semacam).
Seolah tidak ada yang rumit, tetapi beberapa jebakan harus diatasi.
Berikutnya adalah MAIN BLOCK. Di dalamnya kita:
Kami terdaftar di jaringan nirkabel.
Pertama kita membuat server TCP yang mendengarkan tiga perintah:
1. "program" (kami akan memprogram)
2. "data" (kami akan mengubah data),
3. "berhenti" (kami menghentikan semuanya).
Jika kami memprogram, pertama-tama kami menginisialisasi SPI dan membuat server TCP lain yang mengambil data (kode firmware) per kilobyte dan memanggil fungsi pemrograman mikrokontroler untuknya. Saya mengerti bahwa kelihatannya konyol untuk membuat server kedua, tetapi ini adalah keharusan, karena API lokal mendukung pembuatan hanya satu soket, dan kita perlu memisahkan perintah "program" dan "data" dengan data yang dikirimkan, karena menurut pandangan mereka tidak berbeda, ada byte dan ini adalah byte.
Jika kita tidak ingin memprogram, tetapi untuk bertukar data, mengirimkannya dalam kasing kita ke mikrokontroler, maka kita pertama-tama mengirim string “data” melalui TCP. Menanggapi hal ini, server UDP akan dibuat (saya ingatkan Anda bahwa kami tidak mengelola secara dinamis dengan tangan mekanis dan bahwa kami tidak perlu menunda dengan pembentukan paket TCP, dan memang mengirim satu byte sebagai keseluruhan frame TCP ke atas meja). Dan datagram UDP akan kecil dan akan terbentuk dengan cepat.
Setelah UART diinisialisasi, dan setiap byte yang diterima secara nirkabel sudah dikirim melalui kabel TXD ke mikrokontroler, yang wajib menerimanya jika program terkait diperbarui di sana. Pertukaran data ke arah lain juga tidak sulit untuk diatur, tetapi saya belum mengimplementasikannya.
Nah, dengan perintah "stop", server yang disebutkan di atas (kecuali yang pertama) menutup koneksi dan server utama kembali masuk ke keadaan siaga dari perintah "program" dan "data".
Karena antarmuka SPI ditiru secara pemrograman dalam ESP8266, port I / O untuk sinyal CS, CLK, MISO, MOSI, RESET (untuk AVR), Anda dapat menggunakan yang tersedia, dan bukan yang ditunjukkan dalam bootloader saya. Selain itu, ternyata CS dan MISO, pada prinsipnya, juga dapat terganggu dalam hal ini, itu akan berfungsi tanpa mereka. Nah, satu pin digunakan pada LED yang terpasang pada papan ESP8266 sehingga terkadang berkedip dan menunjukkan bahwa program tersebut masih hidup.
Pemeriksaan untuk kesalahan perekaman tidak dilakukan (dengan pengecualian permintaan pertama ke AVR, tetapi informasi ini hanya ditampilkan pada konsol), EEPROM tidak diprogram, lebih dari 32 KB tidak dijahit - singkatnya, masih ada pekerjaan yang harus dilakukan. Kecepatan pertukaran SPI sekitar 115 Kbit, dalam beberapa detik semuanya terlintas, kira-kira, seperti dengan programmer serial biasa seperti ISP500).
Ambil kodenya, masukkan jaringan dan kata sandi Anda, kompilasi pada ESplorer, sebut "init" (sehingga dimulai saat restart) dan kirimkan ke ESP8266. Itu harus bekerja. Dalam artian bekerja sebagai programmer nirkabel, setidaknya.
Sekarang kita akan berurusan dengan pihak pengelola - komputer pribadi.
Bahkan, kita perlu mengambil file HEX ke mana program Anda ditulis dalam lingkungan ATMEL STUDIO berubah dan mengirimkannya melalui WI-FI ke port soket yang kita tahu (dalam hal ini 4000). Tangkapan kecilnya adalah bahwa kita memerlukan file BIN biner untuk transfer, dan ATMEL STUDIO menyenangkan kita hanya dengan HEX. Ada dua jalan keluar; atau mengubahnya menjadi format BIN dengan konverter program khusus, seperti WinHex, atau lakukan sendiri di program Anda. Saya belum melakukannya, tetapi tampaknya tidak sulit, di sana Anda perlu memotong judul dan melakukan sesuatu yang lain.
Akibatnya, saya menulis program bootloader di JAVA (terutama karena saya tidak tahu bagaimana melakukan hal lain), bekerja di lingkungan IntelliJ IDEA yang sangat indah dan gratis. Ini menciptakan klien TCP yang mencari server yang berjalan pada ESP8266. Jika ditemukan, maka kontaknya dan mengiriminya file yang terletak di alamat tersebut. Kode di bawah.
Pengunduh file JAVA berbasis PC import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.List; public class Net { <b> public static void main(String args[]) { new Http_client(4000); }</b> } class Http_client extends Thread { int port; String s; String Greetings_from_S; Http_client(int port){ this.port = port; start(); } public void run() {
Di sini, tentu saja, terlalu banyak luka, semua jenis siap, pada prinsipnya, tidak diperlukan. Jika koneksi TCP terjalin, maka terjalin. Satu-satunya masalah adalah bahwa file tidak ingin dikirim dalam potongan 1024 byte dengan cara apa pun, seperti yang saya benar-benar butuhkan, meskipun saya secara eksplisit menunjukkan ukurannya. Rupanya ada beberapa jenis buffer akhir yang tidak dapat diakses dari JAVA, dan mengirimkan paket ukuran yang dia inginkan, yang sama sekali tidak dapat diterima oleh pihak penerima. Pada awalnya saya mencoba menunda sehingga penyangga akan bosan menunggu kepingan berikutnya dan mengirimkannya apa adanya. Tetapi penundaan mulai bekerja ketika mencapai 10 detik, yang entah bagaimana sepertinya terlalu banyak untuk satu kilobyte yang ditransfer.
Tetapi kemudian saya perhatikan bahwa karena suatu alasan bagian pertama selalu berjalan mulus, mana yang dipesan, dan sudah sejak detik dimulai bacchanalia yang tidak dapat diprediksi. Oleh karena itu, saya membuat klien membuka koneksi, mengirim sebagian kode dalam 1024 byte dan menutup koneksi. Demikian seterusnya hingga seluruh file terkirim. Semuanya bekerja dengan baik.
Satu-satunya hal untuk memulai adalah menginstal runtime JAVA di komputer. Tapi saya biasanya memulai segera dari IntelliJ IDEA karena di sana Anda selalu dapat melihat apa yang terjadi di konsol (tetapi di sini Anda memerlukan lingkungan JAVA). Meskipun, tentu saja, dengan cara yang cerdas Anda perlu membuat GUI. Yaitu, jendela tempat path ke file jatuh, kemampuan untuk mengubah nomor port di jendela dan, yah, hal-hal lain yang diperlukan. Dan untuk mengumpulkan semua ini dalam bentuk file yang dapat dieksekusi.
Dan tapericha, seperti yang biasa dikatakan Koroviev, mari kita kembali ke warga, pada kenyataannya, ke mekanik MechArm, yang disebutkan di awal. Kami sekarang memiliki kesempatan untuk memprogram dari jarak jauh, dan kemudian mengelolanya. Mari kita beralih ke program kontrol di samping mikrokontroler.
Dalam hal ini, kita perlu mengendalikan empat servos. Ini mereka.
Drive tersebut dikendalikan oleh pulsa persegi panjang periode 20 ms (50 Hz) dengan faktor tugas 2 hingga 4 persen. Yaitu, 2% adalah giliran lengkap di satu arah, 4% di yang lain. Tugas ini hanya untuk PWM terintegrasi dalam AVR.

Satu servo drive digunakan untuk bergerak ke kiri dan ke kanan; yang kedua pada diri sendiri - dari diri sendiri; ketiga atas dan ke bawah; yang keempat adalah cakar itu sendiri, yang harus dikompresi dan diperluas. Semuanya ditulis dalam C dan dikompilasi ke file HEX di ATMEL STUDIO. Jenis program yang agak aneh adalah karena pada awalnya tangan dikendalikan dari keyboard yang diikat dengan kabel ke mikrokontroler. Tapi kabel kemarin, kita harus berevolusi lebih lanjut.
Anda tentu saja dapat menggunakan sketsa untuk servos dari "ARDUINO", tetapi saya tidak menyukainya. Lebih menarik untuk menulis sendiri. Selain itu, keempat servo harus bekerja secara bersamaan, dan tidak dalam mode multiplex, ketika PWM beralih ke setiap servo secara bergantian. Karena tidak ada yang membatalkan gravitasi, dan anggota tubuh yang terangkat akan segera turun jika kendali impuls berhenti tiba di servo drive yang sesuai. Saya tidak yakin bahwa sketsa “ARDUINO” menyediakan operasi simultan untuk empat servos. Tapi kami sendiri bisa menulis program yang memenuhi persyaratan yang diperlukan. Secara umum, dengan tidak adanya sistem operasi yang memisahkan domba dari kambing, penggunaan sketsa yang bersaing untuk perangkat periferal mikrokontroler (dan kami bahkan tidak tahu yang mana di muka) terlalu buggy.
Berikut adalah kode itu sendiri yang kami tulis ke Arduino Nano menggunakan ESP8266-07.
Program untuk mengendalikan MechArm untuk mikrokontroler AVRmega328P #define F_CPU 16000000 #include <avr/io.h> #include <stdint.h>// #include <avr/interrupt.h> #include <math.h> // #include <stdio.h> // - #include <avr/eeprom.h> #include <setjmp.h> #include <stdlib.h> // #define UART_BAUD_RATE 115200 // 1 20 #define COUNTER1_OFF TCCR1B=0b00000000 // CS02 CS01 CS00 - 000 - ; 001 ; 010 c 8; 011 -64; 100 -256; 101 -1024 #define COUNTER1_ON TCCR1B=0b00000011 // 0 0 1 #define COUNTER0_OFF TCCR0B=0b00000000 // CS02 CS01 CS00 - 000 - ; 001 ; 010 c 8; 011 -64; 100 -256; 101 -1024 #define COUNTER0_ON TCCR0B=0b00000100 // 2 B2(PD6) 3(PD7) #define COUNTER2_OFF TCCR2B=0b00000000 // CS02 CS01 CS00 - 000 - ; 001 ; 010 c 8; 011 -64; 100 -256; 101 -1024 #define COUNTER2_ON TCCR2B=0b00000110 volatile uint16_t period_20ms; volatile uint8_t State_of_keyboard; volatile uint8_t start_position [6]; volatile int8_t number_servo; ISR(USART_RX_vect)// UART { State_of_keyboard=UDR0; return; } ISR(TIMER0_COMPA_vect)// 0 { PORTB &=~(1<<0); TIMSK0&=~(1<<OCIE0A); TIFR0 |=(1<<OCF0A); return; } ISR(TIMER0_COMPB_vect) // 1 { PORTB &=~(1<<1); TIFR0 |=(1<<OCF0B); TIMSK0 &=~(1<<OCIE0B); return; } ISR(TIMER2_COMPA_vect)// 2(PD6) { PORTD &=~(1<<6); TIFR2 |=(1<<OCF2A); TIMSK2 &=~(1<<OCIE2A); return; } ISR(TIMER2_COMPB_vect)// 3(PD7) { PORTD &=~(1<<7); TIFR2 |=(1<<OCF2B); TIMSK2 &=~(1<<OCIE2B); return; } ISR(TIMER1_OVF_vect){// 20 COUNTER1_OFF; COUNTER0_OFF; COUNTER2_OFF; TIFR0 |=(1<<OCF0A); TIFR0 |=(1<<OCF0B); TIFR2 |=(1<<OCF2A); TIFR2 |=(1<<OCF2B); TIFR1 |=(1<<TOV1); PORTB |=(1<<0)|(1<<1); PORTD |=(1<<6)|(1<<7); TCNT1 = period_20ms; // 20 TCNT0 = 0; TCNT2 = 0; TIMSK0|=(1<<OCIE0A)|(1<<OCIE0B); TIMSK2|=(1<<OCIE2A)|(1<<OCIE2B); OCR0A=start_position[1];// 0 0 OCR0B=start_position[2];// 0 1 OCR2A=start_position[3];// 0 2 OCR2B=start_position[4];// 0 3 COUNTER1_ON; COUNTER2_ON; COUNTER0_ON; return; } void time_delay(long i) { cli();sei(); long k; i*=2000; for(k=0;k<i;k++){;;}; } void timer_counter0_1_2_INIT()// 0,1,2 { // 1 TCCR1A &=~(1<<COM1A0)|~(1<<COM1A1)|~(1<<COM1B0)|~(1<<COM1B1);// TCCR1A &=~(1<<WGM10)|~(1<<WGM11); TCCR1B &=~(1<<WGM12)|~(1<<WGM13);// period_20ms=60575; TCNT1 = period_20ms; TIMSK1|=(1<<TOIE1);//| //TIFR0 TOV0 // 0 TCCR0A &=~(1<<COM0A0)|~(1<<COM0A1)|~(1<<COM0B0)|~(1<<COM0B1);// TCCR0A &=~(1<<WGM00)|~(1<<WGM01); TCCR0B &=~(1<<WGM02);// // 2 TCCR2A &=~(1<<COM2A0)|~(1<<COM2A1)|~(1<<COM2B0)|~(1<<COM2B1);// TCCR2A &=~(1<<WGM20)|~(1<<WGM21); TCCR2B &=~(1<<WGM22);// COUNTER1_ON; } void servo_reset() { start_position[1]=97;// 0 0 start_position[2]=70;// 0 1 start_position[3]=92;// 0 2 start_position[4]=124; // 0 3 COUNTER1_ON; time_delay(100); } void servo_go( int8_t moven, uint8_t servo_position_max, uint8_t servo_position_min)// { switch (moven){ case 1: start_position[number_servo]++; if(start_position[number_servo]==servo_position_max){start_position[number_servo]--;};// +90 break; case 2: start_position[number_servo]--; if(start_position[number_servo]==servo_position_min){start_position[number_servo]++;};//6 -90 break; }; time_delay(20); return; } //PORTB-0,1, PORTD - 6,7 - , 8- COUNTER 0 int main(void) { uint8_t servo_positionmin=0, servo_positionmax=0; int8_t const servo_position1max = 122, servo_position1min=58; // int8_t const servo_position2max = 120, servo_position2min=36;// int8_t const servo_position3max = 125, servo_position3min=68;// int8_t const servo_position4max = 129, servo_position4min=108;// 128 108 sei(); DDRD = 0B11000010; // D2-D5 , D0 RX, D1 TX, D6 D7 3 4 PORTD = 0B00111110; // DDRB |=(1<<0)|(1<<1);// PORTB &=(~1<<0)|(~1<<1); UCSR0A=0;// UART UCSR0B=0b10010000; UCSR0C=0b00000110; UBRR0L=103;// 115200 UBRR0H=0; timer_counter0_1_2_INIT(); servo_reset(); PORTB |=(1<<5); while (1) { switch (State_of_keyboard) { case 1:// 1 PD0(PB0) number_servo=1; servo_positionmin=servo_position1min; servo_positionmax=servo_position1max; break; case 2: // 1 PD0(PB0) number_servo=1; servo_positionmin=servo_position1min; servo_positionmax=servo_position1max; break; case 5: number_servo=2; // 2 PD1(PB1) servo_positionmin=servo_position2min; servo_positionmax=servo_position2max; break; case 6: number_servo=2; // 2 PD1(PB1) servo_positionmin=servo_position2min; servo_positionmax=servo_position2max; break; case 7: number_servo=3;// 3 PD6 servo_positionmin=servo_position3min; servo_positionmax=servo_position3max; break; case 8: number_servo=3;// 3 PD6 servo_positionmin=servo_position3min; servo_positionmax=servo_position3max; break; case 3: number_servo=4; // 4 PD7 servo_positionmin=servo_position4min; servo_positionmax=servo_position4max; break;// case 4: number_servo=4; // 4 PD7 servo_positionmin=servo_position4min; servo_positionmax=servo_position4max; break;// // c - , 4- // , } if(State_of_keyboard==1||State_of_keyboard==3||State_of_keyboard==5||State_of_keyboard==7) { servo_go(1,servo_positionmax,servo_positionmin);// } if(State_of_keyboard==2||State_of_keyboard==4||State_of_keyboard==6||State_of_keyboard==8) // { servo_go(2,servo_positionmax,servo_positionmin);// } time_delay(20); } }
Inti dari program ini jelas dari teks dan komentar. Kami menggunakan penghitung T1 untuk periode contoh 20 ms dan T0, penghitung T2 untuk mengeluarkan sinyal PWM ke empat baris port I / O, karena masing-masing dari dua penghitung ini dapat bekerja pada dua perangkat.
Program ini mengatur posisi awal servos dengan memuat register penghitung OCR0A, OCR0B, OCR2A, OCR2B. Konstanta kendala juga diperkenalkan, karena kita tidak selalu membutuhkan rentang 180 derajat. Baik dan selanjutnya, dengan interupsi dari UART, program menangkap nomor yang dikirim oleh ESP8266 (dari 1 hingga 8) dan menerjemahkannya menjadi perintah untuk servo yang sesuai. Ada empat drive, masing-masing bekerja dalam dua arah, jadi bilangan bulat dari satu hingga delapan sudah cukup. Setelah nomor dipilih, isi register penghitung di atas bertambah atau berkurang, masing-masing mengubah siklus tugas dari pulsa kontrol dan sudut rotasi dari drive servo yang dipilih. Drive yang tidak kami pilih mempertahankan nilai lama sudut rotasi (karena isi register yang sesuai, meskipun diperbarui, tidak berubah) dan terus menahan lengan mekanik pada posisi yang sama.
Sekarang kita hanya perlu menulis program kontrol, maaf untuk tautalogy, untuk mengontrol tangan mekanik langsung dari komputer melalui WI-FI.
Kode ini juga ditulis dalam bahasa JAWA, tetapi sedikit dimuliakan. GUI dan kemampuan untuk mengedit nomor port dan alamat jaringan ESP8266 muncul.

Apa yang terjadi di sana jelas dari jendela. Saya tidak
menyediakan teks program di sini (tersedia di
Github ), karena alasan berikut: sekitar 95% volumenya adalah pembuatan jendela dan pemrosesan sinyal dari keyboard. Tetapi intinya sama dengan program sebelumnya di JAVA. Klien dibuat, hanya UDP, yang, tergantung pada tombol yang ditekan, mengirimkan angka dari 1 hingga 8, pada alamat yang ditentukan pada port yang ditentukan.
Atau Anda bisa langsung mendapatkan executable
dari sini . Untuk mesin 64 bit dengan Windows. Bahkan lingkungan JAVA yang diinstal tidak diperlukan. Semuanya sudah dimasukkan ke 178 MB.
Jadi, pena mekanis dirakit, di-debug, dan disajikan kepada saudaranya untuk ulang tahunnya. Dapat mengambil tumpukan plastik dengan vodka, di Skype dari kota lain. Meskipun untuk lengan mekanik Howard Volovitsa dari seri "The Big Bang Theory", dia masih jauh.
Tetapi kemudian dalam artikel berikut (jika ada yang tertarik) kita akan dapat mengelolanya dari ponsel, melakukan hal yang sama dengan kereta roda empat robot dan memperbarui waktu dalam jam tangan elektronik dari server jam di Internet. Kemudian kami meletakkan smartphone lama di troli dan mendorong video dari itu ke jaringan saraf dengan pengenalan pola, dan kembali sinyal kontrol ke motor,
oh sesuatu sudah membawa saya ...Dan semua ini dengan ESP8266 yang indah.
Saya akan senang jika ada yang menemukan artikel yang menarik.
[1]
Pinout dan spesifikasi ESP8266[2]
Menghubungkan ESP8266. Mulai cepat.[3]
Pembaruan firmware NodeMCU melalui cloud[4]
NODE MCU PyFlasher[5]
ESPlorer - IDE untuk ESP8266[6]
C Pemrograman untuk AVR[7] Tinjauan artikel - “Memprogram mikrokontroler dalam bahasa C”[8] Deskripsi NodeMCU API[9] Referensi Lua[10] Skrip dan modul Lua[11] IntelliJ IDEA[12] Unduh Java ke komputer desktop Anda sekarang![13] Atmel Studio