Comment parler avec le microcontrôleur de JS

Pourquoi un microcontrôleur est-il nécessaire? Par exemple, pour installer une brasserie à la maison. Si votre brasserie ne suffit pas, vous pouvez faire quelque chose de plus grand: construire une salle de quête, organiser une présentation, une fontaine interactive qui peint une image avec des gouttes ou un stand d'exposition pour une grande entreprise. Vous pouvez tout faire avec un microcontrôleur - tout dépend de votre imagination.

Il y a une idée fausse selon laquelle pour créer vos propres glandes, vous devez connaître l'assembleur C / C ++, être capable de gérer la mémoire et de comprendre profondément l'électricité. Autrefois, mais la technologie se développe et maintenant pour la mise en œuvre complète de son projet, seul JS suffit!



Ok, nous connaissons JavaScript, mais comment le connecter au matériel? Quel type de fer existe-t-il et que peut-il faire? Comment configurer l'ensemble du système? Lors du décodage du rapport, Victor Nakoryakova de FrontendConf apprendra: comment, en utilisant uniquement JS, contrôler les servos, comment combiner physiquement le système avec un PC et les options de communication pour l'application sur JS. Nous discuterons des packages serialport et Firmata, serialport avec un firmware auto-écrit en C ++, Espruino et la programmation du contrôleur directement sur JS, Raspberry Pi, HTTP sur le réseau local et HTTP et MQTT via le cloud.



Victor Nakoryakov ( nailxx ) - directeur technique, co-fondateur d'Amperka. Il aime les technologies de développement avancées, la programmation fonctionnelle et l'informatique physique. Amperka fabrique et vend des modules électroniques afin que les non-professionnels puissent créer des appareils intelligents de leurs propres mains, des kits de formation et des blocs de construction individuels qui peuvent être ajoutés à leur appareil - moteurs, GPS, SMS.

Où écrire JavaScript


Espruino dispose d'un microcontrôleur autonome avec JavaScript. La plate-forme Espruino vous permet d'écrire JS directement sur le microcontrôleur. C'est une chose autonome en soi: connectée à un ordinateur, flashée, puis ça fonctionne de façon indépendante.

Le Raspberry Pi est un petit ordinateur avec GPIO.

Dans une application Web , vers le frontend ou le backend.

Je vais montrer le fonctionnement du système en utilisant un exemple de grenouille. Accédez à toad.amperka.ru depuis votre téléphone - une interface Web simple apparaîtra.



La colonne de gauche contrôle l'œil gauche, la droite - la droite. Le principe est simple - j'ai appuyé sur le bouton, le servomoteur fait tourner les yeux.



Démonstration vidéo d'un stand avec une grenouille pendant le reportage.

Comment fonctionne la grenouille


Lorsque vous ouvrez toad.amperka.ru, vous obtenez une page Web statique avec JS statique qui utilise la bibliothèque MQTT.js. Cette bibliothèque contacte le courtier MQTT dans le cloud.



Si vous connaissez Redis, Publish / Subscribe, RabbitMQ ou d'autres files d'attente de messages, vous avez immédiatement compris de quoi il s'agissait. MQTT est un courtier de messages Machine-to-Machine . Léger et simple pour que même les glandes faibles puissent l'utiliser.

MQTT nécessite un courtier sur le serveur. Mais vous n'avez même pas besoin de le soulever - de le louer. Pour quelques dollars par mois, vous aurez votre propre courtier MQTT. Aucun backend nécessaire.

D'autre part, il y a un contrôleur du courtier MQTT. Il existe de nombreux appareils différents avec ce rôle, par exemple, Wi-Fi Slot . Il s'agit d'un contrôleur qui peut se connecter à Internet.



Il fonctionne sur la base de la puce ESP8266 populaire. Ajout de la possibilité d'alimenter via micro-USB et de connecter des périphériques externes via des contacts triples pour se connecter à d'autres appareils.

Comment programmer du matériel dans JS


