Il 0% ha trovato utile questo documento (0 voti)
41 visualizzazioni28 pagine

04 GPIO pt2

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)
41 visualizzazioni28 pagine

04 GPIO pt2

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/ 28

Mod 18 –

Programmazione
Raspberry Pi
GPIO – parte 2
Raspberry Pi - GPIO
Interrupt VS Polling

• Il programma che abbiamo utilizzato per la gestione del pulsante ha un funzionamento


definito «Polling», vuol dire che continua a controllare lo stato attuale del pulsante ed effettua
un’azione quando viene premuto
• In questo primo modo lo stato del pulsante viene controllato ogni 0.3 millisecondi, un tempo
breve per un essere umano ma in realtà un tempo molto lungo per una macchina.
• Inoltre esiste la possibilità di perdere alcune pressioni del pulsante se queste avvengono entro
0.3 ms una dall’altra
• Al contrario l’interrupt è un segnale che «sveglia» la Raspberry Pi quando si verifica un
determinato evento, in questo caso ci interessa sapere quando il pulsante è stato premuto
• Ma cosa accade alla pressione del pulsante? Abbiamo visto che normalmente lo stato della
GPIO del pulsante è HIGH/True e diventa LOW/False nel momento in cui il pulsante viene
premuto
Raspberry Pi - GPIO
Interrupt VS Polling

• Un interrupt serve proprio a segnalare una variazione di questo tipo, da HIGH a LOW si parla di
FALLING (caduta) mentre al contrario da LOW a HIGH si parla di RISING (salita)

• Si tratterà quindi di dire al nostro programma di attendere che si verifichi un tale evento
tramite la funzione GPIO.wait_for_edge(PIN, EDGE)
Raspberry Pi - GPIO

ATTENZIONE! Questa istruzione è


bloccante quindi il vostro programma sarà
letteralmente bloccato in attesa
dell’evento e NON reagirà neanche al
CTRL+C da tastiera
NON FAR PARTIRE QUESTO PROGRAMMA
Raspberry Pi - GPIO
Gestione degli interrupt con RPi.GPIO

• Un interrupt permette di rilevare una transizione di stato che avviene su un pin della
GPIO, su Raspberry Pi qualsiasi porta GPIO programmabile può essere utilizzata come
interrupt a patto che venga dichiarata come GPIO di input
• GPIO.add_event_detect(channel, trigger) assegna ad una determinata GPIO
specificata nel parametro channel l’interrupt a cui deve reagire, infatti trigger può
essere GPIO.RISING, GPIO.FALLING oppure GPIO.BOTH
• GPIO.event_detected(channel) se utilizzata all’interno di un loop segnala tutti gli eventi
del tipo trigger assegnato per quel channel e non vengono persi neanche se la CPU sta
svolgendo altri compiti tuttavia la gestione tramite callback è migliore
• GPIO.remove_event_detect(channel) bisogna ricordarsi di eliminare l’evento assegnato
a quel determinato channel PRIMA di eseguire il cleanup delle GPIO
Raspberry Pi - GPIO
Importiamo i moduli necessari,
«signal» è necessario per gestire
correttamente il CRTL+C dell’utente

Questa funzione sarà richiamata


quando verrà premuto CTRL+C e
permette di terminare il programma

Questa è la callback, cioè la funzione


che verrà richiamata quando il tasto
viene premuto
Raspberry Pi - GPIO
Questa funzione è la vera novità e
permette al programma di reagire
soltanto quando il pulsante viene
premuto restando libero per il resto
del tempo

Continuo a voler sapere quando il


pulsante è stato premuto e quindi
quando si verifica un evento di FALLING

Assegniamo una funzione che dica al


programma cosa fare quando questo
evento viene rilevato

Bouncetime (in millisecondi) ci


In caso di CRTL+C sarà richiamata la funzione permette di evitare la reazione a più
signal_handler, dopo di che il programma principale va interrupt che si verificano in un lasso
in pausa e libera il processore di tempo molto ristretto
Raspberry Pi - GPIO
Esecuzione su Thread

• Un «thread» è un flusso di esecuzione separato dal programma principale che andrà ad


eseguire la porzione di codice che gli assegniamo

• Possiamo utilizzare questo metodo per far eseguire a thread separati la gestione di due
led per esempio
Raspberry Pi - GPIO
Definisco la funzione che verrà eseguita nel Thread. La funzione accetta
come input l’indice del led e termina quando la variabile globale running
diventa false

Per ogni led creo un thread, ognuno riceve come


argomento l’indice del led corrispondente. Metto tutti i
thread in una lista.

Faccio partire tutti i thread

Il programma principale non deve fare più niente, fanno tutto i Thread! Quindi gli dico
di aspettare che l’utente prema invio.

