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




    Raspberry                     Home