Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Libreria python GPIOZero

Link copiato negli appunti

Questa lezione introduce l'uso della libreria python GPIOZero per poter programmare ed utilizzare i pin GPIO del Raspberry Pi. Viene fornita una panoramica delle funzionalità principali della libreria e vengono descritti i passi da seguire per l'installazione. Inoltre vengono descritte due diverse modalità di numerazione dei pin GPIO.

GPIO e codice di controllo

Come descritto nella lezione precedente di questa guida una delle caratteristiche principali del Raspberry Pi è la possibilità di interfacciarsi con dispositivi esterni tramite il connettore GPIO a 40 pin.
Per esempio è possibile leggere (INPUT) da sensori esterni valori come temperatura, umidità e pressione atmosferica. Sempre tramite il GPIO è possibile comandare (OUTPUT) dei dispositivi esterni, a esempio far scattare un relè o pilotare una striscia led RGB.
Ovviamente, oltre a effettuare le connessioni elettriche, è necessario scrivere ed eseguire un programma di controllo dei dispositivi e sensori esterni.
Il Raspberry Pi è un computer completo, che supporta vari sistemi operativi, tra cui Linux, è quindi possibile scrivere il programma di controllo in una moltitudine di linguaggi di programmazione.
I più giovani potrebbero usare il linguaggio visuale Scratch (altamente consigliato per far avvicinare i giovani al mondo dell’informatica e della programmazione).
Coloro che sono alla ricerca delle massime prestazioni possono programmare in C/C++. Chi proviene dal mondo web può utilizzare node.js.
Chi è interessato a utilizzare un linguaggio in forte espansione può scrivere e controllare i GPIO in go-lang.
Infine, per chi cerca semplicità, espressività e immediatezza, e consigliato l'uso del linguaggio Python.

La libreria GPIOZero

La libreria python GPIOZero per Raspberry Pi, fornisce una semplice interfaccia verso i dispositivi e sensori collegati e controllati tramite i pin GPIO. È sviluppata e mantenuta dalla Raspberry Pi Foundation e viene rilasciata sotto licenza BSD 3-Clause "New" or "Revised".
Questa licenza è molto permissiva: autorizza la redistribuzione della libreria, sia in formato sorgente sia binario con o senza modifiche.
Tuttavia bisogna tassativamente rispettare 3 vincoli:

  1. La redistribuzione in sorgente deve riportare il messaggio di copyright in tutte le sue parti.
  2. La redistribuzione in binario deve riportare il messaggio di copyright in tutte le sue parti, nella documentazione e in ogni altro materiale relativo al progetto.
  3. Il nome del titolare del copyright (Raspberry Pi Foundation) e quello di ogni collaboratore non può essere usato in nessuna maniera e forma, per supportare e promuovere prodotti che usano la libreria, senza uno specifico permesso scritto.

Modellazione dei dispositivi

La caratteristica fondamentale della libreria GPIOZero è quella di fornire un modello o un’interfaccia di alto livello per i dispositivi comunemente utilizzati con il Raspberry Pi.
Quindi, a differenza di altre librerie, non richiede al programmatore di gestire i singoli pin ma fornisce un’interfaccia e una serie di metodi di alto livello specifici per ogni componente supportato.

I componenti supportati dalla versione 1.4.1 sono i seguenti:

  • Led
  • Led con controllo di luminosità PWM
  • Led Board
  • Barra Led
  • Semaforo a Led
  • Led RGB
  • Pulsante
  • Sensore di movimento PIR HC-SR501
  • Sensore di luminosità LDR
  • Sensore di distanza ad ultrasuoni HC-SR04
  • Motore DC (corrente continua)
  • Robot a due ruote (RC car)
  • Convertitore Analogico-Digitale (AC/DC) MCP300x
  • BlueDot
  • Controllo Remoto dei GPIO
  • Sensore di linea TCRT5000
  • Buzzer acustico
  • Servo motore SG 90

