Premessa: Questa guida è opera dell’utente Ippogrifo, e nata da una costruttiva discussione sul forum.raspberryitaly.com, io la pubblico per suo conto.
Zzed
Mini UPS per Raspberry
Un Ups per alimentare un Raspberry Pi, anche se mini, può essere utile, anche se occasionalmente.
Quello acquistato da me, tra i tanti modelli commerciali, è stato in grado di alimentare, prima dello spegnimento, il mio Pi 4 (1GB di RAM) per molte decine di minuti, tempo variabile in funzione del carico complessivo, provandolo con il SO su SD e successivamente su SSD (quindi un SSD collegato ed alimentato da una delle due porta USB classe 3). Nel mio caso l’autonomia riscontrata con la sola alimentazione da batteria è:
- Con Rpi4 + SD = circa 55 minuti
- Con Rpi4 + SSD = circa 40 minuti
La tempistica è dovuta all’intervento del sistema di protezione integrato che, per evitare la scarica profonda della batteria LiPo, spegne tutto.
Questo però comporta lo spegnimento forzato del Raspberry Pi, senza, cioè, che gli sia stato inviato il comando di shutdown. Cosa non auspicabile, specialmente quando il Raspberry Pi lavora in ambienti non presidiati.
E’ sorta quindi la necessità di dotare il mio modulino UPS con sistemi di controllo che possano comunicare al Raspberry il valore della tensione di scarica della batteria, in modo tale da programmarne la fase di shutdown e il conseguente, successivo “reale” spegnimento.
Il modulino UPS presenta tre caratteristiche:
- un piccolo pulsante per il controllo dello stato di carica della batteria tramite quattro LED;
- un interruttore ON/OFF che toglie l’alimentazione da 5V alle porte USB di uscita;
- quando l’interruttore è in posizione ON, non “vedendo” un carico, si porta in una sorta di modalità di risparmio energetico.
Quest’ultima condizione non permette ad un Raspberry Pi, mandato correttamente in shutdown, di riaccendersi al ritorno dell’alimentazione principale (i 5V dall’alimentatore). Per riattivare il Lampone (o qualunque altro carico) è necessario spostare l’interruttore su OFF e successivamente riportarlo su ON. Cosa non fattibile in ambienti non presidiati.
La soluzione al punto 3 è quella di utilizzare un interruttore elettronico posto in serie all’uscita a 5V dell’UPS che venga controllato dal Raspberry Pi per lo spegnimento (dopo il corretto shutdown) e dal ritorno dell’alimentazione principale (i 5V dall’alimentatore) per la riaccensione. Per questo l’interruttore ON/OFF a bordo dell’UPS dovrà essere spostato e rimanere nella posizione ON.
Il segnale di spegnimento viene inviato dal Raspberry Pi all’interruttore elettronico dal GPIO17 (nel mio caso); affinché ciò avvenga è necessario inserire alla fine del file /boot/config.txt la stringa:
dtoverlay=gpio-poweroff,gpiopin=17.
Questo fa si che alla fine della fase di shutdown il GPIO17 si porti a livello HIGH, forzando lo spegnimento.
Lo stato di ON dell’interruttore elettronico avviene in due fasi:
- al ritorno dell’alimentazione principale (i 5V dall’alimentatore) viene attivato il circuito di “TRIGGER” che simula la pressione del pulsantino di controllo dello stato di carica della batteria facendo si che all’interruttore (che si trova in posizione ON) si presenti la 5V;
- l’interruttore elettronico, collegato a valle dell’interruttore, “vede” i 5V in ingresso e commuta su ON, alimentando così il nostro Raspberry Pi.
Un modulo INA219 che misura tensione e corrente di carica/scarica della batteria, comunica al Raspberry Pi, tramite protocollo I2C, i valori letti di tensione e corrente ogni X secondi (valore modificabile sul SW di controllo che “gira” sul Raspberry). L’INA viene alimentato a 3,3 V da un apposito convertitore che da 5V porta la tensione a 3,3V (l’ingresso 5V del convertitore è connesso insieme a quello dell’interruttore elettronico per motivi di contemporaneità).
Il valore di tensione di batteria con cui programmare lo shutdown è impostabile sul software di controllo: quando il valore misurato è più basso di quello impostato, viene inviato il comando di shutdown, al termine del quale, il GPIO17 si porta HIGH (con conseguente spegnimento del Raspberry Pi).
Un LED, controllato dal GPIO4, indica, lampeggiando, l’esecuzione del software di controllo il cui avvio avviene in background tramite il comando inserito alla fine del file /etc/rc.local.
Il software di controllo non è certo ottimizzato, ma per il mio uso è sufficiente; “girando” in bakground tutte le istruzioni di print potranno essere eliminate o commentate.
Codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # # UPS.py # # # from ina219 import INA219, DeviceRangeError from time import sleep from gpiozero import LED import os led_blu = LED(4) # GPIO 4 ina = INA219(shunt_ohms=0.1, max_expected_amps = 3.15, address=0x40) ina.configure(voltage_range=ina.RANGE_16V, gain=ina.GAIN_AUTO, bus_adc=ina.ADC_128SAMP, shunt_adc=ina.ADC_128SAMP) def read_ina219(): try: v=(ina.shunt_voltage()) i_battery=(ina.current()) / 1000 v_battery = ina.voltage() if v_battery < 3.30 and i_battery < -0.1: os.system ('shutdown -h now') print('Shunt Voltage: {0:0.2f}mV'.format(v)) print('Battery Current: {0:0.2f}A'.format(i_battery)) print('Battery Voltage: {0:0.2f}mV'.format(v_battery)) w=v_battery * i_battery print('Power: {0:0.2f}W\n'.format(w)) except DeviceRangeError as e: # Current out of device range with specified shunt resister print(e) while 1: read_ina219() led_blu.toggle() sleep(0.5) |
Per installare la libreria dell’INA219, digitare nel Terminale:
“sudo pip install git+git://github.com/chrisb2/pi_ina219.git”
che installa la libreria e le sue dipendenze. Link utile: https://github.com/chrisb2/pi_ina219.
E’ una libreria interessante e completa in grado di configurare tutti registri dell’INA219.
Fotografie ad alta risoluzione:
https://i.ibb.co/6DsgqJw/Schema-Elettrico-Switch.jpg
https://i.ibb.co/vXWQcSb/Switch-INA.jpg
https://i.ibb.co/z754jS8/SCHEMA-BLOCCHI-UPS.png
https://i.ibb.co/HnF2pfg/Particolare-2-UPS.jpg
https://i.ibb.co/3778BFT/Particolare-1-UPS.jpg
https://i.ibb.co/T10bxQ8/Particolare-3-UPS.jpg
https://i.ibb.co/ZKNCNjq/Particolari-UPS.jpg
https://i.ibb.co/mBmZNHW/Assieme-UPS-Switch.jpg
NOTE DI REALIZZAZIONE:
Non ho testato il tutto per assorbimenti di corrente superiori a quelli del Raspberry Pi 4 + SSD. In questa condizione al ritorno dell’alimentazione principale (5V dall’alimentatore) avviene la ricarica della batteria contemporaneamente all’alimentazione del Raspberry.
Il modulino UPS eroga una tensione a vuoto di circa 5,12V che sotto carico scende al di sotto dei 5V. Il Mosfet di potenza (Q3 nello schema elettrico) che rappresenta il vero “interruttore”, ha una caduta di tensione tra i terminali Source e Drain di 20 mV quando nello stato di ON (valore molto più basso rispetto alle cadute di tensione dovute a tutto l’insieme, compreso il circuito stampato). Nel mio caso il Raspberry viene alimentato a 4,90V ma non ho avuto alcuna indicazioni di “low voltage” (simbolo del fulmine giallo) o problemi annessi, pur essendo alimentato dalla sola batteria, anche con Kodi attivo (installato in Buster) che riproduceva un film in streaming da Netflix.
Nel prolungare (saldando) il positivo (filo rosso) della batteria si dovrà fare attenzione che il connettore maschio della stessa non sia inserito in uno dei due femmina presenti sul circuito stampato dell’UPS.
I collegamenti di “5V input UPS for TRIGGER Circuit” e “ON Board UPS push botton connection, from TRIGGER circuit” potranno essere effettuati scrostando la vernice di protezione del circuito stampato nei punti evidenziati per mezzo di una piccola lama.
Qualunque intervento (anche di saldatura) da effettuare sul circuito stampato dell’UPS è opportuno che venga eseguito con la batteria scollegata per evitare accidentali corto circuiti.
INTERRUTTORE ELETTRONICO
L’interruttore commuta su ON quando in ingresso “vede” la variazione di livello da 0 a 5V; il condensatore posto in serie all’ingresso “deriva” questa tensione trasformandola in un impulso che pilota correttamente e momentaneamente il gate di Q1 facendo si che questo passi in conduzione, portando la tensione di drain e quindi del gate di Q3 a valori prossimi allo 0V (potenziale di massa). In questa condizione il Q3 si trova correttamente polarizzato (Mosfet a canale P) e passa in conduzione, portando la tensione del drain a 5V. Presente questa tensione, Q2 viene polarizzato correttamente e passa in conduzione facendo si che il drain a cui è collegato anche il gate di Q3, vada/rimanga a tensione prossima allo 0V. La conduzione di Q3 fa si che anche Q2, a sua volta correttamente polarizzato, rimanga in conduzione garantendo l’uscita a 5V.
Il passaggio da ON ad OFF avviene per mezzo di Q4: quando il gate riceve il livello HIGH dal GPIO17 porta in conduzione il transistor, facendo si che ai capi della R5 a cui è collegato il drain ma anche il gate di Q2 si presenti una tensione prossima allo 0V. In questa condizione, Q2 smette di condurre facendo in modo che ai capi della R4 vi sia la 5V e quindi anche al gate di Q3. Non essendo più polarizzato correttamente, Q3 passa nello stato di OFF togliendo alimentazione al Raspberry Pi.
CIRCUITO DI TRIGGER
Questo circuito ha il compito di attivare momentaneamente (il chip dell’UPS ha un proprio temporizzatore) l’uscita a 5V dello stesso, simulando la pressione del piccolo pulsante dedicato al check dello stato di carica della batteria. Si attiva al ritorno della tensione di alimentazione proveniente dall’alimentatore. L’uscita a 5V viene abilitata sul fronte negativo del segnale, quindi al rilascio del pulsante o sul fronte di discesa della tensione di carica del condensatore posto all’ingresso del circuito (in linea di massima, una volta che il condensatore si sarà caricato al valore max della tensione applicata, tenderà a scaricarsi con una certa costante di tempo dovuta alla propria capacità e alla resistenza totale verso massa e che ne determina la scarica). Questa temporizzazione diventa importante in quanto se il timer interno del chip disabilita l’uscita a 5V prima che il circuito di trigger sia intervenuto, sarà impossibile per l’interruttore elettronico passare nella condizione di ON (questa possibile condizione è facilmente risolvibile utilizzando componenti attivi, che comunque complicherebbero un po’ di più le cose).
MIGLIORIE
Se vuoi restare aggiornato, seguici anche sui nostri social: Facebook, Twitter, Youtube, Telegram.