Il metodo join dice al programma principale di aspettare che il thread corrispondente


sia finito
Raspberry Pi - GPIO
Pulse Width Modulation (PWM)

• Il PWM è spesso utilizzato nell’ambito dell’automazione per il controllo dei motori, per
controllare led o altri dispositivi elettronici
• Gli output digitali possono assumere soltanto due valori (HIGH/LOW) e quindi led e altri
dispositivi collegati possono essere solo accesi o spenti
• Attraverso il PWM possiamo simulare la variazione del livello
di energia, ad ogni istante di tempo l’output digitale sarà
sempre HIGH o LOW ma all’interno di un periodo (definito
come il tempo tra due impulsi consecutivi) è possibile definire
per quanto tempo il segnale dovrà restare alto
• Il duty cycle è quindi il rapporto tra il tempo in cui il segnale
rimarrà alto rispetto alla durata totale e la durata del periodo
T è definita come l’inverso della frequenza f
• Un duty cycle del 50% per esempio indica un’onda quadra che
resterà alta per la metà del periodo
Raspberry Pi - GPIO
Inizializziamo un segnale PWM sulla
GPIO 12 che abbia una frequenza pari
a 100Hz

Inizializziamo anche il duty cycle a 0


quindi la prima onda quadra sarà
completamente al livello LOW

Incrementiamo prima il duty cycle da


0 a 100 con passo di 5

Tra un cambio di duty cycle e il


successivo aspettiamo 50 millisecondi

E poi lo decrementiamo da 95 a 0 a
ritroso togliendo -5 ogni volta

Prima di effettuare la cleanup delle


GPIO è necessario fermare la
generazione del PWM
Raspberry Pi - GPIO
Sense Hat

• E’ una scheda multifunzione che si collega


direttamente alle GPIO della scheda Raspberry Pi,
esistono altri «hat» come questo ognuno dei quali
utile per diversi scopi

• Questa scheda dispone di una griglia di led, di un


joystick e di alcuni sensori che le permettono di sentire
il mondo che la circonda

• Esiste un emulatore dell’intera scheda che può girare


sia sulla macchina virtuale che sulla Raspberry Pi vera
e propria così può essere utilizzata e testata pur non
avendola a disposizione
Raspberry Pi - GPIO
Sense Hat

• Addirittura esiste un sito web https://trinket.io/sense-


hat che simula la scheda Sense Hat

• La libreria per gestirla dispone esattamente delle


stesse funzioni sia che possediate una sense hat reale
sia che stiate usando l’emulatore

• L’unica differenza è nella prima riga per importare la


libreria, dovrete usare:
• from sense_hat import SenseHat se utilizzate la
scheda reale
• from sense_emu import SenseHat se utilizzate un
emulatore
Raspberry Pi - GPIO
Import della libreria per utilizzare la
senseHat emulata

Creazione dell’oggetto «sense» di tipo


SenseHat() da cui si possono richiamare
tutte le funzioni della libreria

I colori dei led sono fissati secondo la


notazione RGB dove ogni componente
di colore può variare tra 0 e 255

Con questa istruzione si «pulisce» la


matrice di led e la si colora tutta del
colore selezionato (in questo caso
bianco)
Raspberry Pi - GPIO

show_message() permette di Come parametri opzionali si possono


visualizzare un messaggio scorrevole esprimere:
sulla matrice di led • La velocità di scorrimento del testo
(più il numero è piccolo e più il testo
scorrerà veloce)
• Il colore del testo
• Il colore del background

La funzione clear() senza specificare alcun parametro


praticamente spegne i led della matrice
Raspberry Pi - GPIO

E’ anche possibile mostrare una sola lettera sulla matrice


tramite show_letter(), i parametri opzionali sono solo
text_colour e back_colour infatti la lettera non scorre e
quindi non si ha un parametro di velocità

Esercizio

• Visualizzare le lettere del proprio nome in sequenza una alla volta e tutte di colore diverso

• Definire una funzione che generi casualmente un colore in formato RGB invece che impostare
un colore fisso per ogni lettera
Raspberry Pi - GPIO
Per utilizzare randint in precedenza all’inizio
del file avevo già importato
«from random import randint»
Raspberry Pi - GPIO
La matrice di led della Sense Hat è
numerata come in figura dove x rappresenta
la colonna e y la riga

Si può accendere ogni singolo led di una


matrice specificandolo con le coordinate
(x,y) e assegnandoli un colore tramite la
funzione set_pixel()

Si può inoltre creare una matrice colore


assegnando ad ogni pixel un colore (green e
black in questo esempio) e poi impostarla
tutta insieme con la funzione set_pixels()
Raspberry Pi - GPIO

