.. note::
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 [|link_sf_facebook|] e unisciti oggi stesso!
.. _3.1.3_c_pi5:
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.
.. image:: ../img/list_Reversing_Alarm.png
:align: center
È sicuramente conveniente acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ELEMENTI IN QUESTO KIT
- LINK
* - Kit Raphael
- 337
- |link_Raphael_kit|
Puoi anche acquistarli separatamente dai link sottostanti.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE COMPONENTE
- LINK PER L'ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_buzzer`
- \-
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_ultrasonic_sensor`
- |link_ultrasonic_buy|
* - :ref:`cpn_i2c_lcd`
- |link_i2clcd1602_buy|
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
============ ======== ======== ===
.. image:: ../img/Schematic_three_one3.png
:align: center
Procedure sperimentali
----------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../img/image242.png
**Passo 2:** Vai alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.3/
**Passo 3:** Compila il codice.
.. raw:: html
.. code-block::
gcc 3.1.3_ReversingAlarm.c -lwiringPi
**Passo 4:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
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.
.. note::
* Se viene visualizzato un messaggio di errore ``wiringPi.h: No such file or directory``, consulta :ref:`install_wiringpi_pi5`.
* Se viene visualizzato l'errore ``Unable to open I2C device: No such file or directory``, consulta :ref:`i2c_config` 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**
.. note::
I seguenti codici sono incompleti. Se desideri controllare il codice completo,
ti consigliamo di usare il comando nano 3.1.1_ReversingAlarm.c.
.. code-block:: c
#include
#include
#include
#include
#include
#include
#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**
.. code-block:: c
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.
.. code-block:: c
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.
.. code-block:: c
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.
.. code-block:: c
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
---------------------------
.. image:: ../img/image243.jpeg
:align: center