.. note::
Ciao, benvenuto nella comunità SunFounder per gli appassionati di Raspberry Pi, Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.
- **Impara & Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Accedi in anteprima agli annunci dei nuovi prodotti.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri ultimi prodotti.
- **Promozioni e Omaggi Festivi**: Partecipa a concorsi e promozioni in occasione delle festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti subito!
2.2.5 Sensore a Ultrasuoni
=============================
Introduzione
---------------
Il sensore a ultrasuoni utilizza onde ultrasoniche per rilevare oggetti con
precisione e misurare distanze. Emana onde ultrasoniche e le converte in
segnali elettronici.
Componenti
-------------
.. image:: img/list_2.2.5.png
Principio di Funzionamento
------------------------------
**Ultrasuoni**
Il modulo di misurazione a ultrasuoni offre una funzione di misurazione
senza contatto da 2cm a 400cm con una precisione di 3mm. Garantisce un
segnale stabile fino a 5m, che si indebolisce gradualmente fino a scomparire a 7m.
Il modulo include trasmettitori e ricevitori ultrasonici e un circuito di
controllo. I principi di base sono i seguenti:
(1) Utilizzare un flip-flop IO per gestire un segnale di livello alto di almeno 10μs.
(2) Il modulo invia automaticamente otto impulsi a 40kHz e rileva se c'è un
segnale di ritorno.
(3) Se il segnale ritorna, il livello alto dell’uscita IO indica il tempo
trascorso dall'emissione alla ricezione dell'onda ultrasonica. La distanza di
test è calcolata come = (tempo di livello alto x velocità del suono (340 m/s) / 2.
.. image:: img/image217.png
:width: 200
.. image:: img/image328.png
:width: 500
Il diagramma temporale è mostrato di seguito. È sufficiente fornire un
breve impulso di 10μs all'input trigger per avviare la misurazione della
distanza, quindi il modulo emetterà un ciclo di 8 onde ultrasoniche a 40 kHz
e attiverà l'eco. È possibile calcolare la distanza in base all’intervallo di
tempo tra l'invio del segnale di trigger e la ricezione del segnale di eco.
Formula: us / 58 = centimetri o us / 148 = pollici; oppure: distanza = tempo di
livello alto \* velocità (340 M/S) / 2; si consiglia di utilizzare un ciclo di
misurazione superiore a 60 ms per prevenire collisioni tra il segnale di trigger
e quello di eco.
.. image:: img/image218.png
:width: 800
Schema Elettrico
---------------------
.. image:: img/image329.png
Procedure Sperimentali
-------------------------
**Passo 1:** Costruisci il circuito.
.. image:: img/image220.png
:width: 800
**Passo 2:** Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.2.5/
**Passo 3:** Compila il codice.
.. raw:: html
.. code-block::
gcc 2.2.5_Ultrasonic.c -lwiringPi
**Passo 4:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Dopo aver eseguito il codice, il modulo del sensore a ultrasuoni rileva la
distanza tra l'ostacolo davanti e il modulo stesso, visualizzando il valore
della distanza sullo schermo.
.. note::
Se il programma non funziona o viene visualizzato un messaggio di errore: \"wiringPi.h: Nessun file o directory di questo tipo", consulta :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#include
#define Trig 4
#define Echo 5
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
float disMeasure(void)
{
struct timeval tv1;
struct timeval tv2;
long time1, time2;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);
time1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
time2 = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(time2 - time1) / 1000000 * 34000 / 2;
return dis;
}
int main(void)
{
float dis;
if(wiringPiSetup() == -1){ // quando l'inizializzazione di wiringPi fallisce, stampa un messaggio a schermo
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
while(1){
dis = disMeasure();
printf("%0.2f cm\n\n",dis);
delay(300);
}
return 0;
}
**Spiegazione del Codice**
.. code-block:: c
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
Inizializza i pin dell'ultrasuono; nel frattempo, imposta Echo come input
e Trig come output.
.. code-block:: c
float disMeasure(void){};
Questa funzione consente di misurare la distanza rilevata dal sensore
ultrasonico calcolando il tempo di ritorno.
.. code-block:: c
struct timeval tv1;
struct timeval tv2;
La struct timeval è una struttura utilizzata per memorizzare il tempo attuale.
La struttura completa è la seguente:
.. code-block:: c
struct timeval
{
__time_t tv_sec; /* Secondi. */
__suseconds_t tv_usec; /* Microsecondi. */
};
Qui, tv_sec rappresenta i secondi trascorsi dall'Epoch al momento della
creazione di struct timeval. Tv_usec indica i microsecondi, ovvero una
frazione di secondo.
.. code-block:: c
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
Viene inviato un impulso ultrasonico di 10 microsecondi.
.. code-block:: c
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);
Questo ciclo vuoto viene utilizzato per assicurarsi che, quando il segnale
di attivazione viene inviato, non ci siano segnali di eco interferenti,
quindi viene registrato il tempo attuale.
.. code-block:: c
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);
Questo ciclo vuoto serve a garantire che non venga eseguito il passo
successivo finché non viene ricevuto il segnale di eco; successivamente
viene registrato il tempo attuale.
.. code-block:: c
time1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
time2 = tv2.tv_sec * 1000000 + tv2.tv_usec;
Converte il tempo memorizzato dalla struct timeval in microsecondi totali.
.. code-block:: c
dis = (float)(time2 - time1) / 1000000 * 34000 / 2;
La distanza viene calcolata in base all'intervallo di tempo e alla velocità
di propagazione del suono. Velocità del suono nell'aria: 34000 cm/s.