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!

3.1.3 Allarme di Retromarcia

Introduzione

In questo progetto, utilizzeremo un display LCD, un buzzer e dei sensori a ultrasuoni per realizzare un sistema di assistenza alla retromarcia. Potremo montarlo su un veicolo telecomandato per simulare il processo reale di retromarcia nel garage.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_Reversing_Alarm.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

Resistore

ACQUISTA

Cicalino

-

Transistor

ACQUISTA

Modulo Ultrasuoni

ACQUISTA

I2C LCD1602

ACQUISTA

Schema elettrico

Il sensore a ultrasuoni rileva la distanza tra sé e l’ostacolo, che verrà visualizzata sull’LCD in forma numerica. Allo stesso tempo, il sensore a ultrasuoni farà emettere al buzzer un segnale acustico di diversa frequenza in base al valore della distanza rilevata.

T-Board Name

physical

wiringPi

BCM

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

GPIO17

Pin 11

0

17

SDA1

Pin 3

SCL1

Pin 5

../_images/Schematic_three_one3.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image242.png

Passo 2: Vai alla cartella del codice.

cd ~/raphael-kit/c/3.1.3/

Passo 3: Compila il codice.

gcc 3.1.3_ReversingAlarm.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Una volta eseguito il codice, il modulo sensore a ultrasuoni rileverà la distanza dall’ostacolo e visualizzerà le informazioni sulla distanza sull’LCD1602; inoltre, il buzzer emetterà un tono di avviso la cui frequenza varierà in base alla distanza.

Nota

  • Se viene visualizzato un messaggio di errore wiringPi.h: No such file or directory, consulta Installazione e verifica di WiringPi.

  • Se viene visualizzato l’errore Unable to open I2C device: No such file or directory, consulta Configurazione I²C per abilitare l’I2C e verifica che il cablaggio sia corretto.

  • Se il codice e il cablaggio sono corretti, ma l’LCD non visualizza ancora contenuti, prova a ruotare il potenziometro sul retro per aumentare il contrasto.

Codice

Nota

I seguenti codici sono incompleti. Se desideri controllare il codice completo, ti consigliamo di usare il comando nano 3.1.1_ReversingAlarm.c.

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

#define Trig    4
#define Echo    5
#define Buzzer  0

int LCDAddr = 0x27;
int BLEN = 1;
int fd;

//Funzione per il controllo dell'LCD
void write_word(int data){...}

void send_command(int comm){...}

void send_data(int data){...}

void lcdInit(){...}

void clear(){...}

void write(int x, int y, char data[]){...}

//Funzione per il sensore a ultrasuoni
void ultraInit(void){...}

float disMeasure(void){...}

//Funzione principale
int main(void)
{
    float dis;
    char result[10];
    if(wiringPiSetup() == -1){
        printf("setup wiringPi failed !");
        return 1;
    }

    pinMode(Buzzer,OUTPUT);
    fd = wiringPiI2CSetup(LCDAddr);
    lcdInit();
    ultraInit();

    clear();
    write(0, 0, "Ultrasonic Starting");
    write(1, 1, "By Sunfounder");

    while(1){
        dis = disMeasure();
        printf("%.2f cm \n",dis);
        digitalWrite(Buzzer,LOW);
        if (dis > 400){
            clear();
            write(0, 0, "Error");
            write(3, 1, "Out of range");
            delay(500);
        }
        else
        {
            clear();
            write(0, 0, "Distance is");
            sprintf(result,"%.2f cm",dis);
            write(5, 1, result);

            if(dis>=50)
            {delay(500);}
            else if(dis<50 & dis>20) {
                for(int i=0;i<2;i++){
                digitalWrite(Buzzer,HIGH);
                delay(50);
                digitalWrite(Buzzer,LOW);
                delay(200);
                }
            }
            else if(dis<=20){
                for(int i=0;i<5;i++){
                digitalWrite(Buzzer,HIGH);
                delay(50);
                digitalWrite(Buzzer,LOW);
                delay(50);
                }
            }
        }
    }

    return 0;
}

Spiegazione del Codice

pinMode(Buzzer,OUTPUT);
fd = wiringPiI2CSetup(LCDAddr);
lcdInit();
ultraInit();

In questo programma, applichiamo componenti già utilizzati in precedenza. Qui usiamo buzzer, LCD e ultrasuoni. Li inizializziamo nello stesso modo in cui abbiamo fatto in precedenza.

dis = disMeasure();
printf("%.2f cm \n",dis);
digitalWrite(Buzzer,LOW);
if (dis > 400){
     write(0, 0, "Error");
     write(3, 1, "Out of range");
}
else
{
    write(0, 0, "Distance is");
    sprintf(result,"%.2f cm",dis);
    write(5, 1, result);
    }

Otteniamo il valore del sensore a ultrasuoni e calcoliamo la distanza.

Se il valore della distanza è maggiore del valore massimo rilevabile, un messaggio di errore viene visualizzato sull’LCD. Se invece la distanza è all’interno del range, i risultati corrispondenti verranno visualizzati.

sprintf(result,"%.2f cm",dis);

Poiché l’LCD supporta solo l’output di tipo carattere e la variabile dis memorizza il valore di tipo float, utilizziamo sprintf(). La funzione converte il valore di tipo float in un carattere e lo memorizza nella variabile stringa result[]. %.2f significa mantenere due cifre decimali.

if(dis>=50)
{delay(500);}
else if(dis<50 & dis>20) {
    for(int i=0;i<2;i++){
    digitalWrite(Buzzer,HIGH);
    delay(50);
    digitalWrite(Buzzer,LOW);
    delay(200);
    }
}
else if(dis<=20){
    for(int i=0;i<5;i++){
    digitalWrite(Buzzer,HIGH);
    delay(50);
    digitalWrite(Buzzer,LOW);
    delay(50);
    }
}

Questa condizione di giudizio viene utilizzata per controllare il suono del buzzer. In base alla differenza di distanza, il tono varia in tre diversi casi, con diverse frequenze. Poiché il valore totale del delay è 500ms, tutti i casi forniscono un intervallo di 500ms per il sensore a ultrasuoni.

Immagine del Fenomeno

../_images/image243.jpeg