Hinderniswarnsystem für Fahrzeug: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 52: Zeile 52:


== Umsetzung (HW/SW) ==
== Umsetzung (HW/SW) ==
<code>
/*************************************************************************************************
*                                                                                                *
* Datei          : Projekt_Hinderniserkennung_IDE_Sketch.ino                                    *
*                                                                                                * 
* Datum          : 14-11-2020                                                                  *
*                                                                                                *
* Funktion        : Programmcode für das Projekt Hinderniswarnsystem im Studiengang              *
*                  "Business and Systems Engineering" der Hochschule                            *
*                  Hamm-Lippstadt im Wintersemester 20/21                                      *
*                                                                                                *
* Implementation  : Arduino IDE 1.8.13                                                          *
*                                                                                                *
* Autoren        : Matthias Rassenhövel                                                        *           
*                  Lars Vienenkötter                                                            *             
*                                                                                                * 
* Link            : https://wiki.hshl.de/wiki/index.php/Hinderniswarnsystem_f%C3%BCr_Fahrzeug    *
*                                                                                                *
* Letzte Änderung : 04-12-2020                                                                  *
*                                                                                                *
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
/*************************************************************************************************
  Einbinden der Bibliotheken
*************************************************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
/*************************************************************************************************
  Definition der Ein- und Ausgänge
*************************************************************************************************/
const int trigPin = 2;      //Trigger-Pin des Ultraschallsensors
const int echoPin = 3 ;    //Echo-Pin des Ultraschallsensors
const int sdaPin = A4;      //SDA-Pin des I2C-LCD
const int sclPin = A5;      //SCL-Pin des I2C-LCD
const int buzzPin = 9;      //Buzzer-Pin (PWM für verschiedene Frequenzen)
const int redPin = 10;      //Pin für Rot der RGB-LED (PWM für verschiedene Lichtstärken)
const int greenPin = 6;    //Pin für Grün der RGB-LED (PWM für verschiedene Lichtstärken)
const int bluePin = 5;      //Pin für Blau der RGB-LED (PWM für verschiedene Lichtstärken)
const int ldrPin = A1;      //Pin für LDR-Sensor
const int ledPin = 8;      //Pin LED-Scheinwerfer für rechts und links
//const int servoPin = 11;  //Servo-Pin
/*************************************************************************************************
  Definition der globalen Variablen
*************************************************************************************************/
double Dauer = 0.0;
double Distanz = 0.0;
double Servoposition = 0.0;
double ldrWert = 0.0;
/*************************************************************************************************
  Weitere Einstellungen:
*************************************************************************************************/
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);  //Initialisierung LCD-Display
//Servo servo;                                            //Initialisierung Servo-Motor
/*************************************************************************************************
  SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP
*************************************************************************************************/
void setup() {
  /*****Definition der Eingänge******/
 
  pinMode(echoPin, INPUT);
  pinMode(ldrPin, INPUT);
 
  /******Definition der Ausgänge******/
 
  pinMode(trigPin, OUTPUT);
  pinMode(buzzPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  /******LCD via I2C verbinden und initialisieren******/
 
  lcd.init();
  lcd.backlight();
  /******Setup des Servo-Motors******/
 
  //servo.attach(4);
}
/*************************************************************************************************
  LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP
*************************************************************************************************/
void loop() {
  /*****Berechnung der Distanz:*****/
 
  digitalWrite(trigPin, LOW);    // Signal am Trigger-Pin auf LOW(0) setzen
  delayMicroseconds(5);          // 5 µs warten
  digitalWrite(trigPin, HIGH);    // Aktivierung: Signal am Trigger-Pin auf HIGH (1) setzen
  delayMicroseconds(10);          // 5 µs warten
  digitalWrite(trigPin, LOW);    // Signal am Trigger-Pin auf LOW (0) setzen
  Dauer = pulseIn(echoPin, HIGH); // Einlesen des Signals (Schallimpuls) am Echo-Pin [in s]
 
  Distanz = Dauer * 0.034 / 2;    // Berechnung der Distanz [in cm]
  /*****Anzeige der Distanz auf dem LCD:*****/
 
  lcd.setCursor(0, 0);            // Cursor auf Zeile 1, Spalte 1 setzten
  lcd.print("Distanz: ");        // Anzeige von "Distanz: " auf LCD
  lcd.setCursor(0, 1);            // Cursor auf Zeile 2, Spalte 1 setzten
  lcd.print(Distanz);            // Anzeige von berechneter Distanz auf LCD
  lcd.print(" cm  ");            // Anzeige von " cm" auf LCD
  delay(50);                      // 10 ms warten
  /*****Erzeugen der verschiedenen Buzzer-Töne und LED-Farben abhängig von der Distanz:*****/
  if (Distanz > 20 || Distanz < 0)
  {
    digitalWrite(bluePin, LOW);  // Blau 0% an
    digitalWrite(redPin, LOW);    // Rot 0% an
    digitalWrite(greenPin, HIGH); // Grün 100% an
    noTone(buzzPin);              // kein Ton
    delay(500);
  }
  if (Distanz > 10 && Distanz <= 20)
  {
    analogWrite(bluePin, 0);      // Blau 0% an
    analogWrite(redPin, 255);    // Rot 100% an
    analogWrite(greenPin, 30);    // Grün (30/255*100)% an
    tone(buzzPin, 1000, 1000);    // Ton an (mit Frequenz: 1000 Hz & Dauer: 1000 ms)
    delay(500);
  }
  if (Distanz > 5 && Distanz <= 10)
  {
    digitalWrite(bluePin, LOW);  // Blau 0% an
    digitalWrite(redPin, HIGH);  // Rot 100% an
    digitalWrite(greenPin, LOW);  // Grün 0% an
    tone(buzzPin, 1500, 500);    // Ton an (mit Frequenz: 1500 Hz & Dauer: 500 ms)
    delay(500);
  }
  if (Distanz <= 5 && Distanz >= 0)
  {
    digitalWrite(bluePin, LOW);  // Blau 0% an
    digitalWrite(redPin, HIGH);  // Rot 100% an
    digitalWrite(greenPin, LOW);  // Grün 0% an
    delay(500);                  // 500 ms warten
    digitalWrite(bluePin, LOW);  // Blau 0% an
    digitalWrite(redPin, LOW);    // Rot 0% an
    digitalWrite(greenPin, LOW);  // Grün 0% an
    tone(buzzPin, 2000);          // durchgängiger Ton an (mit Frequenz: 2000 Hz)
    delay(500);
  }
  /*****Anschalten der Scheinwerfer-LEDs bei Dunkelheit:*****/
  ldrWert = analogRead(ldrPin);  // Einlesen des aktuellen Wert des LDR-Sensors
  if (ldrWert > 900)              // Ein-/Ausschalten der LEDs
    {
      digitalWrite(ledPin, HIGH);
    }
  else
    {
      digitalWrite(ledPin, LOW);
    }
  /*****Drehen der Warnleuchte:*****/
 
  //for(Servoposition = 0; Servoposition < 180; Servoposition++)  // von 0° bis 180° drehen
  //  {                                 
  //  servo.write(Servoposition);             
  //  delay(15);                 
  //  }
  //
  //for(Servoposition = 180; Servoposition > 0; Servoposition--)  // von 180° bis 0° drehen
  //  {                               
  //  servo.write(Servoposition);         
  //  delay(15);     
  //  }
}
</code>


== Komponententest ==
== Komponententest ==

Version vom 4. Dezember 2020, 13:28 Uhr

Autoren: Matthias Rassenhövel, Lars Vienenkötter
Betreuer: Prof. Schneider


→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)


