Como construir um servidor Node.js para controlar o Arduino a partir de uma página da web

Cómo construir un servidor Node.js para controlar Arduino desde una página web

Node.js es el servidor más popular en este momento. Debido a su naturaleza asincrónica y sin bloqueo, Node es la opción obvia para aplicaciones web en tiempo real como salas de chat, aplicaciones de una sola página, transmisión de video, etc. Por las mismas razones, Node está atrayendo a ingenieros de IoT. Debido a que las aplicaciones web desarrolladas en Node funcionan en tiempo real, son las más adecuadas para implementar operaciones integradas impulsadas por la web y en las que el tiempo es crítico. Además, con express.js agregado a Node, puede programar tanto el backend como el frontend de la aplicación de red en el mismo lenguaje, es decir, JavaScript.

Se utiliza un marco popular llamado "Johny-five" para controlar microcontroladores desde el backend de JavaScript. "Johny-five" es una plataforma de robótica e IoT de JavaScript creada por Rick Waldron en 2012. Está mantenida por una comunidad de desarrolladores de software e ingenieros de hardware apasionados, con más de 75 desarrolladores que contribuyen al marco. El marco se puede utilizar para controlar una variedad de microcontroladores y plataformas SoC compatibles con Arduino, incluidos Arduino, Raspberry Pi, Tessel 2, Particle Photon, Intel Edison, etc. Para placas que no son Arduino, hay disponibles complementos IO específicos de la plataforma. El complemento IO puede hacer que "johny-five" se comunique con cualquier plataforma de hardware.

En este proyecto, primero configuraremos un servidor Node e implementaremos un código JavaScript backend para controlar Arduino directamente. Se puede ejecutar un JavaScript backend “johny-five” en un servidor Node para controlar directamente las placas Arduino y compatibles con Arduino. Esto se demuestra haciendo parpadear un LED en el Arduino UNO que ejecuta JavaScript en un servidor Node.

A continuación, ampliamos el servidor Node con la ayuda de Express.js y Socket.io para alojar una página web y utilizamos la biblioteca JavaScript SerialPort para comunicar datos directamente desde una página web a Arduino. El Arduino se programará para leer datos en serie directamente desde la página web y apagar un LED de acuerdo con el flujo de datos recibido.

Componentes necesarios

  1. Arduino UNO x1
  2. LEDx1
  3. Resistencia 470Ω x1
  4. Placa de pruebas x1
  5. Cables de puente x1
  6. Cable USB para conectar Arduino a la computadora x1

Configurar el servidor de nodo
En primer lugar, necesitamos instalar Node.js en una computadora. Puede descargar Node.js para Microsoft Windows y Mac OS desde este enlace. Simplemente descargue y ejecute la configuración de Node.js en su computadora. Una vez completada la instalación, puede verificar la versión actual de Node.js instalada ejecutando el siguiente comando en el símbolo del sistema en el caso de Windows o Terminal en el caso de Linux/macOS.
nodo -v

Luego crea una carpeta con el nombre “Arduino Control”. En la misma carpeta, abra Símbolo del sistema/Terminal e instale la biblioteca johny-five ejecutando el siguiente comando.
npm instala johny-cinco

Después de instalar la biblioteca johny-five en la carpeta indicada, la carpeta tendrá archivos y carpetas, como se muestra en la imagen a continuación.

Esta carpeta es ahora un proyecto de Node.js. Luego instale express.js en el proyecto Node ejecutando el siguiente comando en Símbolo del sistema/Terminal en la misma carpeta.
instalación npm expresa

Luego instale socket.io en el proyecto Node ejecutando el siguiente comando en Símbolo del sistema/Terminal en la misma carpeta.
npm instala socket.io

Luego instale la biblioteca JavaScript del puerto serie en el proyecto Node ejecutando el siguiente comando en Símbolo del sistema/Terminal en la misma carpeta.
npm instala el puerto serie

Ahora nuestro servidor Node.js está listo con los paquetes johny-five, express, socket.io y serialport instalados en el proyecto Node. Todos estos módulos se almacenan en la carpeta "node_modules".

