Phase 2 2021/22
In diesem Buch sind die Teamergebnisse der FST21 in Phase 2 dokumentiert.
Die Bedienung des Fahrzeugmodells wird mit dem Infrarothandsender ausgeführt. Durch Druck auf die „Hoch“ - Taste fährt das Fahrzeug mit 50% der Maximalgeschwindigkeit nach vorne los. Durch erneutes Betätigen der „Hoch“ - Taste lässt sich die Geschwindigkeit des Fahrzeuges in 10er Schritten bis zum Maximum von 100% erhöhen. Wird die „Runter“ -Taste auf dem Infrarothandsender betätigt, wird die Geschwindigkeit in 10er Schritten bis zum Stillstand des Fahrzeugs reduziert. Das Fahrzeug lässt sich durch den Druck auf Die „Power“ - Taste auch sofort stoppen. Wenn das Fahrzeug stillsteht und die „Runter“ - Taste betätigt wird, fährt es mit 50% der Maximalgeschwindigkeit nach hinten los. Auch hier wird durch erneutes Betätigen der „Runter“ - Taste die Geschwindigkeit erhöht, durch betätigen der „Hoch“ - Taste die Geschwindigkeit verringert und mit der „Power“ - Taste die Fahrtbewegung gestoppt.
Hier (Datei "Vorlage_Fahrzeugverfahren_vor_zur_ck.ino") befindet sich der Programmcode zu der Funktion:
//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
//Hexcodes für die Tasten des Infrarothandsenders
// 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
//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
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;
// 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 distanz1 =0; // erste errechnete Distanz zum Ultraschallsensor. Für die Geschwindigkeitserrechnung
int zeitx1 = 0; // Deklaration der Variablen "zeitx"
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt Rückwärts
int FahrzeugRueckwaerts()
{
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 );
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
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//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 = 0;
ledcWrite (PwmChannelMotEna, DutyCycleNull); // Nullsetzen des PWM-Ausgangs
digitalWrite (MotV , LOW ); // Nullsetzen der Motordrehrichtung
digitalWrite (MotR , LOW );
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 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 );
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
if (IRcode == button_Up && 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_Down && 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_Down && DutyCycleMotEna == 160) // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
{
IRcode = button_Power; // Ansteuern des Stoppmodus
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt: Erfassen eines Infrarotsignals
int IRCodeAuslesen (){
if (irrecv.decode(&results)) // Wenn ein IR-Signal empfangen wurde
{
IRcode = (results.value); // Das Empfangsignal in der Variable speichern
if(IRcode == 0xFFFFFFFF) // Wenn eine Taste lange gedrückt wird, soll der Code gelöscht werden, um nicht im seriellen Monitor bzw. im Programm aufzutauchen
{
IRcode = 0x00000000; // schreiben des default-Wertes in die Variable des IrCodes
}
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.
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
//Infrarotempfänger
irrecv.enableIRIn(); // Empfänger wird ausgeführt
//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() {
IRCodeAuslesen ();
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts
if ((IRcode == button_Up && merker_Down == 0)|| merker_Up == 1) // Bedingungen für Modus: Fahrzeug fährt vorwärts
{
FahrzeugVorwaerts();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt rückwärts
if ((IRcode == button_Down && merker_Up == 0)|| merker_Down == 1 ) // Bedingungen für Modus: Fahrzeug fährt rückwärts
{
FahrzeugRueckwaerts();
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: allgemeiner Funktionsstopp
if (IRcode == button_Power) // Bedingung für Funktion: Allgemeiner Fahrzeugstopp
{
StopMode ();
}
}