JavaScript Raspberry Pi Pico

Kaluma JS Runtime

Apr 20, 2024

Programa la Raspberry Pi Pico/W con JavaScript

Kaluma JS runtime

Kaluma es un JavaScript runtime pequeño y eficiente para RP2040 (Raspberry Pi Pico). Las características principales son:

Small footprint. Runs minimally on microcontrollers with 300KB ROM with 64KB RAM.

Kaluma UF2:

Conectamos la Raspberry Pi Pico/H/W/WH al USB de nuestra Raspberry Pi manteniendo presionado el botón BOOTSEL, obtenemos el UF2 para nuestro modelo Pico=PicoH y PicoW=PicoWH, hacemos clic en la imagen de nuestra Pico o en el hiperenlace debajo. Una vez descargado lo copiamos y pegamos en la Pico mediante PCManFM nuestro explorador de archivos, donde veremos a la Pico como RPI-RP2, tras pegar el .uf2 veremos que se reinicia y ya estará ejecutando  Kaluma JS.

Kalauma's JavaScript UF2
Kalauma's JavaScript UF2
Kalauma's JavaScript UF2
Kalauma's JavaScript UF2

Raspberry Pi OS Requisitos:

Necesitamos ser Super Usuarios para realizar la sencilla instalación, para ello abriremos la Terminal e introducimos--We need be Super User:

Una vez seamos Super Usuarios introducimos--Type:

Current Version podemos usar LTS también en tal caso solo cambiar el número de la variable ver por 18:

Una vez que ha terminado este proceso, nos indicará como instalar nodejs y npm--Once done, install nodejs & npm:


Kaluma CLI:

Si recibimos un mensaje de que existe una nueva versión de npm ejecutamos el comando que nos indica o directamente:

Y siempre obtendremos la versión más reciente.

Nuestro primer blink en Raspberry Pi Pico/H:

En Kaluma JS Runtime siempre deberemos subir un único archivo index.js aunque usemos librerías, que en JavaScript se denominan Packages. Comencemos...

Creamos un archivo con cualquier editor de texto, nano, Leafpad, Geany, incluso Thonny aunque no lo usaremos para flashear.

En la primer línea podemos observar cómo se realiza un comentario de 1 línea en JavaScript, si estás familiarizado con C notarás que es exactamente igual.

En la segunda línea declaramos una constante llamada led a la cual le asignamos el número de Pin al que se encuentra conectado nuestro LED, en este caso por absurda simplicidad aprovechamos el LED incorpoporado en nuestra Raspberry Pi Pico.

En la Tercer línea configuramos nuestros LED como Salida mediante pinMode(variable, OUTPUT)

En la cuarta línea comenzamos a configurar el intervalo de tiempo en ms en el que nuestro LED cambiara de estado.

En la Quinta línea indicamos que nuestro LED cambiara al estado opuesto al que se encontraba mediante digitalToggle(variable)

En la Sexta línea terminamos de configurar el intervalo, indicando cada cuántos ms sucederá lo que hemos declarado entre llaves, en este caso cambiar el estado del LED

En la Séptima línea vemos otro comentario, absolutamente innecesario, es solo un indicativo para ustedes visitantes de la web, para indicarles que el código termino.

Podemos observar también que el código está amontonado, que no hay líneas vacías, esto es porque si las agregamos, el tamaño de nuestro programa aunque en este caso sea insignificante, aumentaría de 113 bytes a 117 bytes simplemente agregando una línea vacía bajo const led, pinMode. Incluso la eliminación de los comentarios hace que baje a 97 bytes. Y como es normal en JavaScript podemos eliminar todos los espacios en nuestro código y escribirlo en una sola línea larguísima(no en este caso) y nuestro programa pasa a tener solo 77 bytes, es algo a tener en cuenta cuando realicemos programas complejos y robustos, pero para aprender tampoco nos obsesionemos.

Código Kaluma's JavaScript Raspberry Pi Pico:

Crear archivo index.js

Tras guardar nuestro blink como index.js es el momento de flashearlo a nuestra Pico, para ello abrimos la Terminal en donde se encuentre nuestro index.js e ingresamos:

Aquí podemos observar que se creó con nano el archivo index.js con el contenido descripto anteriormente sin comentarios, guardado con Ctrl+o, Enter para confirmar el nombre del archivo y Ctrl+x para cerrarlo, tras lo cual se flasheo sin necesidad de indicar el puerto. Y que su tamaño es de 88 bytes.