Preparando el Arduino para la comunicación con la computadora host
Para que Arduino se comunique con una computadora host, necesitamos implementar un protocolo intermedio entre Arduino y la computadora host. Este protocolo se llama protocolo Firmata. Afortunadamente, hay disponible una biblioteca Firmata que implementa el protocolo Firmata en Arduino.

Para este proyecto, simplemente necesitamos cargar un boceto Firmata estándar en Arduino para que Arduino sea receptivo a lo que enviamos desde nuestra computadora. Abra el IDE de Arduino, navegue hasta Archivo->Ejemplos->Firmata->StandardFirmata. Compile y cargue el boceto de ejemplo en Arduino.

Ahora el Arduino está listo para recibir comandos de la computadora host y bailar en el código JavaScript que ejecutaremos en el servidor de Node.

LED parpadeando en Arduino usando "johny-five"
Podemos hacer cualquier cosa literaria en la placa Arduino usando la biblioteca JavaScript “johny-five”. Después de cargar Firmata en Arduino, tenemos control total de Arduino desde la computadora host. Ejercitaremos este control haciendo parpadear un LED en Arduino mediante codificación JavaScript. Conecte un LED a cualquier Arduino GPIO. El siguiente diagrama de circuito muestra un LED conectado al pin 3 del Arduino.

Ahora, cree un archivo con el nombre "blink.js" en la carpeta "Arduino Control" y ábralo en cualquier editor de código de su elección, como Visual Studio Code, Atom, NotePad++, etc. editor y guarde el archivo.
const {Tablero, Led} = requerir(“johnny-cinco”);
tablero constante = tablero nuevo;
tablero.on(“listo”, => {
LED constante = nuevo LED (5);
led.blink(500);
});

Para ejecutar el proyecto, abra el símbolo del sistema/Terminal en la misma carpeta y ejecute el siguiente comando para ejecutar "blink.js" en el servidor de Node.
Nodo Blink.js
Mientras se ejecuta el archivo Javascript “blink.js”, el LED conectado al Arduino comenzará a parpadear, como se muestra en el siguiente video.

(Enlace al vídeo de demostración de P34-DV01)

Creando un servidor websocket en Node
Ya hemos visto cómo controlar Arduino desde código JavaScript ejecutándose en un servidor Node. Ahora, creemos un servidor web que aloje una página web y permita enviar datos desde la página web al Arduino. En este proyecto, usaremos la página web para atenuar un LED en Arduino.

Para construir un servidor web, cree un archivo llamado "fade.js" en la carpeta "Arduino Control". Copie y pegue el siguiente código en fade.js. expresión constante = requiere('expresar');
aplicación constante=expreso;
const http = requiere('http');
servidor constante = http.createServer(aplicación);
aplicación.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
})