Rien d'extraordinaire, JS régulier - ES6 presque complet. Quelques fonctions et objets pour travailler à bas niveau avec des signaux électriques ont été ajoutés à la bibliothèque standard. Par exemple, des fonctions de lecture et d'écriture numériques simples.

digitalRead - lecture numérique . C'est une question pour le contrôleur: "Y a-t-il trois volts sur la broche numéro 4?" S'il y a de la tension, elle retournera TRUE; sinon, FALSE. Cela met en œuvre la lecture de simples capteurs binaires: boutons, interrupteurs, verrous à lames et capteurs de mouvement infrarouge.

digitalWrite est un simple enregistrement numérique . Nous disons que digitalWrite TRUE - 3V va de pair avec la broche. Nous disons digitalWrite FALSE - 0V. En utilisant ce principe simple, vous pouvez allumer / éteindre une bande LED ou lancer un missile nucléaire. Nous envoyons un signal faible au relais, il commute une grosse charge et la fusée a volé.

Il existe également des fonctions pour travailler avec des valeurs intermédiaires entre 0 et 3V:

  • analogRead;
  • analogWrite;
  • setWatch;
  • digitalPulse.

Les commandes vous permettent d'interroger toutes sortes de rebondissements et offrent des fonctions d'enregistrement flou.

Viennent ensuite les objets pour travailler avec des interfaces acceptées dans le monde des microcontrôleurs. Si sur le Web, nous comprenons et connaissons HTTP, WebSocket, TCP, alors pour un microcontrôleur, c'est:

  • Série - port série;
  • Bus I2C
  • Bus SPI
  • Bus OneWire.

Comment démarrer un servomoteur


Pour un exemple, je vais vous dire comment contrôler un moteur qui se trouve dans un hypodermique. Le protocole moteur est simple. 0V est appliqué à la broche de commande - la limite inférieure. Une fois tous les 20 μs, il doit être lancé, ce qui donne une unité stable de 3V, et après un certain temps - réinitialisé à 0.



Puis tout recommence. Selon la longueur de l'unité, nous obtenons différentes vitesses de rotation. Avec une longueur d'impulsion de 1 500 μs, le moteur s'arrête. Lorsqu'il est dévié dans un sens ou dans un autre, il tourne dans le sens horaire ou antihoraire. L'amplitude de l'écart affecte la vitesse de rotation.

Comment programmer


La programmation de la plateforme Espruino se fait dans l'IDE Espruino du même nom. La carte microcontrôleur est connectée à l'ordinateur avec un câble micro-USB. La seule chose est que vous devez installer le pilote, ce qui prend 1,5 minute. Le pilote est installé pour MAC et Windows, et sur Linux tout fonctionne hors de la boîte.

Voici un exemple de programme qui se charge dans l'environnement en un seul clic. Il fait clignoter une LED une fois par seconde:

var on = false; setInterval(function() { on = !on; LED1.write(on); },500); 

À gauche dans l'environnement se trouve l'interpréteur REPL. Entrez "1 + 1". Le programme donne la réponse "2". Miracle!

Le miracle est que lorsque vous appuyez sur les boutons, le chiffre «1», le signe «+» et l'unité suivante passent par le câble vers le contrôleur. Lorsque vous appuyez sur ENTRÉE, l'expression est exécutée à l'intérieur du microcontrôleur, pas de l'ordinateur. Le microcontrôleur a obtenu le résultat «2» et l'a renvoyé par câble à l'ordinateur. «2» était affiché sur le moniteur.

JavaScript est exécuté à l'intérieur du matériel.

En plus du divertissement avec l'arithmétique, vous pouvez faire tourner les moteurs. Vous aurez besoin de la fonction analogWrite, qui envoie une onde carrée. Nous parlons de quelle broche pour donner une onde. Par exemple, sur mon tableau, il est signé comme A7. Ensuite, nous indiquons la durée - par exemple, 1300 μs sur 20 000 μs nous en servirons un. Une option qui définit également la fréquence de ce coup de pied - 50 fois par seconde, soit 20 000 μs, est également requise.

 >analogWrite(A7, 1300 / 2000, {freq: 50}} =undefined > 

