RX2 Macchinina RC con ritardo tra azioni elevato

Salve a tutti, qualche giorno fa ho modificato una macchinina RC avente all’interno un Chip RX2, il mio intento era di telecomandarla con arduino tramite bluetooth, bypassando esclusivamente il ricevitore radio. Le prime prove con tasti su breadboard funzionavano… Poi ho deciso di installare un modulo BT… Ed il problema si presenta qui: quando premo il tasto di marcia (uno qualsiasi) o una direzione per lungo tempo e rilascio la macchina continua a svolgere l’azione precedente come se il tasto fosse ancora premuto, poi dopo X tempo (determinato dal tempo di pressione del tasto) si ferma. In pratica premo un tasto per 5 secondi, lo rilascio e dopo altri 5 secondi la macchina si ferma, non riesco a capire dove sta l’errore. Avevo pensato ad una banda ristretta e quindi ho settato il modulo BT ad un baudrate superiore, ma nulla il problema persiste; ho provato pure da monitor seriale per vedere se fosse l’app sul cellulare il problema… ma invece no, spero che voi possiate aiutarmi.

Qui sotto trovate il nome dell’app:

La app

Qui sotto troverete il datasheet del RX2:

RX2

Qui sotto troverete il sorgente:

const int luci  = 12;   
 const int statobt = 2;
  const int dati = 11;
 

 /*  
[W2 W2 W2 W2] {(n) x W1} [W2 W2 W2 W2] {(n) x W1} [W2 W2 W2 W2]

4 Inizio/Fine treno
10 Avanti
16 Avanti e Turbo
22 Turbo (N2o vieni a me!)
28 Avanti e Sinistra
34 Avanti e Destra
40 Indietro
46 Indietro e Destra
52 Indietro e Sinistra
58 Sinistra
64 Destra
*/
  

void setup() { //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    pinMode(dati,OUTPUT);
    pinMode(luci, OUTPUT); 
    pinMode(statobt, INPUT);    
    Serial.begin(9600);
}//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
void loop() {//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  //Funzione di protezione contro disconnessioni
     if(digitalRead(statobt)==LOW) { stato='S'; }
  //Si salva la lettura seriali nella variabile stato    
      stato = Serial.read();   

  /***********************AVANTI****************************/
if (stato == 'F') {
 for(int i=0; i<=3; i++)  
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=10; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /**********************AVANTI SINISTRA************************/
if (stato == 'G') {
      for(int i=0; i<=3; i++) 
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=28; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /**********************AVANTI DESTRA************************/
if (stato == 'I') {
        for(int i=0; i<=3; i++) 
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=34; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /***********************INDIETRO****************************/
if (stato == 'B') {
       for(int i=0; i<=3; i++)  
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=40; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /**********************INDIETRO SINISTRA************************/
if (stato == 'H') {
     for(int i=0; i<=3; i++) 
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=52; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /**********************INDIETRO DESTRA************************/
if (stato == 'J') {
      for(int i=0; i<=3; i++) 
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=46; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /***************************SINISTRA*****************************/
if (stato == 'L') {
    for(int i=0; i<=3; i++) 
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=58; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  /***************************DESTRA*****************************/
if (stato == 'R') {
         for(int i=0; i<=3; i++)  
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
 
 for(int i=0; i<=64; i++) 
 {

   digitalWrite(dati,HIGH);
   delayMicroseconds(500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }


    
  /************************LUCI*****************************/
if (stato == 'W') {  
         digitalWrite(luci, HIGH); 
    }
    
      else if (stato == 'w'){
         digitalWrite(luci, LOW); 
    }
  /************************STOP*****************************/
if (stato == 'S'){
           for(int i=0; i<=3; i++)  
 {
   digitalWrite(dati,HIGH);
   delayMicroseconds(1500);

   digitalWrite(dati,LOW);
   delayMicroseconds(500);
 }
    }
  
}//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

sei sicuro che quando tieni il tasto premuto per 5 secondi, una volta rilasciato l’app non abbia sparato molti caratteri ad Arduino e lui li stà ancora gestendo perchè li ha in coda ?
Prova a mettere un contatore su un tasto (esempio nel ramo ‘F’) e stampalo su Monitor.
Per fare il debug logicamente dovrai NON collegare il BT sulla seriale fisica (pin 0 e 1) ma dovrai usare la SoftwareSerial e usare pin diversi.

Inoltre ricorda che quando ci sono for del tipo:

for(int i=0; i<=34; i++) 
{ digitalWrite(dati,HIGH);
   delayMicroseconds(500);
   digitalWrite(dati,LOW);
   delayMicroseconds(500);
}

mentre Arduino non può fare altro mentre esegue quel codice per circa 34*1000 microsecondi + tempo di due digitalWrite