Premessa
Alessandro
L’idea nasce dalla necessità di dover irrigare alcune piante, fiori e un orto a qualche chilometro da casa; tutti dotati di un impianto a goccia che permette di risparmiare molta acqua, ma che deve essere acceso per lunghi periodi di tempo, anche una notte intera. Quindi, dopo aver pensato alla parte idraulica, è giunto il momento di renderla anche smart*, grazie al fedele Raspberry Pi.
*ovvero come rendere complicato anche il semplice gesto di aprire un rubinetto.
Questo progetto ha avuto una lunga gestazione, non tanto per la complessità di fondo, quanto per la troppa carne al fuoco messa fin da subito. Ho deciso quindi di partire dall’essenziale: una centralina per l’irrigazione gestita dal Raspberry Pi che permetta la programmazione tramite smartphone, tablet o da remoto.
Le valvole
Iniziamo dal componente principale, le elettrovalvole: dopo alcune considerazione sulla portata dell’impianto ho deciso di suddividere il terreno in 3 zone ed ho impostato il progetto su 4, per permettere una seppur minima espansione futura. Inizialmente ho acquistato una piccola elettrovalvola da 12v in corrente continua da un venditore cinese, perché mi sembrava più semplice da alimentare e da controllare tramite una Gpio del Raspberry; probabilmente avrebbe funzionato, però mi è sembrata inaffidabile e fin troppo economica (come costruzione), oltre che troppo piccola, 1/2 pollice. Per progetti più modesti sarebbe la scelta ideale ma, visto che saranno posizionate dentro un pozzetto, in esterno, per 365 giorni all’anno, ho deciso di affidarmi alle elettrovalvole standard per l’irrigazione da 24V in corrente alternata, da 1 pollice.
I vantaggi di queste valvole sono molti: sono stagne, ispezionabili, robuste ed hanno i ricambi disponibili, ma hanno l’alimentazione a 24V in corrente alternata. Trovare un alimentatore a prezzi umani è praticamente impossibile, quindi l’unica possibilità è costruirselo da zero inscatolando un trasformatore 220v-24v AC in una scatola elettrica.
Quello che ho acquistato io è da 16W, più che sufficienti per l’utilizzo. I collegamenti sono banali per chi ha qualche esperienza; per chi non ce l’ha il mio consiglio è quello di cercarne uno già pronto: sbagliare collegamenti con la tensione di rete porta a conseguenze molto pericolose. L’uscita del trasformatore è poi collegata alle valvole, attraverso un fusibile di sicurezza, e interrotta da dei relè comandati dal raspberry.
L’hardware
Oltre ad un Rasberry Pi modello B (ovviamente) ho utilizzato i seguenti componenti:
- una chiavetta wifi nano con chipset RT5370;
- un alimentatore adeguato da 5v (almeno 1 Ampere, meglio di più)
- real time clock, basato sul chip ds1307, per mantenere l’ora anche ad alimentazione assente, collegato tramite protocollo i2c al Raspberry (attenzione ai modelli alimentati a 5v)
- lcd a cristalli liquidi, economico, basato sul chip standard HD44780. Il problema di questo componente è l’elevato numero di pin necessari per il funzionamento che ho risolto con un shift register;
- shift register 74hc595 per utilizzare lo schermo utilizzando solamente 3 Gpio, (avevo il chip disponibile, esistono delle alternative);
- scheda da 4 relè, contenente anche l’elettronica necessaria al loro funzionamento;
- un array di transistor di tipo Darlington ULN2803 per interfacciare le Gpio con la scheda relè a 5v ed i led, in modo sicuro per il raspberry;
- pulsanti ed interruttori per il comando manuale delle valvole;
- led per segnalare lo stato;
- varia minuteria e cavi per cablaggi.
Anche con l’accorgimento dello shift register, utilizzato per comandare l’lcd, sono arrivato ad impiegare lo stesso tutte le uscite disponibili sul connettore principale del RaspberryPi. Per eventuali future espansioni ho in mente di acquistare l’integrato MCP23017, che permette di aggiungere ulteriori 17 porte tramite la comunicazione i2c.
Per comodità ho deciso di saldare fin da subito tutti gli integrati, le resistenze di pull-up per gli interruttori e per i led su una scheda millefori, collegandola al Raspberry attraverso un cavo piatto. Ho anche creato e ordinato una pcb che si innesta sul raspberry come una shield, ma sto ancora aspettando con ansia dalla Cina.
Componenti e prototipo della scheda di controllo
Schema PCB
Per il contenitore ho utilizzato una scatola metallica recuperata da un vecchio alimentatore atx da pc fisso e una scatolina di derivazione elettrica in plastica dentro cui effettuare i collegamenti tra relè e valvole. Con il senno di poi tale scelta è risultata problematica essenzialmente per due motivi:
- bucare e forare il metallo è molto più laborioso rispetto alla plastica;
- bisogna isolare bene i componenti dal contenitore metallico per evitare disturbi e corto circuiti.
Il risultato semi definitivo non è poi così male, ha un aspetto molto artigianale, ma l’estetica non è comunque il suo obbiettivo. E soprattutto è funzionale.
Il software
Il codice si trova qui, su GitHub. (chi è capace a programmare troverà sicuramente moltissimi errori)
Lo script python che gestisce irrigaPi è concettualmente semplice e si basa su vari processi indipendenti:
- controllo file di programmazione;
- controllo dello stato dei pulsanti e degli interrutori;
- scrittura lcd;
- scrittura dei log.
Una valvola viene accesa se:
- la leva è su automatico e l’orario corrisponde con quello programmato;
- la leva è su manuale e viene premuto il corrispondente pulsante.
Il tutto è corredato da un sistema di logging per il debugging e soprattutto per permettere il controllo della situazione anche tramite le pagine web.
Per gestire le Gpio del raspberry ho utilizzato la libreria WiringPi, nella sua versione per Python il cui sito contiene tutta la documentazione per utilizzare gli lcd, gli shift register e in generale tutti gli expander di porte. L’utilizzo è molto intuitivo e ben spiegato nella documentazione.
La programmazione: raspberry Pi come access point e web server
Non avendo disponibile una connessione internet in loco né un router wireless, l’idea è stata quella di creare un access point e un web server sfruttando il Raspberry e, attraverso un form apposito su una pagina web, permettere di definire gli orari per la programmazione dell’irrigazione.
Per quanto riguarda la parte server ho installato Lighttpd, un web server leggero e veloce. Non ha senso installare niente di più complesso per l’uso che ne devo fare.
Per la connessione, ho trasformato il raspberry in un access point con hotspot wireless. Inaspettatamente devo dire che tutto ha funzionato fino da subito, se si esclude qualche iniziale caduta della rete wireless dovuta a dei driver buggati.
La pagina web è un semplice form in html, senza tanti fronzoli, che, attraverso uno script php, scrive un file di testo contenente i dati inseriti. Tale file sarà poi letto dallo script python che provvederà alla gestione delle valvole.
La programmazione degli orari di irrigazione, in pratica, avviene connettendosi ad una rete wifi creata dal raspberry stesso; indipendentemente da quale pagina web viene aperta mentre si è connessi a questa rete, si viene reindirizzati al form per la programmazione, che contiene anche le informazioni aggiornate sullo stato del sistema. Il sistema è molto semplice ed alla portata di chiunque abbia un smartphone.
Espansioni future
Ancora il progetto non è molto intelligente, si limita a ricevere degli input e a seguire degli orari. Effettivamente non è niente di nuovo, per adesso. C’è da dire che il lavoro sporco è stato già fatto, se fosse disponibile una connessione ad internet sarebbe già possibile controllarlo anche da remoto. Quello che è interessante fare è implementare una rete di sensori che permettano ad irrigaPi di gestire in autonomia l’irrigazione, interrompendola se non necessaria (pioggia) ed attivandola in casi particolari; non l’ho fatto fino ad ora per più motivi:
- per motivi di tempo, se avessi fatto tutto insieme probabilmente non avrei finito niente in tempi accettabili (cioè prima dell’arrivo del gran caldo!);
- per motivi logistici: ho terminato le Gpio disponibili (o almeno quasi) e non avevo disponibili expander come l’integrato mcp23017 che crea altre 17 porte utilizzando il protocollo i2c;
- per manie di grandezza: il terreno è molto esteso e mi piacerebbe creare una rete di sensori magari wireless a batteria; non c’è bisogno di dire che non è banale.
In linea di massima però l’idea è quella di sfruttare un microcontrollore tipo Arduino, come Slave, per gestire ed inviare ad irrigaPi i dati dei sensori, magari tramite la seriale rs485, oppure via ethernet, oppure con qualche modulo wifi (ma quelli affidabili costano un po’ troppo, vedi xbee).
Per adesso il sistema è funzionante, non ho ancora attaccato fisicamente la valvole ai relè perché la parte idraulica è ancora da completare, ma il sistema è up and running da qualche giorno senza problemi particolari. Quando poi arriverà (finalmente) la pcb dalla Cina riuscirò anche a eliminare quel groviglio di cavi all’interno della scatola.
Edit: la IrrigaPi shield:
Il viaggio dalla Cina (e dai laboratori di Seedstudio.com) è lungo, ma finalmente è arrivata la pcb che avevo ordinato. La realizzazione è molto buona, gli unici errori sono dovuti al mio disegno con Eagle (è la prima pcb che ho fatto stampare in assoluto), ed adesso l’aspetto è molto più professionale! Spero inoltre di avere meno problemi riguardo a disturbi che prima, di tanto in tanto, facevano comparire caratteri strani sullo schermo lcd.