Go Down

Topic: Robot evita ostacoli (Read 913 times) previous topic - next topic

aerospike

Jun 14, 2013, 01:54 pm Last Edit: Jun 14, 2013, 01:57 pm by aerospike Reason: 1
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  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green: Grazie mille!!!

(forward() e right() sono funzioni che ho aggiunto in una tab)
Code: [Select]


// 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();
  }






}


nid69ita

#1
Jun 14, 2013, 02:14 pm Last Edit: Jun 14, 2013, 02:16 pm by nid69ita Reason: 1
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.
my name is IGOR, not AIGOR

aerospike

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

nid69ita

Controlla dentro al file IRremoteInt.h che stà nella cartella della libreria.
Tra le prime cose dovrebbe esserci:
Code: [Select]
#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.
my name is IGOR, not AIGOR

aerospike


aerospike

ho cambiato i timer ma non si è risolto nulla

amario57

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

aerospike

cosa intendi con in parte?

amario57

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

Go Up