13 dicembre 2018

tutorial: come fare il countdown per capodanno con un raspberry pi (e la libreria gpiozero)


Benvenuti!
Questo tutorial vi fornirà una guida su come utilizzare la libreria GPIOzero sfruttandola per dar vita ad un piccolo progettino DIY: una sorta di countdown che avvisi dello scadere della mezzanotte tra il 31 dicembre ed il 1 gennaio, insomma Capodanno.

Nota: il presente articolo contiene una infarinatura generale ed alcuni dettagli sono stati tralasciati. Se volete approfondire, non esitate a lasciare un commento o a contattarmi sui canali social.

Prima di addentrarci, vi riporto il video di supporto a questa guida che ho pubblicato sul mio canale YouTube:


Inoltre vi segnalo che nella pagina dedicata troverete tutti i tutorial da me pubblicati.


1. l'attrezzatura minima per iniziare


Per portare a termine il progetto occorrono:
  • un Raspberry Pi (in questa guida viene utilizzato lo Zero, ma va bene un modello qualsiasi) + una microSD + un alimentatore da almeno 2.1A
  • Raspbian OS Lite (o Raspbian OS oppure il sistema che preferite)
  • un po' di sensori con cui giocare (es: buzzer, bottoni, luci, e via discorrendo)
  • un router a cui collegare il Pi per l'accesso da remoto
Per quanto riguarda il primo punto, tutte le configurazioni per comodità verranno effettuate via SSH da PC, quindi non sono necessari altri accessori. Nulla vieta che si colleghi il Pi ad un monitor più tastiera e mouse e si sviluppi direttamente da lì. Ma è importante usare un alimentatore che eroghi almeno 2.1A di corrente (2.4A nel caso del Pi 3).
Raspbian OS Lite è la scelta migliore poiché il sistema consente l'utilizzo della libreria GPIOzero con il minimo sforzo e poi l'OS è minimale e leggerissimo. Si può comunque utilizzare un qualsiasi altro sistema operativo compatibile con i single board computer della fondazione inglese.
Dato che andremo a giocare con la libreria, si necessitano un po' di sensori (in questo caso specifico: un buzzer, un bottone ed una luce LED con eventuali resistori).
Infine è indispensabile un router se si intende sviluppare il codice da remoto e soprattutto una connessione ad internet per installare la libreria GPIOzero su Raspbian OS Lite o altri OS (Raspbian OS invece la ha preinstallata). Se si sviluppa il codice direttamente sul Pi e se si ha già GPIOzero installata e funzionante, allora la connessione ad internet ed il router non sono necessari.


2. GPIOzero e l'idea


Natale, Capodanno & co. stanno per arrivare e potrebbe essere interessante sfruttare la testata GPIO presente su tutti i Raspberry Pi per creare un qualcosa che possa animare tali festività…

La fondazione inglese fornisce una fantastica libreria, chiamata GPIOzero, che consente di gestire con estrema facilità sensori e componenti connessi ai PIN GPIO, e tale libreria è preinstallata su Raspbian OS (oppure può essere facilmente recuperata in altri sistemi operativi).
Perché questa libreria è così interessante? Perché semplifica lo sviluppo di codice python consentendo l'uso dei sensori tramite una marea di API. API che permettono di attivare LED, controllare bottoni, motori, ed una quantità elevata di altre componenti grazie a semplici metodi, ottimizzati e ben organizzati!

L'idea, quindi, è quella di creare uno strumento che faccia da conto alla rovescia negli ultimi istanti tra il 31 dicembre ed il 1 gennaio, cioè Capodanno, countdown che sfrutti un LED RGB ed un buzzer per segnalare lo scadere della mezzanotte. Tutto controllato tramite la libreria GPIOzero per attivare i sensori al momento giusto.
Nota: la guida ufficiale della libreria è accessibile da qui ed in essa potete trovate tutte le informazioni per l'installazione più tutta una serie di esempi d'uso (sia basilari che avanzati) da cui attingere per sviluppare. Nella stessa documentazione ci sono diverse informazioni aggiuntive utili, come la configurazione per l'accesso da remoto al GPIO, o come usare via OTG il Pi Zero, tools di varia natura, domande frequenti e davvero chi più ne ha ne metta... Non mancano i capitoli dedicati alle API, nei quali sensore per sensore vengono descritti e dettagliati tutti i metodi presenti.