Nous passerons pour 1500 - nous forcerons à tourner dans l'autre sens avec une plus grande vitesse.

 >analogWrite(A7, 2300 / 2000, {freq: 50}} =undefined > 

Ou dites stop.

 >digitalWrite(A7, 0) =undefined > 

En utilisant les mêmes fonctions, vous pouvez écrire un programme complet qui, en fonction de facteurs externes - en appuyant sur les boutons, les lectures du capteur - fera ce que vous voulez.

Bibliothèques


Il n'est pas toujours commode de rappeler les détails de la mise en œuvre du protocole. Par conséquent, pour toutes sortes de fer, de nombreuses bibliothèques ont été créées, de petite à géante. Ils contiennent toutes les caractéristiques techniques. Les bibliothèques utilisent des méthodes compréhensibles: lire les données d'une balise nfc, lire la concentration de dioxyde de carbone en ppm ou envoyer un message à Telegram.
  • servo.write;
  • barometer.init;
  • barometer.read;
  • baromètre.température;
  • nfc.listen;
  • nfc.on ('tag', ...);
  • nfc.readPage;
  • nfc.writePage;
  • relay.turnOn;
  • relay.turnOff;
  • gaz.calibrate;
  • gas.read («CO2»);
  • telegram.sendMessage.

Il est utile de comprendre les commandes de bas niveau, mais pour commencer à créer, il n'est pas nécessaire de le savoir.

Code client


Ainsi, lorsque nous cliquons sur l'un des boutons de la colonne de gauche ou de droite de notre grenouille, la valeur que nous voulons définir sur le servo correspondant est envoyée au sujet crapaud / œil / gauche ou droite.



 <button class="toad__eye__control" data-queue="left" data-payload="1300"> -1 </button> 

1300 est la durée d'impulsion. D'où viennent la gauche et 1300? Je viens de les ajouter au HTML en tant qu'attributs de données.

En JS, nous écrivons du code simple.

 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)); 

Analysons le code en plusieurs parties. Au début, nous nous connectons au courtier, qui fonctionne par défaut sur le port 9001: const client = mqtt.connect(`ws://${location.hostname}:9001`); .

En cliquant sur l'un des boutons, nous publions un nouveau message avec charge utile, que nous avons obtenu de l'attribut client.publish(`toad/eye/${queue}`, payload); : client.publish(`toad/eye/${queue}`, payload); .

Ensuite, nous publions sur le sujet, qui est également formé sur la base de l'attribut data. C'est tout notre code JS dans le navigateur.

Code du conseil


Lorsque la fente Wi-Fi démarre, elle s'abonne aux sujets qui l'intéressent et reçoit les données. Quand ils arrivent, la fente répond et fait fonctionner les moteurs.



Le code du tableau est classiquement divisé en plusieurs parties. Pour commencer, nous connectons des bibliothèques. En particulier, ce n'est que la bibliothèque qui exécute Servo afin de ne pas rappeler les détails. Ils sont dans le champ d'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). 

Chacun peut créer et publier ses propres bibliothèques. Nous en avons fabriqué plusieurs dizaines pour notre propre module et d'autres modules populaires. Tout Open Source - entrez, utilisez-le .

Ensuite, nous avons besoin de bibliothèques pour travailler avec les courtiers Wi-Fi et MQTT .

 const wifi = require("Wifi"); const mqtt = require("tinyMQTT").create(brokerHostname); 

Il n'y a pas de système d'exploitation, donc même la connexion au Wi-Fi est une opération manuelle. Les soins de connexion vous appartiennent, mais ce n'est pas si difficile. Pour se connecter au réseau, nous appelons simplement la méthode «connect» qui, en cas de succès ou d'échec, appellera «callback» et rendra compte des résultats de l'opération.

 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(); } }); 

Si tout va bien, connectez-vous au courtier MQTT.

Une fois la connexion établie, nous souscrivons à des sujets intéressants, c'est-à-dire tout ce qui commence par crapaud / œil.

 mqtt.on("connected", function() { mqtt.subscribe("toad/eye/*"); console.log("Connected to broker", brokerHostname); }); 

