Loggen auf die SD Karte

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.

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
 
Hallo Sven,

danke für die Ansätze, am Laborplatz konnte ich unter keinen Zuständen den Treiber in den Fehlerzustand bringen, muss aber nichts heißen.

Ich habe meine selbst gebaute Bremse im Code in Verdacht:
https://forum.ardumower.de/threads/...warum-bremst-der-mower-nicht.24823/post-54808

Aus irgendeinem Grund wird die Bremse wahrscheinlich nicht gelöst. Ich habe jetzt meine Zeilen im Code:
Code:
//Brake über RC Buchse für die JYQD 2021
  if (leftPwm == 0) digitalWrite(pinRemoteSwitch, HIGH);
    else digitalWrite(pinRemoteSwitch, LOW);
  if (rightPwm == 0) digitalWrite(pinRemoteSpeed, HIGH);
    else digitalWrite(pinRemoteSpeed, LOW);
  //ENDE

ein Stück weiter oben eingefügt, bevor das hier aufgerufen wird:

Code:
 // apply motor PWMs
  setMotorDriver(pinMotorLeftDir, pinMotorLeftPWM, leftPwm, gearsDriverChip, leftSpeedSign);
  setMotorDriver(pinMotorRightDir, pinMotorRightPWM, rightPwm, gearsDriverChip, rightSpeedSign);
  setMotorDriver(pinMotorMowDir, pinMotorMowPWM, mowPwm, mowDriverChip, mowSpeedSign);

Gestern ein paar Runden fahren lassen, noch unauffällig
 
Hallo Alexander,

da Du den Fehler unter Laborbedingungen nicht reproduzieren kannst, kann es vielleicht am generatorischem Betrieb beim Auslösen des Bumpers bei Fahrgeschwindigkeit liegen. Wenn ich das mit dem Treiber richtig verstehe, schaltet dieser bei PWM = 0 in den Freilauf (durch die Hemmung des Getriebes dürfte das aber nicht viel sein) und versucht nicht, den Motor abzubremsen, weshalb Du den Brake Eingang nutzt, um den Mäher bei Hanglage in Position zu halten. Wenn der Bumper auslöst, wird der PWM sofort auf 0 gesetzt, wodurch dann die Bedingung für die Bremse erfüllt ist und dieses vielleicht zu einem zu hohen Strom im Treiber führt, so das dieser auf Störung geht.
Das sind nur Mutmaßungen, aber vielleicht reicht es schon, die Bremse mit leichter Verzögerung (500ms) nach PWM=0 einzuschalten, um den Fehler gar nicht erst entstehen zu lassen.
Und der Brakeausgang sollte bei dem Fehlerrest auch mit auf low geschaltet werden und dann wieder verzögert auf high. Durch die aktuelle Bedingung bleibt dieser high wodurch der Treiber vielleicht nicht korrekt resetet werden kann.

Viel Erfolg!
Gruß Sven
 
Oben