Come utilizzare questa libreria?
  • per chi parte da Raspbian OS non c'è alcun prerequisito: tutto è già disponibile all'uso
  • per chi parte da Raspbian OS Lite (o altri sistemi Debian based), la libreria va recuperata dai repository con un semplice sudo apt install python3-gpiozero (per la libreria compatibile con python3) oppure sudo apt install python-gpiozero (per python2)
  • su altri sistemi operativi, invece, la libreria può essere recuperata con pip con il comando sudo pip3 install gpiozero (per python3) oppure sudo pip install gpiozero (per python2). Ovviamente se non si ha pip va installato dal gestore dei pacchetti del sistema in uso (ad esempio sui sistemi Debian basta un sudo apt install python-pip3 per python3 oppure sudo apt install python-pip per python2)


3. step by step


Quello a cui vogliamo arrivare è un software che faccia da countdown, e negli ultimi 10 secondi di conto alla rovescia emetta un beep per scandire il procedere del tempo. Allo scadere, vogliamo avere un ulteriore suono di avviso. Il tutto accompagnato dal LED RGB che si colorerà a supporto.

Ciò che serve, quindi, è un Raspberry Pi, una breadboard con un po' di cavetti per collegare tramite essa i sensori alla testata GPIO del Pi, sensori che saranno appunto: un LED RGB, un buzzer di tipo attivo, ed un piccolo bottoncino da usare principalmente nelle fasi di test (ma a cui assegneremo comunque una funzione finale).
Nota: attenzione, in generale i LED hanno bisogno di resistori per protezione, a meno di utilizzare chip che li integrino al loro interno.



 


Le varie componenti vanno così posizionate sulla breadboard:
  1. il bottone ha un PIN a cui collegare il GROUND ed un PIN a cui abbinarne uno (ad esempio il PIN BCM 2) della testata GPIO
  2. il buzzer ha un PIN a cui collegare il GROUND ed un PIN da abbinare ad un secondo PIN della testata GPIO (ad esempio il BCM 17)
  3. infine, il LED RGB ha 4 PIN di cui uno da collegare al GROUND e gli altri 3 da associare a rispettivi PIN sulla testata GPIO (ad esempio i BCM 9, 10 ed 11) uno per colore base (rosso, verde, blu)

Una volta operativi si può passare al codice: create un file chiamato ad esempio countdown.py. Si arriverà alla soluzione finale per gradi, prima bisogna assicurarsi che la libreria GPIOzero ed i sensori collegati via breadboard al Pi siano perfettamente funzionanti.
Usare la libreria è facilissimo, è sufficiente importarla nel codice, ed anzi ancor più semplice basterà importare da essa solamente le componenti che si vogliono utilizzare.

  • Ad esempio il seguente codice sfrutta il buzzer e lo fa suonare per 1 secondo:

    # import da GPIOzero del componente desiderato
    from gpiozero import Buzzer
    from time import sleep

    # istanziare il Buzzer sul PIN BCM a cui è connesso
    buzzer = Buzzer(17)

    # attivare il Buzzer e tenerlo on per 1 secondo
    buzzer.on()
    sleep(1)
    buzzer.off()


    Salvato il codice, può essere avviato con il comando python3 countdown.py (cioè il nome del file contenente il codice che stiamo sviluppando) e il risultato sarà proprio la riproduzione del buzz per 1 secondo.


  • Il seguente codice, invece, sfrutta il LED RGB e lo colora in base alle configurazioni che desideriamo:

    # import da GPIOzero del componente desiderato
    from gpiozero import RGBLED
    from time import sleep

    # istanziare il LED RGB sui 3 PIN BCM a cui è connesso
    led = RGBLED(9, 10, 11)

    # attivare il LED rosso per 1 secondo
    led.red = 1
    sleep(1)

    # attivare il LED blu a ½ luminosità per 2 secondi
    led.blue = 0.5
    sleep(2)

    # attivare il LED giallo per 1 secondo
    led.color = (1, 1, 0)
    sleep(1)

    led.off()


    Nuovamente, salvando il file e lanciandolo con il comando python3 countdown.py il led si accenderà prima in rosso per 1 secondo, poi in blu a metà intensità per 2 secondi, ed infine in giallo per un altro secondo.


  • Infine, i seguenti codici permettono di testare il bottone, il quale essendo un sensore di input ha un funzionamento differente rispetto ai semplici sensori di output come il LED o il buzzer.

    # import da GPIOzero il componente desiderato
    from gpiozero import Button

    # istanziare il Button sul PIN BCM a cui è connesso
    button = Button(2)

    # rimanere in attesa di pressione e poi stampare il messaggio
    button.wait_for_press()
    print("Il bottone e' stato premuto")


    Salvato il codice, avviandolo con python3 countdown.py e premendo il pulsante apparirà a video il messaggio configurato.


    # import da GPIOzero i componenti desiderati
    from gpiozero import Button, RGBLED
    from signal import pause

    # istanziare Button e LED RGB sui PIN BCM a cui sono connessi
    button = Button(2)
    led = RGBLED(9, 10, 11)

    # attivare il LED quando il bottone viene premuto
    # disattivarlo quando il bottone viene rilasciato
    button.when_pressed = led.on
    button.when_released = led.off

    # restare in attesa per non uscire dal programma
    pause()


    Eseguendo il codice con python3 countdown.py e premendo il bottone si accenderà il led in bianco, e lasciando il bottone si spegnerà. Per uscire premere CTRL+C.