Lorsque nous recevons un message, nous découvrons d'où il vient. Ceci est très similaire à une simple analyse d'URL. Selon le sujet, nous décidons quel œil nous allons influencer. Si vous obtenez quelque chose de conscient, alors dans cet œil, nous écrivons ce qui est arrivé en «charge utile» en microsecondes.

 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"); } }); 

C'est toute la magie d'une grenouille.

Limitations d'Espruino JS


Nous sommes passés sur la plate-forme Espruino. Tordre les grenouilles n'est pas sa seule option. Mais la plateforme a ses propres hauts-fonds, ce qui nous fait envisager d'autres options.

«Total» 1 à 4 Mo de RAM . Il y a une limitation sur la RAM. Sur le code et les données en même temps, seuls quelques mégaoctets sont donnés. Il peut sembler qu'à une époque où la RAM est mesurée par des concerts, cela ne suffit pas. Mais pour un groupe de petits appareils, cela suffit. À 2 Mo, vous pouvez faire des choses magnifiques - assez pour la fontaine.

Pas si simple avec NPM . Ce problème s'applique à l'ESpruino IDE. Si nous écrivons «exiger», Espruino regarde dans un endroit, dans un autre, et sinon, il produit un repli sur NPM. À ce stade, il peut ralentir. Espruino n'est pas toujours capable de gérer des packages complexes. Sa puissance en ce sens est bien inférieure à celle du même Webpack ou Parcel. C'est une douleur, mais si vous configurez la chaîne d'outils vous-même, avec une compréhension de ce qui se passe à l'intérieur du fer, il n'y a pas de problème.

Assortiment de fer. Tous les composants matériels appelés plates-formes de développement ne tireront pas Espruino. Selon les normes du monde des microcontrôleurs, Espruino est vorace - il a besoin de 500 Ko de RAM. Une telle mémoire ne donnera aucun morceau de fer. L'Arduino Uno ou l'Arduino Nano canonique ne dispose que de 2 Ko de RAM - c'est donc impossible là-bas. Il est possible de travailler avec Espruino sur le matériel, ce que nous faisons sur le matériel officiel d'Espruino.



Espruino est une entreprise composée d'une seule personne qui va souvent sur Kickstarter avec de nouveaux produits et collecte toujours avec succès. Si vous souhaitez soutenir la plateforme - achetez officiellement.

Il y a une troisième option - prenez un devboard assez puissant, mais tiers. Par exemple, la société ST, qui produit "Nucléaire" et "Découverte". Le fer étiqueté STM32 est susceptible de tirer l'Espruino.

Passons en revue deux options alternatives. Le premier est le Raspberry Pi.

Raspberry pi


Il s'agit d'un ordinateur Linux complet de la taille d'une carte de visite.




De plus, il y a des broches d'entrée / sortie. Si vous avez Raspberry Pi à votre disposition, utilisez la topologie d'appareil suivante.



Ici, le cloud est facultatif - un appareil mobile peut se connecter directement à l'appareil via le nom d'hôte, l'API ou un système pour détecter automatiquement un appareil sur le réseau. J'ai un téléviseur intelligent et un disque dur de sauvegarde à la maison. Ils sont accessibles depuis tous les autres appareils simplement parce qu'ils sont sur le même réseau local.

Le principe est le même. Mettez l'appareil sur le Raspberry Pi sur le réseau et construisez le client afin qu'il s'y connecte directement via HTTP ou WebSocket, en contournant les intermédiaires. Le cloud utilise l'application sur Raspberry Pi à ses fins: il enregistre des capteurs ou diffuse des prévisions météorologiques.

La prochaine topologie possible avec un backend complet.



Le serveur monte dans le cloud. Son client est la même application mobile qui maintient une connexion via HTTP ou WebSocket. D'autre part, la connexion est déjà maintenue via le Raspberry Pi, en utilisant HTTP ou le même MQTT.

