Cómo hablar con el microcontrolador de JS

¿Por qué se necesita un microcontrolador? Por ejemplo, para configurar una cervecería en casa. Si su cervecería no es suficiente, entonces puede hacer algo más grande: construir una sala de búsqueda, organizar una presentación, una fuente interactiva que pinta una imagen con gotas o un puesto de exhibición para una gran empresa. Puedes hacer cualquier cosa con un microcontrolador: todo depende de tu imaginación.

Existe la idea errónea de que para crear sus propias glándulas necesita conocer el ensamblador, C / C ++, poder administrar la memoria y comprender profundamente la electricidad. Una vez lo fue, pero la tecnología se está desarrollando y ahora para la implementación completa de su proyecto, ¡solo JS es suficiente!



Ok, sabemos JavaScript, pero ¿cómo conectarlo al hardware? ¿Qué tipo de hierro hay y qué puede hacer? ¿Cómo configurar todo el sistema? En la transcripción del informe, Victor Nakoryakova en FrontendConf aprenderá: cómo, utilizando solo JS, controlar los servos, cómo combinar físicamente el sistema con una PC y sobre las opciones de comunicación para la aplicación en JS. Analizaremos los paquetes de puerto serie y Firmata, puerto serie con firmware autoescrito en C ++, Espruino y la programación del controlador directamente en JS, Raspberry Pi, HTTP en la red local y HTTP y MQTT a través de la nube.



Victor Nakoryakov ( nailxx ) - director técnico, cofundador de Amperka. Le gustan las tecnologías avanzadas de desarrollo, la programación funcional y la informática física. Amperka fabrica y vende módulos electrónicos para que los no profesionales creen dispositivos inteligentes con sus propias manos, kits de entrenamiento y bloques de construcción individuales que se pueden agregar a su dispositivo: motores, GPS, SMS.

Donde escribir JavaScript


Espruino tiene un microcontrolador independiente con JavaScript. La plataforma Espruino le permite escribir JS directamente en el microcontrolador. Esto es algo autónomo en sí mismo: conectado a una computadora, flasheado y luego funciona de manera independiente.

La Raspberry Pi es una computadora pequeña con GPIO.

En una aplicación web , para el frontend o el backend.

Mostraré el funcionamiento del sistema usando un ejemplo de rana. Vaya a toad.amperka.ru desde su teléfono; aparecerá una interfaz web simple.



La columna izquierda controla el ojo izquierdo, el derecho, el derecho. El principio es simple: presioné el botón, el servomotor gira el ojo.



Video de demostración de un puesto con una rana durante el informe.

Como funciona la rana


Cuando abre toad.amperka.ru, obtiene una página web estática con JS estático, que utiliza la biblioteca MQTT.js. Esta biblioteca se pone en contacto con el agente MQTT en la nube.



Si conoce Redis, Publicar / Suscribir, RabbitMQ u otras colas de mensajes, entendió inmediatamente de qué se trataba. MQTT es un agente de mensajes de máquina a máquina . Ligero y simple para que incluso las glándulas débiles puedan usarlo.

MQTT requiere un intermediario en el servidor. Pero ni siquiera tiene que levantarlo, alquilarlo. Por un par de dólares al mes, tendrá su propio corredor MQTT. No se necesita backend.

Por otro lado, hay un controlador del corredor MQTT. Hay muchos dispositivos diferentes con este rol, por ejemplo, la ranura para Wi-Fi . Este es un controlador que puede conectarse a Internet.



Funciona sobre la base del popular chip ESP8266. Se agregó la capacidad de alimentar a través de micro-USB y conectar periféricos externos a través de contactos triples para conectarse a otros dispositivos.

Cómo programar hardware en JS


Nada fuera de lo común, JS regular, casi completo ES6. Algunas funciones y objetos para trabajar en un nivel bajo con señales eléctricas se han agregado a la biblioteca estándar. Por ejemplo, funciones para lectura y escritura digital simple.

digitalRead - lectura digital . Esta es una pregunta para el controlador: "¿Hay tres voltios en el pin número 4?" Si hay voltaje, devolverá VERDADERO; si no, FALSO. Esto implementa la lectura de sensores binarios simples: botones, interruptores, cerraduras de láminas y sensores de movimiento infrarrojos.

digitalWrite es una simple grabación digital . Decimos digitalWrite TRUE - 3V va con pin. Decimos digitalWrite FALSE - 0V. Usando este principio simple, puede encender / apagar una tira de LED o lanzar un misil nuclear. Enviamos una señal débil al relé, conmuta una carga grande y el cohete voló.

