hallo,
ich bin noch dran an meinem Raspi-Robot, der per BT Fernbedienung gesteuert wird.
Um eine BT-Unterbrechung zu registrieren, läuft ein Heartbeat-Signal von der Fernsteuerung zum Robot, das vom Raspi detektiert wird.
Nur bei intakter Verbindung ( _REMOTE_OK_ == TRUE ) dürfen dann Motor-Aktionen erfolgen.
Die Motorsteuerung läuft über L293-kompatible H-Brücken.
Die Motor-API ist diese:
Man sieht: motorOn ist nur möglich, wenn die Heartbeat-kontrollierte Variable _REMOTE_OK_ auf TRUE gesetzt ist.Code://************************************************************* #define motorCoast(nr) motorOn(nr, 0) // alias for motor coast //************************************************************* void motorBrake(int nr, int dirpwm) { // brake by pwm power int pwm; pwm = abs(dirpwm); digitalWrite(motor[nr].pind1, HIGH); digitalWrite(motor[nr].pind2, HIGH); motor[nr].dirpwm = pwm; softPwmWrite(motor[nr].pinpwm, pwm); // brake power always > 0 } //************************************************************* void motorOn(int nr, int dirpwm) { // motor On (nr, dir_pwm) int dir, pwm; // signed pwm: if(dirpwm > 0) dir = +1; // pwm > 0: forward else if(dirpwm < 0) dir = -1; // pwm < 0: reverse else dir = 0; // pwm = 0: coast if (!_REMOTE_OK_) dirpwm=0; // <<<<<<<<<<<<<< pwm = abs(dirpwm); if(dir> 0) { digitalWrite( motor[nr].pind1, HIGH); digitalWrite( motor[nr].pind2, LOW); } else if(dir==0) { digitalWrite( motor[nr].pind1, LOW); digitalWrite( motor[nr].pind2, LOW); } else { digitalWrite( motor[nr].pind1, LOW); digitalWrite( motor[nr].pind2, HIGH); } motor[nr].dirpwm = dirpwm; softPwmWrite( motor[nr].pinpwm, pwm); }
Das Problem ergibt sich jetzt aus der nächsten geplanten Erweiterung, einem MT-"Behaviour" Setup per Subsumption-Architektur.
Hier kann man es nicht restlos ausschließen, dass ein Task einen Motor anschaltet aufgrund falscher Environment-Daten oder weil er sich in einer Endlosschleife aufgehängt hat, und so die Motorpins auf HIGH zieht.
Auch in diesen Fällen muss ein Abschalten per Heartbeat-Semaphore oder einer anderen "EMERGENCY_STOP" Bedingung möglich sein, um unkontrolliertes Verhalten zu verhindern.
Was passiert nun, wenn ich per Heartbeat-gesteuertem Zusatz-Thread alle Motor-Pins auf LOW schalte, währenddessen der fehlerhafte Thread sie auf HIGH zieht?
Ist dann ein Kurzschluss zu befürchten?Code:void* thread99Go (void* ) { // EMERGENCYSTOP WATCHER while(1) { if(!_REMOTE_OK_) { motorCoast[0]; motorCoast[1]; //... } } return NULL; }
ich will es nicht einfach ausprobieren, um den Raspi nicht zu beschädigen.







Zitieren
Lesezeichen