Warum wird ein Mikrocontroller benötigt? Zum Beispiel, um zu Hause eine Brauerei zu gründen. Wenn Ihre Brauerei nicht ausreicht, können Sie etwas Größeres tun: einen Questraum bauen, eine Präsentation arrangieren, einen interaktiven Brunnen, der ein Bild mit Tropfen zeichnet, oder einen Ausstellungsstand für ein großes Unternehmen. Mit einem Mikrocontroller können Sie alles machen - alles hängt von Ihrer Vorstellungskraft ab.
Es gibt ein Missverständnis, dass Sie zum Erstellen Ihrer eigenen Drüsen den Assembler C / C ++ kennen müssen, in der Lage sein müssen, den Speicher zu verwalten und die Elektrizität genau zu verstehen. Früher war es so, aber die Technologie entwickelt sich und jetzt reicht für die vollständige Umsetzung des Projekts nur JS aus!

Ok, wir kennen JavaScript, aber wie kann man es mit Hardware verbinden? Welche Art von Eisen gibt es und was kann es? Wie konfiguriere ich das gesamte System? Bei der Dekodierung des Berichts wird Victor Nakoryakova von
FrontendConf lernen: wie man nur JS verwendet, um Servos zu steuern, wie man das System physisch mit einem PC kombiniert und wie man Kommunikationsoptionen für die Anwendung auf JS verwendet. Wir werden Serialport- und Firmata-Pakete, Serialport mit selbstgeschriebener Firmware in C ++, Espruino und die Programmierung des Controllers direkt auf JS, Raspberry Pi, HTTP im lokalen Netzwerk sowie HTTP und MQTT über die Cloud diskutieren.
Victor Nakoryakov (
nagelxx ) - technischer Direktor, Mitbegründer von Amperka. Er mag fortschrittliche Entwicklungstechnologien, funktionale Programmierung und physikalisches Rechnen. Amperka produziert und vertreibt elektronische Module, damit Laien mit ihren eigenen Händen intelligente Geräte, Trainingskits und einzelne Bausteine erstellen können, die ihrem Gerät hinzugefügt werden können - Motoren, GPS, SMS.
Wo man JavaScript schreibt
Espruino verfügt über einen eigenständigen Mikrocontroller mit JavaScript. Mit der Espruino-Plattform können Sie JS direkt auf den Mikrocontroller schreiben. Dies ist an sich eine autonome Sache: an einen Computer angeschlossen, geflasht, und dann funktioniert es unabhängig.
Der Raspberry Pi ist ein kleiner Computer mit GPIO.
In einer Webanwendung zum Frontend oder Backend.
Ich werde die Funktionsweise des Systems am Beispiel eines Frosches zeigen.
Gehen Sie von Ihrem Telefon zu
toad.amperka.ru - eine einfache Weboberfläche wird
angezeigt .

Die linke Spalte steuert das linke Auge, das rechte - das rechte. Das Prinzip ist einfach - ich habe den Knopf gedrückt, der Servomotor dreht das Auge.
Videodemonstration eines Standes mit einem Frosch während des Berichts.
Wie der Frosch funktioniert
Wenn Sie toad.amperka.ru öffnen, erhalten Sie eine statische Webseite mit statischem JS, die die Bibliothek
MQTT.js verwendet. Diese Bibliothek kontaktiert den MQTT-Broker in der Cloud.

Wenn Sie Redis, Publish / Subscribe, RabbitMQ oder andere Nachrichtenwarteschlangen kennen, haben Sie sofort verstanden, worum es ging.
MQTT ist ein Machine-to-Machine-Nachrichtenbroker . Leicht und einfach, damit auch schwache Drüsen es nutzen können.
MQTT erfordert einen Broker auf dem Server. Aber Sie müssen es nicht einmal anheben - mieten. Für ein paar Dollar im Monat haben Sie Ihren eigenen MQTT-Broker. Kein Backend erforderlich.
Auf der anderen Seite gibt es einen Controller vom MQTT-Broker. Es gibt viele verschiedene Geräte mit dieser Rolle, z. B. den
Wi-Fi-Steckplatz . Dies ist ein Controller, der eine Verbindung zum Internet herstellen kann.

