Der Mäher bekommt nach dem bumper Ereignis höchst wahrscheinlich wieder ganz normal den Fahrbefehl. linear (der Sollwert für die vor-/rückwärts Geschwindigkeit) wird auf dem Wert stehen, der für die Geschwindigkeit vorgesehen ist. Aber aus irgend einem Grund versetzen die Treiber die Antriebe nicht in Bewegung. Nach kurzer Überwachungsdauer wird dann der ODO-Fehler gemeldet, weil laut Software die Antriebe drehen müssten, dieses aber nicht tun. Allerdings wird durch „resetting recoverMotorFaultCounter“ der Fehlermerker eigentlich zu früh zurück gesetzt, wodurch er bei diesem Fehlerbild in einer Endlosschleife endet und immer wieder versucht, den Treiber zu reaktivieren. Anstatt nach 3 oder 5 Versuchen abzubrechen.
Ich vermut, dass sich die Treiber selbst in einem Fehlerzustand befinden und so, wie die Ansteuerung momentan für die Treiber in so einem Fehlerfall erfolgen einfach nicht funktioniert. Wie es scheint, lässt sich der Fehler aber wenigstens leicht mit auslösen des Bumper reproduzieren. Dann würde ich als erstes in der „AmRobotDriver.cpp“ beim „resetMotorFaults“ anfangen zu experimentieren. Als Beispiel habe ich für den linken Motor eine Konsolenausgabe hinzugefügt, um im Log sehen zu können, dass er im Fehlerfall auch wirklich durch den Reset läuft. Um beim Resetversuch jetzt die Ausgänge für den Treiber für etwas längere Zeit (0,5 Sekunden) auf einem anderen Pegel zu halten und sicher zu gehen, dass da nichts anderes reinfunkt habe ich ein delay(500) zwischen den Wechsel des enable Signals gesetzt. (NUR zum testen! Kein delay im endgültigen Code, da dann die komplette Programmbearbeitung gestoppt wird.)
Dann kannst Du noch zusätzliche Ausgangssignale für den Treiber toggeln lassen und diese für 500ms in den Zustand versetzen, wie während eines reboots. (Nach einem reboot robot laufen die Treiber doch immer wieder ohne Probleme an, oder?)
Falls der „watchdogReset();“ dort beim kompilieren unbekannt ist (kann es jetzt leider nicht testen) dann das ganze erst einmal nur für einen Antrieb testen. Wenn es funktioniert, wird sich der Mäher mit einem Rad drehen und dann zwar auch wieder einen Fehler geben, aber man weiß dann, dass es theoretisch funktionieren würde.
Viel Erfolg!
Gruß Sven
Ich vermut, dass sich die Treiber selbst in einem Fehlerzustand befinden und so, wie die Ansteuerung momentan für die Treiber in so einem Fehlerfall erfolgen einfach nicht funktioniert. Wie es scheint, lässt sich der Fehler aber wenigstens leicht mit auslösen des Bumper reproduzieren. Dann würde ich als erstes in der „AmRobotDriver.cpp“ beim „resetMotorFaults“ anfangen zu experimentieren. Als Beispiel habe ich für den linken Motor eine Konsolenausgabe hinzugefügt, um im Log sehen zu können, dass er im Fehlerfall auch wirklich durch den Reset läuft. Um beim Resetversuch jetzt die Ausgänge für den Treiber für etwas längere Zeit (0,5 Sekunden) auf einem anderen Pegel zu halten und sicher zu gehen, dass da nichts anderes reinfunkt habe ich ein delay(500) zwischen den Wechsel des enable Signals gesetzt. (NUR zum testen! Kein delay im endgültigen Code, da dann die komplette Programmbearbeitung gestoppt wird.)
Dann kannst Du noch zusätzliche Ausgangssignale für den Treiber toggeln lassen und diese für 500ms in den Zustand versetzen, wie während eines reboots. (Nach einem reboot robot laufen die Treiber doch immer wieder ohne Probleme an, oder?)
Falls der „watchdogReset();“ dort beim kompilieren unbekannt ist (kann es jetzt leider nicht testen) dann das ganze erst einmal nur für einen Antrieb testen. Wenn es funktioniert, wird sich der Mäher mit einem Rad drehen und dann zwar auch wieder einen Fehler geben, aber man weiß dann, dass es theoretisch funktionieren würde.
C++:
void AmMotorDriver::resetMotorFaults(){
if (digitalRead(pinMotorLeftFault) == gearsDriverChip.faultActive) {
if (gearsDriverChip.resetFaultByToggleEnable){
digitalWrite(pinMotorEnable, !gearsDriverChip.enableActive);
CONSOLE.println("DEBUG resetMotorFaults: Delay for toggle enable.");
delay(500);
watchdogReset();
digitalWrite(pinMotorEnable, gearsDriverChip.enableActive);
}
}
if (digitalRead(pinMotorRightFault) == gearsDriverChip.faultActive) {
if (gearsDriverChip.resetFaultByToggleEnable){
digitalWrite(pinMotorEnable, !gearsDriverChip.enableActive);
digitalWrite(pinMotorEnable, gearsDriverChip.enableActive);
}
}
if (digitalRead(pinMotorMowFault) == mowDriverChip.faultActive) {
if (mowDriverChip.resetFaultByToggleEnable){
digitalWrite(pinMotorMowEnable, !mowDriverChip.enableActive);
digitalWrite(pinMotorMowEnable, mowDriverChip.enableActive);
}
}
}
Viel Erfolg!
Gruß Sven