In una lezione precedente abbiamo imparato a gestire un carico direttamente connesso a un GPIO del Raspberry Pi.
All'occorrenza potete leggere la sezione della guida che tratta l'argomento.
Tuttavia, per ragioni squisitamente tecniche ed elettriche, non è sempre possibile far ciò per qualsiasi carico.
Impareremo quindi a pilotare un carico esterno tramite un Relè.
Il Relè
Un Relè è un interruttore controllato elettricamente che viene utilizzato quando è necessario pilotare un carico di alta potenza tramite un segnale a bassa potenza, come per esempio un GPIO del Raspberry Pi.
Il carico ad alta potenza è collegato tra i poli COMUNE e NORMALMENTE APERTO.
Per esempio immaginiamo di voler pilotare, come abbiamo detto, una comune lampada a 220V. Questa non può certamente essere collegata direttamente al Raspberry Pi.
Il Relè può essere utilizzato per pilotare la lampada tramite un piedino GPIO.
Pochi milliAmpere possono quindi gestire una lampada a 220V da 100W.
Il modulo Relè
In questa lezione introduciamo l'uso del modulo Relè a 5V (molto comune nella comunità maker che adopera Raspberry Pi).
Il modulo, che contiene un Relè controllabile per l'appunto a 5V, può essere utilizzato per carichi con massima corrente nominale di 10A, sia in corrente continua che alternata. Tuttavia è altamente consigliato non raggiungere mai questo valore per ragioni di sicurezza. Se si adoperano carichi con correnti massime del 50/60% del valore nominale si è certi di lavorare in sicurezza.
Il modulo, oltre al Relè, include anche pochi altri componenti passivi, utili a renderlo utilizzabile e controllabile tramite un GPIO.
Questo modulo ha 3 piedini:
- +: pin per la connessione dell'alimentazione a 5V;
- -: pin per la connessione della massa o GND;
- S: pin di controllo del Relè.
Il piedino di controllo S è collegato, tramite una resistenza, alla base di un transistor NPN. Questa soluzione permette di eccitare la bobina del Relè con pochi mA di corrente forniti da un GPIO del Rapsberry Pi.
Controllo diretto con Raspberry Pi
Realizziamo ora il circuito per connettere correttamente il modulo Relè al GPIO #24 del Raspberry.
Abbiamo bisogno del seguente materiale:
- Raspberry Pi;
- Modulo Relè a 5V;
- Un pulsante;
- Due led;
- Una resistenza da 220 Ohm;
- Una resistenza da 470 Ohm;
- Una batteria a 9V di tipo transistor.
Normalmente ai capi del Relè si collega un carico di potenza ma per ragioni pratiche, in questo circuito, è adoperato un normale led. Tuttavia il funzionamento rimane invariato anche al mutare del carico collegato.
Una volta premuto il pulsante per almeno mezzo secondo si attiva il Relè e il carico viene alimentato. In contemporanea si accende il primo led per indicare che il carico ad alta potenza è attivo.
Viceversa, premendo nuovamente il pulsante per almeno mezzo secondo, il Relè commuta andando a interrompere l'alimentazione della lampada a 220V (simulata dal led). Il led di controllo si spegnerà.
Una volta realizzate le connessioni elettriche, eseguite questo codice Python:
from gpiozero import LED, Button, OutputDevice
from signal import pause
def aziona_carico(): # linea 4
led_controllo.toggle()
rele.source = led_controllo.values # linea 6
print("Inizializzazione Led")
led_controllo = LED(23) # linea 9
rele = OutputDevice(24) # linea 10
print("Inizializzazion Pulsante")
pulsante = Button(18, pull_up=True, hold_time=0.5) # linea 13
pulsante.when_held = aziona_carico # linea 15
pause()
Il codice è molto semplice, implementa e riutilizza concetti già descritti nelle lezioni precedenti.
La novità principale consiste nel l'uso della classe OutputDevice per modellare il Relè. Infatti la libreria GPIOZero non ha una classe specifica per il modulo Relè, come per il Led e per il Pulsante.
- Alla linea 9 inizializziamo il led di controllo connesso al GPIO #23;
- Alla linea 10 definiamo il relè connesso al GPIO #24;
- Alla linea 13 definiamo il pulsante connesso al GPIO #18 impostando una resistenza di Pull-Up e un tempo di pressione di 0.5 secondi;
- Infine alla linea 15 colleghiamo all'evento del pulsante when_held l'esecuzione della funzione aziona_carico precedentemente definita alla linea 4.
Da notare come lo stato del Relè sia impostato alla linea 6 in funzione del valore del led di controllo che a sua volta è determinato dallo stato del pulsante.
In questo modo abbiamo implementato il funzionamento desiderato per il controllo del Relè e del carico a esso collegato.
Controllo indiretto con Raspberry Pi
Nell'esempio precedente abbiamo visto come collegare direttamente il modulo Relè al Raspberry Pi. Esiste un ulteriore metodo utile in caso si voglia pilotare direttamente un Relè singolo (non modulo Relè).
In questo esempio alternativo useremo un transistor NPN interposto tra il GPIO del Raspberry e il modulo Relè.
Per il circuito in questione abbiamo bisogno del seguente materiale:
- Raspberry Pi;
- Modulo Relè a 5V;
- Un pulsante;
- Due led;
- Una resistenza da 220 Ohm;
- Una resistenza da 470 Ohm;
- Una resistenza da 1K Ohm;
- Un transistor comune tipo NPN (qualsiasi sigla va bene);
- Una batteria a 9V di tipo transistor.
Come si vede, dallo schema di collegamento, il GPIO #24 in questo caso è collegato tramite la resistenza da 1K Ohm alla base del transistor NPN.
Il pin S del modulo Relè è collegato al collettore del transistor e, tramite una resistenza da 470 Omh, a VCC (5V).
Quindi, in questo modo, la corrente entrante nel modulo Relè non viene più fornita direttamente dal GPIO #24 ma dalla linea di alimentazione tramite il transistor NPN.
Vediamo ora il codice relativo a questo caso:
from gpiozero import LED, Button, OutputDevice
from signal import pause
def aziona_carico():
led_controllo.toggle()
rele.source = led_controllo.values
print("Inizializzazione Led")
led_controllo = LED(23)
rele = OutputDevice(24, active_high=False) # linea 10
print("Inizializzazion Pulsante")
pulsante = Button(18, pull_up=True, hold_time=0.5)
pulsante.when_held = aziona_carico
pause()
La differenza principale è l'inizializzazione del Relè alla linea 10.
In questo caso, impostando active_high=False, il GPIO funzionerà in logica inversa. Sara cioè LOW quando è on(), e HIGH quando è off().
È necessario muoversi in questo modo poiché abbiamo utilizzato un transistor di tipo NPN che realizza una funzione invertente (NOT).
Quindi con il GPIO in logica inversa, in serie al NPN invertente, otteniamo il funzionamento atteso e il circuito funziona esattamente come nel primo caso, quindi il Relè viene controllato tramite la pressione del pulsante.
Conclusioni
In questa lezione abbiamo visto come adoperare il Raspberry Pi per pilotare un carico di alta potenza (una lampada, un ventilatore, una presa elettrica) che tecnicamente non può essere collegata direttamente ai GPIO del Raspberry.
Abbiamo descritto, due modi diversi di collegamento, uno diretto e uno indiretto, tramite l'uso di un transistor.
Le tecniche apprese possono essere utilizzate in una miriade di progetti, specie in ambito domotico, in cui si usa il Raspberry Pi per pilotare un qualsiasi dispositivo casalingo.