Mengapa mikrokontroler diperlukan? Misalnya, untuk menyiapkan tempat pembuatan bir di rumah. Jika tempat pembuatan bir Anda tidak cukup, maka Anda dapat melakukan sesuatu yang lebih besar: membangun ruang pencarian, mengatur presentasi, air mancur interaktif yang menggambar dengan tetesan air, atau tempat pameran untuk sebuah perusahaan besar. Anda dapat melakukan apa saja dengan mikrokontroler - semuanya tergantung pada imajinasi Anda.
Ada kesalahpahaman bahwa untuk membuat kelenjar Anda sendiri, Anda perlu tahu assembler, C / C ++, dapat mengelola memori dan sangat memahami listrik. Setelah itu, tetapi teknologi berkembang dan sekarang untuk implementasi penuh proyeknya, hanya JS yang cukup!

Oke, kita tahu JavaScript, tetapi bagaimana menghubungkannya ke perangkat keras? Jenis besi apa yang ada di sana dan apa yang bisa dilakukannya? Bagaimana cara mengkonfigurasi seluruh sistem? Dalam transkrip laporan, Victor Nakoryakova di
FrontendConf akan belajar: bagaimana, hanya menggunakan JS, untuk mengontrol servos, cara menggabungkan sistem secara fisik dengan PC, dan tentang opsi komunikasi untuk aplikasi pada JS. Kami akan membahas paket serialport dan Firmata, serialport dengan firmware yang ditulis sendiri dalam C ++, Espruino dan pemrograman pengontrol langsung pada JS, Raspberry Pi, HTTP pada jaringan lokal dan HTTP dan MQTT melalui cloud.
Victor Nakoryakov (
nailxx ) - direktur teknis, salah satu pendiri Amperka. Ia menyukai teknologi pengembangan canggih, pemrograman fungsional, dan komputasi fisik. Amperka memproduksi dan menjual modul elektronik sehingga non-profesional membuat perangkat pintar dengan tangan mereka sendiri, kit pelatihan dan blok bangunan individual yang dapat ditambahkan ke perangkat mereka - motor, GPS, SMS.
Tempat menulis JavaScript
Espruino memiliki mikrokontroler yang berdiri sendiri dengan JavaScript. Platform Espruino memungkinkan Anda menulis JS langsung ke mikrokontroler. Ini adalah hal yang otonom: terhubung ke komputer, dipasang, dan kemudian berfungsi secara independen.
Raspberry Pi adalah komputer kecil dengan GPIO.
Dalam aplikasi web , ke frontend atau backend.
Saya akan menunjukkan operasi sistem menggunakan contoh katak.
Buka toad.amperka.ru dari ponsel Anda - antarmuka web sederhana akan muncul.

Kolom kiri mengontrol mata kiri, kanan - kanan. Prinsipnya sederhana - saya menekan tombol, motor servo memutar mata.
Video demonstrasi dudukan dengan katak selama laporan.
Cara kerja katak
Ketika Anda membuka toad.amperka.ru, Anda mendapatkan halaman web statis dengan JS statis yang menggunakan pustaka
MQTT.js. Perpustakaan ini menghubungi broker MQTT di cloud.

Jika Anda tahu Redis, Publikasikan / Berlangganan, RabbitMQ atau antrian pesan lainnya, maka Anda segera mengerti tentang apa itu.
MQTT adalah pialang pesan antar-mesin . Ringan dan sederhana sehingga kelenjar yang lemah pun bisa menggunakannya.
MQTT membutuhkan broker di server. Tetapi Anda bahkan tidak perlu mengangkatnya - menyewanya. Untuk beberapa dolar sebulan, Anda akan memiliki broker MQTT Anda sendiri. Tidak perlu backend.
Di sisi lain, ada pengontrol dari broker MQTT. Ada banyak perangkat berbeda dengan peran ini, misalnya,
Slot Wi-Fi . Ini adalah pengontrol yang dapat terhubung ke Internet.

Ini bekerja berdasarkan chip ESP8266 yang populer. Menambah kemampuan daya melalui micro-USB dan menghubungkan periferal eksternal melalui tiga kontak untuk terhubung ke perangkat lain.
Cara memprogram perangkat keras di JS
Tidak ada yang luar biasa, JS biasa - ES6 hampir penuh. Beberapa fungsi dan objek untuk bekerja pada level rendah dengan sinyal listrik telah ditambahkan ke perpustakaan standar. Misalnya, fungsi untuk membaca dan menulis digital sederhana.
digitalRead - pembacaan digital . Ini adalah pertanyaan untuk controller: "Apakah ada tiga volt pada pin nomor 4?" Jika ada tegangan, itu akan mengembalikan BENAR, jika tidak, SALAH. Ini mengimplementasikan pembacaan sensor biner sederhana: tombol, sakelar, kunci buluh dan sensor gerak inframerah.
digitalWrite adalah rekaman digital sederhana . Kami mengatakan digitalWrite TRUE - 3V cocok dengan pin. Kami katakan digitalWrite FALSE - 0V. Dengan menggunakan prinsip sederhana ini, Anda dapat menyalakan / mematikan strip LED atau meluncurkan rudal nuklir. Kami mengirim sinyal lemah ke relay, itu mengangkut beban besar dan roket terbang.
Ada juga fungsi untuk bekerja dengan nilai antara antara 0 dan 3V:
- analogRead;
- analogWrite;
- setWatch;
- digitalPulse.
Perintah memungkinkan Anda untuk menginterogasi semua jenis tikungan dan menyediakan fungsi untuk perekaman fuzzy.
Selanjutnya adalah objek untuk bekerja dengan antarmuka yang diterima di dunia mikrokontroler. Jika di web kita mengerti dan terbiasa dengan HTTP, WebSocket, TCP, maka untuk mikrokontroler ini adalah:
- Serial - port serial;
- Bus I2C
- Bus SPI
- Bus OneWire.
Cara menendang servomotor
Sebagai contoh, saya akan memberi tahu Anda cara mengontrol motor yang berdiri di hypodermic. Protokol motorik sederhana. 0V diterapkan pada pin kontrol - batas bawah. Sekali setiap 20 μs, perlu ditendang, memberikan unit stabil 3V, dan setelah beberapa saat - reset ke 0.

Kemudian semuanya terulang lagi. Tergantung pada panjang unit, kami mendapatkan kecepatan rotasi yang berbeda. Dengan panjang pulsa 1.500 μs, motor berhenti. Ketika menyimpang dalam satu arah atau yang lain, itu berputar searah atau berlawanan arah jarum jam. Besarnya deviasi mempengaruhi kecepatan rotasi.
Cara memprogram
Pemrograman platform Espruino dilakukan dalam IDE Espruino dengan nama yang sama. Papan mikrokontroler terhubung ke komputer dengan kabel mikro-USB. Satu-satunya hal adalah Anda harus menginstal driver, yang memakan waktu 1,5 menit. Driver diinstal untuk MAC dan Windows, dan di Linux semuanya berfungsi dengan baik.
Berikut adalah contoh program yang memuat ke lingkungan dengan satu klik. Berkedip LED sekali per detik:
var on = false; setInterval(function() { on = !on; LED1.write(on); },500);
Di sebelah kiri di lingkungan adalah juru bahasa REPL. Masukkan "1 + 1". Program ini memberikan jawaban "2". Keajaiban
Keajaibannya adalah ketika Anda menekan tombol, angka "1", tanda "+" dan unit berikutnya melalui kabel ke controller. Saat Anda menekan ENTER, ekspresi dieksekusi di dalam mikrokontroler, bukan komputer. Mikrokontroler mendapat hasil "2" dan mengembalikannya melalui kabel ke komputer. "2" ditampilkan di monitor.
JavaScript dijalankan di dalam perangkat keras.
Selain hiburan dengan aritmatika, Anda dapat memutar motor. Anda akan membutuhkan fungsi analogWrite, yang mengirimkan gelombang persegi. Kami berbicara pada pin apa untuk memberikan gelombang. Misalnya, di papan saya ditandatangani sebagai A7. Kemudian kami menunjukkan durasi - misalnya, 1300 μs dari 20 000 μs yang akan kami sajikan. Yang juga diperlukan adalah opsi yang menetapkan frekuensi tendangan ini - 50 kali per detik, ini adalah 20.000 μs.
>analogWrite(A7, 1300 / 2000, {freq: 50}} =undefined >
Kami akan melewati 1500 - kami akan memaksa untuk berputar ke arah lain dengan kecepatan yang lebih besar.
>analogWrite(A7, 2300 / 2000, {freq: 50}} =undefined >
Atau katakan berhenti.
>digitalWrite(A7, 0) =undefined >
Dengan menggunakan fungsi yang sama, Anda dapat menulis seluruh program yang, tergantung pada faktor-faktor eksternal - menekan tombol, membaca sensor - akan melakukan apa yang Anda inginkan.
Perpustakaan
Tidak selalu mudah untuk mengingat detail implementasi protokol. Karena itu, untuk semua jenis besi, banyak perpustakaan telah dibuat, dari kecil hingga raksasa. Mereka mengandung semua fitur teknis. Perpustakaan menggunakan metode yang dapat dimengerti: membaca data dari tag nfc, membaca konsentrasi karbon dioksida dalam ppm, atau mengirim pesan ke Telegram.
- servo.write;
- barometer.init;
- barometer.baca;
- suhu barometer;
- nfc.listen;
- nfc.on ('tag', ...);
- nfc.readPage;
- nfc.writePage;
- relay.turnOn;
- relay.turnOff;
- gas. kalibrasi;
- gas.read ('CO2');
- telegram.sendMessage.
Sangat berguna untuk memahami perintah tingkat rendah, tetapi untuk mulai membuat itu tidak perlu diketahui.
Kode Klien
Jadi, ketika kita mengklik salah satu tombol kolom kiri atau kanan di katak kita, nilai yang ingin kita atur pada servo yang sesuai dikirim ke topik kodok / mata / kiri atau kanan.

<button class="toad__eye__control" data-queue="left" data-payload="1300"> -1 </button>
1300 adalah durasi pulsa. Dari mana kiri dan 1300 berasal? Saya baru saja menambahkannya ke HTML sebagai atribut data.
Di JS, kami menulis kode sederhana.
import mqtt from 'mqtt'; const client = mqtt.connect(`ws://${location.hostname}:9001`); function onEyeControlClick() { const { queue, payload } = this.dataset; client.publish(`toad/eye/${queue}`, payload); } document.querySelectorAll(".toad__eye__control") .forEach(e => e.addEventListener('click', onEyeControlClick));
Mari kita menganalisis kode dalam beberapa bagian. Pada awalnya, kami terhubung ke broker, yang secara default berfungsi pada port 9001:
const client = mqtt.connect(`ws://${location.hostname}:9001`);
.
Ketika mengklik salah satu tombol, kami menerbitkan pesan baru dengan payload, yang kami dapatkan dari atribut data:
client.publish(`toad/eye/${queue}`, payload);
.
Selanjutnya, kami menerbitkan pada topik, yang juga dibentuk berdasarkan atribut-data. Ini semua kode JS kami di browser.
Kode Dewan
Ketika Slot Wi-fi dimulai, ia berlangganan ke topik yang menarik dan menerima data. Ketika mereka tiba, slot merespons dan membuat motor bekerja.

Kode di papan tulis secara konvensional dibagi menjadi beberapa bagian. Untuk memulai, kami menghubungkan perpustakaan. Secara khusus, ini hanya
perpustakaan yang menjalankan Servo agar tidak mengingat detail. Mereka berada dalam ruang lingkup amperka.
const ssid = "Droidxx"; const password = "****"; const brokerHostname = "toad.amperka.ru"; const leftEye = require("@amperka/servo").connect(A5); const rightEye = require("@amperka/servo").connect(A7).
Setiap orang dapat membuat dan menerbitkan perpustakaan mereka sendiri. Kami telah membuat beberapa lusin untuk modul populer kami sendiri dan lainnya. Semua Sumber Terbuka -
masuk, gunakan .
Maka kita membutuhkan
perpustakaan untuk bekerja dengan broker Wi-Fi dan MQTT .
const wifi = require("Wifi"); const mqtt = require("tinyMQTT").create(brokerHostname);
Tidak ada OS, jadi bahkan menghubungkan ke Wi-Fi adalah operasi manual. Perawatan koneksi adalah milik Anda, tetapi tidak begitu sulit. Untuk terhubung ke jaringan, kita cukup memanggil metode "sambungkan", yang, jika berhasil atau tidak berhasil, akan memanggil "panggilan balik" dan melaporkan hasil operasi.
wifi.connect(ssid, { password: password }, function(e) { if (e) { console.log("Error connecting:", e); wifi.disconnect(); } else { console.log("Wi-Fi OK, connecting to broker ..."); mqtt.connect(); } });
Jika semuanya baik-baik saja, sambungkan ke broker MQTT.
Setelah koneksi berhasil, kami berlangganan ke topik menarik, yaitu segala sesuatu yang dimulai dengan katak / mata.
mqtt.on("connected", function() { mqtt.subscribe("toad/eye/*"); console.log("Connected to broker", brokerHostname); });
Ketika kami menerima pesan, kami mencari tahu dari mana pesan itu berasal. Ini sangat mirip dengan parsing URL sederhana. Bergantung pada topiknya, kami memutuskan mata mana yang akan kami pengaruhi. Jika Anda mendapatkan sesuatu yang disadari, maka di mata ini kami menulis apa yang muncul dalam "payload" dalam mikrodetik.
mqtt.on("message", function(msg) { const eye = (msg.topic === "toad/eye/left") ? leftEye : (msg.topic === "toad/eye/right") ? rightEye : null; if (eye) { eye.write(Number(msg.message), "us"); } });
Itu semua keajaiban katak.
Batasan Espruino JS
Kami membahas platform Espruino. Memutar katak bukan satu-satunya pilihannya. Tetapi platform memiliki beting sendiri, yang membuat kita mempertimbangkan opsi lain.
“Total” 1-4 Mb RAM . Ada batasan pada RAM. Pada kode dan data pada saat yang sama hanya beberapa megabyte yang diberikan. Tampaknya di era ketika RAM diukur dengan pertunjukan, ini tidak cukup. Tetapi untuk sekelompok perangkat kecil ini sudah cukup. Dengan kecepatan 2 Mb Anda dapat melakukan hal-hal indah - cukup untuk air mancur.
Tidak begitu sederhana dengan NPM . Masalah ini berlaku untuk Espruino IDE. Jika kita menulis "wajib", Espruino mencari di satu tempat, di tempat lain, dan jika tidak, itu menghasilkan fallback pada NPM. Pada titik ini, ia bisa melambat. Espruino tidak selalu dapat menangani paket yang rumit. Kekuatannya dalam hal ini jauh lebih rendah daripada Webpack atau Parcel yang sama. Ini menyakitkan, tetapi jika Anda mengkonfigurasi rantai alat sendiri, dengan pemahaman tentang apa yang terjadi di dalam setrika, maka tidak ada masalah.
Bermacam-macam besi. Tidak semua perangkat keras yang disebut platform pengembangan akan menarik Espruino. Dengan standar dunia mikrokontroler, Espruino rakus - membutuhkan 500 Kb RAM. Ingatan seperti itu tidak akan menghasilkan besi. Arduino Uno atau Arduino Nano kanonik hanya memiliki 2 Kb RAM - oleh karena itu, tidak mungkin di sana. Dimungkinkan untuk bekerja dengan Espruino pada perangkat keras, yang kami lakukan pada perangkat keras resmi dari Espruino.

Espruino adalah perusahaan satu orang yang sering menggunakan Kickstarter dengan produk baru dan selalu berhasil mengumpulkan. Jika Anda ingin mendukung platform - beli secara resmi.
Ada opsi ketiga - ambil yang cukup kuat, tapi papan pihak ketiga. Misalnya, perusahaan ST, yang memproduksi "Nuclear" dan "Discovery". Besi berlabel STM32 kemungkinan akan menarik Espruino.
Mari kita membahas dua opsi alternatif. Yang pertama adalah Raspberry Pi.
Raspberry pi
Ini adalah komputer Linux ukuran kartu lengkap.

Selain itu ada pin input / output. Jika Anda memiliki Raspberry Pi yang Anda inginkan, gunakan topologi perangkat berikut.

Di sini cloud bersifat opsional - perangkat seluler dapat terhubung langsung ke perangkat melalui nama host, API atau sistem untuk secara otomatis mendeteksi perangkat di jaringan. Saya memiliki TV pintar dan hard drive cadangan di rumah. Mereka dapat diakses dari semua perangkat lain hanya karena mereka berada di LAN yang sama.
Prinsipnya sama. Letakkan perangkat di Raspberry Pi di jaringan dan bangun klien sehingga terhubung langsung melalui HTTP atau WebSocket, melewati perantara. Cloud menggunakan aplikasi pada Raspberry Pi untuk tujuannya: ia mencatat sensor atau menyiarkan ramalan cuaca.
Topologi selanjutnya yang mungkin dengan backend penuh.

