Sperando di fare cosa utile ad altri amici "arduinomani" più o meno alle prime armi, vi posto una libreria che ho realizzato per semplificare al massimo la gestione del sensore di distanza ad ultrasuoni. Mi sono avvicinato ad Arduino da poco (e con entusiasmo!) ma sono un "vecchio" programmatore per cui mi piace cercare di creare oggetti riutilizzabili. Chiaramente sono aperto a qualsiasi critica e/o proposte di miglioramento.
Per prima cosa ovviamente bisogna collegare il sensore correttamente (Vcc e GND, più 2 pin digitali uno per Trig l'altro per Echo).
La classe si chiama SRF05 (nel mio caso uso un HY-SRF05 ma funziona anche per gli SR04).
Iniziamo da un piccolo sketch per mostrare l'uso:
#include "SRF05.h"
// TrigPin, EchoPin, <MaxDistance>, <ReadInterval>
SRF05 Sensor(6, 7, 200, 500);
void setup() {
Serial.begin(9600);
}
void loop() {
// Leggo la distanza
if ( Sensor.Read() > -1 ) {
// Ha fatto una nuova lettura!
if ( Sensor.Distance == 0 ) {
Serial.println("Fuori portata");
} else {
// -------------
Serial.print("Dist: ");
Serial.print(Sensor.Distance);
Serial.println(" cm");
}
}
}
Come si vede, basta creare l'oggetto SRF05 specificando i parametri di configurazione, nell'ordine:
- TrigPin: pin digitale collegato a Trig
- EchoPin: pin digitale collegato a Echo
- MaxDist: distanza massima di misurazione (cm); opzionale, default=300 (3mt)
- ReadInterval: intervallo tra acquisizioni (millis); opzionale, default=0
I primi due non hanno bisogno di spiegazioni.
Il terzo penso sia abbastanza chiaro, comunque specifica la distanza massima che vogliamo misurare, ossia si specifica il valore massimo per il quale il sensore fornisce risultati affidabili.
Per l'ultimo bisogna spiegare meglio. Generalmente il sensore si utilizza per oggetti in movimento, per i quali non è generalmente necessario effettuare misurazioni ad ogni ciclo di loop (anche per evitare di far perdere tempo alla CPU). Per semplificare questa gestione, ho implementato quindi un metodo per evitare misurazioni ad intervalli di tempo inferiori a "readInterval". Se vogliamo usare la libreria per leggere continuamente dal sensore, basta impostare a zero il parametro.
Passiamo quindi all'uso.
Come vedete, ha un solo metodo, "Read()" il quale restituisce la distanza misurata, in centimetri.
Se viene invocato prima di "readInterval" millisecondi, la Read() restituisce il valore "-1" che significa "non è ancora tempo di leggere la distanza, non mi rompere". 8)
Se viene invocato oltre il tempo minimo, effettua la nuova lettura e restituisce la nuova distanza.
Se il sensore non rileva ostacoli o l'ostacolo si trova ad una distanza maggiore di "MaxDist", il metodo restituisce zero.
Oltre al valore restituito dalla Read() sono disponibili varie proprietà pubbliche, ossia i parametri del costruttore più l'ultima distanza misurata:
- int TrigPin;
- int EchoPin;
- long MaxDistance;
- long ReadInterval;
- long Distance; // l'ultima lettura effettuata dalla Read()
Una sola nota: non so se sia l'SRF05 che ho a comportarsi in questo modo, ma quando il sensore non rileva alcun eco (es. puntato verso l'alto) ossia "fuori portata", come distanza mi restituisce alternativamente 0 e 3 cm. Per cui nella libreria ho inserito una piccola "patch" secondo me inoffensiva, secondo la quale se la lettura precedente è zero e quella attuale è 3 cm, la considera 0 (fuori portata).
In allegato trovate la libreria. Attendo vostri commenti (siate buoni!).