Dans cette approche, l'avantage est un contrôle total: validation, autorisation, refus aux clients. Dans le même temps, la disponibilité mondiale est un appareil à Moscou, et la communication avec lui est disponible auprès de Vladivostok.

Limitations de Raspberry Pi


Long chargement. Raspberry Pi est un ordinateur complet et il faut du temps pour démarrer. En tant que disque dur, une carte SD est utilisée. Même la carte la plus rapide perd toujours un disque dur ordinaire, sans parler du SSD. Avec le temps, la charge approche d'une minute.

Le prochain inconvénient est la consommation d'énergie . En termes d'efficacité énergétique, parlons du Raspberry Pi comme appareil mobile. Cela ne durera pas longtemps de la batterie - la facture va à l'horloge. Pour que l'appareil fonctionne pendant six mois ou un an, un programme compétent pour le microcontrôleur et un jeu de piles sont nécessaires.

Le mauvais GPIO est une entrée / sortie à usage général . Les caractéristiques de l'alimentation des vagues, de la lecture des ondes, du travail avec des signaux analogiques au Raspberry Pi sont beaucoup plus faibles que celles des microcontrôleurs, pour lesquelles c'est la tâche principale. Par exemple, hors de la boîte sur un Raspberry Pi, il ne sera pas possible de contrôler le servo en mode matériel.



La restriction est conditionnelle, car elle peut être contournée par l'extension. Par exemple, le morceau de fer Troyka Cap , qui prend tout le contrôle de bas niveau du travail avec les signaux sur lui-même. Raspberry Pi communique avec elle via un package de haut niveau. Donne des commandes pour tordre le servo et cela fonctionne. En utilisant ces cartes d'extension, vous pouvez connecter tout ce que vous voulez.

Arduino


Vous pouvez prendre l' Arduino habituel, dont tout le monde est fatigué. Mais JavaScript devra être déplacé quelque part qui peut transformer Node JS - un vieil ordinateur ou le même Raspberry Pi.



Nous connectons un vieil ordinateur inutile à Arduino via un câble USB. Dans Arduino, remplissez le firmware Firmata standard une fois . Elle transforme Arduino en zombie qui suit les instructions d'un maître - un vieil ordinateur. Le maître dit de transmettre tel ou tel signal à telle ou telle broche, et Arduino transmet.

Pour la communication, des bibliothèques avec NPM - SerialPort et Firmata avec une API claire sont utilisées. Vous êtes donc à nouveau dans le monde JS, en train d'écrire un programme de haut niveau que vous envoyez à votre serveur. Vous faites confiance à Arduino pour travailler avec des signaux, et elle le fait.

Pas toujours avec Firmata arrivera à tout gérer. Il est capable de fournir une interaction avec le matériel auquel il est destiné: servos, bandes LED, contrôleurs de média. Mais si la capacité de lire un gyroscope ou un accéléromètre très spécifique n'est pas intégrée - cela ne fonctionnera pas. Ensuite, vous devez écrire un programme en C sur un Arduino ordinaire.

Mais ce n'est pas tout - si vous ne voulez pas écrire en C, utilisez l'outil Open Source XOD.io.



Il s'agit d'un environnement de programmation visuelle où le graphique que vous construisez se transforme en code, et vous pouvez déjà le compiler et le remplir. XOD.io permet aux personnes qui ne sont pas familières avec les subtilités et les nuances de la programmation des microcontrôleurs de créer rapidement des programmes simples. Si vous avez grandi de Firmata, mais que vous ne ressentez toujours pas la force d'écrire à un bas niveau - utilisez XOD.io.

La prochaine conférence FrontendConf se tiendra en octobre. Vous connaissez JavaScript que la plupart des développeurs frontaux ne connaissent pas, développez des interfaces pratiques à utiliser ou trouvez le graal des performances et êtes prêt à dire où il se trouve, nous attendons des applications pour les rapports.

Nous recueillons des rapports intéressants dans le programme, des nouvelles de la conférence, des vidéos et des articles dans la newsletter régulière - inscrivez-vous .

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


All Articles