Einleitung

Im Rahmen des Praktikums WS 20/21: Angewandte Elektrotechnik (BSE) wollen wir ein ferngesteuertes Fahrzeug mit zusätzlichen Funktionen zur Hinderniserkennung ausstatten. Es sollen visuelle wie auch akustische Warnsignale in drei verschiedenen Stufen entsprechend der Distanz zum Hindernis ausgegeben werden. Detaillierte Angaben hierzu sind im nachfolgenden Kapitel (s. Anforderungen) zu finden.

Falls es der zeitliche Rahmen des Projektes zulässt wollen wir zusätzlich eine automatische Beleuchtung der Fahrbahn bei Dunkelheit (vom Fahrzeug aus) ergänzen. Weiterhin könnten wir die optische Warnleuchte als Rundumleuchte umsetzen.

Anforderungen

Ausstattung eines ferngesteuerten Fahrzeugs mit folgenden zusätzlichen Funktionen:

1) Warnung bei Annäherung des Fahrzeugs an Hindernisse in Form von:

  • Akustischem Signal (mit Buzzer)
    • niedrige Frequenz (bei großer Distanz)
    • mittlere Frequenz (bei mittler Distanz)
    • hohe Frequenz (bei kurzer Distanz)
  • Optischem Signal (mit RGB-LED)
    • grün (bei großer Distanz)
    • gelb (bei mittler Distanz)
    • rot (bei kurzer Distanz)

