JavaScript Raspberry Pi Pico
Kaluma JS RuntimePrograma la Raspberry Pi Pico/W con JavaScript
Kaluma JS runtimeKaluma 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.
Pequeña footprint. Se ejecuta en microcontroladores con 300 KB de ROM con 64 KB de RAM.
Soporta los estandares modernos de JavaScript (ECMAScript 5/6/6+). Powered by JerryScript.
Tiene un bucle de eventos interno como Node.js para asíncrono.
Tiene módulos incorporados, incluyendo sistemas de archivos (LittleFS, FAT), gráficos, redes y más.
Admite el ensamblado en línea PIO (E/S programable) de RP2 en código JavaScript.
Proporciona una API muy amigable que se asemeja a Node.js y Arduino.
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.
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:
sudo su
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:
ver=20
curl -sL https://deb.nodesource.com/setup_$ver.x | bash -
exit
Una vez que ha terminado este proceso, nos indicará como instalar nodejs y npm--Once done, install nodejs & npm:
sudo apt-get install -y nodejs
Kaluma CLI:
sudo npm install -g @kaluma/cli
Si recibimos un mensaje de que existe una nueva versión de npm ejecutamos el comando que nos indica o directamente:
sudo npm install -g npm@latest
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:
kaluma flash index.js
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.
En la Primer línea declaramos una constante PicoCYW43 entre llaves ya que le asignamos el paquete "pico_cyw43".
En la Segunda línea declaramos otra constante a la que le asignamos la constante declarada en la línea anterior.
En la Tercer línea podemos ver un salto de línea que podemos eliminar.
En la Cuarta línea un comentario.
En la Quinta línea comenzamos a configurar el intervalo de tiempo en ms en el que nuestro LED cambiara de estado.
En la Sexta línea iniciamos un bucle condicional if(condición){tarea si la condición es cierta;} en el que como condición queremos saber el estado del Pin 0 del CYW43, una vez leído el valor booleano que nos devuelve si es true, entra en el bucle.
En la Séptima línea al haberse dado que el pin esté encendido, entró al bucle y mediante el método constante.putGpio(Pin,Boolean); indicamos que el led se apague con un false.
En la Octava línea con else{} , vemos que la condición del if(){} no se cumplió, el led está apagado.
En la Novena línea mediante el método constante.putGpio(Pin, boolean) indicamos lo opuesto a la tarea que se iba a realizar en el bucle if(){}, en la cual el LED se apagaría, por ende, en está lo encendemos con un true.
En la décima línea terminamos de configurar el intervalo, indicando cada cuántos ms sucederá lo que indique el bucle condicional if(){}else{}, en este caso cambiar el estado del LED según el valor booleano devuelto por el método get.Gpio(Pin), si devolvió true entra el if y apaga el led por un segundo, al estar el led apagado el método le devuelve un false y se ejecuta el else encendiendo el LED por 1000ms.
Finalmente la línea innecesaria para indicarles el final del código.
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:
kaluma flash index.js
Más ejemplos:
Kaluma IDE online:
A la Shell de Kaluma JS podemos acceder desde la Terminal con:
kaluma shell
Si queremos saber el puerto en el que está nuestra Pico:
kaluma ports
Una vez conocido podemos indicar conectarnos a la Shell a ese puerto:
kaluma shell --port /dev/ttyACM0
De esta forma podemos programar en tiempo real como hacemos en MicroPython con REPL.
Si queremos conocer todos los comandos en la Shell escribimos:
.help
Si nuestro código va a mostrar mensajes en la Shell entonces al flashear indicamos que nos muestre la Shell:
kaluma flash index.js --shell
Otra forma de crear, un poco más ordenado, nuestro código es:
cd
mkdir blink-app
cd blink-app
npm init -y
nano index.js
kaluma flash index.js
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:
npm install $URL --save
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:
cd
mkdir dht-app
cd dht-app
npm install https://github.com/niklauslee/dht --save
npm init -y
nano index.js
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:
notepad index.js
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.
kaluma flash ./index.js --bundle --shell
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:
console.log("Gracias por visitar la web y compartirla con tus colegas");
GitHub:
Docs:
Download Page:
Old firmware versions:
Packages:
Pico W exclusive packages modules:https://kalumajs.org/docs/boards/pico-w
IDE online:
OneWire:
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.