Cercando sul web ho trovato alcuni progetti relativi a un pulsante per il riavvio e lo spegnimento del Raspberry
Di uno in particolare ho utilizzato le indicazioni con poche variazioni:
Per spegnere un Raspberry “in modo pulito” si deve dare il comando:
‘sudo shutdown -h now’
Non rischieremo di corrompere il file system
L’idea è di utilizzare un pulsante con duplice funzione:
Pressione breve (< 3 s) per innescare lo shutdown
Pressione lunga (>= 3 s) per innescare il reboot
Feedback visivo tramite un led:
Tre lampeggi veloci nel caso di pressione breve (< 3 s): shutdown (spegnimento)
Dieci lampeggi veloci nel caso di pressione lunga (>= 3 s): reboot (riavvio)
Circuito:
Collegare un LED con in serie R = 330 Ω tra un pin GPIO (da configurare via software come uscita) e massa
Collegare un pulsante normalmente aperto tra un altro pin GPIO (da configurare via software come ingresso) e massa
Consiglio di collegare due pulsanti in serie da premere contemporaneamente per maggior sicurezza
Nel mio caso Led su GPIO 13 e pulsante (o pulsanti) su GPIO 21
Sia Python che RPi.GPIO sono già installati su Raspbian
Script Python:
import RPi.GPIO as GPIO
import time
import os
def blink(channel, count = 1, timeHigh = 1000, timeLow = 1000):
"""Blink count times, timeHigh milliseconds high, timeLow milliseconds low."""
if count <= 0:
return
GPIO.output(channel, GPIO.HIGH)
time.sleep(timeHigh / 1000.0)
GPIO.output(channel, GPIO.LOW)
for i in range(count - 1):
time.sleep(timeLow / 1000.0)
GPIO.output(channel, GPIO.HIGH)
time.sleep(timeHigh / 1000.0)
GPIO.output(channel, GPIO.LOW)
led = 13
button = 21
# Init GPIO
GPIO.setwarnings(False) ## disabilita avviso di errore in quanto uso la stessa uscita GPIO del led in altro programma
GPIO.setmode(GPIO.BCM)
GPIO.setup(led, GPIO.OUT)
GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.wait_for_edge(button, GPIO.FALLING)
channel = GPIO.wait_for_edge(button, GPIO.RISING, timeout = 3000)
if channel is None:
blink(led, 10, 100,200)
print "Reboot"
os.system("/sbin/shutdown -r now")
else:
blink(led, 3, 100, 200)
print "Shutdown"
os.system("/sbin/shutdown -h now")
GPIO.cleanup()
-------------------------------------------------------------------------------
Sul pin GPIO "button", viene abilitato il circuito di pull-up interno
(istruzione GPIO.setup(button, GPIO.IN, pull_up_down = GPIO.PUD_UP))
La funzione utilizzata per monitorare il pulsante è GPIO.wait_for_edge().
Questa è una funzione bloccante, non consuma risorse di sistema e rimane in attesa sul pin GPIO "button"
fino a che non viene rilevato un fronte in discesa (1 -> 0), (pressione del pulsante)
Successivamente si rimane in attesa per un periodo massimo di tre secondi di un fronte in salita (0 -> 1)
(rilascio del pulsante) con l’istruzione GPIO.wait_for_edge(button, GPIO.RISING, timeout = 3000)
Se si esce perché il fronte in salita è stato rilevato, significa che la pressione del pulsante è durata meno di 3 secondi, e quindi si opta per lo shutdown, altrimenti si esce perché sono passati 3 secondi senza che il pulsante sia stato rilasciato, e quindi si opta per il reboot
La funzione blink(), definita all’inizio dello script, si occupa di notificare all’utente il riconoscimento della pressione del pulsante:
Tre lampeggi veloci nel caso di pressione breve (< 3 s): shutdown (spegnimento)
Dieci lampeggi veloci nel caso di pressione lunga (>= 3 s): reboot (riavvio)
La funzione os.system() serve per lanciare l’esecuzione di un comando utilizzando la shell di sistema
In questo caso i comandi da lanciare sono:
/sbin/shutdown -h now per lo shutdown
/sbin/shutdown -r now per il riavvio.
Per salvare lo script sul Raspberry Pi digitare:
nano shutPi.py
Inserire il testo dello script
Verificare che lo script sia stato salvato col nome /home/pi/shutPi.py.
Collaudo:
Per eseguire lo script dare il comando:
sudo python /home/pi/shutPi.py
Alla pressione del pulsante, dopo il lampeggio del LED e un attimo prima dell’arresto del sistema,
sul terminale dovrebbe comparire la scritta:
Shutdown quando viene intercettata una pressione breve
Reboot quando viene intercettata una pressione lunga
Verificare che lo script funzioni
Avvio automatico:
Modificare il file /etc/rc.local:
sudo nano /etc/rc.local
Aggiungere, prima della riga ‘exit 0’:
if [ -f /home/pi/shutPi.py ]; then
python /home/pi/shutPi.py &
fi
Qui sudo non serve, perché lo script /etc/rc.local viene eseguito già con i privilegi di super utente
La e commerciale (&) in fondo alla seconda linea serve per lanciare il nostro script in background, in modo da non bloccare l’esecuzione di eventuali altre parti del file /etc/rc.local.
Lo script shutPi.py verrà lanciato automaticamente, e in background, ad ogni avvio
Per verificare:
ps ax | grep shutPi.py
Lo stesso led può lampeggiare per indicare che il Raspberry è acceso
Nel mio caso un lampo di 100 ms ogni 6 secondi: Lampeggio Led