2) Anzeige der Distanz des Fahrzeugs zum Hindernis auf einem Display

3) Die Hindernisbewegung wird mit einem Konstante-Beschleunigung-Modell modelliert und die Zustände Position, Geschwindigkeit Beschleunigung werden mittels Zustandsschätzer (Kalman-Filter) geschätzt.


Zusätzliche Anforderungen:

  • Alle benötigten Komponenten sollen im/am Fahrzeug verbaut werden.


Ausblick - Mögliche Ergänzungen:

  • Optisches Signal als Rundumleuchte (mit Servomotor)
  • Automatische Beleuchtung der Fahrbahn bei Dunkelheit (mit Fotowiderstand und LED's)

Funktionaler Systementwurf/Technischer Systementwurf

Systementwurf



Komponentenspezifikation

Umsetzung (HW/SW)

/*************************************************************************************************

  • *
  • Datei  : Projekt_Hinderniserkennung_IDE_Sketch.ino *
  • *
  • Datum  : 14-11-2020 *
  • *
  • Funktion  : Programmcode für das Projekt Hinderniswarnsystem im Studiengang *
  • "Business and Systems Engineering" der Hochschule *
  • Hamm-Lippstadt im Wintersemester 20/21 *
  • *
  • Implementation  : Arduino IDE 1.8.13 *
  • *
  • Autoren  : Matthias Rassenhövel *
  • Lars Vienenkötter *
  • *
  • Link  : https://wiki.hshl.de/wiki/index.php/Hinderniswarnsystem_f%C3%BCr_Fahrzeug *
  • *
  • Letzte Änderung : 04-12-2020 *
  • *

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

/*************************************************************************************************

 Einbinden der Bibliotheken
                                                                                                                                                                                                  • /
  1. include <Wire.h>
  2. include <LiquidCrystal_I2C.h>
  3. include <Servo.h>

/*************************************************************************************************

 Definition der Ein- und Ausgänge
                                                                                                                                                                                                  • /

const int trigPin = 2; //Trigger-Pin des Ultraschallsensors const int echoPin = 3 ; //Echo-Pin des Ultraschallsensors

const int sdaPin = A4; //SDA-Pin des I2C-LCD const int sclPin = A5; //SCL-Pin des I2C-LCD

const int buzzPin = 9; //Buzzer-Pin (PWM für verschiedene Frequenzen)

const int redPin = 10; //Pin für Rot der RGB-LED (PWM für verschiedene Lichtstärken) const int greenPin = 6; //Pin für Grün der RGB-LED (PWM für verschiedene Lichtstärken) const int bluePin = 5; //Pin für Blau der RGB-LED (PWM für verschiedene Lichtstärken)

const int ldrPin = A1; //Pin für LDR-Sensor const int ledPin = 8; //Pin LED-Scheinwerfer für rechts und links

//const int servoPin = 11; //Servo-Pin

/*************************************************************************************************

 Definition der globalen Variablen
                                                                                                                                                                                                  • /

double Dauer = 0.0; double Distanz = 0.0; double Servoposition = 0.0; double ldrWert = 0.0;

/*************************************************************************************************

 Weitere Einstellungen:
                                                                                                                                                                                                  • /

LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); //Initialisierung LCD-Display

//Servo servo; //Initialisierung Servo-Motor

/*************************************************************************************************

 SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP - SETUP
                                                                                                                                                                                                  • /

void setup() {

 /*****Definition der Eingänge******/
 
 pinMode(echoPin, INPUT);
 pinMode(ldrPin, INPUT);
 
 /******Definition der Ausgänge******/
 
 pinMode(trigPin, OUTPUT);
 pinMode(buzzPin, OUTPUT);
 pinMode(bluePin, OUTPUT);
 pinMode(greenPin, OUTPUT);
 pinMode(redPin, OUTPUT);
 pinMode(ledPin, OUTPUT);
 /******LCD via I2C verbinden und initialisieren******/
 
 lcd.init();
 lcd.backlight();
 /******Setup des Servo-Motors******/
 
 //servo.attach(4);

}