Arrivati a questo punto la libreria funziona dovreste aver capito come utilizzarla: abbiamo le basi per poter sviluppare il countdown! L'idea era quella di fare un conto alla rovescia degli ultimi 10 secondi prima della mezzanotte, e poi emettere un ulteriore suono ed animare il tutto con il LED.
Per provare si può far sì che il countdown si avvii quando si preme il bottone e per comodità segnalare solo 3 secondi anziché 10. Il seguente codice fa proprio ciò:

from gpiozero import RGBLED, Buzzer, Button
from time import sleep
from signal import pause

buzzer = Buzzer(17)
led = RGBLED(9, 10, 11)
button = Button(2)

def alarm():
    buzzer.beep(0.5, 0.5, 3)
    led.pulse(n = 3, background = True)
    buzzer.beep(n = 3, background = True)

button.when_pressed = alarm

pause()

Nella funzione alarm quello che accade è che il buzzer emette 3 suoni da mezzo secondo ciascuno con altrettante pause, dopodiché (passati i 3 secondi) vengono lanciati due eventi in background (così da essere eseguiti contemporaneamente) che si occupano di ripetere per 3 volte il pulse del LED e il beep del buzzer.


4. countdown!


Arrivati a questo punto, il gioco è fatto! Il Pi deve verificare data ed ora correnti ed iniziare il countdown a tempo debito.
Nota: assicuratevi che l'ora sia settata correttamente e verificate che il timezone utilizzato dal Pi sia quello italiano (se siete in Italia chiaramente): potete farlo con il tool raspi-config (sudo raspi-config nella sezione Localization). 
Potete verificare quanto impostato lanciando il comando timedatectl che mostrerà timezone, orario e quant'altro.

Quando certi che tutto sia impostato correttamente, potete tornare sul codice e modificarlo per raggiungere lo scopo. Ottenendo un qualcosa come (in grassetto le differenze rispetto al codice precedente):

from gpiozero import RGBLED, Buzzer, Button
from time import sleep
from datetime import datetime
from subprocess import check_call


buzzer = Buzzer(17)
led = RGBLED(9, 10, 11)
button = Button(2)

def alarm():
    buzzer.beep(0.5, 0.5, 10)
    led.pulse(n = 3, background = True)
    buzzer.beep(n = 3, background = True)

# spegni il Pi alla pressione del bottone
def byebye():
    check_call(['sudo', 'poweroff'])

button.when_pressed = byebye

# avvia il countdown il 31/12 alle 23:59:50
while True :
    current_time = datetime.now()
    # nota: scrivere l'if tutto su una riga
    if current_time.day == 31
              and current_time.month == 12
              and current_time.hour == 23
              and current_time.minute == 59
              and current_time.second == 50 :
        alarm()
    sleep(1)

Nota: per testare il corretto funzionamento del codice, provare ad esempio con la data corrente ed un orario il più vicino possibile a adesso cosicché l'allarme partirà subito.


5. conclusioni ed ultime note


Questo semplice esempio voleva essere una dimostrazione di quanto sia comodo utilizzare la libreria GPIOzero fornita dalla fondazione Raspberry Pi: con pochissime righe di codice permette di utilizzare in modo intuitivo tantissimi sensori che possono essere collegati alla testata GPIO. Sta chiaramente allo sviluppatore applicare tutte le logiche del caso che desidera.

Il countdown preso come esempio può essere modificato a piacere, ad esempio aggiungendo il led come accompagnamento al buzzer nella fase di conto alla rovescia (e non solo al termine della stessa), facendolo colorare oppure pensando a un po' tutte le varianti possibili.


Bene: come indicato ad inizio guida, alcuni aspetti sono stati lasciati in secondo piano, ma se siete interessati ad approfondirli non esitate a contattarmi nei commenti di questo tutorial o dei video ad esso correlati, oppure sui canali social!

Spero che la guida vi sia stata utile. Al prossimo tutorial!

Nessun commento:

Posta un commento