Controllo remoto GPIO di Raspberry Pi da Web con PHP e WiringPi
Tempo fa avevo sviluppato un progetto di controllo remoto GPIO RaspberryPi da Web utilizzando Flask, un micro framework per la realizzazione di pagine web e la libreria RPi.GPIO di Python. Flask è un’ottima soluzione, in quanto perfettamente integrato con Python e quindi con la gestione dell’hardware di RPi.
Tuttavia ho voluto sperimentare una strada diversa, utilizzando gli strumenti a disposizione di un web server tradizionale, ovvero Apache o Nginx con PHP e l’ausilio della libreria C/C++ WiringPi. C’è da precisare che allo stato attuale, Gordon, l’autore di tale libreria, ha deciso di terminarne lo sviluppo, tuttavia l’ultima release 2.52 è pienamente compatibile con tutte le versioni della board Raspberry Pi, fino alla 4B. Recentemente un gruppo di programmatori indipendenti ha creato un mirror non ufficiale per continuarne lo sviluppo.
Installazione
Web server
Come ho già accennato, occorre installare sul Raspberry Pi le applicazioni necessarie alla creazione di un web server. Alla pagina Web Server con Raspberry Pi troverete le istruzioni del caso.
Wiring Pi
La libreria WiringPi è solitamente già presente sulla distribuzione Raspbian. Per verificarne la presenza e la versione installata, dalla linea di comando digitare:
gpio -v
in caso contrario installarla con il comando
sudo apt install wiringpi
Nel caso in cui abbiate un Raspberry Pi 4B, occorre utilizzare l’ultima versione della libreria, che al momento non è ancora presente su repository Raspbian. Per installarla seguire le istruzioni wiringPi updated to 2.52 o fare riferimento agli ultimi aggiornamenti sul repository non ufficiale GitHub.
Per visualizzare posizione e stato dei pin di I/O utilizzare
gpio readall
L’utility gpio consente di configurare, leggere e scrivere lo stato dei pin della porta GPIO e verrà richiamata dal PHP per interfacciarsi con l’hardware. Inoltre non richiede i privilegi di amministratore, quindi può essere eseguita senza problemi dal server PHP. Non è un modo molto efficiente, ma non c’è alternativa e, considerato il tipo di utilizzo, è più che sufficiente. Esistono un paio di librerie in PHP per la gestione della GPIO, ma sono ormai obsolete.
Remote Switch
Scaricare RPiRemoteSwitch dalla tabella sottostante, copiarne i file in una sotto-cartella del web server (solitamente /var/www/html).
Aprire e modificare, nella parte indicata di seguito, il file index.php specificando, per ogni riga, numero pin e descrizione della porta, lasciare a 0 l’ultima colonna. Per la numerazione delle porte GPIO fare riferimento a quanto indicato alla pagina WiringPi pins. Aggiungere o togliere righe in base al numero di controlli che necessitano.
$relay = array(
array(1,"Switch1",0),
array(4,"Switch2",0),
array(5,"Switch3",0),
array(6,"Switch4",0)
);
Digitare dal browser l’indirizzo IP del proprio Raspberry Pi, eventualmente seguito dal nome della sotto-cartella, e si aprirà la pagina web dell’applicazione. Premendo sul pulsante on / off , si accende o spegne la rispettiva porta. Lo stato delle uscite attive è indicato in colore verde, bianco quelle spente, rosso se si verifica qualche errore legato alle impostazioni o ad un problema di esecuzione dello script sul server.
A questo punto sarà possibile controllare da remoto qualunque utenza connessa all’interfaccia GPIO del Raspberry Pi, tramite dispositivi che siano in grado di navigare sul web.
Download
Versione | Data | Change log |
---|---|---|
1.0 | 06/2020 | Prima release |
Hardware
La parte hardware è composta, oltre che dal Raspberry e suo alimentatore, da una scheda relè 5V optoisolata, di quelle che si trovano comunemente sul web. La scheda andrà opportunamente interconnessa ai pin della GPIO per il pilotaggio e l’alimentazione.
Riferimenti
- Simple and Intuitive Web Interface for Your Raspberry Pi, TheFreeElectron su instructables;
- Wiring Pi, GPIO Interface library for the Raspberry Pi;
- Wiring Pi, unofficial mirror GitHub;
- Raspberry GPIO, su www.raspberry.org.
Argomenti correlati
Questa opera è distribuita con:
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Italia.
Si declina ogni responsabilità per eventuali errori ed omissioni e gli eventuali danni che ne dovessero conseguire. Per ulteriori informazioni consultare le note legali.
ciao,
funziona tutto solo che lo stato è verde se spento e bianco se attivato il relè
ho provato a variare il codice ma non ho ottenuto risultati.
Grazie se mi risponderai.
Buona giornata
Ciao Giovanni, molto probabilmente la scheda relé che stai utilizzando utilizza la logica invertita, ovvero il relè è attivo quando il pin di uscita di RPi è a livello logico basso. Qui maggiori dettagli https://www.pianetaradio.it/blog/scheda-rele-optoisolata/
Se non vuoi modificare la scheda relé, inverti nel codice la logica di colorazione dello stato della GPIO.
Saluti
Ti ringrazio per la risposta, in effetti avevo già provato ad invertire i colori nel codice lime con white ma senza successo. Ho provato persino a mettere un colore diverso tipo Yellow ove c’era lime e al caricarsi del codice al primo off si vede il giallo ma dopo un on (bianco) è un nuovo off si rivede il verde…. Inspiegabile.
Vabbè me lo terrò così e riproverò a fare cambiamenti di codice.
Ma il codice css va anch’esso sistemato?
Grazie ancora e buona serata.