/*************************************************************************************************

 LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP - LOOP
                                                                                                                                                                                                  • /

void loop() {

 /*****Berechnung der Distanz:*****/
 
 digitalWrite(trigPin, LOW);     // Signal am Trigger-Pin auf LOW(0) setzen
 delayMicroseconds(5);           // 5 µs warten
 digitalWrite(trigPin, HIGH);    // Aktivierung: Signal am Trigger-Pin auf HIGH (1) setzen
 delayMicroseconds(10);          // 5 µs warten
 digitalWrite(trigPin, LOW);     // Signal am Trigger-Pin auf LOW (0) setzen
 Dauer = pulseIn(echoPin, HIGH); // Einlesen des Signals (Schallimpuls) am Echo-Pin [in s]
 
 Distanz = Dauer * 0.034 / 2;    // Berechnung der Distanz [in cm]
 /*****Anzeige der Distanz auf dem LCD:*****/
 
 lcd.setCursor(0, 0);            // Cursor auf Zeile 1, Spalte 1 setzten
 lcd.print("Distanz: ");         // Anzeige von "Distanz: " auf LCD
 lcd.setCursor(0, 1);            // Cursor auf Zeile 2, Spalte 1 setzten
 lcd.print(Distanz);             // Anzeige von berechneter Distanz auf LCD
 lcd.print(" cm  ");             // Anzeige von " cm" auf LCD
 delay(50);                      // 10 ms warten
 /*****Erzeugen der verschiedenen Buzzer-Töne und LED-Farben abhängig von der Distanz:*****/
 if (Distanz > 20 || Distanz < 0)
 {
   digitalWrite(bluePin, LOW);   // Blau 0% an
   digitalWrite(redPin, LOW);    // Rot 0% an
   digitalWrite(greenPin, HIGH); // Grün 100% an
   noTone(buzzPin);              // kein Ton
   delay(500);
 }
 if (Distanz > 10 && Distanz <= 20)
 {
   analogWrite(bluePin, 0);      // Blau 0% an
   analogWrite(redPin, 255);     // Rot 100% an 
   analogWrite(greenPin, 30);    // Grün (30/255*100)% an
   tone(buzzPin, 1000, 1000);    // Ton an (mit Frequenz: 1000 Hz & Dauer: 1000 ms)
   delay(500);
 }
 if (Distanz > 5 && Distanz <= 10)
 {
   digitalWrite(bluePin, LOW);   // Blau 0% an
   digitalWrite(redPin, HIGH);   // Rot 100% an 
   digitalWrite(greenPin, LOW);  // Grün 0% an
   tone(buzzPin, 1500, 500);     // Ton an (mit Frequenz: 1500 Hz & Dauer: 500 ms)
   delay(500);
 }
 if (Distanz <= 5 && Distanz >= 0)
 {
   digitalWrite(bluePin, LOW);   // Blau 0% an
   digitalWrite(redPin, HIGH);   // Rot 100% an
   digitalWrite(greenPin, LOW);  // Grün 0% an
   delay(500);                   // 500 ms warten
   digitalWrite(bluePin, LOW);   // Blau 0% an
   digitalWrite(redPin, LOW);    // Rot 0% an
   digitalWrite(greenPin, LOW);  // Grün 0% an
   tone(buzzPin, 2000);          // durchgängiger Ton an (mit Frequenz: 2000 Hz)
   delay(500);
 }
 /*****Anschalten der Scheinwerfer-LEDs bei Dunkelheit:*****/
 ldrWert = analogRead(ldrPin);   // Einlesen des aktuellen Wert des LDR-Sensors
 if (ldrWert > 900)              // Ein-/Ausschalten der LEDs
   {
     digitalWrite(ledPin, HIGH);
   }
 else 
   {
     digitalWrite(ledPin, LOW);
   }
 /*****Drehen der Warnleuchte:*****/
 
 //for(Servoposition = 0; Servoposition < 180; Servoposition++)  // von 0° bis 180° drehen 
 //  {                                  
 //  servo.write(Servoposition);               
 //  delay(15);                   
 //  } 
 //
 //for(Servoposition = 180; Servoposition > 0; Servoposition--)  // von 180° bis 0° drehen
 //  {                                
 //  servo.write(Servoposition);           
 //  delay(15);       
 //  } 

}

Komponententest

Ergebnis

Zusammenfassung

Lessons Learned

Projektunterlagen

Projektplan

Projektdurchführung

YouTube Video

Weblinks

Literatur


→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)