Phase 2 2021/22
In diesem Buch sind die Teamergebnisse der FST21 in Phase 2 dokumentiert.
Die Funktion des vor- und zurückfahrens wird um einen Positioniermodus erweitert. Wenn das Fahrzeug vorwärts oder rückwärts fährt, wird auf dem Display mit Decoder die Distanz zu dem nächsten erfassten Objekt ausgegeben. In der Vorwärtsfahrt wird die Distanz zum Objekt genutzt, um das Fahrzeug zu einem sicheren Halt zu bringen. Die Geschwindigkeit wird nach und nach bis zum Stillstand vor dem Objekt reduziert. Sobald das Fahrzeug steht, wechselt es in den Positioniermodus. Dieser Modus erlaubt es, die Distanz zum erkannten Objekt durch einmaligen Druck auf die „Channel Plus“ - bzw. „Channel Minus“ - Taste um 5 Centimeter zu verändern. Das Fahrzeug verfährt nach Betätigung selbstständig auf den neuen Wert und hält an. Diesen Modus kann man nur durch Betätigung der „Power“ - Taste verlassen.
Hier (Datei "Vorlage_Fahrzeugverfahren_VZ_Posi.ino") der zugehörige Programmcode:
//Infrarotsensor
#include <IRremoteESP8266.h> // Bibliothek zum Empfang von Infrarotsignalen
#include <IRrecv.h> // Bibliothek zum Empfang von Infrarotsignalen
#include <IRutils.h> // Bibliothek für Funktionen nach Infrarotempfang
#define RECV_PIN 34 // Pin, an dem der Pin des IR-Empfängers angeschlossen ist
IRrecv irrecv(RECV_PIN); // Eingangsbestimmung für den Infrarot-Datenstrom
decode_results results; // Dekodierung in Datei schreiben
// Angabe von '0x' vor dem eigentlichen Hexcode
// Bezeichnung HEX-Code
int button_Power = 0xECDF8084; // zurücksetzen auf den ursprungszustand
int button_Down = 0x7F984248; // keine Zuordnung in diesem Programm
int button_Up = 0xC5F76D04; // keine Zuordnung in diesem Programm
//int button_01 = 0x3138F3E0; // keine Zuordnung in diesem Programm
//int button_02 = 0xBF33DC80; // keine Zuordnung in diesem Programm
//int button_03 = 0xABB78D20; // keine Zuordnung in diesem Programm
//int button_04 = 0x4A86A8C0; // keine Zuordnung in diesem Programm
int button_05 = 0xC0134580; // Modus PDC optische akustische Signale
//int button_06 = 0xBA1256C4; // keine Zuordnung in diesem Programm
//int button_07 = 0x52A2DA24; // keine Zuordnung in diesem Programm
//int button_08 = 0xB74C8420; // keine Zuordnung in diesem Programm
//int button_09 = 0xE3172C20; // keine Zuordnung in diesem Programm
//int button_VolumePlus = 0xF62981E4; // keine Zuordnung in diesem Programm
//int button_00 = 0x2F9EF384; // keine Zuordnung in diesem Programm
int button_ChannelPlus = 0x9C7C29E0; // Änderung Wertebereich für optische akustische Signale nach oben; Fahrzeug in Positionierung nach vorne verfahren
//int button_VolumeMinus = 0x973C68E0; // keine Zuordnung in diesem Programm
//int button_Enter = 0x3C1BB180; // keine Zuordnung in diesem Programm
int button_ChannelMinus = 0x1B433B24; // Änderung Wertebereich für optische akustische Signale nach unten; Fahrzeug in Positionierung nach hinten verfahren
int IRcode = 0x00000000; // variable für den Empfangenen Tastencode
int merker_Power = 0;
int merker_Down = 0;
int merker_Up = 0;
//int merker_01 = 0;
//int merker_02 = 0;
//int merker_03 = 0;
//int merker_04 = 0;
int merker_05 = 0;
//int merker_06 = 0;
//int merker_07 = 0;
//int merker_08 = 0;
//int merker_09 = 0;
//int merker_VolumePlus = 0;
//int merker_00 = 0;
int merker_ChannelPlus = 0;
//int merker_VolumeMinus = 0;
//int merker_Enter = 0;
int merker_ChannelMinus = 0;
//Ultraschallsensor
#define echo 15 //Anschluss ECHO vom HC-SR04 wurde für PIN 15 festgelegt
#define trig 18 //Anschluss TRIG vom HC-SR04 wurde für PIN 18 festgelegt
//Display mit Controller
#include <TM1637TinyDisplay.h> // Bibliothek für die 7- Segment Anzeige
#define CLK 21 //Anschluss CLK von der 7- Segment Anzeige wurde für PIN 21 festgelegt
#define DIO 19 //Anschluss DIO von der 7- Segment Anzeige wurde für PIN 19 festgelegt
TM1637TinyDisplay display(CLK, DIO);
const uint8_t SEG_PDC_NORMAL[] = {0x39, 0x00, 0x00, 0x00,};
const uint8_t SEG_PDC_VOR[] = {0x3f, 0x39, 0x00, 0x00,};
const uint8_t SEG_PDC_END[] = {0x3f, 0x3f, 0x39, 0x00,};
const uint8_t SEG_PDC_NOT[] = {0x3f, 0x3f, 0x3f, 0x39,};
const uint8_t SEG_PDC_STOP[] = {0x7f, 0x7f, 0x7f, 0x7f,};
const uint8_t SEG_Modus_MS[] = {0x54, 0x44, 0x52, 0x6d,};
const uint8_t SEG_Modus_kmh[] = {0x78, 0x54, 0x44, 0x74,};
const uint8_t SEG_VEH_STOP[] = {0x6d, 0x78, 0x3f, 0x73,};
const uint8_t SEG_VEH_VPlus[] = {0x1c, 0x46, 0x40, 0x00,};
const uint8_t SEG_VEH_VMinus[] = {0x1c, 0x40, 0x40, 0x00,};
//Pins der Soundmodule
#define Sound1 12
#define Sound2 13
#define Sound3 14
#define Sound4 27
// Motortreiber L298N
#define MotV 27
#define MotR 26
#define MotEna 12
//PWM Motortreiber
int Freq = 30000;
int Res = 8;
int PwmChannelMotEna = 2;
int DutyCycleMotEna = 0; // MaximalWert: 250; Minimalwet 160;
int DutyCycleNull = 0;
//allgemeine Variablen, die in verschiedenen Programmabläufen aufgerufen werden
int merker_PdcMode = 2; //Wertespeicher für den PDC Modus. Ursprung ist mit 2 = normal
int distanz1 =0; //erste errechnete Distanz zum Ultraschallsensor. Für die Geschwindigkeitserrechnung
int zeitx1 = 0; //Deklaration der Variablen "zeitx"
int vResNull_230 = 0; //Merker für die Geschwindigkeitsreduzierung
int vResNull_220 = 0;
int vResNull_210 = 0;
int vResNull_200 = 0;
int vResNull_190 = 0;
int vResNull_180 = 0;
int vResNull_170 = 0;
int vResNull_160 = 0;
int merker_positionierungsmodi = 0;
int merker_Verfahrweg = 0;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 1: Errechnung der ersten Distanz zum Objekt
int EntfernungsMessung1 (){
long distanz1 = 0; //Deklaration der Variablen "distanz1"
long zeitx1 = 0; //Deklaration der Variablen "zeitx"
digitalWrite (trig, LOW); //setzt den Zustand von trig auf LOW
delayMicroseconds(3); //setzt eine Pause/Unterbrechung von 3 Mikrosekunden
noInterrupts(); //verhindert eine Unterbrechung des Vorgangs
digitalWrite(trig, HIGH); //setzt den Zustand von trig auf HIGH
delayMicroseconds(10); //setzt eine Pause/Unterbrechung von 10 Mikrosekunden
digitalWrite(trig, LOW); //setzt den Zustand von trig auf LOW
zeitx1 = pulseIn(echo, HIGH);
interrupts(); //lässt Vorgangsunterbrechungen erneut zu
// Serial.print("Zeitx1 PulseIn:");
// Serial.print(zeitx1);
// Serial.println("");
zeitx1 = (((zeitx1 * 344)/1000)/2); //vererrechnet den Wert der Zeit mit der Schallgeschwindigkeit nach der Raumtemperaur,
//dem Faktor für die Kommastelle und halbiert diesen wegen der doppelten strecke (hin+zurück)
distanz1 = zeitx1;
// Serial.print("distanz1 Wert01:"); //Ausgabe des Wertes über den seriellen Monitor
// Serial.print(distanz1);
// Serial.println("");
return (distanz1); //Ausgabe des Wertes für die Entfernung
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 2: Erfassen eines Infrarotsignals
int IRCodeAuslesen (){
if (irrecv.decode(&results)) //Wenn ein IR-Signal empfangen wurde
{
IRcode = (results.value); //Das Empfangsignal in der Variable speichern
Serial.print(IRcode, HEX); //Gebe empfangenen Code hexadezimal im seriellen Monitor aus
Serial.println("");
irrecv.resume(); //IR-Empfänger für den nächsten Wert bereit machen.
if(IRcode == 0xFFFFFFFF)
{
IRcode = 0x00000000;
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 7: Fahrzeugstopp
int StopMode (){
merker_Up = 0; // Zurücksetzen der Modusmerker
merker_Down = 0;
merker_05 = 0;
Serial.println ("Power Button gedrückt, Fahrzeugfunktionen Stopp"); // Ausgabe über den seriellen Monitor
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
DutyCycleMotEna = 200;
ledcWrite (PwmChannelMotEna, DutyCycleNull); // Nullsetzen des PWM-Ausgangs
digitalWrite (MotV , LOW ); // Nullsetzen der Motordrehrichtung
digitalWrite (MotR , LOW );
display.setSegments (SEG_VEH_STOP);
vResNull_230 = 0; // Merker für die Geschwindigkeitsreduzierung
vResNull_220 = 0;
vResNull_210 = 0;
vResNull_200 = 0;
vResNull_190 = 0;
vResNull_180 = 0;
vResNull_170 = 0;
vResNull_160 = 0;
merker_positionierungsmodi = 0;
merker_ChannelPlus = 0;
merker_ChannelMinus = 0;
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts
int FahrzeugVorwaerts (){
if (merker_Up == 0 ) // einmalige Anzeige des Modus
{
Serial.println ("Modus: Fahrzeug fährt vorwärts"); // Ausgabe des Modus über den seriellen Monitor
// Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
DutyCycleMotEna = 200; // Minimal 160, maximal 255 bei DutyCycleMotEna
digitalWrite (MotV , HIGH); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
display.setSegments (SEG_VEH_VPlus);
delay(500);
display.clear();
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
merker_Up = 1; // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
merker_Down = 0; // Nullsetzung der anderen Modusmerker
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10; // Umformen der Distanz zu Cm
// Serial.print("Distanz zu Objekt "); // Ausgabe der Distanz über den seriellen Monitor
// Serial.print(distanz1);
// Serial.print("cm");
// Serial.println ("");
display.showNumber (distanz1); // Ausgabe des Wertes der Distanz auf dem Display mit Decoder
if (IRcode == button_Up && DutyCycleMotEna < 241 && distanz1 >= 50) // Bedingungen für die Geschwindigkeitserhöhung
{
DutyCycleMotEna = DutyCycleMotEna +10; // Erhöhung der Geschwindigkeit über den Wert des DutyCycles
Serial.print ("DutyCycleMotEna Anhebung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
vResNull_230 = 0; //Merker für die Geschwindigkeitsreduzierung
vResNull_220 = 0;
vResNull_210 = 0;
vResNull_200 = 0;
vResNull_190 = 0;
vResNull_180 = 0;
vResNull_170 = 0;
vResNull_160 = 0;
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Down && DutyCycleMotEna >169) // Bedingung für die Geschwindigkeitsverringerung
{
DutyCycleMotEna = DutyCycleMotEna -10; // Verringerung der Geschwindigkeit über den Wert des DutyCycles
Serial.print ("DutyCycleMotEna Senkung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Down && DutyCycleMotEna == 160) // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
{
IRcode = button_Power; // Ansteuern des Stoppmodus
}
//Abschnitt Geschwindigkeitsreduzierung bei Objekterkennung
if (distanz1 < 50 && DutyCycleMotEna > 230&& vResNull_230 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 230; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V230"); // Ausgabe über den seriellen Monitor
vResNull_230 = 1;
}
if (distanz1 < 47 && DutyCycleMotEna > 220 && vResNull_220 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 220; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V220"); // Ausgabe über den seriellen Monitor
vResNull_220 = 1;
}
if (distanz1 < 44 && DutyCycleMotEna > 210 && vResNull_210 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 210; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V210"); // Ausgabe über den seriellen Monitor
vResNull_210 = 1;
}
if (distanz1 < 41 && DutyCycleMotEna > 200 && vResNull_200 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 200; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V200"); // Ausgabe über den seriellen Monitor
vResNull_200 = 1;
}
if (distanz1 < 38 && DutyCycleMotEna > 190 && vResNull_190 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 190; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V190"); // Ausgabe über den seriellen Monitor
vResNull_190 = 1;
}
if (distanz1 < 35 && DutyCycleMotEna > 180 && vResNull_180 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 180; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V180"); // Ausgabe über den seriellen Monitor
vResNull_180 = 1;
}
if (distanz1 < 32 && DutyCycleMotEna > 170 && vResNull_170 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 170; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V170"); // Ausgabe über den seriellen Monitor
vResNull_170 = 1;
}
if (distanz1 < 29 && DutyCycleMotEna > 160 && vResNull_160 == 0 && merker_positionierungsmodi == 0)
{ // Reduzierung schrittweise
DutyCycleMotEna = 160; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des DutyCycles in den Ausgang
Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V160"); // Ausgabe über den seriellen Monitor
vResNull_160 = 1;
}
if (distanz1 < 26 && DutyCycleMotEna == 160 && vResNull_160 == 1 && merker_positionierungsmodi == 0)
{ // Bis zum Stillstand vor dem Objekt und dem Wechsel in den Abstandsmodus
DutyCycleMotEna = 0; // Schreiben des kleineren Wertes in den DutyCycle
ledcWrite (PwmChannelMotEna, DutyCycleNull); // Schreiben des DutyCycles in den Ausgang
delay(1000);
digitalWrite (MotV , LOW ); // zurücksetzen der Drehrichtung des Motors
digitalWrite (MotR , LOW );
merker_positionierungsmodi = 1; // Aktivieren des Merkers für die Positionierung
merker_Verfahrweg = distanz1;
Serial.println("Fahrzeug gestoppt, Positioniermodus aktiviert"); // Ausgabe über den seriellen Monitor
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Positionierung vor Objekt stehend
int Positionierung (){
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10; // Umrechnen des Wertes in Cm
display.showNumber (distanz1); // Ausgabe des wertes auf dem Display mit Decoder
if (IRcode == button_ChannelPlus || merker_ChannelPlus ==1) // Bedingung für das Verfahren nach vorne
{
if (merker_ChannelPlus == 0) // Einmal Ausführung des Schreibens der Motorwerte
{
digitalWrite (MotV , HIGH ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 200; // Starten mit einem initialwert, damit der motor sich dreht
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 180; // Schrittweises Absenken der Drehgeschwindigkeit
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 160; // Bis zur Minimalfrequenz
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelPlus = 1;
merker_Verfahrweg = distanz1;
merker_Verfahrweg = merker_Verfahrweg -5;
Serial.print ("Distanz 1 ");
Serial.println (distanz1);
Serial.print ("merker_Verfahrweg ");
Serial.println (merker_Verfahrweg);
Serial.println ("ChannelPlus betätigt, Anpassung nach vorne angefordert");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (distanz1 < merker_Verfahrweg)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 0;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelPlus = 0;
Serial.println ("ChannelPlus betätigt, Anpassung nach vorne wurde abgeschlossen");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
}
if (IRcode == button_ChannelMinus || merker_ChannelMinus ==1)
{
if (merker_ChannelMinus == 0)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , HIGH );
DutyCycleMotEna = 200;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 180;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
delay(20);
DutyCycleMotEna = 160;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelMinus = 1;
merker_Verfahrweg = merker_Verfahrweg +5;
Serial.print ("ChannelPlus betätigt, Anpassung nach hinten angefordert");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (distanz1 > merker_Verfahrweg)
{
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , LOW );
DutyCycleMotEna = 0;
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
merker_ChannelMinus = 0;
Serial.print ("ChannelPlus betätigt, Anpassung nach hinten wurde abgeschlossen");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt Rückwärts
int FahrzeugRueckwaerts()
{
distanz1 = EntfernungsMessung1 (); // errechnen der Distanz
distanz1 = distanz1 / 10;
display.showNumber (distanz1); // Ausgabe des Wertes der Distanz auf dem Display mit Decoder
if (merker_Down == 0 ) // einmalige Anzeige des Modus
{
Serial.println ("Modus: Fahrzeug fährt Rückwärts"); // Ausgabe des Modus über den seriellen Monitor
// Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
DutyCycleMotEna = 200; // Minimal 160, maximal 255 bei DutyCycleMotEna
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
digitalWrite (MotV , LOW ); // Schreiben der Drehrichtung des Motors
digitalWrite (MotR , HIGH );
display.setSegments (SEG_VEH_VMinus);
delay(500);
display.clear();
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
merker_Down = 1; // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
merker_Up = 0; // Nullsetzung der anderen Modusmerker
ledcWrite (PwmChannelMotEna, DutyCycleMotEna); // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
if (IRcode == button_Down && DutyCycleMotEna < 241) // Bedingungen für die Geschwindigkeitserhöhung
{
DutyCycleMotEna = DutyCycleMotEna +10; // Erhöhung der Geschwindigkeit
Serial.print ("DutyCycleMotEna Anhebung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Up && DutyCycleMotEna > 169) // Bedingung für die Geschwindigkeitsverringerung
{
DutyCycleMotEna = DutyCycleMotEna -10; // Verringerung der Geschwindigkeit
Serial.print ("DutyCycleMotEna Senkung auf:"); // Ausgabe über den seriellen Monitor
Serial.print (DutyCycleMotEna);
Serial.println("");
IRcode = 0x00000000; // Zurücksetzen des IR-Codespeichers
}
if (IRcode == button_Up && DutyCycleMotEna == 160) // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
{
IRcode = button_Power; // Ansteuern des Stoppmodus
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
//Infrarotempfänger
irrecv.enableIRIn(); // Empfänger wird ausgeführt
//Display TM1637
display.setBrightness(7);
//Ultraschallsensor
pinMode (echo , INPUT ); //festlegen des Pins am Ultraschallsensor als Eingang
pinMode (trig , OUTPUT); //festlegen des Pins am Ultraschallsensor als Ausgang
//Soundmodule
pinMode (Sound1 , OUTPUT); // festlegen der Pins der Soundmodule als Ausgänge
pinMode (Sound2 , OUTPUT);
pinMode (Sound3 , OUTPUT);
pinMode (Sound4 , OUTPUT);
//L298N
pinMode (MotV , OUTPUT); // festlegen des Pins am L298N als Ausgang
pinMode (MotR , OUTPUT); // festlegen des Pins am L298N als Ausgang
pinMode (MotEna , OUTPUT); // festlegen des Pins am L298N als Ausgang
//PWM
ledcSetup (PwmChannelMotEna, Freq, Res); // PWM-Kanal Einstellung
ledcAttachPin (MotEna, PwmChannelMotEna); // Definition des PWM-Kanals auf den Pin
Serial.begin(115200); //Seriellen Monitor mit einer Baudrate von 115200 starten
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop() {
//EntfernungsMessung1 ();
IRCodeAuslesen ();
//StopMode ();
//FahrzeugVorwaerts ();
//FahrzeugRueckwaerts ();
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts + Objekterkennung und Stoppbereichanpassung
// Bedingungen für Modus: Fahrzeug fährt vorwärts
if ((IRcode == button_Up && merker_Down == 0)|| merker_Up == 1 && merker_positionierungsmodi == 0)
{
FahrzeugVorwaerts();
}
if (merker_positionierungsmodi == 1)
{
Positionierung ();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt rückwärts
// Bedingungen für Modus: Fahrzeug fährt rückwärts
if ((IRcode == button_Down && merker_Up == 0)|| merker_Down == 1 && merker_positionierungsmodi == 0)
{
FahrzeugRueckwaerts();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: allgemeiner Funktionsstopp
if (IRcode == button_Power) // Bedingung für Funktion: Allgemeiner Fahrzeugstopp
{
StopMode ();
}
}