JavaScript

Arduino Uno con ¿JavaScript?

Autorangel cruz
Actualizado
Publicado
Lectura3 min de lectura

Tengo un Arduino Uno desde hace unos días, después de mucho tiempo queriéndolo, y he pasado el rato probando sensores y recordando mi época de la universidad con los microcontroladores.

El "combo" que tengo:

  • ARDUINO UNO R3
  • Sensor infrarrojo para obstáculos FC-51
  • Zumbador buzzer 5V
  • Llave interruptor basculante
  • TCRT5000, sensor reflectivo infrarrojo
  • Sensor de ultrasonido HY-SRF04
  • Puente H L293D
  • Microservo SG90 180°
  • Sensor de temperatura y humedad DHT11
  • Módulo relé KY-019, 10A, 5V, 1 canal
  • Sensor de humedad
  • Fotorresistor LDR 5528 de 5mm

Después de hacer algunas pruebas con los sensores se me ocurrió buscar si existía algo para Node.js que permitiera controlar el Arduino. Existe: Johnny-Five.

Johnny-Five, la plataforma de robótica en JavaScript

Johnny-Five es un proyecto para gente que viene del desarrollo web y empieza a jugar con Arduino, o para quien ya lo hace y quiere integrar un prototipo en una aplicación web. Corre sobre Node.js y programa el Arduino en JavaScript apoyándose en Firmata.

Antes de empezar, el estado del proyecto en 2026. Johnny-Five sigue funcionando, y lo he comprobado escribiendo esta actualización: instala y compila en Node 25. Pero su última versión publicada en npm es la 2.1.0, de julio de 2021, y el último commit en el repositorio es de marzo de 2023. No está archivado ni abandonado formalmente, pero lleva años quieto. Además arrastra serialport ^8.0.5, cinco versiones mayores por detrás de la actual. Para trastear con un Arduino sigue siendo la opción más cómoda en JavaScript; para algo que tenga que durar en producción, cuenta con que esa dependencia nativa es lo primero que se puede romper al actualizar Node.

Hola mundo

Para este ejemplo necesitas:

  • El Arduino con Firmata cargado. Con el Arduino IDE instalado, la ruta es File > Examples > Firmata > StandardFirmata (o StandardFirmataPlus).
  • Node.js con npm o yarn.
  • johnny-five.

El ejemplo de la documentación de Johnny-Five es con un LED:

const { Board, Led } = require("johnny-five");
const board = new Board();
 
board.on("ready", () => {
  const led = new Led(13);
  led.blink(500);
});

El resultado es este:

Escena de johnny-five con un led parpadeando

En mi caso no tengo un LED (olvidé comprarlo), así que lo cambié por un console.log:

const { Board } = require("johnny-five");
const board = new Board();
 
board.on("ready", () => {
  console.log("Hello world from arduino uno");
});

Y devuelve esto:

 node hello
>> Hello world from arduino uno

gif de it's alive

Funciona. Y ya que estamos en Node, podemos aprovechar para hacer cosas que el Arduino solo no hace fácil, como una petición HTTP.

Una petición HTTP desde el script

El script pasa a ser este. Pide un chiste a la API de chucknorris.io y lo imprime cuando la placa está lista:

const { Board } = require("johnny-five");
const https = require("https");
 
const board = new Board({
  port: "/dev/ttyUSB0",
});
 
const options = {
  hostname: "api.chucknorris.io",
  port: 443,
  path: "/jokes/random",
  method: "GET",
};
 
board.on("ready", () => {
  const req = https.request(options, (res) => {
    console.log(`statusCode: ${res.statusCode}`);
 
    let cuerpo = "";
    res.on("data", (chunk) => {
      cuerpo += chunk;
    });
    res.on("end", () => {
      const respuesta = JSON.parse(cuerpo);
      console.log(respuesta.value);
    });
  });
 
  req.on("error", (error) => {
    console.error(error);
  });
 
  req.end();
});

Fíjate en cómo se lee la respuesta, porque es el detalle que más se hace mal: data puede dispararse varias veces, una por cada trozo que llega. Hay que ir acumulando y parsear el JSON en end, cuando ya está completo. Si haces JSON.parse dentro de data, funciona mientras la respuesta sea pequeña (esta son unos 340 bytes y cabe en un chunk) y revienta el día que crezca.

El port está fijado a mano porque en Linux mi placa aparece ahí. Si lo omites, Johnny-Five busca el dispositivo por su cuenta, que es lo normal.

Al ejecutarlo:

 node hello
>> statusCode: 200
Chuck Norris can cremate you instantly with a mean-ass death stare.

Visita johnny-five.io para conocer más.

Fuentes

¿Tienes un proyecto en mente?

Trabajo con Laravel, WordPress, SEO técnico y servidores MCP. El primer paso es una llamada de descubrimiento, sin costo ni compromiso, donde me cuentas qué necesitas y te digo con honestidad si puedo ayudarte.

Hablemos