Nuestro primer blink en Raspberry Pi Pico W/WH:

En este caso, ya que el microcontrolador RP2040 no posee un LED conectado, sino que el LED que tenemos está conectado al controlador del WiFi CYW43, requerimos del Package: pico_cyw43 incluído por defecto en nuestro firmware. Por lo tanto el Blink es diferente al anterior.

Y como mencionamos anteriormente todo puede ser guardado en una sola línea reduciendo el tamaño de nuestro programa de los 284 bytes a unos 187 bytes.

Código Kaluma's JavaScript Raspberry Pi Pico W:

Requiere Package: pico_cyw43

Crear archivo index.js

Tras guardar nuestro blink como index.js es el momento de flashearlo a nuestra Pico, para ello abrimos la Terminal en donde se encuentre nuestro index.js e ingresamos:

Más ejemplos:

Kaluma IDE online:

Kaluma IDE con el Código de la Pico W
Al presionar el botón Conectar nos sale la ventana para elegir la Pico y pulsamos Conectar
Veremos que se accede a la Shell de Kaluma JS
Al haber pulsado Flash se ha cargado el Código a la Pico W

A la Shell de Kaluma JS podemos acceder desde la Terminal con:

Si queremos saber el puerto en el que está nuestra Pico:

Una vez conocido podemos indicar conectarnos a la Shell a ese puerto:

De esta forma podemos programar en tiempo real como hacemos en MicroPython con REPL.

Si queremos conocer todos los comandos en la Shell escribimos:

Si nuestro código va a mostrar mensajes en la Shell entonces al flashear indicamos que nos muestre la Shell:

Otra forma de crear, un poco más ordenado, nuestro código es:

Con esto nuestro programa estará en nuestra $HOME (/home/tu_usuario/blink-app), npm init -y creara un archivo package.json con los datos básicos que posteriormente podremos editar, nuestro index.js con el contenido ya descripto más arriba, y finalmente el flasheo a la Pico.

Packages(Bibliotecas):

Como en todo lenguaje las bibliotecas nos salvan de reinventar la rueda, en JavaScript son llamados Packages, en el caso de Kaluma JS ya poseemos un buen surtido en su web. Los Packages se instalan con npm de la siguiente manera:

Donde $URL será la dirección donde se encuentra nuestra librería en este caso no están publicadas en npm sino en github.

En Windows para instalar Packages requerimos tener Git instalado, en Pi OS viene por defecto, si usas otro Linux: sudo apt install git).

Veamos como ejemplo completo un clásico el sensor DHT11, abrimos la Terminal(Pi OS) o el CMD,PowerShell o Terminal(Windows) e ingresamos:

Guardamos los cambios con Ctrl+o, Confirmamos con Enter, Ceerramos el arcvhivo con Ctrl+x.

En Windows en lugar de nano tenemos Notepad, guardar los cambios con Ctrl+g, Salir con Ctrl+w:

Pero a diferencia de un Package ya incluido en el firmware o un programa que no requiere package alguno, necesitamos que éste esté incluído, para que nuestro sensor DHT11 funcione, y como no podemos subir más que un index.js, usamos la opción --bundle que empaquetara todo y lo flasheara correctamente como bundle.js, además como los datos los veremos en la Shell debemos verla mediante --shell , además debemos indicar con ./ que el index.js está en esa carpeta asi ubica también a ./node_modules/dht correctamente sino nos dará un mensaje de error.

Podemos observar cada paso en la captura, asi como también, como quedó nuestro directorio dht-app tras instalar el Package dht:

Como podemos observar, existe una carpeta node modules pero no la hemos subido a nuestra Raspberry Pi Pico, pero si hacemos uso de ella.

Observamos la Shell con los mensajes de Humedad y Temperatura, al ser un if(){} solo vemos una sola medición, luego podemos modificarlo para obtener valores continuos.

El print("Hello World de JavaScript"):

Como hemos notado en el último ejemplo, no usamos print("texto") ni Serial.print("texto") como en Arduino, en Javascript esto se realiza mediante:

Review of KalumaJS on Page 94

Con el tiempo podrás ver la gran mayoría de sensores también en este lenguaje, date una vuelta por los tutoriales de sensores para Arduino, Raspberry Pi y las Raspberry Pi Pico.