Il 0% ha trovato utile questo documento (0 voti)
37 visualizzazioni27 pagine

04 GPIO pt1

Caricato da

ipasrl.guest
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
37 visualizzazioni27 pagine

04 GPIO pt1

Caricato da

ipasrl.guest
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 27

Mod 18 –

Programmazione
Raspberry Pi
GPIO – parte 1
Raspberry Pi - GPIO
• Tutti i modelli di Raspberry Pi recenti sono dotati di un header da 40 pin di porte GPIO
(General Purpose Input/Output)

• Per sapere di quali porte è dotato il vostro Raspberry Pi basta eseguire il comando «pinout»
da un terminale, fate attenzione che questo comando non può essere utilizzato dal sistema
su macchina virtuale in quanto effettivamente le GPIO non sono presenti

• Ogni pin della GPIO ha uno specifico significato, quelli fondamentali vengono già illustrati
visivamente a terminale
Raspberry Pi - GPIO
Cosa viene visualizzato sul terminale della Raspberry Pi? Numero porta scheda

Numero porta BCM


Uno schema della scheda Raspberry
Pi con le porte e i collegamenti a
disposizione dell’utente

Ogni porta può essere numerata in 2


modi, con il numero dell’uscita del
processore (BCM) o con la sua
disposizione fisica (Board), le
combinazioni non sono uguali per
tutti i modelli
Raspberry Pi - GPIO

• In rete si trovano diversi schemi delle GPIO


della Raspberry Pi che indicano le possibili
ulteriori funzioni a cui possono essere
dedicati alcuni pin

• NB: il pin numero 1 è sempre riconoscibile


sui circuiti stampati perché dal lato delle
saldature (il sotto della Raspberry) è
quadrato, così potete riconoscere facilmente
il lato corretto dei pin per effettuare i vostri
collegamenti
Raspberry Pi - GPIO
Pin di Voltaggio

• Sulla Raspberry Pi sono presenti due pin


per l’alimentazione a 5V

• Sono presenti inoltre due pin per


l’alimentazione a 3.3V

• Infine sono presenti diversi pin GND, ovvero


di terra (0V)

Tutti questi pin NON sono


configurabili, servono per
l’alimentazione delle componenti che
saranno collegate al Raspberry Pi
Raspberry Pi - GPIO
Fate attenzione!

• Tutte le rimanenti GPIO funzionano a 3.3 V! Non


vanno a 5V come le porte di Arduino e per
utilizzare i due pin a 5V si ha bisogno comunque
di circuiteria aggiuntiva.
• MAI cortocircuitare le GPIO di una Raspberry Pi!
Le GPIO di Raspberry sono MOLTO più delicate
di quelle di Arduino e non hanno
un’autoprotezione quindi bisogna prestare
attenzione ai collegamenti che si effettuano e al
codice che si scrive.
• La corrente massima erogabile è di 16mA e
quindi molto ridotta, non si devono collegare
componenti che assorbano potenza!
Raspberry Pi - GPIO

Fate attenzione!

• Collegare input a 5V al Raspberry lo


danneggerebbe e la scheda è molto più costosa
di Arduino
• Le GPIO della Raspberry Pi NON sono
plug&play! Effettuate tutte le connessioni
necessarie quando la scheda è SPENTA e solo
dopo accendetela tramite il suo alimentatore
Raspberry Pi - GPIO
Uscite
• Un pin della GPIO utilizzato come pin di
uscita può quindi essere impostato al valore
alto HIGH (3.3V) oppure al valore basso
LOW (0V)

Ingressi
• Allo stesso modo un pin della GPIO
impostato come pin di ingresso può essere
letto al valore alto HIGH (3.3V) oppure al
valore basso LOW (0V)

NON possono funzionare come segnali


analogici, servirebbe un chip ADC
dedicato
Raspberry Pi - GPIO
PWM
• Software: PWM disponibile su tutti i pin
• Hardware: PWM disponibile solo sulle
GPIO12, GPIO13, GPIO18 e GPIO19