Esistono delle funzioni anche per ruotare e


specchiare tutta l’immagine proiettata sulla
matrice dei led:
• set_rotation(a) dove a può valere 0, 90,
180 o 270 e ruota l’immagine dell’angolo
specificato
• flip_h() e flip_v() specchiano l’immagine
rispettativamente rispetto ad un asse
orizzontale o rispetto ad un asse
verticale
Raspberry Pi - GPIO
Sulla Sense Hat sono presenti anche i
sensori di pressione e umidità il cui valore
può essere ottenuto tramite la funzione
get_pressure() e get_humidity()

La temperatura può essere ottenuta da uno dei due


sensori di pressione o di umidità tramite le funzioni
get_temperature_from_pressure() oppure
get_temperature_from_humidity()
Tuttavia essendo su una board simulata i due
risultati sono analoghi e lo stesso risultato può
essere ottenuto semplicemente da
get_temperature() (dove _from humidity è omesso
ma accede sempre al sensore di umidità)
La funzione round arrotonda il numero passato
come primo argomento al numero di cifre decimali
specificate dal secondo argomento
Raspberry Pi - GPIO
Esercizio

• Visualizzare i dati di temperatura, pressione e umidità in un testo scorrevole sulla matrice led

• Decidere un range di temperatura accettabile (tra 18.3 e 26.7) e visualizzare il messaggio su


sfondo verde se la temperatura è compresa nel range oppure su sfondo rosso se la
temperatura non è nel range

Per essere stampati i valori devono essere convertiti


a string e messi in serie uno all’altro tamite il +
Raspberry Pi - GPIO
Inertial Measurement Unit

• Abbreviato in IMU si tratta di un chip che contiene al


suo interno:
1. Un giroscopio che serve per capire come è
orientata la scheda
2. Un accelerometro che legge il movimento che
la scheda sta effettuando
3. Un magnetometro per rilevare il campo
magnetico terrestre

• L’orientamento della scheda è restituito dall’IMU


secondo tre angoli che esprimono le rotazioni:
1. Roll (Rollio) attorno all’asse x Conoscere le tre rotazioni è molto importante
perché permette di conoscere come l’oggetto in
2. Pitch (Beccheggio) attorno all’asse y esame sia effettivamente orientato
3. Yaw (Imbardata) attorno all’asse z
Raspberry Pi - GPIO
La funzione get_orientation() permette di
ottenere un oggetto che al suo interno
contiene le informazioni roll, pitch e yaw

Ogni singolo angolo può essere ottenuto


separatamente dall’oggetto o

{0}, {1} e {2} sono dei segnaposto che prendono gli


argomenti inseriti nel format in ordine
ATTENZIONE! Quando si utilizzano sensori di movimento
non bisogna utilizzare delle sleep all’interno del codice
perché per ottenere il corretto orientamento l’algoritmo
contenuto nell’IMU ha bisogno di molte letture
Raspberry Pi - GPIO

Anche l’accelerazione espressa secondo i tre


assi (x,y,z) può essere ottenuta tramite la
funzione get_accelerometer_raw()

Le accelerazioni lungo i tre assi possono essere


ottenute separatamente dall’oggetto acc
Raspberry Pi - GPIO
Joystick

• In ultimo la scheda Sense Hat dispone anche di un joystick che può rilevare le 4 direzioni
classiche rappresentate anche dalle frecce che ci sono sulla tastiera. Il click del joystick è invece
analogo al click del tasto invio sulla tastiera.
• Sulla Sense Hat emulata infatti il joystick è rappresentato proprio da questi simboli

Questo permette di rilevare ogni evento che


si verifichi a livello di movimento del
joystick

Viene rilevata sia la direzione in cui il


joystick è stato spostato che l’azione
compiuta, ovvero se è stato spostato in
quella direzione o se è tornato nella sua
posizione originale
Raspberry Pi - GPIO
Esercizio

• In base a quale direzione viene selezionata con il joystick visualizzare la lettera corrispondente
sulla matrice led, soltanto quando il tasto viene premuto

• Le event.action possono essere ‘’pressed’’ (premuto, su cui dovete agire e visualizzare la


lettera) e ‘’release’’ (rilasciato)

• Le event.direction invece possono essere:


• ‘’up’’: visualizzare la lettera U
• ‘’down’’: visualizzare la lettera D
• ‘’left’’: visualizzare la lettera L
• ‘’right’’: visualizzare la R
• ‘’middle’’: visualizzare la lettera M
Raspberry Pi - GPIO
Raspberry Pi - GPIO
E’ possibile definire delle funzioni e
associarle ad un particolare evento del
joystick in modo che siano richiamate
quando quell’evento si verifica

Potrebbero piacerti anche