Gpio Raspberry Pi con Node.js y HTML desde cero
Últimamente me ha entrado la curiosidad de manejar los pines Gpio de mi Raspberry Pi. A través de varias páginas he ido cogiendo idas e información sobre cómo hacerlo, así que aquí os traigo como manejar esos pines con Node.js a través de una interfaz web que crearemos nosotros mismos desde cero.
Yo estoy usando una Raspberry Pi 3B, pero podéis utilizar la que queráis, solo tenéis que saber qué pines utilizar de vuestro modelo. Utilizaré el sistema operativo Raspbian, aunque también podéis utilizar el que queráis. Os dejo aquí los pines que tiene este modelo:
Materiales necesarios
Instalación de utilidades
Vamos a comenzar instalando Node.js, con el comando sudo apt-get install nodejs.
Necesitaremos la librería onoff para encender y apagar nuestros leds de prueba, pero para ello necesitamos tener npm para instalar esa librería, así que ejecutamos sudo apt-get install npm, después instalamos la librería con sudo npm install onoff. Ya tenemos todo lo necesario para crear un script básico para encender y apagar un led con solo ejecutar un archivo.
En resumen:
Encender y apagar led con archivo .js
De momento no vamos a crear ningún html para este script, lo haremos más adelante.
Vamos a crear un script básico para encender un led y otro para apagarlo.
Pero antes necesitamos conectar el led a nuestra Raspberry. Yo por ejemplo, voy a conectar el led al Gpio 17 (No es lo mismo el Gpio 17 que el pin 17: El Gpio 17 está en el pin 11, mira la imagen de arriba). Entre el cable negativo y la pata negativa del led (la más corta), ponemos una resistencia de 220 ohms Aquí un esquema de mi conexión:
Con nano, vamos a crear el archivo, así que ejecutamos nano encender.js (el nombre da igual).
Dentro, primero vamos a importar la librería onoff, instalada anteriormente. para ello, dentro escribimos var Gpio = require('onoff').Gpio;
Ahora vamos a especificar el pin por el que saldrá la señal como output, en mi caso el Gpio 17
En el script, escribimos var led = new Gpio(17, 'out');
Con el led especificado, ahora vamos a encenderlo escribiendo led.writeSync(1);
(Con 1 encendemos y con 0 apagamos).
Ya lo tenemos todo listo. Pulsamos Ctrl+O para guardar y Ctrl+x para salir. Ahora ejecutamos el script con node encender.js ( o el nombre del archivo que le has puesto).
Vemos como se enciende nuestro led.
Ahora vamos a crear otro script para apagarlo. Para ello copiamos el archivo o su contenido en un nuevo archivo llamado apagar.js. Solo tendremos que modificar la última línea: en vez de led.writeSync(1); ponemos led.writeSync(0);
Ahora si ejecutamos este nuevo archivo (node apagar.js), vemos como nuestro led se apaga.
¿Y si queremos que se encienda, espere y apague?
Tendremos que utilizar una librería llamada sleep. ¿Te acuerdas cómo se instalan las librerías? (sudo npm install sleep).
Vamos a modificar el archivo encender.js añadiendo las siguientes líneas:
Si ahora lo ejecutamos con node encender.js, nuestro led se encenderá, esperará 1 segundo y se apagará.
¿Y si queremos hacer esto en bucle?
Ahora no necesitaremos ninguna librería, simplemente un bucle for. (muy fácil hacerlo en JavaScript)
En el mismo archivo encender.js, lo modificaremos para que quede así:
Si no entiendes el bucle for, simplemente declaramos una variable x con valor 0, se ejecuta mientras sea menor o igual a 9, y le incrementa un número por cada vuelta. Cada vuelta ejecuta lo que está entre llaves: enciende, espera, apaga, espera, así 10 veces.
Ahora podemos ejecutar el script para ver su resultado con node encender.js
Interfaz web para controlar Gpio
Vamos a lo más chulo de este tutorial, que es controlar los pines Gpio a través de una página html.
A través de dos archivos, un script y un html, vamos a:
Yo estoy usando una Raspberry Pi 3B, pero podéis utilizar la que queráis, solo tenéis que saber qué pines utilizar de vuestro modelo. Utilizaré el sistema operativo Raspbian, aunque también podéis utilizar el que queráis. Os dejo aquí los pines que tiene este modelo:
Materiales necesarios
- Raspberry Pi (Cualquier modelo)
- Sistema operativo (Cualquiera)
- Cables, resistencias y leds para empezar
- Conexión a internet para instalar utilidades
- Node.js, npm y alguna de sus librerías que instalaremos
Instalación de utilidades
Vamos a comenzar instalando Node.js, con el comando sudo apt-get install nodejs.
Necesitaremos la librería onoff para encender y apagar nuestros leds de prueba, pero para ello necesitamos tener npm para instalar esa librería, así que ejecutamos sudo apt-get install npm, después instalamos la librería con sudo npm install onoff. Ya tenemos todo lo necesario para crear un script básico para encender y apagar un led con solo ejecutar un archivo.
En resumen:
- sudo apt-get install nodejs -> Instalamos Node.js para ejecutar nuestros scripts.
- sudo apt-get install npm -> Instalamos npm para instalar librerías para Node.js.
- sudo npm install onoff -> Instalamos la librería onoff para enviar señales a través de los pines.
Encender y apagar led con archivo .js
De momento no vamos a crear ningún html para este script, lo haremos más adelante.
Vamos a crear un script básico para encender un led y otro para apagarlo.
Pero antes necesitamos conectar el led a nuestra Raspberry. Yo por ejemplo, voy a conectar el led al Gpio 17 (No es lo mismo el Gpio 17 que el pin 17: El Gpio 17 está en el pin 11, mira la imagen de arriba). Entre el cable negativo y la pata negativa del led (la más corta), ponemos una resistencia de 220 ohms Aquí un esquema de mi conexión:
Con nano, vamos a crear el archivo, así que ejecutamos nano encender.js (el nombre da igual).
Dentro, primero vamos a importar la librería onoff, instalada anteriormente. para ello, dentro escribimos var Gpio = require('onoff').Gpio;
Ahora vamos a especificar el pin por el que saldrá la señal como output, en mi caso el Gpio 17
En el script, escribimos var led = new Gpio(17, 'out');
Con el led especificado, ahora vamos a encenderlo escribiendo led.writeSync(1);
(Con 1 encendemos y con 0 apagamos).
Ya lo tenemos todo listo. Pulsamos Ctrl+O para guardar y Ctrl+x para salir. Ahora ejecutamos el script con node encender.js ( o el nombre del archivo que le has puesto).
Vemos como se enciende nuestro led.
Ahora vamos a crear otro script para apagarlo. Para ello copiamos el archivo o su contenido en un nuevo archivo llamado apagar.js. Solo tendremos que modificar la última línea: en vez de led.writeSync(1); ponemos led.writeSync(0);
Ahora si ejecutamos este nuevo archivo (node apagar.js), vemos como nuestro led se apaga.
¿Y si queremos que se encienda, espere y apague?
Tendremos que utilizar una librería llamada sleep. ¿Te acuerdas cómo se instalan las librerías? (sudo npm install sleep).
Vamos a modificar el archivo encender.js añadiendo las siguientes líneas:
- var sleep = require('sleep'); -> Importamos la librería sleep
- led.writeSync(1); -> Encendemos el led
- sleep.sleep(1); -> Espera durante 1 segundo. (Si queremos especificar en milisegundos, ponemos sleep.msleep(milisegundos);)
- led.writeSync(0);
Nuestro archivo encender.js, quedaría así:
Si ahora lo ejecutamos con node encender.js, nuestro led se encenderá, esperará 1 segundo y se apagará.
¿Y si queremos hacer esto en bucle?
Ahora no necesitaremos ninguna librería, simplemente un bucle for. (muy fácil hacerlo en JavaScript)
En el mismo archivo encender.js, lo modificaremos para que quede así:
Ahora podemos ejecutar el script para ver su resultado con node encender.js
Interfaz web para controlar Gpio
Vamos a lo más chulo de este tutorial, que es controlar los pines Gpio a través de una página html.
A través de dos archivos, un script y un html, vamos a:
- Crear una página servida por un puerto definido
- Crear un formulario con botones
- Detectar el resultado de los botones
- Controlar el Gpio (En este ejemplo, encender leds)
Vamos a necesitar dos librerías más, express y path, así que las instalamos con sudo npm install express path.
Vamos a crear una carpeta llamada GpioWeb, por ejemplo, y dentro una llamada views, donde crearemos el html.
En la carpeta views, crearemos un archivo llamado index.ejs, muy importante ese nombre y extensión!!
Dentro crearemos un formulario y dentro de él, botones. Vamos a crear dos botones, uno para encender y otro para apagar (luego dejaremos uno solo). Cada botón va a tener un formaction="" que enviará una cadena de texto y la detectaremos con el script. He añadido un estilo a los botones para que se vean más grandes, pero no hace falta
El index.ejs nos quedaría así:
Ahora en la carpeta GpioWeb, vamos a crear un archivo llamado index.js (el script).
En el archivo pondremos este contenido:
var express = require('express');
var app = express();
var path = require('path');
var Gpio = require('onoff').Gpio;
var led = new Gpio(17, 'out');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
res.render('index');
});
app.post('/encender', function(req, res){
led.writeSync(1);
return res.render('index');
});
app.post('/apagar', function(req, res){
led.writeSync(0);
return res.render('index');
});
app.listen(3000);
Explicación
var express = require('express'); -> Importamos la librería express
var app = express(); -> app corresponde a la funcción express
var path = require('path'); -> Importamos la librería path
var Gpio = require('onoff').Gpio; -> Importamos la librería onoff
var led = new Gpio(17, 'out'); -> Gpio 17 como salida
app.set('view engine', 'ejs'); ->
app.get('/', function(req, res){ -> Obtiene la página principal y muestra el index de la carpeta views
res.render('index');
});
app.post('/encender', function(req, res){ -> Detecta si el post del formulario es "encender"
led.writeSync(1); -> Enciende el led
return res.render('index'); -> Vuelve a cargar el index de la carpeta views
});
app.listen(3000); -> Servimos la página por el puerto 3000 por ejemplo
Guardamos nuestro archivo con Ctrl+O y salimos con Ctrl+x.
Ahora ejecutamos el index.js (node index.js), nos conectamos a localhost:3000 (o a la ip del equipo:3000) y ya veremos nuestra página:
OperssenFsaze Michael Baker https://marketplace.visualstudio.com/items?itemName=quicalapo.Descargar-Hidden-Object-Hunt-Classic-gratuita-2022
ResponderEliminarsleekneusatea