Oltre a questi componenti la libreria può supportare moltissimi altri dispositivi esterni tramite l’estensione di specifiche classi.
In altre parole, il maker programmatore, può estendere la libreria per supportare dispositivi esterni non ancora presenti nella lista che abbiamo appena riportato.
Descriviamo ora l'uso della libreria per controllare due semplici dispositivi come un LED (Output) ed un pulsante (Input).
Faremo anche il confronto con la piattaforma Arduino evidenziando i vantaggi e l'alto livello di espressività della libreria GPIOZero.

Il LED

Il led appartiene alla classe dei dispositivi di output e viene modellato da una semplice interfaccia intuitiva.
Per esempio i metodi on() e off() permettono l’accensione  e lo spegnimento del led.


led.on() # accende il led
led.off() # spegne il led

Come si può notare, questi metodi non si riferiscono a uno specifico piedino GPIO ma sono un’astrazione delle caratteristiche reali del led.
Per esempio, un codice simile per la piattaforma Arduino potrebbe essere:


digitalWrite(13, HIGH); // accende il led
digitalWrite(13, LOW); // spegne il led

In questo caso l’astrazione è di più basso livello. Il codice imposta lo stato logico di uno specifico GPIO e non fa nessun riferimento all'uso del LED.
Chiaramente se al GPIO 13 è collegato un LED questo si accenderà e spegnerà.
Entrambe le soluzioni sono di semplice comprensione ma l’astrazione fornita dalla classe LED, della libreria GPIOzero, risulta più intuitiva e comprensibile anche per chi si è appena accostato al mondo della programmazione del Raspberry Pi.

Un altro esempio dell’intuitività fornita da GPIOZero è il lampeggio (blink) di un led.


led.blink() # fa lampeggiare il led per sempre con un periodo di 1 secondo

Il codice per la piattaforma Arduino sarebbe:


for(;;) { // ciclo infinito
    digitalWrite(13, HIGH); // accende il led
    delay(1000); // attende per 1000 ms
    digitalWrite(13, LOW);  // spegne il led
    delay(1000);  // attende per 1000 ms
}

Quindi, tramite l’uso della libreria GPIOZero ,il maker-programmatore può concentrarsi maggiormente sulla logica della sua applicazione di controllo, lasciando i dettagli implementativi alla libreria stessa.

Il Pulsante

Il pulsante appartiene alla classe dei dispositivi di input, e viene modellato da una semplice interfaccia intuitiva.
Per esempio il metodo wait_for_press() mette il programma di controllo in attesa della pressione di un pulsante.


pulsante.wait_for_press() # attende finché il pulsante non viene premuto
print(“Pulsante premuto!!!”) # esegue l’istruzione di stampa a video

La stessa funzionalità con Arduino può essere implementata in questo modo:


for(;;) { // ciclo infinito
    int pulsante = digitalRead(7); // legge lo stato logico del GPIO 7 a cui è collegato il pulsante
    if (pulsante == HIGH) // se lo stato logico del GPIO 7 diventa HIGH
        Serial.println(“Pulsante premuto!!!”); // stampa a video la stringa
}

In maniera analoga al LED anche per il pulsante il livello di astrazione è più basso. Questo codice legge lo stato logico di un GPIO e in caso diventi HIGH stampa il messaggio predefinito.
Confrontando le due porzioni di codice  è immediatamente evidente la semplicità d’utilizzo dell’interfaccia pulsante (Button). Inoltre GPIOZero permette la scrittura di un codice più compatto ed espressivo.

Il metodo wait_for_release() colloca il programma in attesa del rilascio di un pulsante.


pulsante.wait_for_release() # attende finché il pulsante non viene rilasciato
print(“Pulsante rilasciato!!!”) # esegue l’istruzione di stampa a video

Qui la versione per Arduino:


stato_pulsante = LOW; // iniaizlmente il pulsante non è premuto
for(;;) { // ciclo infinito
    int pulsante = digitalRead(7); // legge lo stato logico del GPIO 7 a cui è collegato il pulsante
    if (pulsante == HIGH && stato_pulsante == LOW) //il pulsante è stato premuto
        stato_pulsante = HIGH; // ricordo che il pulsante è premuto
    if (pulsante == LOW && stato_pulsante == HIGH) //il pulsante è stato rilasciato
        Serial.println(“Pulsante premuto!!!”);
}

