#include "CodeRacer_MKII.h" #include #include "esp32-hal-ledc.h" //----- Werte für den Ultraschallsensor ----- #define US_STOP_ABSTAND_CM 20 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an #define US_MIN_ABSTAND_LI_RE 8 // Wenn der Unterschied zwischen linkem und und rechtem Abstand kleiner ist, dann drehe in dieselbe Richtugn wie vorher weiter #define MAX_ANZAHL_DREHUNGEN 10 // Wenn der Coderacer sich schon so oft gedreht hat ohne eine Stelle zu finden, wo es Platz gibt - fahren wir mal ein Stück rückwärts ... //----- Variablen, die wir brauchen um uns Werte zu merken ---- long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm; enum drehrichtung {links=0, rechts}; drehrichtung drehung = links; unsigned int anzahl_drehung = 0; CodeRacerMKII coderacer; int aabstand[160]; void filladistance(); int adegree[160]; int ispeed=0; float fZeit= 0; float fSpeedminleft= 0; float fSpeedminright=0; float fSpeedmaxleft=0; int iTicks=31; float callibration_drive(unsigned int tickstogo, float calfactor); int Emit_vmin(bool state); float calculate_min_veliocity(bool side); unsigned int getcount_function(bool left_notright); void set_speed_function(bool left_notright, unsigned int speed); unsigned int get_inmin(bool left_notright); //---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ---- void setup() { // Monitor Serial.begin(9600); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen. // CodeRacer initialisieren coderacer.begin(); coderacer.servo_set_to_left(); delay(10); coderacer.servo_set_to_right(); delay(10); coderacer.servo_set_to_center(); anzahl_drehung = 0; drehung = links; coderacer.set_syncstop(true); coderacer.set_obstacle_stop(false); } //---- Hier startet unsere endlose Schleife - die immer wieder von vorn angefangen wird, wenn wir am Ende angekommen sind. Da ist unser "Fahr"Code drin, der den CodeRacer steuert void loop() { bool started = false; while(coderacer.start_stop()== 1) { if(false == started) { started = true; wait_ms(1000); } coderacer.stop_driving(); unsigned int in_min_left = get_inmin(true); wait_ms(1000); // do not use delay() this will create problems with interrupt routines! use the wait_ms() instead !!!! unsigned int in_min_right = get_inmin(false); Serial.printf("left in_min: %u right in_min: %u \n", in_min_left, in_min_right); //float vminright= calculate_min_veliocity(1); //Serial.println(vminright); //speedleft = speedleft == 0 ? 128 : 0; //speedright = speedright == 0 ? 128 : 0; //coderacer.drive_forward(speedleft, speedright); //coderacer.set_drives_speed_left_right(speedleft,speedright); //coderacer.drive_forward(); //wait_ms(1000); //coderacer.stop_driving(); wait_ms(1000); coderacer.set_inactive(); } } unsigned int get_inmin(bool left_notright ) { unsigned int steps_before_driving = getcount_function(left_notright); Serial.printf("Steps before driving: %u \n", steps_before_driving ); for(unsigned int pwm_in = 0; pwm_in < 255; pwm_in = pwm_in+5) { unsigned int steps_after_driving = getcount_function(left_notright); if(steps_after_driving > steps_before_driving) { Serial.printf("Steps after driving: %u \n", steps_before_driving ); coderacer.stop_driving(); return pwm_in*1.1; } set_speed_function(left_notright, pwm_in); wait_ms(100); } coderacer.stop_driving(); return 0 ; } unsigned int getcount_function(bool left_notright) { if(true == left_notright){return coderacer.show_left_stepcounter();} else{return coderacer.show_right_stepcounter();} } void set_speed_function(bool left_notright, unsigned int speed) { if(true == left_notright){coderacer.drive_forward(speed,0);} else{coderacer.drive_forward(0,speed);} } float calculate_min_veliocity(bool side) { ispeed=Emit_vmin(side); coderacer.speed_settings(ispeed, ispeed); coderacer.set_left_start_time(); coderacer.set_right_start_time(); int iStepsbefore=coderacer.show_left_stepcounter(); Serial.printf("Schritte: %i\n", iStepsbefore); coderacer.drive_ticks(iTicks, iTicks); while(coderacer.is_driving()){}; if(1==side) { fZeit= (coderacer.show_left_time_of_last_tick()- coderacer.show_left_start_time())/1000.0; int iDifferenz= coderacer.show_left_stepcounter()-iStepsbefore-1; Serial.printf("Zeit: %f timebefore: %lu timeafter: %lu Ticks: %i differenz: %i\n", fZeit, coderacer.show_left_start_time(), coderacer.show_left_time_of_last_tick(), coderacer.show_left_stepcounter(), iDifferenz); fSpeedminleft= (float)iDifferenz/fZeit; } else { fZeit= (coderacer.show_right_time_of_last_tick()- coderacer.show_right_start_time())/1000.0; int iDifferenz= coderacer.show_right_stepcounter()-iStepsbefore-1; fSpeedminright= (float)iDifferenz/fZeit; } if(1==side) { return fSpeedminleft; } else return fSpeedminright; } int Emit_vmin(bool state){ int iSteps=0; if(1== state) { iSteps= coderacer.show_left_stepcounter(); } else {iSteps= coderacer.show_right_stepcounter();} for(int i=0;i<=150; i++) { if(1== state) { if(iSteps