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:
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);
   
   
}
Man sieht: motorOn ist nur möglich, wenn die Heartbeat-kontrollierte Variable _REMOTE_OK_ auf TRUE gesetzt ist.

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?

Code:
void* thread99Go (void* ) {       //  EMERGENCYSTOP WATCHER
   while(1) {   
      if(!_REMOTE_OK_) {
         motorCoast[0];
         motorCoast[1];
         //...
      }
   }
   return NULL;
}
Ist dann ein Kurzschluss zu befürchten?

ich will es nicht einfach ausprobieren, um den Raspi nicht zu beschädigen.