Nota

Ciao, benvenuto nella community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Immergiti più a fondo in Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime esclusive.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

2.2.8 Modulo Sensore a Ultrasuoni

Introduzione

Il sensore a ultrasuoni utilizza onde ultrasoniche per rilevare con precisione oggetti e misurare distanze. Invia onde ultrasoniche e le converte in segnali elettronici.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_2.2.5.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Ultrasuoni

ACQUISTA

Schema elettrico

../_images/image329.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image220.png

Passo 2: Vai alla cartella del codice.

cd ~/raphael-kit/c/2.2.8/

Passo 3: Compila il codice.

gcc 2.2.8_Ultrasonic.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Una volta eseguito il codice, il modulo sensore a ultrasuoni rileverà la distanza tra l’ostacolo di fronte e il modulo stesso, quindi il valore della distanza verrà stampato sullo schermo.

Nota

Se non funziona dopo l’esecuzione o compare un messaggio di errore: "wiringPi.h: No such file or directory", consulta Installazione e verifica di WiringPi.

Codice

#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>

#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){ //se l'inizializzazione di wiring fallisce, stampa un messaggio sullo 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

void ultraInit(void)
{
    pinMode(Echo, INPUT);
    pinMode(Trig, OUTPUT);
}

Inizializza i pin del sensore a ultrasuoni; contemporaneamente, imposta Echo come input e Trig come output.

float disMeasure(void){};

Questa funzione viene utilizzata per realizzare la funzione del sensore a ultrasuoni calcolando la distanza rilevata.

struct timeval tv1;
struct timeval tv2;

La struct timeval è una struttura utilizzata per memorizzare l’ora corrente. La struttura completa è la seguente:

struct timeval
{
__time_t tv_sec;        /* Secondi. */
__suseconds_t tv_usec;  /* Microsecondi. */
};

Qui, tv_sec rappresenta i secondi trascorsi dall’Epoch alla creazione della struct timeval. Tv_usec indica i microsecondi o una frazione di secondi.

digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);

Viene inviato un impulso ultrasonico di 10us.

while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);

Questo ciclo vuoto serve per garantire che, quando viene inviato il segnale di trigger, non vi siano segnali di eco interferenti, quindi ottiene l’ora corrente.

while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);

Questo ciclo vuoto assicura che non venga eseguito il passo successivo fino a quando non viene ricevuto il segnale di eco, quindi ottiene l’ora corrente.

time1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
time2  = tv2.tv_sec * 1000000 + tv2.tv_usec;

Converte il tempo memorizzato da struct timeval in microsecondi completi.

dis = (float)(time2 - time1) / 1000000 * 34000 / 2;

La distanza viene calcolata dall’intervallo di tempo e dalla velocità di propagazione del suono. La velocità del suono nell’aria è di 34000cm/s.

Immagine del fenomeno

../_images/image221.jpeg