In questa lezione sarà trattata la rilevazione della distanza di un oggetto tramite l'utilizzo di un sensore ultrasonico HC-SR04 e della libreria GPIOZero.
Il sensore ultrasonico HC-SR04
Il sensore HC-SR04 permette di rilevare un oggetto fino a circa 2 metri valutandone la distanza relativa.
Il principio di funzionamento sfrutta la rifrazione dei segnali. In pratica il sensore emette un segnale ad ultrasuoni (40 KHz) e misura il tempo che il segnale impiega per tornare indietro al sensore.
Essendo la velocità del suono costante nell'aria, allora tale tempo sarà proporzionale alla distanza tra il sensore e l'oggetto che ha riflesso il segnale iniziale.
Circuito e adattamento livelli logici
Il sensore funziona a 5V mentre i GPIO del Raspebrry Pi a 3,3V. Per tale motivo non è possibile collegarli direttamente pena il danneggiamento del Raspberry Pi o comunque del circuito collegato al GPIO.
Adottiamo quindi un semplice stratagemma per adattare il livello da 5V a 3,3V.
Le tre resistenze di egual valore (470 Ohm) formano un partitore di tensione che riduce la tensione di 1/3 trasformando quindi i 5V in uscita dal pin echo a circa 3,3V.
Le tre resistenze non devono essere necessariamente da 470 Ohm, possiamo selezionare altri valori commerciali (330 Ohm, 1K Ohm). È tuttavia importante, come abbiamo detto, che siano tutte e tre dello stesso valore. Vediamo i collegamenti da effettuare.
Collegamenti
Colleghiamo il pin VCC del sensore a 5V erogati dal Raspberry Pi. In modo analogo colleghiamo il pin GND al rispettivo pin della scheda.
Poi colleghiamo il GPIO 23 al pin trigger del sensore.
Mentre il pin echo del sensore va collegato al partitore di tensione, realizzato con le tre resistenze, come in figura. Infine il partitore lo colleghiamo al GPIO 24.
La classe DistanceSensor
Il sensore a ultrasuoni HC-SR04, all'interno della libreria GPIOZero, appartiene alla classe dei dispositivi di input (SmoothedInputDevice).
Il costruttore della classe ha la sintassi seguente.
DistanceSensor(pin=None,
queue_len=30,
max_distance=1,
threshold_distance=0.3,
partial=False,
pin_factory=None)
- pin: è un parametro obbligatorio di tipo integer che rappresenta il numero del pin in numerazione BCM a cui è collegato il sensore;
- queue_len: è un parametro facoltativo di tipo integer che rappresenta la lunghezza della coda utilizzata per memorizzare le letture passate del sensore. Di default è impostato a 30;
- max_distance: è un parametro facoltativo di tipo float. Rappresenta la massima distanza misurabile. Il valore di default è 1 metro;
- threshold_distance: è un parametro facoltativo di tipo float che rappresenta la soglia entro la quale un oggetto viene considerato all'interno del range. Normalmente non è necessario modificare questo parametro;
- partial: è un parametro facoltativo di tipo boolean impostato per default a False. Quando è impostato a False il valore della proprietà is_active viene restituito solo nel caso in cui la coda interna sia piena (lettura bloccante). Qualora sia impostato a True la lettura è non bloccante quindi il valore is_active viene calcolato solo con i valori presenti nella coda interna senza attendere il suo riempimento;
- pin_factory: è un parametro facoltativo solo per uso avanzato. Permette di specificare un GPIO pin factory differente da quella fornita da GPIOZero.
I metodi e le proprietà più importanti della classe sono i seguenti:
wait_for_in_range(timeout=None) | Sospende l'esecuzione fino a quando il sensore non rileva un oggetto all'interno del range d'azione o il timeout è scaduto. |
wait_for_out_of_range(timeout=None) | Sospende l'esecuzione fino a quando il sensore non rileva un oggetto fuori dal range d'azione o il timeout è scaduto. |
when_in_range | Funzione che viene eseguita quando il sensore rileva un oggetto che entra nel range d'azione. |
when_out_of_range | Funzione che viene eseguita quando il sensore rileva un oggetto che esce dal range d'azione. |
Rilevazione oggetto nel range
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(echo=24, trigger=23)
print("Rilevazione oggetto.....")
sensor.wait_for_in_range()
print("Oggetto rilevato nel range d'azione!!!!")
In questo primo esempio, realizziamo un semplice rilevatore di presenza di un oggetto.
Instanziamo la classe DistanceSensor specificando che il pin di trigger è collegato al GPIO 23, mentre il pin echo è collegato al GPIO 24.
Una volta che il sensore è attivato, rimaniamo in attesa che un oggetto entri nel range d'azione del sensore.
Rilevazione oggetto fuori dal range
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(echo=24, trigger=23)
print("Tracking oggetto.....")
sensor.wait_for_out_of_range()
print("Oggetto fuori dal range!!!!")
Questo esempio è analogo al precedente, solo che invochiamo il metodo wait_for_out_of_range, andando quindi ad attendere che un oggetto, presente nel range d'azione del sensore, ne fuoriesca.
Rilevatore ostacolo
from gpiozero import DistanceSensor
from time import sleep
from signal import pause
sensor = DistanceSensor(echo=24, trigger=23)
def oggetto_in_range():
print("Oggetto entrato nel range d'azione!!!")
def oggetto_out_range():
print("Oggetto uscito dal range d'azione!!!")
print("Inizio tracking oggetto....")
sensor.when_in_range = oggetto_in_range
sensor.when_out_of_range = oggetto_out_range
pause()
In questo esempio, invece, realizziamo un semplice rilevatore d'ostacolo simile in linea di principio, a quelli che si trovano installati nei paraurti delle automobili.
Tramite i metodi when_in_range e when_out_of_range, specifichiamo due funzioni da eseguire rispettivamente quando un oggetto entra nel range d'azione o quando ne esce.
In questo modo per esempio, possiamo pilotare una sirena o un cicalino, che ci indicano con un segnale acustico l'eccessiva vicinanza a un oggetto.
Conclusioni
In questa lezione abbiamo visto come adattare i livelli logici da 5V a 3,3V per non danneggiare i pin del Raspberry Pi.
Tramite l'uso di un sensore a ultrasuoni e la libreria GPIOZero abbiamo illustrato come realizzare un rilevatore presenza di un oggetto in un range.
Infine abbiamo realizzato un semplice rilevatore d'ostacolo, simile a quelli presenti nelle auto moderne.
Con questa lezione si conclude il ciclo relativo alla programmazione del Raspberry Pi nonché del suo connettore GPIO.
Nella guida abbiamo analizzato, tanto teoricamente quanto con esempi pratici, l'uso delle principali classi della libreria GPIOZero. Abbiamo, inoltre, interfacciato sensori di input come il pulsante, il rilevatore di presenza PIR, attuatori in output come relè e led.
Attraverso le varie lezioni abbiamo anche appreso come la libreria GPIOZero fornisca un'interfaccia di programmazione chiara e di facile utilizzo.
Un suggerimento conclusivo per il lettore: "continuare a sperimentare e realizzare progetti con due, tre o persino un numero superiore di sensori e attuatori".
Partendo dagli esempi trattati in questa guida il lettore può sviluppare le sue competenze passando alla realizzazione di progetti via via più complessi.
Buona sperimentazione!!!