In questo articolo vedremo come accendere un led da remoto usando un raspberry, per chi fosse interessato trova un progetto simile fatto con Arduino a questo link.
Il progetto può sembrare banale ma in questo articolo vedremo tutto quello che ci serve per poter controllare il raspberry da remoto andando a pilotare a piacimento i suoi pin.
Prima di partire con il codice voglio parlavi di alcuni concetti importanti che useremo in questo progetto:
- Node.js
- NPM
Partiamo da Node.js la cui definizione ufficiale presente sul sito Node.js è la seguente:
Node.js® è un runtime Javascript costruito sul motore JavaScript V8 di Chrome. Node.js usa un modello I/O non bloccante e ad eventi, che lo rende un framework leggero ed efficiente. L’ecosistema dei pacchetti di Node.js, npm, è il più grande ecosistema di librerie open source al mondo.
Capisco che da questa definizione forse non avete capito molto per questo vi rimando al video di Alberto Olla che spiega in maniera veramente esaustiva e semplice cos’è Node.js e come funziona.
Come secondo punto vediamo cos’è NPM (Node Package Manager), come dice la definizione sopra citata è il più grande ecosistema di librerie open source al mondo , dove trovare repository di librerie, o moduli, scritti da terze parti per il linguaggio server-side JavaScript.
CODICE RASPBERRY
Ora passiamo a scrivere il codice che ci permetterà di accendere da remoto il led collegato al raspberry.
Per prima cosa dobbiamo installare node.js sul nostro raspberry quindi apriamo un terminale e digitiamo
wget http://node-arm.herokuapp.com/node_latest_armhf.deb sudo dpkg -i node_latest_armhf.deb
Dopo aver installato node eseguiamo il reboot del raspberry, per verificare la corretta installazione lanciamo il comando node -v
che ci restituisce la versione corrente di node e npm -v
che restituisce invece la versione corrente del node package manager, necessario per l’installazione rapida di librerie.
Ora quello che dobbiamo fare e tirare su un server su raspberry che rimanga in ascolto e risponda alle nostre chiamate per accendere il led, il codice per farlo è il seguente:
var app = require("express")(); var http = require("http").Server(app); //GPIO var Gpio = require('pigpio').Gpio, led = new Gpio(18, {mode: Gpio.OUTPUT}); led.digitalWrite(0); app.get("/light/:status", function(req, res){ var status = (req.params.status).toLowerCase(); console.log("light " + status); if(status == "on"){ led.digitalWrite(1); } else if (status == "off"){ led.digitalWrite(0); } res.send("<h1>Light " + status + "</h1>"); }); http.listen(8080, function(){ console.log("listening on *:8080"); });
Per creare questo server utilizzeremo la libreria express quindi digitiamo
npm install express
Per comunicare con i pin del raspberry invece abbiamo bisogno della libreria pigpio
npm install pigpio
Ora che abbiamo entrambe le librerie passiamo a vedere il codice, in particolare dopo aver definito le variabili app e Gpio per le nostre due librerie non ci resta che definire il pin dove collegare il led, in questo caso il 18 e specificare che è un pin di output.
led = new Gpio(18, {mode: Gpio.OUTPUT});
Avviare il server in ascolto sulla porta 8080
http.listen(8080, function(){ console.log("listening on *:8080"); });
e infine definire la rotte a cui l’app deve rispondere che in questo caso è /light/:status
app.get("/light/:status", function(req, res){ var status = (req.params.status).toLowerCase(); console.log("light " + status); if(status == "on"){ led.digitalWrite(1); } else if (status == "off"){ led.digitalWrite(0); } res.send("<h1>Light " + status + "</h1>"); });
dove status è un parametro che assumerà il valore definito dalla request.
A questo punto non ci resta che avviare il server quindi lanciamo il seguente comando (index.js è il nome del file dove è presente il nostro codice)
sudo node index.js
Per accendere e spengere il led ci basterà aprire un browser e digitare:
Led ON
http://<indirizzo-ip-raspberry>:8080/light/on
Led OFF
http://<indirizzo-ip-raspberry>:8080/light/off
Con questo abbiamo visto come accendere il raspberry all’interno della nostra rete locale se volessimo raggiungere il raspberry da remoto possiamo semplicemente creare un tunnel in modo da esporre il nostro localhost al mondo, per far questo basta semplicemente installare localtunell
npm install localtunnel
E successivamente lanciare in un’altra shell
lt --port 8080
Ci verrà mostrato un indirizzo, usiamolo come indirizzo del raspberry in questo modo potremmo accedere da qualsiasi parte del mondo al nostro server :).