Es funktioniert auf Basis des beliebten ESP8266-Chips. Es wurde die Möglichkeit hinzugefügt, über Micro-USB mit Strom zu versorgen und externe Peripheriegeräte über Dreifachkontakte anzuschließen, um eine Verbindung zu anderen Geräten herzustellen.
So programmieren Sie Hardware in JS
Nichts Außergewöhnliches, JS regulär - fast voll ES6. Einige Funktionen und Objekte zum Arbeiten auf niedriger Ebene mit elektrischen Signalen wurden der Standardbibliothek hinzugefügt. Zum Beispiel Funktionen zum einfachen digitalen Lesen und Schreiben.
digitalRead - digitale Anzeige . Dies ist eine Frage an die Steuerung: "Gibt es drei Volt an Pin Nummer 4?" Wenn Spannung anliegt, wird TRUE zurückgegeben, wenn nicht, FALSE. Dies implementiert das Lesen einfacher binärer Sensoren: Tasten, Schalter, Reed-Schlösser und Infrarot-Bewegungssensoren.
digitalWrite ist eine einfache digitale Aufnahme . Wir sagen, digitalWrite TRUE - 3V passt zum Pin. Wir sagen digitalWrite FALSE - 0V. Mit diesem einfachen Prinzip können Sie einen LED-Streifen anzünden / löschen oder eine Atomrakete abschießen. Wir senden ein schwaches Signal an das Relais, es pendelt eine große Last und die Rakete flog.
Es gibt auch Funktionen zum Arbeiten mit Zwischenwerten zwischen 0 und 3V:
- analogRead;
- analogWrite;
- setWatch;
- digitalPulse.
Mit Befehlen können Sie alle Arten von Drehungen abfragen und Funktionen für die Fuzzy-Aufnahme bereitstellen.
Als nächstes kommen die Objekte für die Arbeit mit Schnittstellen, die in der Welt der Mikrocontroller akzeptiert werden. Wenn wir im Web HTTP, WebSocket und TCP verstehen und mit diesen vertraut sind, gilt für einen Mikrocontroller Folgendes:
- Seriell - serielle Schnittstelle;
- I2C-Bus
- SPI-Bus
- OneWire-Bus.
Wie man einen Servomotor tritt
Als Beispiel erkläre ich Ihnen, wie Sie einen Motor steuern, der in einem Injektionsgerät steht. Das Motorprotokoll ist einfach. 0 V werden an den Steuerstift angelegt - die untere Grenze. Einmal alle 20 μs muss es getreten werden, was eine stabile Einheit von 3 V ergibt, und nach einer Weile auf 0 zurückgesetzt werden.

Dann wiederholt sich alles wieder. Je nach Länge der Einheit erhalten wir unterschiedliche Drehzahlen. Mit einer Pulslänge von 1.500 μs steht der Motor still. Wenn es in die eine oder andere Richtung abweicht, dreht es sich im oder gegen den Uhrzeigersinn. Die Größe der Abweichung beeinflusst die Drehzahl.
Wie man programmiert
Die Programmierung der Espruino-Plattform erfolgt in der gleichnamigen Espruino-IDE. Die Mikrocontroller-Karte ist über ein Micro-USB-Kabel mit dem Computer verbunden. Das einzige ist, dass Sie den Treiber installieren müssen, was 1,5 Minuten dauert. Der Treiber ist für MAC und Windows installiert, und unter Linux funktioniert alles sofort.
Hier ist ein Beispiel für ein Programm, das mit einem Klick in die Umgebung geladen wird. Einmal pro Sekunde blinkt eine LED:
var on = false; setInterval(function() { on = !on; LED1.write(on); },500);
Links in der Umgebung befindet sich der REPL-Interpreter. Geben Sie "1 + 1" ein. Das Programm gibt die Antwort "2". Wunder!
Das Wunder ist, dass beim Drücken der Tasten die Nummer „1“, das „+“ - Zeichen und das nächste Gerät über das Kabel zur Steuerung gelangen. Wenn Sie die EINGABETASTE drücken, wird der Ausdruck im Mikrocontroller und nicht im Computer ausgeführt. Der Mikrocontroller erhielt das Ergebnis „2“ und gab es per Kabel an den Computer zurück. Auf dem Monitor wurde „2“ angezeigt.
JavaScript wird in der Hardware ausgeführt.
Neben der Unterhaltung mit Arithmetik können Sie die Motoren drehen. Sie benötigen die analogWrite-Funktion, die eine Rechteckwelle sendet. Wir sprechen darüber, welchen Stift wir geben sollen. Auf meinem Board ist es beispielsweise als A7 signiert. Dann geben wir die Dauer an - zum Beispiel 1300 μs von 20 000 μs werden wir eine bedienen. Ebenfalls erforderlich ist eine Option, mit der die Häufigkeit dieses Tritts festgelegt wird - 50 Mal pro Sekunde, dies sind 20.000 μs.
>analogWrite(A7, 1300 / 2000, {freq: 50}} =undefined >
Wir werden für 1500 passen - wir werden zwingen, uns mit größerer Geschwindigkeit in die andere Richtung zu drehen.
>analogWrite(A7, 2300 / 2000, {freq: 50}} =undefined >
Oder sag halt.
>digitalWrite(A7, 0) =undefined >
Mit den gleichen Funktionen können Sie ein ganzes Programm schreiben, das abhängig von externen Faktoren - Drücken von Tasten, Sensorablesungen - das tut, was Sie wollen.
Bibliotheken
Es ist nicht immer bequem, die Details der Protokollimplementierung abzurufen. Daher wurden für alle Arten von Eisen viele Bibliotheken erstellt, von klein bis riesig. Sie enthalten alle technischen Merkmale. Die Bibliotheken verwenden verständliche Methoden: Lesen Sie Daten von einem NFC-Tag, lesen Sie die Kohlendioxidkonzentration in ppm oder senden Sie eine Nachricht an Telegram.
- servo.write;
- barometer.init;
- barometer.read;
- Barometer.Temperatur;
- nfc.listen;
- nfc.on ('tag', ...);
- nfc.readPage;
- nfc.writePage;
- relay.turnOn;
- relay.turnOff;
- gas.calibrate;
- gas.read ('CO2');
- telegram.sendMessage.
Es ist nützlich, Befehle auf niedriger Ebene zu verstehen, aber um mit dem Erstellen zu beginnen, ist es nicht erforderlich, dies zu wissen.
Kundencode
Wenn wir also auf eine der Schaltflächen in der linken oder rechten Spalte unseres Frosches klicken, wird der Wert, den wir für das entsprechende Servo festlegen möchten, an das Thema Kröte / Auge / links oder rechts gesendet.

