Pages: [1]   Go Down
Author Topic: Robot evita ostacoli  (Read 830 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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






}

« Last Edit: June 14, 2013, 06:57:33 am by aerospike » Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 86
Posts: 4951
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: June 14, 2013, 07:16:23 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 86
Posts: 4951
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Controlla dentro al file IRremoteInt.h che stà nella cartella della libreria.
Tra le prime cose dovrebbe esserci:
Code:
#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.
Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, grazie mille  smiley-cool
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho cambiato i timer ma non si è risolto nulla
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cosa intendi con in parte?
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: