diff --git a/Fahrzeug/.vscode/arduino.json b/Fahrzeug/.vscode/arduino.json deleted file mode 100644 index 518e1b1e95e17db29418369a67d7dee7ecb8936e..0000000000000000000000000000000000000000 --- a/Fahrzeug/.vscode/arduino.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "port": "COM6", - "configuration": "cpu=atmega328old", - "board": "arduino:avr:nano" -} \ No newline at end of file diff --git a/Fahrzeug/bits3-bare-minimum/basic_functions.h b/Fahrzeug/bits3-bare-minimum/basic_functions.h index 58ebcd43d20cbba8296230fce341aafe56839642..19790ab4a63edd7972cbd7e6a13382da1f23962b 100644 --- a/Fahrzeug/bits3-bare-minimum/basic_functions.h +++ b/Fahrzeug/bits3-bare-minimum/basic_functions.h @@ -10,6 +10,145 @@ void buzzer_signal(int pitch, int count, int delay_time){ } } +//Fahrlicht: bestehend aus mittleren 4 LEDs vorne (weiss) und zwei hinteren LEDs (rot) +void drive_light_on() { + front_strip.set_pixel_color(1, thk_LedStripController::Color(30, 30, 30)); + front_strip.set_pixel_color(2, thk_LedStripController::Color(30, 30, 30)); + front_strip.set_pixel_color(3, thk_LedStripController::Color(30, 30, 30)); + front_strip.set_pixel_color(4, thk_LedStripController::Color(30, 30, 30)); + front_strip.show(); + back_strip.set_pixel_color(0, thk_LedStripController::Color(50, 0, 0)); + back_strip.set_pixel_color(5, thk_LedStripController::Color(50, 0, 0)); + back_strip.show(); +} + +//schaltet Fahrlicht wieder aus +void drive_light_off() { + front_strip.set_pixel_color(1, thk_LedStripController::Color(0, 0, 0)); + front_strip.set_pixel_color(2, thk_LedStripController::Color(0, 0, 0)); + front_strip.set_pixel_color(3, thk_LedStripController::Color(0, 0, 0)); + front_strip.set_pixel_color(4, thk_LedStripController::Color(0, 0, 0)); + front_strip.show(); + back_strip.set_pixel_color(0, thk_LedStripController::Color(0, 0, 0)); + back_strip.set_pixel_color(5, thk_LedStripController::Color(0, 0, 0)); + back_strip.show(); +} + +void communication() { + Serial.println("Start communication process! Wait for IR..."); + while(command==0){ + command = ir_sensor.receive_command(); + } + Serial.println(); + + if(command != 0 || command == 64){ + //command = ir_sensor.receive_command(); + Serial.print("IR-Daten empfangen: "); + Serial.println(command); + + // Aendern + Ausgabe der Addresse zum Schreiben + address_write[4]=command; + Serial.print("Fahrzeug schreibt auf Kanal: "); + for (int i = 0; i < 5; i++) { + Serial.print(address_write[i]); + Serial.print(" "); + } + Serial.println(); + + // Fahrzeuginformation via NRF senden + radio.stopListening(); + radio.openWritingPipe(address_write); + char vehicle_info[] = "Gruppe1,KTH123"; + + //Schleife zum Senden + while(transmitted==false){ + transmitted=radio.write(&vehicle_info, sizeof(vehicle_info)); + Serial.print("Gesendete Daten: "); + Serial.println(vehicle_info); + delay(100); + Serial.print("Empfangen (ACK)?: "); + if(transmitted == false){ + Serial.println("No"); + }else{ + Serial.println("Yes"); + } + } + transmitted = false; + + + // Aendern + Ausgabe der Addresse zum Lesen + address_read[4]=command+1; + Serial.print("Fahrzeug liest auf Kanal: "); + for (int i = 0; i < 5; i++) { + Serial.print(address_read[i]); + Serial.print(" "); + } + Serial.println(); + + // Koordinaten via NRF empfangen + radio.openReadingPipe(1, address_read); + radio.startListening(); + int text[20]; + for(int k=0;k<20;k++){ + text[k]=0; + } + + // Schleife zum Empfangen + while(text[1]==0 && text[2]==0){ + if(radio.available()){ + Serial.println("Empfangene Nachricht: "); + radio.read(&text, sizeof(text)); + for(int i = 0; i<20;i++){ + Serial.println(text[i]); + } + Serial.println("Ende der Nachricht"); + Serial.print("Groesse der Nachricht: "); + int size = sizeof(text); + int lastIndex; + for(int l=14; l>0;l--){ //Letzten Index des empfangenen Arrays bestimmen + if(text[l]!=0){ + lastIndex = l; + break; + } + } + Serial.println(size); + int m = 0; + for(int l=0; l<ABSCHNITTE;l=l+1){ + state_table[l].x_kor=float(text[m])/100.0; + state_table[l].y_kor=float(text[m+1])/100.0; + + if(m==lastIndex-3){ + state_table[l].parking_side=text[m+2]; // Seite des Parkplatzes uebergeben + state_table[l].parking_type=text[m+3]; // Art des Parkplatzes uebergeben + break; + } + m=m+2; + } + } + } + text[0]=0; + } +} + +void printCourseTable() +{ + Serial.println(F("-------------- Fahrkurs -----------")); + for (int i = 0; i < ABSCHNITTE; i++) + { + Serial.print(state_table[i].part); + Serial.print(F(" ")); + Serial.print(state_table[i].x_kor); + Serial.print(F(" ")); + Serial.print(state_table[i].y_kor); + Serial.print(F(" ")); + Serial.print(state_table[i].wall_side); + Serial.print(F(" ")); + Serial.print(state_table[i].parking_side); + Serial.print(F(" ")); + Serial.println(state_table[i].parking_type); + } +} + void all_led_blink(int count, int delay_time){ for (int k=0; k<count; k++){ front_strip.set_pixel_color(thk_LedStripController::Color(red, green, blue)); @@ -364,4 +503,4 @@ void drive_course() { //Main-Funktion zum Abfahren des Kurses und anschliesse end_of_programm(); //Programmende sobald alle Abschnitte durchfahren sind } -#endif \ No newline at end of file +#endif diff --git a/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino b/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino index eb8e1b2a26f350d336e6a776d196acb4b501614b..2d427ded0499f4eb1d27816ca0b537bdd61e3f5d 100644 --- a/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino +++ b/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino @@ -97,12 +97,23 @@ void setup() { // buzzer_signal(350, 2, 100); //tone() und IR-Empfangen läuft nicht gleichzeitig!!!! // Heranfahren an Schranke - - // Kommunikation-Funktion (IR+NRF) - - // Warten bis Schranke offen ist + drive_light_on(); + ServoSteer.turn(STEER_START_POS); + readUS(); + while (US_distance_f >= 100) { //Fahre bis die Schranke 100 mm entfernt + Motor.drive_forward(50); + readUS(); + } + Motor.stop(); + + communication(); // Kommunikation-Funktion (IR+NRF) + printCourseTable(); // Ausgabe der Empfangenen Zustandstabelle + set_led_color(0, 100, 0); + all_led_blink(2, 200); + delay(3000); // Warten bis Schranke offen ist } + /* ************* * Hauptprogramm * ************* */ diff --git a/Fahrzeug/bits3-bare-minimum/config.h b/Fahrzeug/bits3-bare-minimum/config.h index e53a9d1ef4a9f54678ba8a22852b8b5c31d66f25..1c23931c51dd57825927c022a835da09694e70ee 100644 --- a/Fahrzeug/bits3-bare-minimum/config.h +++ b/Fahrzeug/bits3-bare-minimum/config.h @@ -1,7 +1,7 @@ /* -########################################################## -######### DIESES SKRIPT NICHT BEARBEITEN!!! ############## -########################################################## +#################################################################################### +######### DIESES SKRIPT BIS AUF DIE STATE MACHINE NICHT BEARBEITEN!!! ############## +#################################################################################### */ /* BITS-i sensor shematic @@ -159,6 +159,18 @@ int tof_distance_front; * ************* */ const double Fahrbahnbreite = 500.00; +/* ************ * + * IR Empfänger * + * ************ */ +uint8_t command; + +/* ******** * + * NRF24L01 * + * ******** */ +byte address_read[] = {0,0,0,0,0}; +byte address_write[] = {0,0,0,0,0}; +boolean transmitted = false; + /* ******* * Encoder * ******* */ @@ -181,7 +193,7 @@ const int MIN_DIST_TURN = 300; //Mindestanbstand vorne für anschließende /* ********** * PID Regler * ********** */ -const double prop_gain = 0.4; +const double prop_gain = 0.0; const double int_gain = 0.0; const double diff_gain = 0.0; uint8_t setpoint = 0; //Zielwert Regeldifferenz @@ -194,31 +206,31 @@ double front_rear_difference_right; //Differenz TOF rechts double front_rear_difference_left; //Differenz TOF links const double wall_distance = (Fahrbahnbreite / 2.00) - 60.00; //Soll-Abstand zur Wand auf einer Seite, damit fzg mittig auf Spur -/* ************* * - State machine - * ************* */ +/* ******************************************** * + State machine (diese darf bearbeitet werden) + * ******************************************** */ //Definiton struct für Tabelle: typedef struct course_state_t { - const byte part; //Name des Streckenabschnitts - float x_kor; //x-Koordinate (Meter) - float y_kor; //y-Koordinate (Meter) - int wall_side; //Seite der Wand für Kurskorrektur - int parking_side; //Parkplatz Seite r oder l - int parking_type; //vorwaerts / rueckwaerts / seitlich + const byte part; //Name des Streckenabschnitts (1. Spalte) + float x_kor; //x-Koordinate (Meter) (2. Spalte) + float y_kor; //y-Koordinate (Meter) (3. Spalte) + int wall_side; //Seite der Wand für Kurskorrektur (4. Spalte; 0: keine Seite verfuegbar; 1: rechts; 2: links) + int parking_side; //Parkplatz Seite r oder l (5. Spalte; 1: rechts; 2: links) + int parking_type; //Parkplatzart; 1: vorwaerts; 2: rueckwaerts; 3: seitlich }; // Hier wird der Fahrkurs in einer Tabelle für das Fahrzeug definiert: // Leere Zustandstabelle, Daten kommen mit Hilfe von Funk/IR von Parkplatzinfrastruktur course_state_t state_table[] = { - {1, 0.00, 0.00, 0, 0, 0}, // i = 0 (erster Abschnitt) - {2, 0.00, 0.00, 2, 0, 0}, // 0 = keine Seite (für Korrektur verfuegbar) - {3, 0.00, 0.00, 1, 0, 0}, // 1 = rechte Seite - {4, 0.00, 0.00, 1, 0, 0}, // 2 = linke Seite - {5, 0.00, 0.00, 1, 0, 0} //Parken 1: vorwaerts , 2: rueckwaerts , 3: seitlich + {1, 0.00, 0.00, 0, 0, 0}, + {2, 0.00, 0.00, 2, 0, 0}, + {3, 0.00, 0.00, 1, 0, 0}, + {4, 0.00, 0.00, 1, 0, 0}, + {5, 0.00, 0.00, 1, 0, 0} }; const int ABSCHNITTE = sizeof(state_table) / sizeof(course_state_t); //Größe der Tabelle (Anzahl der Abschnitte siehe Parklayout) int i; //Laufvariable für drive_course und parking -#endif \ No newline at end of file +#endif