<button class="toad__eye__control" data-queue="left" data-payload="1300"> -1 </button>
1300 ist die Pulsdauer. Woher kommen die Linken und 1300? Ich habe sie gerade als Datenattribute zum HTML hinzugefügt.
In JS schreiben wir einfachen Code.
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));
Lassen Sie uns den Code in Teilen analysieren. Zu Beginn stellen wir eine Verbindung zum Broker her, der standardmäßig auf Port 9001 funktioniert:
const client = mqtt.connect(`ws://${location.hostname}:9001`);
.
Wenn wir auf eine der Schaltflächen klicken, veröffentlichen wir eine neue Nachricht mit Nutzdaten, die wir vom
client.publish(`toad/eye/${queue}`, payload);
:
client.publish(`toad/eye/${queue}`, payload);
.
Als nächstes veröffentlichen wir das Thema, das ebenfalls auf Basis von Datenattributen gebildet wird. Dies ist unser gesamter JS-Code im Browser.
Board Code
Wenn der Wi-Fi-Steckplatz gestartet wird, abonniert er die für ihn interessanten Themen und empfängt die Daten. Wenn sie ankommen, reagiert der Steckplatz und lässt die Motoren arbeiten.

Der Code auf der Tafel ist herkömmlicherweise in mehrere Teile unterteilt. Zu Beginn verbinden wir Bibliotheken. Dies ist insbesondere nur die
Bibliothek, in der Servo ausgeführt wird , um keine Details abzurufen. Sie sind im Amperka-Bereich.
const ssid = "Droidxx"; const password = "****"; const brokerHostname = "toad.amperka.ru"; const leftEye = require("@amperka/servo").connect(A5); const rightEye = require("@amperka/servo").connect(A7).
Jeder kann seine eigenen Bibliotheken erstellen und veröffentlichen. Wir haben mehrere Dutzend für unsere eigenen und andere beliebte Module hergestellt. Alle Open Source -
kommen Sie herein, verwenden Sie es .
Dann brauchen wir
Bibliotheken für die Arbeit mit Wi-Fi- und MQTT-Brokern .
const wifi = require("Wifi"); const mqtt = require("tinyMQTT").create(brokerHostname);
Es gibt kein Betriebssystem, daher ist selbst das Herstellen einer Verbindung zu Wi-Fi ein manueller Vorgang. Die Verbindungspflege liegt bei Ihnen, ist aber nicht so schwierig. Um eine Verbindung zum Netzwerk herzustellen, rufen wir einfach die Methode "connect" auf, die bei Erfolg oder Misserfolg "callback" aufruft und die Ergebnisse der Operation meldet.
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(); } });
Wenn alles in Ordnung ist, stellen Sie eine Verbindung zum MQTT-Broker her.
Nach erfolgreicher Verbindung abonnieren wir interessante Themen, dh alles, was mit Kröte / Auge beginnt.
mqtt.on("connected", function() { mqtt.subscribe("toad/eye/*"); console.log("Connected to broker", brokerHostname); });
Wenn wir eine Nachricht erhalten, finden wir heraus, woher sie stammt. Dies ist einer einfachen URL-Analyse sehr ähnlich. Je nach Thema entscheiden wir, welches Auge wir beeinflussen. Wenn Sie etwas bewusst werden, schreiben wir in diesem Auge, was in "Nutzlast" in Mikrosekunden kam.
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"); } });
Das ist die ganze Magie eines Frosches.
Espruino JS Einschränkungen
Wir gingen über die Espruino-Plattform. Das Drehen der Frösche ist nicht ihre einzige Option. Die Plattform hat jedoch ihre eigenen Schwärme, sodass wir andere Optionen in Betracht ziehen.
"Gesamt" 1–4 MB RAM . Der Arbeitsspeicher ist begrenzt. Auf dem Code und den Daten werden gleichzeitig nur wenige Megabyte angegeben. Es mag scheinen, dass in einer Zeit, in der RAM durch Gigs gemessen wird, dies nicht ausreicht. Für eine Gruppe kleiner Geräte reicht dies jedoch aus. Bei 2 Mb können Sie wunderschöne Dinge tun - genug für den Brunnen.
Nicht so einfach mit NPM . Dieses Problem betrifft die Espruino-IDE. Wenn wir "erfordern" schreiben, schaut Espruino an einer Stelle, an einer anderen, und wenn nicht, erzeugt es einen Fallback auf NPM. Zu diesem Zeitpunkt kann es langsamer werden. Espruino ist nicht immer in der Lage, komplexe Pakete zu verarbeiten. Seine Leistung in diesem Sinne ist viel geringer als die des gleichen Webpacks oder Pakets. Dies ist ein Problem, aber wenn Sie die Toolchain selbst konfigurieren und verstehen, was im Inneren des Bügeleisens geschieht, gibt es kein Problem.
Sortiment von Eisen. Nicht jede Hardware, die als Entwicklungsplattform bezeichnet wird, wird Espruino ziehen. Nach den Standards der Mikrocontroller-Welt ist Espruino unersättlich - es benötigt 500 KB RAM. Eine solche Erinnerung wird kein Stück Eisen geben. Das kanonische Arduino Uno oder Arduino Nano hat nur 2 KB RAM - daher ist es dort unmöglich. Es ist möglich, mit Espruino an Hardware zu arbeiten, was wir mit der offiziellen Hardware von Espruino tun.

