INPUT SENSORE ULTRASUONI HC-SR04
Per costruire il seguente esempio abbiamo bisogno di un sensore ad ultrasuoni.
Codice Sorgente A
Obiettivo progetto: Implementare un programma C con arduino che calcola la distanza di un ostacolo rispetto al sensore ad ultrasuoni.
soluzione:
Per svolgere questo esempio occorre scaricare la libreria newping scaricabile qui. Per installarla occorre caricare il file zippato tramite il menu "Add Library", presente all'interno dell'IDE di Arduino, come mostrato nella figura sottostante.
Al termine dell'importazione i files contenuti in NewPing_v1.5.zip vengono ricopiati nella cartella C:\Users\<User>\Documents\Arduino\libraries. Se ci sono problemi nell'installazione occorre svuotare la cartella di libreria appena creata (NewPing) e ripetere l'operazione.
Le funzioni disponibili in tale libreria sono:
sonar.ping(); - Manda un ping e determina il tempo di echo come
risultato
sonar.ping_in(); - Manda un ping e determina la distanza in inches
(numero intero).
sonar.ping_cm(); - Manda un ping e determina la distanza in cm (numero
intero).
sonar.ping_median(iterations); - Effettua un multiplo ping (default=5), e
restituisce la media in microsecondi dei risultati ottenuti sui singoli ping.
sonar.convert_in(echoTime); - Converte il tempo di echo da uS a pollici.
sonar.convert_cm(echoTime); - Converte il tempo di echo da uS in cm.
sonar.ping_timer(function); - Manda un ping e chiama la funzione di test
per verificare se un ping è completo.
sonar.check_timer(); - Check if ping has returned within the set distance
limit.
NewPing::timer_us(frequency, function); - Chiama la funzione "function"
ogni "frequency" microsecondi.
NewPing::timer_ms(frequency, function); - Chiama la funzione "function"
ogni "frequency" milliecondi. .
NewPing::timer_stop(); - Ferma il timer
soluzione A
La prima proposta ha il difetto di mostrare continuamente la distanza anche se questa non cambia:
/* ----------------------------------------------------------------------------------- Dimostra l'uso del sensore ad ultrasuoni e calcola la distanza dell'ostacolo ----------------------------------------------------------------------------------- */ #include <NewPing.h> #define TRIGGER_PIN 12 // Pin di arduino collegato al pin "TRIGGER" del sensore a ultrasuoni #define ECHO_PIN 11 // Pin di arduino collegato al pin "ECHO" del sensore a ultrasuoni #define MAX_DISTANCE 200 // Massima distanza del ping (in centimetri) // La massima distanza supportata è circa 400-500 cm NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Setup del sensore (pin e massima // distanza=NewPing setup of pins and maximum distance. void setup() { Serial.begin(115200); // Apro il monitor seriale a 115200 baud per vedere i risultati del ping. } void loop() { delay(50); // effettuo 20 ping al secondo. 29ms è il ritardo minimo ammesso tra 2 ping. unsigned int uS = sonar.ping(); // Invia il ping e determina il tempo di echo in microsecondi (uS). Serial.print("Ping: "); Serial.print(uS / US_ROUNDTRIP_CM); // Converte il tempo di ping in distanza e mostra il risultato // (0 = corrisponde ad oltre il range / nessun echo sul ping) Serial.println("cm"); }
soluzione B
Poniamo dei controlli sulle variazioni per evitare i continui messaggi:
/* ----------------------------------------------------------------------------------- Dimostra l'uso del sensore ad ultrasuoni e calcola la distanza dell'ostacolo Evita l'uscita di continui messaggi mostrando solo le variazioni ----------------------------------------------------------------------------------- */ #include <NewPing.h> #define TRIGGER_PIN 12 // Pin di arduino collegato al pin "TRIGGER" del sensore a ultrasuoni #define ECHO_PIN 11 // Pin di arduino collegato al pin "ECHO" del sensore a ultrasuoni #define MAX_DISTANCE 200 // Massima distanza del ping (in centimetri) - La massima distanza supportata è circa 400-500 cm NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Setup del sensore (pin e massima distanza=NewPing setup of pins and maximum distance. unsigned int prec_cm=-1; void setup() { Serial.begin(115200); // Apro il monitor seriale a 115200 baud per vedere i risultati del ping. } void loop() { unsigned int cm; delay(500); // Aspetto 50ms tra 2 ping (effettuo 20 ping al secondo). 29ms è il ritardo minimo ammesso tra 2 ping. unsigned int uS = sonar.ping_median(5); // Invia un ping multiplo e restituisce il tempo medio di echo in microsecondi (uS). cm=uS / US_ROUNDTRIP_CM; if (cm!=prec_cm) { Serial.print("Ping: "); Serial.print(cm); // Stampo la distanza in cm Serial.println("cm"); } prec_cm=cm; }