Server naik di awan. Kliennya adalah aplikasi seluler yang sama yang menjaga koneksi melalui HTTP atau WebSocket. Di sisi lain, koneksi sudah dipegang melalui Raspberry Pi, menggunakan HTTP atau MQTT yang sama.
Dalam pendekatan ini, keuntungannya adalah kontrol penuh: validasi, otorisasi, penolakan kepada pelanggan. Pada saat yang sama, ketersediaan di seluruh dunia adalah perangkat di Moskow, dan komunikasi dengannya tersedia dari Vladivostok.
Keterbatasan Raspberry Pi
Pemuatan panjang. Raspberry Pi adalah komputer yang lengkap dan membutuhkan waktu untuk memulai. Sebagai hard drive, kartu SD digunakan. Bahkan kartu tercepat masih kehilangan HDD biasa, belum lagi SSD. Pada waktunya, beban mendekati satu menit.
Kelemahan berikutnya adalah konsumsi energi . Dalam hal efisiensi energi, bicarakan Raspberry Pi sebagai perangkat seluler. Ini tidak akan bertahan lama dari baterai - tagihan pergi ke jam. Agar perangkat berfungsi selama enam bulan atau satu tahun, diperlukan program yang kompeten untuk mikrokontroler dan satu set baterai.
GPIO yang buruk adalah input / output untuk tujuan umum . Fitur-fitur feed gelombang, wave read, bekerja dengan sinyal analog di Raspberry Pi jauh lebih lemah daripada mikrokontroler, yang merupakan tugas utama. Misalnya, di luar kotak pada Raspberry Pi, itu tidak akan mungkin untuk mengontrol servo dalam mode perangkat keras.

Pembatasan itu bersyarat, karena bisa dielakkan dengan ekstensi. Misalnya,
sepotong Troyka Cap dari besi, yang mengambil semua kontrol tingkat rendah bekerja dengan sinyal itu sendiri. Raspberry Pi berkomunikasi dengannya melalui paket tingkat tinggi. Memberi perintah untuk memutar servo dan berfungsi. Dengan menggunakan kartu ekspansi ini, Anda dapat menghubungkan apa pun yang Anda inginkan.
Arduino
Anda dapat mengambil
Arduino biasa, yang semua orang bosan. Tetapi JavaScript harus dipindahkan ke suatu tempat yang dapat mengubah Node JS - komputer lama atau Raspberry Pi yang sama.

Kami menghubungkan komputer lama yang tidak perlu ke Arduino melalui kabel USB. Di Arduino, isi firmware
Firmata standar
sekali . Dia mengubah Arduino menjadi zombie yang mengikuti instruksi master - komputer lama. Master mengatakan untuk mengirimkan sinyal ini dan itu ke pin ini dan itu, dan Arduino mentransmisikan.
Untuk komunikasi, perpustakaan dengan NPM -
SerialPort dan Firmata dengan API yang jelas digunakan. Jadi Anda lagi di dunia JS, menulis program tingkat tinggi yang Anda kirim ke server Anda. Anda memercayai Arduino untuk bekerja dengan sinyal, dan dia melakukannya.
Tidak selalu dengan Firmata akan mengelola untuk mengelola segalanya. Itu dapat memberikan interaksi dengan perangkat keras yang dimaksudkan: servos, strip LED, pengontrol media. Tetapi jika kemampuan membaca giroskop atau akselerometer yang sangat spesifik tidak dimasukkan - itu tidak akan berhasil. Maka Anda harus menulis sebuah program dalam C pada Arduino biasa.
Tapi itu belum semuanya - jika Anda tidak ingin menulis dalam C, gunakan alat Open Source
XOD.io.
Ini adalah lingkungan pemrograman visual di mana grafik yang Anda buat berubah menjadi kode, dan Anda sudah dapat menyusun dan mengisinya. XOD.io memungkinkan orang yang tidak terbiasa dengan seluk-beluk dan nuansa pemrograman mikrokontroler untuk dengan cepat membuat program sederhana. Jika Anda tumbuh dari Firmata, tetapi masih belum merasakan kekuatan untuk menulis pada level rendah - gunakan XOD.io.
Konferensi FrontendConf berikutnya akan diadakan pada bulan Oktober. Anda tahu tentang JavaScript yang sebagian besar pengembang front-end tidak tahu, mengembangkan antarmuka yang nyaman digunakan atau menemukan grail kinerja dan siap untuk mengetahui di mana itu, kami sedang menunggu aplikasi untuk laporan.
Kami mengumpulkan laporan menarik dalam program, berita konferensi, video, dan artikel ke dalam buletin reguler - daftar .