ESP32: Flasheando LowJS para poder programar con Javascript

por | Mar 2, 2020 | ESP32, IoT, LowJS | 0 Comentarios

ESP32 - Javascript - LowJS thumb

¿Javascript en ESP32?

Sí amigos, desde hace un tiempo, la empresa Neonious está desarrollando el firmware LowJS, reescribiendo el core de NodeJS en Duktape. Bueno, y ¿qué es eso de Duktape? Es un motor incrustable de ECMAScript E5 / E5.1 enfocado en la portabilidad y en mantener una huella compacta (consumir los mínimos recursos necesarios, vaya). Además, LowJS implementa Babel, un compilador de Javascript para hacer que nuestro código sea compatible con versiones antiguas (de ES2015 para atrás).

Todo esto nos da como resultado la posibilidad de programar nuestro ESP32 con Javascript ES6+, ¿increíble no? Ya tenemos un MiniNodeJS para los microcontroladores. Desde la página de la documentación oficial se puede comprobar en qué estado se encuentra la migración de la API de NodeJS a LowJS.

Materiales

Por desgracia, no nos vale cualquier ESP32. Únicamente funcionará con los que tengan un módulo ESP32-WROVER con 8MB de PSRAM, debido a los requisitos mínimos de memoria que tiene el firmware.

ESP32: Flasheando LowJS para poder programar con Javascript
ESP32: Flasheando LowJS para poder programar con Javascript
ESP32: Flasheando LowJS para poder programar con Javascript

Tecnologías

Nos va a bastar con poco, puesto que sólo necesitaremos tener instalado NodeJS.

  • NodeJS (12.14.1)
  • Npm (6.13.7, incluido en la instalación de NodeJS)

Flasheando LowJS

Sin más rodeos, veámos cómo flashear LowJS en nuestro ESP32. Lo primero que tenemos que hacer es instalar lowsync desde npm. Éste es el gestor de LowJS, mediante el cual mantendremos sincronizado nuestro microcontrolador, le cambiaremos la configuración, monitorizaremos su estado…

npm install --unsafe-perm -g lowsync

Una vez instalado conectamos el ESP32 al ordenador y, desde el Administrador de dispositivos, apuntamos el puerto COM en el que se encuentra.

ESP32: Flasheando LowJS para poder programar con Javascript

En mi caso es el puerto COM6. Ahora abrimos un terminal y ejecutamos el comando para flashear el firmware.

lowsync flash --port="PUERTO_COM" --init

Cuando termine el proceso, veremos un SSID y una contraseña. El SSID nos indica el nombre de la red Wifi que crea por defecto el microcontrolador. Es muy importante que anotemos el SSID y la contraseña, ya que sino no podremos conectarnos a la red del ESP32.

ESP32: Flasheando LowJS para poder programar con Javascript

Configuración del Wifi

El microcontrolador se inicia como punto de acceso (Access Point ó AP), por lo que nuestro siguiente paso será configurarlo en modo cliente (station) para poderlo controlar desde nuestra red. Buscamos una red Wifi que coincida con el SSID que anotamos anteriormente y nos conectamos a ella.

ESP32: Flasheando LowJS para poder programar con Javascript
ESP32: Flasheando LowJS para poder programar con Javascript

No os preocupéis si al conectaros sale el icono de que no hay Internet, es normal. Creamos una nueva carpeta en el escritorio y abrimos un terminal en ella. Ahora ejecutamos el comando de lowsync para inicializar un proyecto, y dejamos por defecto todas las preguntas que nos haga el prompt.

lowsync init
ESP32: Flasheando LowJS para poder programar con Javascript

Este comando nos creará un archivo de configuración que modificaremos más adelante. Por el momento, ejecutaremos el comando para configurar nuestro microcontrolador en modo cliente, especificándole el Wifi al que deberá conectarse.

