.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.
**Warum beitreten?**
- **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
- **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
- **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.
👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!
.. _3.1.3_c:
3.1.3 Rückwärtsfahrwarnung
===============================
Einleitung
-------------
In diesem Projekt werden wir ein LCD, einen Summer und Ultraschallsensoren verwenden, um ein Rückfahrassistenzsystem zu erstellen. Wir können es auf ein ferngesteuertes Fahrzeug setzen, um den tatsächlichen Vorgang des Rückwärtsfahrens eines Autos in die Garage zu simulieren.
Benötigte Komponenten
------------------------------
Für dieses Projekt benötigen wir die folgenden Komponenten.
.. image:: ../img/list_Reversing_Alarm.png
:align: center
Es ist definitiv praktisch, ein ganzes Kit zu kaufen. Hier ist der Link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Name
- ARTIKEL IN DIESEM KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Sie können sie auch einzeln über die untenstehenden Links kaufen.
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUF-LINK
* - :ref:`cpn_gpio_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|
Schaltplan
--------------------
Der Ultraschallsensor erfasst die Entfernung zwischen sich selbst und dem Hindernis, die in Form von Code auf dem LCD angezeigt wird. Gleichzeitig lässt der Ultraschallsensor den Summer je nach Entfernungsangabe einen Hinweiston unterschiedlicher Frequenz ausgeben.
============ ======== ======== ===
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
Experimentelle Verfahren
----------------------------
**Schritt 1:** Schaltkreis aufbauen.
.. image:: ../img/image242.png
**Schritt 2:** Verzeichnis wechseln.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.3/
**Schritt 3:** Kompilieren.
.. raw:: html
.. code-block::
gcc 3.1.3_ReversingAlarm.c -lwiringPi
**Schritt 4:** Starten.
.. raw:: html
.. code-block::
sudo ./a.out
Wenn der Code läuft, erfasst das Ultraschallsensormodul die Entfernung zum Hindernis und zeigt die Informationen über die Entfernung auf dem LCD1602 an. Außerdem gibt der Summer einen Warnton aus, dessen Frequenz sich mit der Entfernung ändert.
.. note::
* Wenn der Fehlerhinweis ``wiringPi.h: No such file or directory`` erscheint, beziehen Sie sich bitte auf :ref:`install_wiringpi`.
* Wenn der Fehler ``Unable to open I2C device: No such file or directory`` auftritt, sollten Sie sich auf :ref:`i2c_config` beziehen, um I2C zu aktivieren und zu überprüfen, ob die Verkabelung korrekt ist.
* Wenn der Code und die Verkabelung in Ordnung sind, das LCD aber immer noch keinen Inhalt anzeigt, können Sie das Potentiometer auf der Rückseite drehen, um den Kontrast zu erhöhen.
**Code**
.. note::
Der folgende Code ist unvollständig. Wenn Sie den vollständigen Code überprüfen möchten,
empfehlen wir, den Befehl nano 3.1.1_ReversingAlarm.c zu verwenden.
.. 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;
//here is the function of 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[]){...}
//here is the function of Ultrasonic
void ultraInit(void){...}
float disMeasure(void){...}
//here is the main function
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;
}
**Code-Erklärung**
.. code-block:: c
pinMode(Buzzer,OUTPUT);
fd = wiringPiI2CSetup(LCDAddr);
lcdInit();
ultraInit();
In diesem Programm verwenden wir vorherige Komponenten synthetisch. Hier nutzen wir
Summer, LCD und Ultraschall. Wir können sie genauso initialisieren wie zuvor.
.. 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);
}
Hier holen wir uns den Wert des Ultraschallsensors und berechnen die Entfernung.
Wenn der Wert der Entfernung größer ist als der zu erkennende Bereichswert,
wird eine Fehlermeldung auf dem LCD angezeigt. Wenn der Entfernungswert
innerhalb des Bereichs liegt, werden die entsprechenden Ergebnisse ausgegeben.
.. code-block:: c
sprintf(result,"%.2f cm",dis);
Da der Ausgabemodus des LCD nur den Zeichentyp unterstützt und die
Variable dis den Wert des Float-Typs speichert, müssen wir sprintf() verwenden.
Die Funktion konvertiert den Wert des Float-Typs in einen Charakter und speichert ihn
in der String-Variable result[]. %.2f bedeutet, zwei Dezimalstellen beizubehalten.
.. 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);
}
}
Diese Bedingung wird verwendet, um den Ton des Summers zu steuern.
Je nach Entfernungsunterschied gibt es drei Fälle, in denen unterschiedliche
Tonfrequenzen auftreten werden. Da der Gesamtwert von delay 500 beträgt, können alle
Fälle dem Ultraschallsensor ein 500 ms-Intervall bieten.
Phänomen-Bild
--------------------
.. image:: ../img/image243.jpeg
:align: center