Gestire linee gpio sul Raspberry pi
Sapiamo che le schede Raspberry Pi offrono un panorama di impiego molto ampio, grazie anche alla presenza di un connettore maschio a 40 pin (Raspberry Pi 1, 2, 3, Zero) che interfaccia la scheda a diverse tipologie di circuiti elettronici. Questa possibilità è data da una serie di linee GPIO che possono essere programmate anche con Python.
Cosa sono le linee GPIO
Le linee GPIO (general purpose input output) sono dei collegamenti tra il processore e i pin del connettore della scheda. Queste linee possono essere programmate sia per funzionare come porte di ingresso sia come porte di uscita. Alcune di queste linee hanno delle funzionalità aggiuntive infatti possono essere configurate come linee UART, SPI o I2C.
Pin function
Per conoscere la posizione e la denominazione delle linee GPIO nel connettore a 40 pin del Raspberry Pi utilizzo il comando pinout. Apriamo il terminale LxTerminal e digitiamo il seguente comando:
$ pinout
premiamo invio e dopo qualche istante avremo sul terminale la rappresentazione delle periferiche della scheda ed in particolare del connettore a 40 pin:
In verde sono elencate le linee GPIO, in grigio i pin collegati a GND, in rosso le linee di alimentazione a 5Vdc ed in celeste le linee di alimentazione a 3,3V
La programmazione delle porte IO può avvenire utilizzando diversi linguaggi di programmazione, ma naturalmente andremo ad utilizzare il linguaggio Python perché è quello che viene maggiormente usato su questa piattaforma (almeno credo!).
Gestire le linee GPIO con Python
Configurare pin Gpio in uscita
Per utilizzare le porte IO abbiamo a disposizione l’attributo GPIO del modulo RPi. Questo attributo mette a disposizione i metodi per definire una linea come ingresso o come uscita e ne permette di controllarne lo stato. Se è una linea di uscita è possibile porla a livello logico alto oppure basso, se è una linea di ingresso è possibile leggere il valore logico disponibile sul pin.
Per scrivere il programma Python usiamo Thonny, disponibile come software preinstallato nelle ultime versioni di Raspbian.
scriviamo la prima istruzione che definisce l’attributo GPIO
from RPi import GPIO
L’istruzione seguente, invece, è necessaria per definire il modo di riferimento del pin. In pratica possiamo riferirci ad un pin tramite la numerazione del connettore (da 1 a 40) o tramite la numerazione del processore (ad esempio gpioxx). Usando l’istruzione seguente utilizzeremo la numerazione gpio del processore
GPIO.setmode(GPIO.BCM)
quindi per definire il pin 40 (gpio21) come linea di uscita dovremmo scrivere la seguente istruzione:
GPIO.setup(21, GPIO.OUT)
il metodo setup accetta come primo argomento il numero della linea gpio, in questo caso la 21, che corrisponde al pin 40. Se avessi usato questa istruzione per definire il riferimento ai pin:
GPIO.setmode(GPIO.BOARD)
nel metodo setup avrei dovuto scrivere:
GPIO.setup(40, GPIO.OUT)
le due istruzioni precedenti producono lo stesso risultato, ovvero definire il pin 40 (gpio21) come una uscita.
Una volta definito il pin come linea digitale di output possiamo gestirne lo stato con la seguente istruzione:
#uscita a livello logico alto
GPIO.output(21, GPIO.HIGH)
#uscita a livello logico basso
GPIO.output(21, GPIO.LOW)
di seguito il codice completo:
from RPi import GPIO
import time
#tipo di riferimento, numerazione della cpu
GPIO.setmode(GPIO.BCM)
#imposto linea 21, pin 40, come uscita
GPIO.setup(21, GPIO.OUT)
#ciclo infinito
while (True):
#metto la linea 21 alta
GPIO.output(21, GPIO.HIGH)
#attendo 1 secondo
time.sleep(1)
#metto la linea 21 bassa
GPIO.output(21, GPIO.LOW)
#attendo 1 secondo
time.sleep(1)
Di seguito il circuito uttizzato per verificare la corretta esecuzione del codice
Configurare pin Gpio in ingresso
Allo stesso modo di come abbiamo configurato un pin in uscita possiamo utilizzare alcune semplici istruzioni per impostare un pin in ingresso. L’istruzione seguente configura la linea Gpio 20 (pin 38) come ingresso:
GPIO.setup(20, GPIO.IN)
Per leggere il livello logico presente sul pin dobbiamo utilizzare la seguente istruzione
GPIO.input(20)
Il seguente circuito permette di avere sul pin 38 (gpio20) un livello logico alto (+3.3Vdc) e premendo il pulsante un livello logico basso (0Vdc).
Il codice per verificare lo stato del pin è il seguente:
from RPi import GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN)
while (True):
if GPIO.input(20)== False:
print ("Pulsante premuto")
Ogni volta che premeremmo il pulsante verrà printata la stringa “Pulsante premuto”.
Queste che abbiamo visto sono le istruzioni basilari che ci permettono di interfacciare il Raspberry Pi al mondo esterno utilizzando le linee GPIO come ingressi e uscite digitali.