bei der umstellung vom FB betrieb auf selbständiges fahren gibts probleme. Und zwar fährt der roboter "abschnittsweise", also stotternd. Der verursacher sind die aufrufe für die entfernungsmessung, ohne die pingabfragen fährt der ganz ok... Die frequenz des "stotterns" ist abhängig von der grösse des ping-intervalls...
---------------------------------------------------------------
@rabenauge: Kann ich solche programmabschnitte mit dem "timer-system" kombinieren, oder muss ich völlig umdenken? Es müsste z.b. noch die bewegung des Servos dazukommen..., da geht ja richtung kontinuierliche bewegung wahrscheinlich garnix...
Wie fragst Du die US module ab? nach der lib, oder anders?
---------------------------------------------------------------
das hier ist der haupt-fahrt-code welches aus der loop() aufgerufen wird:
vor dem start frage ich noch die US-module ab, der roboter soll ja nicht nach vorne anfahren, wenn er vor einer wand steht, die abfrage ist "entprellt", damit es nicht mehrere ergebnisse gibt, es wird für rechts und links abgefragt:Code:void alle_motoren_vorwaerts_hindernis(void) { currentMillis = millis(); dauer_fahrt = 200; if (currentMillis - previousMillis > dauer_fahrt) { if (start_ping_rechts || start_ping_links == true) { aktuelle_ping_millis = millis(); if (aktuelle_ping_millis - vergangene_ping_millis > interval_ping) { vergangene_ping_millis = aktuelle_ping_millis; ping_distanz_rechts(); ping_distanz_links(); } } //servo_und_ping(); if (hindernis_rechts == true) { ausweichen_hindernis_rechts(); hindernis_rechts = false; } if (hindernis_links == true) { ausweichen_hindernis_links(); hindernis_links = false; } else { hindernis_rechts = false; hindernis_links = false; Serial.println("alle motoren vorwaerts_hindernis"); vorwaerts(); } } }
die eigentliche entfernung wird hiermit gemessen, auch wieder für rechts und links ausgelegt:Code:void hindernis_vorh_rechts_entprellt(void) { if (start_ping_rechts == false) aktuelle_ping_millis = millis(); if (aktuelle_ping_millis - vergangene_ping_millis > interval_ping) { vergangene_ping_millis = aktuelle_ping_millis; ping_distanz_rechts(); } if (uS_rechts != NO_ECHO) { if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0) { hindernis_rechts = true; mehrfach_zaehler_rechts = 1; } else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1) { mehrfach_zaehler_rechts = 0; } } else { if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1) { hindernis_rechts = false; mehrfach_zaehler_rechts = 0; } else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0) { mehrfach_zaehler_rechts = 1; } } }
die ganzen prints habe ich auch schon mal auskommentiert, es ändert nichts an meinem problem...Code:void ping_distanz_rechts(void) { uS_rechts = sonar_rechts.ping(); Serial1.print("Ping: "); Serial1.print(uS_rechts / US_ROUNDTRIP_CM); Serial1.println(" cm"); Serial.print("Ping: "); Serial.print(uS_rechts / US_ROUNDTRIP_CM); Serial.println(" cm"); delay(100); // hinzugefügt am 30.1.17 wg. doppelausweichen start_ping_rechts = true; }








Zitieren

Lesezeichen