Espruino ist ein Ein-Personen-Unternehmen, das häufig mit neuen Produkten auf Kickstarter geht und immer erfolgreich sammelt. Wenn Sie die Plattform unterstützen möchten - kaufen Sie offiziell.
Es gibt eine dritte Option: Nehmen Sie ein ausreichend leistungsfähiges Devboard von Drittanbietern. Zum Beispiel die Firma ST, die "Nuclear" und "Discovery" produziert. Eisen mit der Bezeichnung STM32 zieht wahrscheinlich den Espruino.
Lassen Sie uns zwei alternative Optionen durchgehen. Der erste ist der Raspberry Pi.
Himbeer pi
Dies ist ein vollwertiger Linux-Computer in Visitenkartengröße.

Zusätzlich gibt es Eingangs- / Ausgangspins. Wenn Sie Raspberry Pi zur Verfügung haben, verwenden Sie die folgende Gerätetopologie.

Hier ist die Cloud optional - ein mobiles Gerät kann über Hostname, API oder ein System zur automatischen Erkennung eines Geräts im Netzwerk eine direkte Verbindung zum Gerät herstellen. Ich habe einen Smart-TV und eine Backup-Festplatte zu Hause. Sie sind von allen anderen Geräten aus zugänglich, nur weil sie sich im selben LAN befinden.
Das Prinzip ist das gleiche. Stellen Sie das Gerät auf den Raspberry Pi im Netzwerk und erstellen Sie den Client so, dass er über HTTP oder WebSocket eine direkte Verbindung zu ihm herstellt, wobei Vermittler umgangen werden. Die Cloud verwendet die Anwendung auf Raspberry Pi für ihre Zwecke: Sie protokolliert Sensoren oder sendet Wettervorhersagen.
Die nächstmögliche Topologie mit vollem Backend.

