Raspberry – Accendiamo un led da remoto

Raspberry - node

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 :).