También hay funciones para trabajar con valores intermedios entre 0 y 3V:

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

Los comandos le permiten interrogar todo tipo de giros y proporcionar funciones para la grabación difusa.

Luego vienen los objetos para trabajar con interfaces que son aceptadas en el mundo de los microcontroladores. Si en la web entendemos y estamos familiarizados con HTTP, WebSocket, TCP, para un microcontrolador esto es:

  • Serie - puerto serie;
  • Bus I2C
  • Bus SPI
  • Autobús OneWire.

Cómo patear un servomotor


Por ejemplo, te diré cómo controlar un motor que se encuentra en una hipodérmica. El protocolo motor es simple. Se aplica 0V al pin de control, el límite inferior. Una vez cada 20 μs, debe patearse, dando una unidad estable de 3V y, después de un tiempo, restablecer a 0.



Entonces todo se repite nuevamente. Dependiendo de la longitud de la unidad, obtenemos diferentes velocidades de rotación. Con una longitud de pulso de 1,500 μs, el motor se detiene. Cuando se desvía en una dirección u otra, gira en sentido horario o antihorario. La magnitud de la desviación afecta la velocidad de rotación.

Como programar


La programación de la plataforma Espruino se realiza en el IDE de Espruino del mismo nombre. La placa del microcontrolador está conectada a la computadora con un cable micro-USB. Lo único es que tienes que instalar el controlador, que lleva 1,5 minutos. El controlador está instalado para MAC y Windows, y en Linux todo funciona de inmediato.

Aquí hay un ejemplo de un programa que se carga en el entorno con un solo clic. Parpadea un LED una vez por segundo:

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

A la izquierda en el entorno está el intérprete REPL. Ingrese "1 + 1". El programa da la respuesta "2". Milagro!

El milagro es que cuando presiona los botones, el número "1", el signo "+" y la siguiente unidad pasan por el cable al controlador. Cuando presiona ENTRAR, la expresión se ejecuta dentro del microcontrolador, no en la computadora. El microcontrolador obtuvo el resultado "2" y lo devolvió por cable a la computadora. Se visualizó "2" en el monitor.

JavaScript se ejecuta dentro del hardware.

Además del entretenimiento con la aritmética, puede girar los motores. Necesitará la función analogWrite, que envía una onda cuadrada. Hablamos sobre qué alfiler dar una ola. Por ejemplo, en mi tablero está firmado como A7. Luego indicamos la duración; por ejemplo, 1300 μs de 20 000 μs serviremos uno. También se requiere una opción que establezca la frecuencia de esta patada: 50 veces por segundo, esto es 20,000 μs.

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

Pasaremos por 1500, nos veremos obligados a girar en la otra dirección con mayor velocidad.

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

O di parada.

 >digitalWrite(A7, 0) =undefined > 

Con las mismas funciones, puede escribir un programa completo que, dependiendo de factores externos (presionar botones, lecturas del sensor) hará lo que desee.

Bibliotecas


No siempre es conveniente recordar los detalles de la implementación del protocolo. Por lo tanto, para todo tipo de hierro, se han creado muchas bibliotecas, desde pequeñas hasta gigantes. Contienen todas las características técnicas. Las bibliotecas utilizan métodos claros: leer datos de una etiqueta nfc, leer la concentración de dióxido de carbono en ppm o enviar un mensaje a Telegram.
  • servo.write;
  • barometer.init;
  • barometer.read;
  • temperatura del barómetro;
  • nfc.listen;
  • nfc.on ('etiqueta', ...);
  • nfc.readPage;
  • nfc.writePage;
  • relé.turnOn;
  • relay.turnOff;
  • gas.calibrate;
  • gas.read ('CO2');
  • telegram.sendMessage.

Es útil comprender los comandos de bajo nivel, pero para comenzar a crearlo no es necesario saberlo.

Código de cliente


Entonces, cuando hacemos clic en uno de los botones de la columna izquierda o derecha de nuestra rana, el valor que queremos establecer en el servo correspondiente se envía al tema sapo / ojo / izquierda o derecha.



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

1300 es la duración del pulso. ¿De dónde vienen la izquierda y 1300? Acabo de agregarlos al HTML como atributos de datos.

En JS, escribimos código 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)); 

