Robot evita ostacoli


stavo lavorando ad un robot che evita ostacoli, ho inoltre aggiunto un sistema per metterlo in "stand by"  o attivarlo 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 schivare e viaggia autonomamente. se poi lo rimetto in stand e successivamente lo riattivo, si ha la stessa situazione di prima.

il robot ha iniziato 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 next value
}



// stand 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, seconda della scheda.
la libreria servo utilizza il timer1.
nella libreria irremote  puoi cambiare il timer usato seconda della scheda arduino (file irremoteint.h),
ma comunque potrebbero esserci dei problemi di "tempistica".

prova 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.


Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Robot evita ostacoli


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62