Come è facile constatare per una funzionalità leggermente più complessa il codice in python è rimasto simile se non uguale al caso precedente mentre il codice per la piattaforma Arduino si è notevolmente complicato, non essendo più di immediata comprensione ai meno esperti.
Considerazioni analoghe possono essere fatte anche per tutti gli altri dispositivi supportati dalla libreria GPIOZero.

La numerazione dei pin

La numerazione dei pin, delle varie versioni di Raspberry Pi, che si sono succedute negli anni, è sempre stato un tema controverso.
Librerie diverse adottano, infatti, numerazioni differenti. Inoltre versioni differenti del Raspberry Pi hanno connettori GPIO e numerazioni diverse.

pinout BCM

Nello specifico, esistono due tipologie di numerazione dei pin GPIO:

  1. Numerazione fisica: i pin sono numerati sequenzialmente per colonna, assegnando il numero 1 al primo pin in basso a sinistra e il numero 2 al primo pin in alto a sinistra (guardando il connettore dall'alto). In figura i numeri all’interno del cerchietto colorato rappresentano la numerazione dei pin fisica.
  2. Numerazione BCM: la numerazione dei pin segue quella definita dal chip Broadcom del Raspberry Pi. BCM infatti significa Broadcom SOC channel. In figura la numerazione BCM è riportata nel rettangolo sotto ogni pin e preceduta dal prefisso GPIO.

A esempio il pin 7 in numerazione fisica corrisponde al pin 4 in numerazione BCM. Il pin fisico numero 32 corrisponde al GPIO12 in numerazione BCM.

È importante notare che la numerazione in figura è valida solo per i seguenti modelli:

  • Raspberry Pi Model B+
  • Raspberry Pi 2B
  • Raspberry Pi Zero
  • Raspberry Pi Zero W
  • Raspberry Pi 3B

Alcune librerie, permettono di impostare quale numerazione utilizzare.
La libreria GPIOZero, al contrario, non permette di selezionare la modalità di numerazione dei pin GPIO e usa solamente la numerazione BCM.

Installazione di GPIOZero

La libreria GPIOZero è distribuita e installata, per default, assieme al sistema operativo Raspbian Desktop.
Altri sistemi operativi, incluso Raspbian Lite, non forniscono la libreria in modo automatico.
In ogni caso è possibile installare la libreria GPIOZero in qualsiasi ambiente e sistema operativo che supporta Python.
Assumendo che python3 sia già precedentemente installato, l’installazione di GPIOZero è semplice e prevede pochi passi come segue.
Qualora non sia presente, dobbiamo installare il packet manager pip.

sudo curl https://bootstrap.pypa.io/get-pip.py | sudo python3

Ora possiamo verificare la corretta installazione digitando il comando nella prima riga della schermata a seguire. Dovremmo ottenere in risposta qualcosa di simile rispetto a quanto vediamo subito dopo il comando.
pip --version
pip 18.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

Per installare la libreria gpiozero per python3, potremo usare il comando:
sudo pip3 install gpiozero

E, ovviamente, potremo assicurarci che l'installazione della libreria GPIOZero sia andata a buon fine digitando ciò che vediamo al rigo seguente.
pip3 list | grep gpiozero

Se lo output del comando precedente sarà equivalente a ciò che vediamo immediatamente sotto questa riga, potremo considerare gpiozero pronto per essere utilizzato.
gpiozero 1.4.1

Conclusioni

In questa lezione abbiamo introdotto la libreria python GPIOZero, abbiamo visto quali sono i passi e le istruzioni per installarla su Raspberry Pi, pertanto abbiamo acquisito tutti gli elementi utili al fine di iniziare a gestire diversi tipi di dispositivi esterni tramite il Raspberry.
Nelle prossime lezioni descriveremo come impiegare GPIOZero per controllare dispositivi e sensori esterni.

Ti consigliamo anche