Analicemos el código en partes. Al inicio, nos conectamos al intermediario, que por defecto funciona en el puerto 9001: const client = mqtt.connect(`ws://${location.hostname}:9001`); .

Al hacer clic en cualquiera de los botones, publicamos un nuevo mensaje con carga útil, que obtuvimos del atributo de datos: client.publish(`toad/eye/${queue}`, payload); .

A continuación, publicamos sobre el tema, que también se forma sobre la base de atributos de datos. Este es todo nuestro código JS en el navegador.

Código de la Junta


Cuando se inicia la ranura de Wi-Fi, se suscribe a los temas de interés y recibe los datos. Cuando llegan, la ranura responde y hace que los motores funcionen.



El código en el tablero se divide convencionalmente en varias partes. Para comenzar, estamos conectando bibliotecas. En particular, esta es solo la biblioteca que ejecuta Servo para no recordar detalles. Están en el ámbito de 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). 

Todos pueden crear y publicar sus propias bibliotecas. Hemos creado varias docenas para nuestros propios módulos y otros populares. Todo de código abierto: entra, úsalo .

Luego, necesitamos bibliotecas para trabajar con agentes de Wi-Fi y MQTT .

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

No hay sistema operativo, por lo que incluso conectarse a Wi-Fi es una operación manual. El cuidado de la conexión es tuyo, pero no es tan difícil. Para conectarse a la red, simplemente llamamos al método "conectar", que, si tiene éxito o no, llamará a "devolución de llamada" e informará los resultados de la operación.

 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 todo está bien, conéctese al agente MQTT.

Tras una conexión exitosa, nos suscribimos a temas interesantes, es decir, todo lo que comienza con sapo / ojo.

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

Cuando recibimos un mensaje, descubrimos de dónde vino. Esto es muy similar a un análisis de URL simple. Dependiendo del tema, decidimos en qué ojo influiremos. Si obtiene algo consciente, entonces en este ojo escribimos lo que vino en "carga útil" en microsegundos.

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

Esa es toda la magia de una rana.

Limitaciones de Espruino JS


Repasamos la plataforma Espruino. Retorcer las ranas no es su única opción. Pero la plataforma tiene sus propios bajíos, lo que nos hace considerar otras opciones.

"Total" 1–4 Mb de RAM . Hay una limitación en la RAM. En el código y los datos al mismo tiempo, solo se dan unos pocos megabytes. Puede parecer que en una era en la que los conciertos miden la RAM, esto no es suficiente. Pero para un grupo de dispositivos pequeños esto es suficiente. A 2 Mb puedes hacer cosas maravillosas, suficientes para la fuente.

No es tan simple con NPM . Este problema se aplica al IDE de Espruino. Si escribimos "require", Espruino busca en un lugar, en otro, y si no, produce un retroceso en NPM. En este punto, puede disminuir la velocidad. Espruino no siempre puede lidiar con paquetes complejos. Su poder en este sentido es mucho más bajo que el del mismo paquete web o paquete. Esto es una molestia, pero si configura la cadena de herramientas usted mismo, con una comprensión de lo que está sucediendo dentro de la plancha, entonces no hay problema.

Surtido de hierro. No todas las piezas de hardware llamadas plataformas de desarrollo extraerán a Espruino. Según los estándares del mundo de los microcontroladores, Espruino es voraz: necesita 500 Kb de RAM. Este recuerdo no dará ninguna pieza de hierro. El canónico Arduino Uno o Arduino Nano tiene solo 2 Kb de RAM, por lo tanto, es imposible allí. Es posible trabajar con Espruino en hardware, lo que hacemos en el hardware oficial de Espruino.



Espruino es una compañía unipersonal que a menudo va a Kickstarter con nuevos productos y siempre recolecta con éxito. Si desea apoyar la plataforma, compre oficialmente.

Hay una tercera opción: tomar un devboard suficientemente potente pero de terceros. Por ejemplo, la empresa ST, que produce "Nuclear" y "Discovery". Es probable que el hierro etiquetado como STM32 tire del Espruino.

Repasemos dos opciones alternativas. El primero es el Raspberry Pi.

Raspberry pi


Esta es una computadora Linux completa del tamaño de una tarjeta de negocios.




Además, hay pines de entrada / salida. Si tiene Raspberry Pi a su disposición, use la siguiente topología de dispositivo.



