Programando GPIO en JavaScript

En el post anterior verifiqué que el acceso a GPIO funciona, ahora toca escribir el primer programa en JavaScript para acceder al mundo exterior desde la Raspberry Pi.

Lo primero que voy a hacer es crear una estructura de directorios para mantener los distintos archivos que conforman el proyecto. En el directorio raíz del usuario ‘pi’ voy a crear un directorio labs donde voy a colocar los distintos componentes de las aplicaciones. Dentro de este directorio, voy a crear un directorio, gpiojs, donde irán los componentes de este proyecto.

En primer lugar creo un fichero de dependencias (package.json) y lo sitúo en la raíz del proyecto. Los contenidos del fichero son:

{
   "name": "led",
   "version": "0.0.1",
   "description": "Basic test of GPIO",
   "dependencies": {
      "rpio": "^0.9.11"
   }
}

A continuación lanzo el comando para la instalación de las dependencias:

Imagen2

Por último, escribo un pequeño programa en JavaScript que va a probar la comunicación a través de GPIO:

//|   led_1.js
//|   Primer programa de acceso a GPIO usando rpio.

var rpio = require('rpio');

// Inicializar los pines a utilizar.

var red     = 11;
var green   = 12;

// Abrir los pines para salida estableciendo el nivel de salida bajo.

rpio.open(red, rpio.OUTPUT, rpio.LOW);
rpio.open(green, rpio.OUTPUT, rpio.LOW);

// Bucle principal.

for (var i = 0; i < 5; i++) {
   rpio.write(red, rpio.HIGH);         // Encender LED rojo
   rpio.sleep(1);
   rpio.write(red, rpio.LOW);          // Apagar LED rojo
   rpio.msleep(500);
   rpio.write(green, rpio.HIGH);       // Encender LED verde
   rpio.sleep(1);
   rpio.write(green, rpio.LOW);        // Apagar led verde
   rpio.msleep(500);
}

Ya sólo queda lanzarlo y ver el resultado:

A partir de ahora, iré poniendo todo el código en GitHub.

Primeros pasos con GPIO en la Raspberry

Una vez instalados Raspbian y Node.js en la Raspberry, llega el momento de empezar a desarrollar software. Lo que necesito es, en primer lugar, encontrar un módulo JavaScript que me permita acceder a GPIO. Investigando un poco, descubro que hay muchos paquetes que permiten controlar la GPIO de la Rasp desde JavaScript.

Por lo que he ido mirando, quizás los que más destaquen sean:

  1. pi-gpio. Proporciona una interfaz muy simple para el manejo de la GPIO.
  2. rpi-gpio. Parece un poco más elaborado que el anterior. Este paquete usa el esquema de numeración de pines de GPIO propio de Raspberry (en lugar de la numeración del pin físico) y todas las funciones de entrada/salida son asíncronas lo que, a priori, encaja mejor con el esquema de funcionamiento de Node.
  3. onoff. Proporciona funciones tanto síncronas como asíncronas para el acceso de E/S a GPIO. Además, proporciona un mecanismo de detección de interrupciones que permite la invocación de callbacks cuando cambia la señal en un pin y evita estar haciendo pooling a GPIO.
  4. node-rpio. Sólo proporciona funciones síncronas pero tiene una amplia cobertura funcional y parece que es muy rápido.

Tras unos primeros intentos con rpi-gpio, me voy a decantar por trabajar con el último de los cuatro (node-rpio).

Una cosa que hay que tener en cuenta es que para el acceso a los pines de GPIO en la Rasp es necesario tener privilegios de administrador. Desde el punto de vista de seguridad, no es una buena práctica el conceder privilegios de administrador a diestro y siniestro así que, en primer lugar, voy a instalar la herramienta gpio-admin:

Imagen1

Imagen2

Cerramos la sesión y volvemos a entrar y ya debemos tener la membresía del grupo gpio.

Otro aspecto a considerar es el esquema de nombrado de los pines. Dado que este es un aspecto que puede ser muy importante (nos podemos cargar la Rasp conectándola mal) voy a ver si recapacito un poco. El módulo node-rpio soporta dos esquemas de numeración de interfaces: la numeración física y el esquema de numeración de GPIO (WiringPi).

Imagen3

En fin, vamos a por ello. Voy a empezar con algo sencillo empleando un LED de dos colores (verde y rojo) conecto la pata de rojo al pin 11 (físico, GPIO.0 en numeración WiringPi) y la pata verde al pin 1 (fisico, GPIO.1 en numeración wPi) y la tierra al pin 6. El montaje, con los accesorios que tengo, queda así:

Imagen6

Empiezo probando que funciona desde la línea de comandos, establezco el modo de los pines correspondientes a los colores a salida.

Imagen4

Compruebo que, efectivamente, el valor está establecido a out (pin 0 y 1 wPi o pines físicos 11 y 12):

Imagen5

Si ahora escribo el valor de salida 1 en el pin 0 debería encenderse el LED de color rojo:

Imagen7

Imagen8

Escribo el valor de salida 0 en el pin 0 y el valor de salida 1 en el pin 1 y el LED deberá lucir en verde:

Imagen10

Imagen9

Bueno, hemos superado la primera prueba. En el siguiente post empezaré a programar en JavaScript para hacer esto mismo.

Instalando Raspbian

El proyecto con el servidor va avanzando poco a poco así que he decidido hacer un cambio y voy a ponerme a jugar con la Raspberry Pi. El modelo que yo tengo es el Raspberry Pi Model 2 B.

Pi2ModB1GB_-comp

Recientemente he adquirido un juego de sensores para la Rasp en Sunfounder. El juego de sensores proporciona unos programas básicos en C y Python para manejarlos a través de la interfaz GPIO.

Como, por otra parte, estoy aprendiendo Node.js, qué mejor forma para conjugar ambos mundos que programar los sensores en JavaScript usando Node.

Voy a empezar por el principio, desde cero. Me descargo, en primer lugar, la última versión de Raspbian y la “tuesto” en una tarjeta micro USB nueva de  16 GB empleando el programa Win32 Disk Imager. Esta es la parte sencilla, ahora viene la hora de configurar el sistema operativo.

En el primer arranque, el sistema reconoce tanto el teclado como el ratón como la tarjeta WiFi lo cual es estupendo. El sistema arranca la interfaz gráfica y aprovecho para realizar las configuraciones habituales: idioma, teclado, wifi, actualización de paquetes, etc. Ya tengo mi sistema en el punto de inicio.

A partir de ahora, voy a acceder a la Rasp mediante SSH desde mi PC de sobremesa. Lo primero que voy a hacer es instalar la biblioteca WiringPi para con la interfaz GPIO. Voy a seguir los pasos para la instalación descritos en la web. Una vez instalado compruebo que funciona:

Imagen1

Imagen2

Ahora toca instalar Node.js. Voy a ir por el camino largo, me voy a descargar el código fuente y voy a compilarlo en la Rasp. En principio me voy a bajar la versión 4.4.7. Voy a usar WinSCP para copiar el tarball desde el PC a la Rasp.

Imagen3

Imagen4

Imagen5

Toca esperar un ratito que espero que se haga corto con los cuatro cores de la Rasp y una birra. Al final le lleva una hora larga la compilación y ahora a por la instalación.

Imagen6

Imagen7

Finalmente, tanto node como npm quedan instalados.