Der Server steigt in der Cloud auf. Sein Client ist dieselbe mobile Anwendung, die eine Verbindung über HTTP oder WebSocket aufrechterhält. Andererseits wird die Verbindung bereits über den Raspberry Pi über HTTP oder denselben MQTT gehalten.
Bei diesem Ansatz liegt der Vorteil in der vollständigen Kontrolle: Validierung, Autorisierung, Verweigerung gegenüber Kunden. Gleichzeitig ist die weltweite Verfügbarkeit ein Gerät in Moskau, und die Kommunikation mit ihm ist über Wladiwostok möglich.
Himbeer-Pi-Einschränkungen
Langes Laden. Raspberry Pi ist ein vollständiger Computer und der Start dauert einige Zeit. Als Festplatte wird eine SD-Karte verwendet. Selbst die schnellste Karte verliert immer noch eine normale Festplatte, ganz zu schweigen von der SSD. Mit der Zeit nähert sich die Last einer Minute.
Der nächste Nachteil ist der Energieverbrauch . Sprechen Sie in Bezug auf die Energieeffizienz über den Raspberry Pi als mobiles Gerät. Es wird nicht lange von der Batterie dauern - die Rechnung geht an die Uhr. Damit das Gerät sechs Monate oder ein Jahr lang funktioniert, sind ein kompetentes Programm für den Mikrocontroller und ein Satz Batterien erforderlich.
Der schlechte GPIO ist ein universeller Ein- / Ausgang . Die Funktionen von Welleneinspeisung, Wellenlesen und Arbeiten mit analogen Signalen bei Raspberry Pi sind viel schwächer als bei Mikrocontrollern, für die dies die Hauptaufgabe ist. Bei einem Raspberry Pi ist es beispielsweise nicht möglich, das Servo im Hardwaremodus zu steuern.

Die Einschränkung ist bedingt, da sie durch die Erweiterung umgangen werden kann. Zum Beispiel das
Troyka Cap-Stück Eisen, das die gesamte Kontrolle über das Arbeiten mit Signalen auf sich selbst übernimmt. Raspberry Pi kommuniziert mit ihr über ein hochrangiges Paket. Gibt Befehle zum Drehen des Servos und es funktioniert. Mit diesen Erweiterungskarten können Sie alles anschließen, was Sie wollen.
Arduino
Sie können das übliche
Arduino nehmen , das jeder satt hat. Aber JavaScript muss irgendwohin verschoben werden, wo Node JS gedreht werden kann - ein alter Computer oder der gleiche Raspberry Pi.

Wir verbinden einen alten unnötigen Computer über ein USB-Kabel mit Arduino. Füllen Sie in Arduino die Standard-
Firmata- Firmware
einmal aus . Sie verwandelt Arduino in einen Zombie, der den Anweisungen eines Meisters folgt - eines alten Computers. Der Meister sagt, er soll dieses und jenes Signal an diesen und jenen Stift senden, und Arduino sendet.
Für die Kommunikation werden Bibliotheken mit NPM -
SerialPort und Firmata mit einer eindeutigen API verwendet. Sie befinden sich also wieder in der JS-Welt und schreiben ein übergeordnetes Programm, das Sie an Ihren Server senden. Sie vertrauen darauf, dass Arduino mit Signalen arbeitet, und sie führt es aus.
Nicht immer mit Firmata wird es gelingen, alles zu verwalten. Es kann eine Interaktion mit der Hardware ermöglichen, für die es bestimmt ist: Servos, LED-Streifen, Mediencontroller. Wenn jedoch die Fähigkeit, ein ganz bestimmtes Gyroskop oder einen bestimmten Beschleunigungsmesser abzulesen, nicht berücksichtigt wird, funktioniert dies nicht. Dann müssen Sie ein Programm in C auf einem normalen Arduino schreiben.
Aber das ist noch nicht alles - wenn Sie nicht in C schreiben möchten, verwenden Sie das Open Source-Tool
XOD.io.
Dies ist eine visuelle Programmierumgebung, in der das von Ihnen erstellte Diagramm in Code umgewandelt wird und Sie es bereits kompilieren und füllen können. Mit XOD.io können Personen, die mit den Feinheiten und Nuancen der Mikrocontroller-Programmierung nicht vertraut sind, schnell einfache Programme erstellen. Wenn Sie mit Firmata aufgewachsen sind, aber immer noch nicht die Kraft haben, auf niedrigem Niveau zu schreiben, verwenden Sie XOD.io.
Die nächste FrontendConf- Konferenz findet im Oktober statt. Wenn Sie über JavaScript Bescheid wissen, das die meisten Front-End-Entwickler nicht kennen, entwickeln Sie Schnittstellen, die bequem zu verwenden sind, oder finden Sie den Gral der Leistung und sind bereit zu erkennen, wo es sich befindet. Wir warten auf Anwendungen für Berichte.
Wir sammeln interessante Berichte im Programm, Konferenznachrichten, Videos und Artikel im regulären Newsletter - melden Sie sich an .