SERIALE
• TX – GPIO14 e RX – GPIO15 sono i pin
dedicati alla comunicazione seriale
Raspberry Pi - GPIO
I2C
• Inter Integrated Circuit, è un protocollo
digitale di comunicazione tra circuiti
integrati
• Permette la connessione tra Raspberry Pi e
molti sensori utilizzati nel mondo
dell’automazione, come sensori di
temperatura, ranging sensors (per leggere
una distanza) o sensori di orientamento
(IMU – inertial measurment unit)
• La velocità di comunicazione non è elevata
e quindi sensori che richiedono di essere
letti molto frequente è preferibile che siano
collegati ad una comunicazione SPI
Raspberry Pi - GPIO
I2C
• La comunicazione I2C è costituita da un
classico bus di dati bidirezionale e necessita
di:
1. SDA (Serial DAta) sulla GPIO2 ed
utilizzato per i dati
2. SCL (Serial CLock) sulla GPIO 3 ed
utilizzato per il clock, vista la presenza
di un clock l’I2C è un bus sincrono
3. GND che funge da connessione di
riferimento
4. Vdd ovvero una linea di alimentazione
per i sensori collegati
Raspberry Pi - GPIO
SPI
• Serial Peripheral Interface, è uno standard
per lo scambio dati che sfrutta una
connessione seriale sincrona del tipo
Master-Slave
• I bit vengono trasmessi lungo il bus nello
stesso ordine in cui sono stati inviati e per
questo motivo si parla di comunicazione
«seriale»
• Le operazioni di trasmissione e ricezione
avvengono al tempo stabilito da un clock e
per questo si parla di comunicazione
«sincrona»
Raspberry Pi - GPIO
SPI
• La prima differenza con il protocollo I2C è la
velocità, questo tipo di comunicazione è
molto più veloce e quindi adatta anche a
leggere sensori che acquisiscono dati
aggiornati molto frequentemente, come le
letture di corrente o della posizione di un
motore
• La seconda differenza sta nel fatto che l’SPI
è un bus di tipo full-duplex, ovvero lo
scambio di dati può avvenire
contemporaneamente sia in trasmissione
che in ricezione. Per questo motivo sono
presenti due pin dedicati, MOSI E MISO
Raspberry Pi - GPIO
Linguaggi utilizzabili

• Python: è il linguaggio più diffusamente utilizzato vista la sua semplicità e versatilità di


utilizzo infatti il sistema operativo di Raspberry Pi lo prevede già in fase di installazione
con una libreria RPi che permette la gestione delle GPIO
• C/C++: è molto diffusa anche la programmazione C per Raspberry Pi specialmente in
applicazioni di «basso» livello, per esempio in cui si vanno a sviluppare loop di controllo
per motori, in quanto essendo un linguaggio compilato permette una migliore
performance in tali ambiti
• Essendo un computer in miniatura è comunque possibile programmare in una grande
varietà di linguaggi su Raspberry Pi, come Scratch, Processing, Java, .NET, Node.js, Perl,
Ruby, …)
Raspberry Pi - GPIO
Librerie per la gestione della GPIO