lowsync settings set wifi.ssid="WIFI_SSID" wifi.password="WIFI_PASSWORD" wifi.mode=station wifi.dhcp=client
ESP32: Flasheando LowJS para poder programar con Javascript

El warning de color naranja sólo nos avisa de que no hemos configurado la contraseña del microcontrolador. Según termine de ejecutarse el comando, nos desconectaremos de forma automática del Wifi del ESP32 y éste se reiniciará.

Una vez reiniciado, se conectará a nuestra red y ya podremos controlarlo (via OTA u Over Ther Air). Para ello necesitamos saber qué dirección IP le ha asignado nuestro Router, utilizando Advanced IP Scanner ó el programa de vuestra preferencia.

ESP32: Flasheando LowJS para poder programar con Javascript

Sincronización inicial

El último paso que nos queda antes de sincronizarlo por primera vez es modificar el archivo lowsync.config.json que se creó en nuestra carpeta cuando inicializamos el proyecto. Actualizaremos el nodo «ip» con la dirección IP actual del ESP32.

lowsync.config.json

{
  "ip": "192.168.1.50"
}

¿Preparados? Ahora ejecutaremos el comando responsable de mantener sincronizados los archivos de nuestro ESP32 y la carpeta del proyecto. Cuando el prompt nos pregunte si queremos mostrar la salida del programa lo dejaremos por defecto.

lowsync sync
ESP32: Flasheando LowJS para poder programar con Javascript
ESP32: Flasheando LowJS para poder programar con Javascript

Para que no os quedéis con la curiosidad, el programa cargado por defecto en LowJS es un chat. Si abrimos dos ventanas en el navegador con la IP de nuestro ESP32 lo comprobaremos. Después de enviar un par de mensajes desde el chat los veremos también en el terminal.

ESP32: Flasheando LowJS para poder programar con Javascript

Haciendo parpadear un LED

Para practicar un poco vamos a conectar un LED al microcontrolador y lo haremos parpadear con LowJS. Borramos todos los archivos que se han sincronizado en la carpeta, a excepción de index.js y los que se llamen lowsync.***.json.

ESP32: Flasheando LowJS para poder programar con Javascript

Ahora vamos a utilizar el gestor de paquetes integrado para desinstalar el módulo ws (preinstalado, ver documentación).

lowsync uninstall ws
ESP32: Flasheando LowJS para poder programar con Javascript

Esquema

Conectamos el LED al pin 4 siguiendo el esquema de conexiones que tenéis a continuación.

ESP32: Flasheando LowJS para poder programar con Javascript

Código

Implementaremos una función que apague y encienda el LED cada medio segundo. Para ello reemplazamos todo el código del archivo index.js por el siguiente.

index.js

// Módulo para controlar los pines
const gpio = require('gpio');
// Pin del LED
const PIN = 4;

// Estado del LED
let state = 0;

// Se establece el pin del LED en modo Salida
gpio.pins[PIN].setType(gpio.OUTPUT);
// Se apaga el LED al iniciar
gpio.pins[PIN].setValue(state);

// Cada 500ms se encenderá/apagará el LED
setInterval(() => {
	// Si el LED estaba encendido (state === 1)
	if (state) {
		// Se establece el estado a 0
		state = 0;
		// Se setea el nuevo estado en el LED
		gpio.pins[PIN].setValue(state);
	}
	// Si el LED estaba apagado (state === 0)
	else {
		// Se establece el estado a 1
		state = 1;
		// Se setea el nuevo estado en el LED
		gpio.pins[PIN].setValue(state);
	}
}, 500);

Sincronizamos el proyecto local con el ESP32.

lowsync sync
ESP32: Flasheando LowJS para poder programar con Javascript

Resultado

Sólo nos queda observar el LED y ver como parpadea 🤩.

ESP32: Flasheando LowJS para poder programar con Javascript

Recursos

Tenéis disponibles los recursos del post en el siguiente enlace, ¡espero que os haya gustado!