servidor.escuchar(8080, => {
console.log('escuchando en *:8080');
});
console.log(“Se inició el servidor web, vaya a ' en su navegador.”);

Este es un servidor web Node.js simple creado con express.js. El servidor simplemente recupera index.html de la carpeta “/public/” y publica la página web como respuesta cuando se abre el puerto 8080 en localhost.

El código JavaScript para el servidor web express comienza importando express.js. Se crea una instancia de una nueva aplicación utilizando el módulo express. El módulo HTTP se importa para manejar solicitudes HTTP. Se crea una instancia de un objeto de servidor llamando al método http.createServer en el objeto express "aplicación". Para enviar index.html desde la carpeta "pública" como respuesta http, se llama al método app.get. La dirección IP y el puerto están configurados en localhost y el puerto 8080 para que el servidor Node los escuche llamando al método server.listen. La devolución de llamada también imprime un mensaje en la consola. Finalmente, se notifica que el servidor se está ejecutando en localhost:8080 imprimiendo otro mensaje en la consola. Estos mensajes se imprimirán en el símbolo del sistema/Terminal desde donde se ejecutará la aplicación del servidor.

Cree una carpeta "pública" dentro de la carpeta "Arduino Control" y cree un archivo con el nombre "index.html". El index.html contiene un control deslizante para controlar el brillo del LED. Utiliza socket.io para enviar o emitir (en terminología de socket.io) valores del control deslizante del navegador al servidor Node. Abra index.html en un editor de código de su elección y pegue el siguiente código HTML.

Guarde y cierre index.html. Observe cómo se crea una instancia del objeto socket.io utilizando el método connect.io y se define una función de escucha "led" utilizando el método socket.on para comunicar el valor del control deslizante del navegador al servidor Node.

La página HTML se puede presentar mejor agregando algo de CSS. Abra style.css en cualquier editor de código de su elección y pegue el siguiente código de hoja de estilo. En la misma carpeta "pública" que contiene "index.html", cree un archivo con el nombre "style.css".

Guarde y cierre style.css. Ahora la página web se parece a la siguiente.

Preparando el Arduino para recibir datos en serie
No estamos apagando directamente el LED de JavaScript que se ejecuta en el servidor de Node. En cambio, el servidor Node aloja una página web en localhost:8080. La página web recibe la entrada del usuario y comunica los datos de entrada del navegador al servidor de Node. Luego, el servidor de nodo agrupa los datos recibidos en un objeto de búfer y se comunica con el puerto serie al que está conectado el Arduino en la computadora host. Por lo tanto, el Arduino debe programarse para leer datos en serie desde la computadora host y atenuar el LED generando una señal PWM en el pin respectivo. En lugar de Firmata, ahora cargue el siguiente boceto en Arduino.

configuración nula
{
Serie.begin(9600);
pinMode(3, SALIDA);
}

bucle vacío
{
while(!Serial.disponible);
analogWrite(3, Serial.read);
}

El LED está conectado al pin 3 del Arduino como se muestra en el diagrama de circuito anterior. GPIO3 también es un pin PWM, por lo que puede atenuar el LED utilizando el método analogWrite.

LED descolorido en el servidor Node.js Arduino
Para atenuar el LED en Arduino, necesitamos enviar datos desde el puerto serie de la computadora host al Arduino. Para ello se utiliza la biblioteca de puerto serie de JavaScript. La biblioteca ya está instalada en el proyecto de Node durante la configuración del servidor de Node.

Ahora, agregue las siguientes líneas a "fade.js" para crear una instancia de un puerto serie en el script de backend.

const {SerialPort} = require('serialport');
puerto constante = nuevo puerto serie ({
ruta: 'COM4',
velocidad de baudios: 9600,
});

En nuestro caso, el Arduino está conectado al puerto serie de una PC con Windows, “COM4”. El puerto puede ser diferente en tu caso. Reemplace el nombre del puerto después de la variable de ruta según su sistema, ya sea Linux o macOS o un puerto de comunicación diferente en una PC con Windows. En Microsoft Windows, puede encontrar el puerto al que está conectado su Arduino abriendo el "Administrador de dispositivos" y navegando a "Puertos". Expanda el puerto que muestra el Arduino.

En macOS y Linux, para saber a qué puerto está conectado Arduino, abra Terminal y ejecute el siguiente comando.
ls /dev/tty*

Busque /dev/tty.usbmodem* o /dev/tty.usbserial* para macOS o /dev/ttyUSB* o /dev/ttyACM* para Linux.

Cree una variable global "brillo" para almacenar el brillo del LED. Finalmente, use socket.io para comunicar el valor del control deslizante desde el servidor de Nodo al puerto serie de la computadora host. Agregue el siguiente código JavaScript a fade.js para crear una instancia de un objeto socket.io.

Observe cómo el mismo script de back-end aloja una página web en localhost, recibe información de la página web en un navegador, transfiere los datos al servidor y comunica los datos del servidor al puerto serie de la computadora host.

Para ejecutar el proyecto, abra el símbolo del sistema/Terminal en la misma carpeta, "Arduino Control" y ejecute el siguiente comando para ejecutar "fade.js" en el servidor de Nodo.
nodo fade.js
Cuando se ejecute el archivo Javascript "fade.js", abra la URL "localhost:8080" en un navegador web y mueva el control deslizante para controlar el brillo del LED conectado al Arduino. La ejecución del proyecto se demuestra en el siguiente vídeo.

Puede descargar los archivos completos del proyecto desde el siguiente enlace.
Arduino-Control.ZIP

Volver al blog

Deja un comentario

Los comentarios deben ser aprobados antes de su publicación.