• RPi.GPIO (https://sourceforge.net/projects/raspberry-gpio-python/): è quella più


vecchia e supportata. Offre dei comandi molto semplici, simili a quelli disponibili per
l’Arduino. Non supporta le interfacce di comunicazione.
• RPIO (https://pythonhosted.org/RPIO/): una versione alternativa di Rpi.GPIO, ha alcune
funzioni più avanzate ma non è supportata da tutte le schede
• pigpio (http://abyz.me.uk/rpi/pigpio/): presenta sia una libreria C molto completa in
grado di gestire tutte le funzionalità della Raspberry Pi (comprese la comunicazione e i
PWM) sia un deamon che permette il controllo remoto delle porte attraverso socket di
rete, da un altro computer con la stessa libreria installata
• gpiozero (https://gpiozero.readthedocs.io/en/stable/): è quella più completa, offre
moltissime funzionalità e il supporto già implementato per un gran numero di
dispositivi. È anche la più complessa da usare.
Raspberry Pi - GPIO
Principali funzioni di RPi.GPIO
• GPIO.setMode(mode) questa funzione (obbligatoria) serve a informare la libreria su
quale tipo di notazione si usa sulle porte (GPIO.BOARD per usare i numeri effettivi dei
pin oppure GPIO.BCM per usare la numerazione di basso livello del chip)
• GPIO.setwarnings(False) questa funzione disabilita gli avvisi della libreria (di solito si
viene avvisati se si tenta di accedere ad una porta già in uso pertanto consiglio di non
utilizzarla, è meglio sapere se si fa qualche passo falso)
• GPIO.setup(channel, state) questa funzione imposta come saranno utilizzati i pin.
Richiede due argomenti obbligatori:
1. channel cioè il numero della porta
2. state che può essere GPIO.IN o GPIO.OUT. È possibile anche aggiungere elementi
facoltativi che dipendono dal valore di state: se state=GPIO.IN è possibile
impostare l’argomento pull_up_down=GPIO.PUD_UP oppure
pull_up_down=GPIO.PUD_DOWN per attivare le resistenze di pullup o pulldown
integrate da 10K; se invece state=GPIO.OUT è possibile impostare
initial=GPIO.HIGH oppure initial=GPIO.LOW per decidere lo stato iniziale
Raspberry Pi - GPIO
Principali funzioni di RPi.GPIO

• GPIO.input(channel) questa funzione ritorna True o False (GPIO.HIGH, GPIO.LOW) a


seconda dello stato della porta. Può essere usato anche su una porta di output per
verificarne lo stato
• GPIO.output (channel, value) questa funzione richiede due argomenti obbligatori
1. channel cioè il numero della porta
2. value cioè il valore dell’uscita (GPIO.HIGH, GPIO.LOW oppure True, False)
• GPIO.cleanup() va chiamata alla fine del programma per riportare tutte le porte allo
stato di default. Attenzione! Le porte restano attive anche quando il programma è
terminato!
Raspberry Pi - GPIO
Primi programmi Raspberry Pi

• Il primo passo è quello di collegare un LED (Light Emitting


Diode) e di farlo lampeggiare accendendolo e spegnendolo
periodicamente
• Il LED dispone di due terminali, un anodo (+) che andrà
collegato alla GPIO che lo controllerà e un catodo (-) che
andrà collegato a GND ma fate attenzione perché andrà
aggiunta una resistenza in serie nei collegamenti, una
resistenza da 150 Ohm dovrebbe bastare ma per sicurezza io
ne ho utilizzata una da 220 Ohm
• La resistenza è necessaria per non causare un sovraccarico di
corrente sulla GPIO, una resistenza più alta al limite porta una
minore luminosità del led, per effettuare i collegamenti se
non si vuole effettuare una saldatura permanente è sempre
meglio utilizzare una breadboard
Raspberry Pi - GPIO
Calcolare il valore della Resistenza

• Si utilizza la legge di Ohm:


• R = (Vin – Vled) / I
• R è il valore della resistenza MINIMA che dovremo
utilizzare
• Vin = 3.3V per i pin della GPIO di una Raspberry
• Vled varia in base al colore del led, il rosso per
esempio è 1.8V mentre il blu 3.0
• I è la corrente che vogliamo attraversi il led, i pin
della GPIO arrivano massimo a 16mA ma meglio
volerne richiedere solo 10mA quindi per questo
calcolo usare I = 0.01A
Raspberry Pi - GPIO
Importazione delle librerie necessarie,
time per gestire i tempi di attesa per
accendere e spegnere il led e GPIO
per le funzioni di gestione

Utilizzo la numerazione dei pin


nell’ordine che hanno sulla Raspberry

Utilizzare una variabile per definire il


numero del pin a cui è collegata la
raspberry è utile nel caso in cui si
decida poi di cambiare i collegamenti,
basterà aggiornare tale variabile
Raspberry Pi - GPIO
Per accendere e spegnere il led è
necessario controllare il valore di
output della GPIO e quindi bisogna
impostarlo come GPIO.OUT

Ripeto queste operazioni per 10 volte

Quando il pin assumerà il valore alto,


il LED sarà acceso, resterà acceso per
un secondo e poi abbassando il valore
del pin il LED si spegnerà per un altro
secondo

Alla fine ricordarsi di effettuare il


cleanup se sono stati modificati i
valori di alcune GPIO
Raspberry Pi - GPIO
Primi programmi Raspberry Pi

• Per leggere invece un valore dall’esterno il modo migliore è


collegarci un pulsante, in questo caso è stato utilizzato un
button switch
• Il collegamento corretto è quello visibile in figura, andrà
collegato con due piedini nel lato alto della breadboard e due
piedini nel lato basso
• I piedini nel lato basso saranno collegati uno a GND e l’altro
alla GPIO che sarà utilizzata per controllare la pressione del
pulsante
• ATTENZIONE! Dichiarate correttamente il pin che gestisce il
pulsante come INPUT, in certi casi dichiararlo come output
potrebbe causare un cortocircuito e danneggiare la scheda
Raspberry Pi
Raspberry Pi - GPIO
Il pulsante nel nostro caso d’esempio
è stato collegato al pin 11 utilizzando
la numerazione BOARD

Viene dichiarato come pin di INPUT e


viene impostato anche il pull up come
protezione alle GPIO

Leggo il valore in ingresso dal


pulsante e se rilevo che il pulsante è
stato premuto lo scrivo sul terminale.
Per default il valore dell’input quando
il pulsante non è premuto è HIGH
quindi True
Aspetto 0.3 secondi durante i quali un
In questo caso sto solo leggendo i
successivo clic del pulsante non
valori e non modificandoli quindi
sarebbe rilevato
cleanup() non sarebbe necessario
Raspberry Pi - GPIO

Se viene premuto ctrl+c il programma


terminerà correttamente senza
warning
Raspberry Pi - GPIO
Esercizio

• Combinare i due esempi visti per accendere e spegnere un led e per leggere la pressione di un
tasto
• Fare in modo che quanto il tasto viene premuto il led si accenda per un secondo e poi si
spenga
• Mantenere la sintassi del try … except … per gestire correttamente l’uscita dal programma e
pulire la GPIO all’uscita del programma
Raspberry Pi - GPIO
Raspberry Pi - GPIO
Il gioco di Simon

• In Simon, un giocatore vede una serie di luci lampeggiare e deve ricordare lo schema

• Si avvia inizialmente con una sola luce e il giocatore dovrà premere il bottone
corrispondente

• Ogni volta che il giocatore indovina la sequenza si aggiunge una luce casuale allo
schema per rendere il gioco più difficile
• Per generare un numero casuale in Python bisogna usare la libreria random con
import random
• Per generare numero casuale compreso tra due estremi A e B bisogna utilizzare la
funzione random.randint(A,B) in cui A e B sono compresi e possono essere
generati

Potrebbero piacerti anche