Aquí la nube es opcional: un dispositivo móvil puede conectarse directamente al dispositivo a través del nombre de host, API o un sistema para detectar automáticamente un dispositivo en la red. Tengo un televisor inteligente y un disco duro de respaldo en casa. Son accesibles desde todos los demás dispositivos simplemente porque están en la misma LAN.

El principio es el mismo. Coloque el dispositivo en la Raspberry Pi en la red y cree el cliente para que se conecte directamente a él a través de HTTP o WebSocket, sin pasar por intermediarios. La nube utiliza la aplicación en Raspberry Pi para sus propósitos: registra sensores o transmite pronósticos del tiempo.

La siguiente topología posible con un backend completo.



El servidor se eleva en la nube. Su cliente es la misma aplicación móvil que mantiene una conexión a través de HTTP o WebSocket. Por otro lado, la conexión ya se mantiene a través de Raspberry Pi, usando HTTP o el mismo MQTT.

En este enfoque, la ventaja es el control total: validación, autorización, negación a los clientes. Al mismo tiempo, la disponibilidad mundial es un dispositivo en Moscú, y la comunicación con él está disponible desde Vladivostok.

Limitaciones de Raspberry Pi


Larga carga. Raspberry Pi es una computadora completa y toma tiempo iniciarla. Como disco duro, se utiliza una tarjeta SD. Incluso la tarjeta más rápida aún pierde un HDD normal, sin mencionar el SSD. Con el tiempo, la carga se acerca a un minuto.

El siguiente inconveniente es el consumo de energía . En términos de eficiencia energética, hablemos de Raspberry Pi como dispositivo móvil. La batería no durará mucho: la factura se va al reloj. Para que el dispositivo funcione durante seis meses o un año, se requiere un programa competente para el microcontrolador y un conjunto de baterías.

El pobre GPIO es de entrada / salida de propósito general . Las características de alimentación de onda, lectura de onda, trabajo con señales analógicas en Raspberry Pi son mucho más débiles que las de los microcontroladores, para lo cual esta es la tarea principal. Por ejemplo, fuera de la caja en una Raspberry Pi, no será posible controlar el servo en modo hardware.



La restricción es condicional, ya que puede ser burlada por la extensión. Por ejemplo, la pieza de hierro Troyka Cap , que toma todo el control de bajo nivel de trabajar con señales en sí mismo. Raspberry Pi se comunica con ella a través de un paquete de alto nivel. Da comandos para torcer el servo y funciona. Con estas tarjetas de expansión, puede conectar lo que desee.

Arduino


Puedes tomar el Arduino habitual, del que todos están cansados. Pero JavaScript tendrá que moverse a algún lugar que pueda convertir el Nodo JS, una computadora vieja o la misma Raspberry Pi.



Conectamos una vieja computadora innecesaria a Arduino a través de un cable USB. En Arduino, complete el firmware estándar de Firmata una vez . Ella convierte a Arduino en un zombie que sigue las instrucciones de un maestro: una computadora vieja. El maestro dice que transmita tal y tal señal a tal y tal pin, y Arduino transmite.

Para la comunicación, se utilizan bibliotecas con NPM: SerialPort y Firmata con una API clara. Entonces, nuevamente estás en el mundo JS, escribiendo un programa de alto nivel que envías a tu servidor. Confías en Arduino para trabajar con señales, y ella lo realiza.

No siempre con Firmata logrará administrar todo. Es capaz de proporcionar interacción con el hardware para el que está destinado: servos, tiras de LED, controladores de medios. Pero si no se incorpora la capacidad de leer un giroscopio o acelerómetro muy específico, no funcionará. Luego tienes que escribir un programa en C en un Arduino normal.

Pero eso no es todo: si no desea escribir en C, use la herramienta de código abierto XOD.io.



Este es un entorno de programación visual donde el gráfico que está creando se convierte en código, y ya puede compilarlo y completarlo. XOD.io permite a las personas que no están familiarizadas con las complejidades y los matices de la programación de microcontroladores crear rápidamente programas simples. Si creció de Firmata, pero aún no siente la fuerza para escribir en un nivel bajo, use XOD.io.

La próxima conferencia FrontendConf se llevará a cabo en octubre. Si conoce JavaScript que la mayoría de los desarrolladores front-end no conocen, desarrolle interfaces que sean convenientes de usar o encuentre el rendimiento básico y esté listo para decir dónde está, estamos esperando solicitudes de informes.

Recopilamos informes interesantes en el programa, noticias de la conferencia, videos y artículos en el boletín regular: suscríbase .

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


All Articles