Robot evita ostacoli

Stavo lavorando ad un robot che evita ostacoli, ho inoltre aggiunto un sistema per metterlo in "stand by" o attivarlo a distanza, con un telecomando infrarosso. Il problema è questo:
quando lo attivo non schiva gli ostacoli, anzi, prosegue dritto come niente fosse, ma se schiaccio un certo numero di volte (che non è mai costante) sul telecomando il tasto per l' attivazione, inizia a schivare e viaggia autonomamente. Se poi lo rimetto in stand by e successivamente lo riattivo, si ha la stessa situazione di prima.

Il robot ha iniziato a comportasi così solo dopo che ho aggiunto l' attivazione remota, prima funzionava correttamente.
Mi dareste una mano? io sto impazzendo :grin: :grin: :grin: Grazie mille!!!

(forward() e right() sono funzioni che ho aggiunto in una tab)

// libreria, sensore di distanza e comunicazione IR

#include <DistanceGP2Y0A21YK.h>
#include <IRremote.h>
//


// led di stato: 
int green = 4;
int red =5;

boolean idle = true;// fa rimanere acceso il led rosso all' avvio
//



// motori

#define motsx  6 //il pin del motore snistro
#define Dirsx  7 //controlla la direzione del motore sinistro

#define motdx  11 //il pin del motore destro
#define Dirdx  13 //controlla la direzione del motore destro
//



 // IR stuff
 #define  RECV_PIN 3     //stabilisce il pin del ricevitore    
 IRrecv irrecv(RECV_PIN); //crea un oggetto per la decodifica
 decode_results dati; //consente la decodifica del codice ir
 // 



 // Distance stuff
 int distance;           // variabile che memorizza la distanza
 DistanceGP2Y0A21YK Dist; 
 //



void setup() {  
  
   // motori
   pinMode(motdx,OUTPUT);
   pinMode(motsx,OUTPUT);
   pinMode(Dirsx,OUTPUT);
   pinMode(Dirdx,OUTPUT);  
  // LEDs
   pinMode(green,OUTPUT);
   pinMode(red,OUTPUT);
  //  
  
   //Sceglie il pin del sensore di distanza 
    Dist.begin(A0);
   //
 
   // avvia il ricevimento ir
   irrecv.enableIRIn(); 
   // 
   Serial.begin(9600);

 }
  
  
  
  
 //IL MAIN PROGRAM  
 void loop() {   
  




// stampa il codice dicevuto dal telecomando  
if (irrecv.decode(&dati)) {   
      Serial.print(dati.value, HEX);
    irrecv.resume(); // Receive the next value
}



// stand by all' avvio
 if(idle == true)
 {
 digitalWrite(red,HIGH);
 }
   
   // se si preme "ON" sul telecomando
     if (dati.value == 0xF7C03F  ) {   
    
     digitalWrite(green,HIGH);
     digitalWrite(red,LOW);   
     idle = false;
     
    
      distance = Dist.getDistanceCentimeter();

     
  
      if (distance >=8) {
          forward();
           }

      else { 
           right();
            }
   
      
  }

 
  
   // se si preme "OFF"
   if (dati.value == 0xF740BF ) 
   {   
   
   
   
     digitalWrite(green,LOW);
     digitalWrite(red,HIGH);  
 
     fermo();
   }






}

Quale Arduino, la Uno o la Mega?
La libreria IRRemote utilizza uno dei timer, a seconda della scheda.
La libreria Servo utilizza il timer1.
Nella libreria IRRemote puoi cambiare il timer usato a seconda della scheda Arduino (file IRremoteInt.h),
ma comunque potrebbero esserci dei problemi di "tempistica".

Prova a commentare solo l'istruzione irrecv.enableIRIn(); questa abilita l'interrupt per il timer. Se remmando questa il robot non da problemi (ma non funziona più il telecomando, ovviamente) allora qualche timer va in conflitto.

uso un arduino uno (la prossima volta è meglio scriverlo :grin:), ma puoi spiegarmi più nello specifico cosa dovrei fare ?

Controlla dentro al file IRremoteInt.h che stà nella cartella della libreria.
Tra le prime cose dovrebbe esserci:

#else
  //#define IR_USE_TIMER1   // tx = pin 9-10
#define IR_USE_TIMER2     // tx = pin 3-11

Questo è quello che c'e' nella mia. Su Arduino Uno la libreria usa il timer2.

ok, grazie mille 8)

ho cambiato i timer ma non si è risolto nulla

Anch'io ho avuto quel tipo di problema, usavo anche la libreria servo e ho risolto in parte così:
http://forum.arduino.cc/index.php?topic=167525.0

cosa intendi con in parte?

Perché se leggi bene, non ho usato la libreria IRremote, ma uso del codice ad hoc per telecomandi tipologia Sony :roll_eyes: