Membuat karangan bunga dengan seorang anak

gambar

Tingkat kesulitan: untuk pemula.

Gagasan muncul ketika karangan bunga tua pecah pada Malam Tahun Baru. Si anak memandangi strip LED RGB dan bertanya apakah mungkin untuk membuat karangan bunga dari sana. Anda bisa - saya berkata, dan putranya mulai menggambarkan untuk waktu yang lama bagaimana seharusnya karangan bunga itu berkedip. Saya tidak mengerti apa-apa, dan memutuskan untuk memastikan bahwa dia bisa melakukan apa yang dia mau sendiri. Saya mulai dengan menganalisis keinginan saya sendiri untuk proyek:

  1. Lingkungan pengembangan corak-awal
  2. pekerjaan offline - kemampuan untuk bekerja dengan perangkat dimatikan
  3. Bekerja melalui udara, tanpa menghubungkan kabel
  4. Keandalan - tidak ada program yang diunduh yang harus "menggantung" perangkat hingga reboot diperlukan


Platform perangkat keras


transistor

Berdasarkan papan ESP8266 dengan NodeMCU ( seperti yang ini ), beberapa transistor dan resistor ditambahkan ke dalamnya. Modul yang dipilih memiliki pengatur tegangan 3-20 volt, yang memungkinkannya diberi daya dari sumber yang sama dengan pita. Output esp memberikan tegangan 3 volt dengan arus pembatas 12mA, jadi saya menggunakan transistor bipolar konvensional untuk mengontrol pita.

gambar

Agar asap putih tidak keluar dari mikrokontroler, saya meletakkan resistor 220 Ohm antara output dan basis. Esp memiliki perangkat lunak PWM, beberapa pin memiliki tujuan khusus, saya memilih secara eksperimental.

Firmware


Sebelum menggunakan, esp8266 perlu di-flash, saya menggunakan NodeMCU dengan lua, meskipun memiliki sedikit fitur lebih sedikit daripada Arduino dengan C ++. Jadi, cara termudah untuk memulai adalah dengan firmware siap pakai dari nodemcu-build.com . Untuk proyek kami, kami perlu menambahkan modul PWM. Setelah beberapa saat, tautan ke gambar akan masuk ke email. Anda perlu mengambil yang dengan float.

Anda dapat menginstalnya dengan programmer apa pun dari sini , dan saya menggunakan NodeMCU Flasher.

NodeMCU memiliki sistem file, eksekusi dimulai dengan modul init.lua, saya menggunakan ESPlorer untuk mengunduh.

Diode berkedip


Saat berikutnya menyesatkan saya. Penomoran internal (GPIO0-16) hanya digunakan dalam program asli (Arduino / C ++). Dari lua, notasi dari papan digunakan. Misalnya, untuk menggunakan GPIO16 / D0 (LED bawaan). dari Lua, Anda perlu menulis gpio.write (0, gpio.HIGH). Anda dapat mengedipkan dioda langsung dari konsol ESPlorer.

gambar

Tidak seperti Arduino, nodemcu tidak dapat menggunakan delay dan busy-loop, konsol dan wifi menggunakan prosesor yang sama untuk bekerja. Watchdog juga dibangun di papan, yang akan me-restart jika kode Anda berjalan lebih dari 500 ms. Disarankan untuk tidak menempati prosesor lebih dari 2ms. Untuk mengatasi masalah tersebut, ada fungsi node.task.post dan tmr

Memilih lingkungan pengembangan


Pada awalnya saya ingin menggunakan Scratch, tetapi itu tidak cocok untuk saya, karena itu tidak memungkinkan saya untuk bekerja secara offline - program ini berjalan pada komputer di lingkungan awal, dan semua papan untuk itu bekerja secara pasif. Setelah mencari-cari di Internet, saya menemukan Google Blockly . Ini ternyata persis apa yang Anda butuhkan: mendukung pembuatan kode dalam lua, dan pembuatan blok sendiri. Setelah bereksperimen, saya memutuskan untuk membuat proyek berbasis web saya, memilih nodejs sebagai server, dan Blockly sebagai frontend. Itu benar-benar diperlukan untuk membuat 2 blok - pengaturan warna dan penundaan. Blockly memiliki fungsi bawaan untuk bekerja dengan warna dalam format #ffffff, membuat fungsi untuk mengatur warna tidak menjadi masalah.

Judul spoiler
Blockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; }; 


Dengan demikian, 2 dari 3 persyaratan ditutup.

Fungsi tidur ()


Di sini saya harus secara khusus memikirkan cara menggabungkan operasi OTA yang andal dengan eksekusi kode kustom. Untungnya, lua memiliki perpustakaan coroutine

Setelah berpikir dan membaca dokumentasi dengan seksama, saya menyadari bahwa semua kode klien harus dijalankan di coroutine, dan menggunakan hasil alih-alih tidur sehingga modul utama dapat mengatur timer.

Juga, untuk melindungi papan dari loop tak terbatas, saya menambal kode setelah generator dengan memasukkan hasil (0) pada awal setiap iterasi setiap loop

 function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); } 

Pengunduhan OTA


Saya memutuskan untuk menerapkan solusi paling sederhana untuk jaringan lokal, papan terhubung ke wifi rumah, terhubung ke server pada alamat tetap, mengirimkan pengidentifikasi unik (untuk memproses dengan benar penyambungan kembali), dan mengharapkan pembaruan program melalui soket ini.

Hasil


github.com/farafonoff/BlocklyESP8266


Anda dapat menambahkan banyak, misalnya, beberapa jenis opsi otorisasi untuk bekerja melalui jaringan publik, konfigurator yang ramah pengguna dalam mode hostap, meningkatkan modularitas init.lua dan dukungan untuk pembaruan OTA-nya (sekarang hanya modul dengan program yang dimuat diperbarui).

Source: https://habr.com/ru/post/id409449/


All Articles