Go Down

Topic: Mi servirebbe una conferma su IRremote (Read 683 times) previous topic - next topic

aerospike

Feb 15, 2013, 03:50 pm Last Edit: Feb 16, 2013, 01:34 pm by aerospike Reason: 1
ho prestato la mia scheda arduino ad un amico e per una settimana non potrò sapere se questo codice funziona...
Secondo voi è corretto? Oltre ad essere alle prime armi è anche la prima volta che uso IRremote

Questo programma servirebbe a controllare un robot con un joistick montato su un telecomando

Code: [Select]


#include <IRremote.h>


#define motsx  6 //il pin del motore snistro
#define motdx  11 //il pin del motore destro

#define DirSx  7 //controlla la direzione del motore sinistro
#define DirDx  13 //controlla la direzione del motore destro


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


int mouvementX;
int mouvementZ;

int Xaxis;
int Zaxis;

  void setup() { 
   pinMode(motdx,OUTPUT);
   pinMode(motsx,OUTPUT);
   pinMode(DirSx,OUTPUT);
   pinMode(DirDx,OUTPUT);
   Serial.begin(9600);
   irrecv.enableIRIn(); // avvia il ricevimento ir
   }
 
 
 
 
//IL MAIN PROGRAM 
void loop() {


   
  irrecv.decode(&datiX);
  irrecv.resume(); // Receive the next value
  delay(80);   
 
  irrecv.decode(&datiZ);
  irrecv.resume(); // Receive the next value

  delay(80);
 
  Xaxis = datiX.value; 
  Zaxis = datiZ.value;
  mouvementX=map(Xaxis,0,1023,0,255); // converte il valore del potenziometro nel valore di output dei motore
  mouvementZ=map(Zaxis,0,1023,0,255); // converte il valore del potenziometro nel valore di output dei motore

   


  if ((Xaxis > 512 && Zaxis == 0))
  {
  forward();                    // per andare dritti
  }
   
  if (Xaxis > 512 && Zaxis < 512)   
  {
  left();                      //per andare a sinistra
  } 
   
  if (Xaxis > 512 && Zaxis > 512)
  {
  right();                      //per andare a destra
  } 

  if (Xaxis > 512 && Zaxis > 512)
  {
  backward();                  //per andare in retro
  } 

  if (Xaxis < 512 && Zaxis < 512)
  {
  backward_left();             //andare a sinistra in retro
  }

  if (Xaxis < 512 && Zaxis > 512)
  {
  backward_right();           //andare a destra in retro
  }

  if (Xaxis == 0 && Zaxis < 512)
  {
  rotation_left();            //per ruotare su se stesso a sinistra
  } 

  if (Xaxis == 0 && Zaxis < 512)
  {
  rotation_right();           //per ruotare su se stesso a destra
  }

  }






il programma che gestisce l' arduino che funge da telecomando è

Code: [Select]

#include <IRremote.h>

IRsend irsend;
IRsend datiX;//per inviare i dati dell' asse X al robot
IRsend datiZ;//per inviare i dati dell' asse Z al robot

#define potenziometroX  5 //il potenziometro avanti/indietro
#define potenziometroZ  3 // potenziometro destra/sinistra

int Xaxis;
int Zaxis;

int mouvementX;
int mouvementZ;



void setup() {
pinMode(potenziometroX,INPUT);
pinMode(potenziometroZ,INPUT);
}  



void loop () {
Xaxis=analogRead(potenziometroX); //legge il valore del potenziometro avanti/indietro
Zaxis=analogRead(potenziometroZ); //legge il valore del potenziometro  destra/sinistra



//invia coninuamente dati sulla posizione del joistick
  datiX.sendSony(0x0+Xaxis,6);
  delay(80);
  datiZ.sendSony(0x0+Zaxis,6);
  delay(80);
}

leo72

Per favore per le prox volte includi il codice usando l'apposito tag code (il pulsante "#").

PS:
perché 2 volte lo stesso messaggio? E' un errore? Se sì, potresti cancellare il secondo?

aerospike

#2
Feb 15, 2013, 09:48 pm Last Edit: Feb 15, 2013, 09:55 pm by aerospike Reason: 1
Corretto  :smiley-mr-green: Mi spiace di non essermi spiegato all' inizio, ho 2 dubbi legati proprio alla comunicazione infrarosso

1-l' arduino-telecomando legge i potenziometri del joystick che ho chiamato asseX e asseZ, e il codice inviato tramite l' infrarosso cambia in funzione di essi in questo modo:

Code: [Select]

  datiX.sendSony(0x0+Xaxis,6);
  delay(80);
  datiZ.sendSony(0x0+Zaxis,6);
  delay(80);


non sono segnati errori quando lo compilo ma non sono sicuro che funzioni




2-devo far distinguere al robot 2 segnali distinti, quelli provenienti dall' asseX e dall' asseZ del joystick, ma i segnali arrivano da un solo pin quindi come faccio a distinguerli ?

ho provato a "sincronizzare"  l' invio dei dati dal telecomando,  con il ricevimento da parte del robot, in questo modo:
l' invio dei dati sul' asseX è contemporaneo al ricevimento di essi sul robot, dopo una pausa di 80 millisecondi, avviene lo stesso ma questa volta per l' asseZ

anche questa volta però non sono sicuro che funzioni

Code: [Select]

 irrecv.decode(&datiX);

 irrecv.resume(); // Receive the next value
 delay(80);  
 
 irrecv.decode(&datiZ);
 irrecv.resume(); // Receive the next value

 delay(80);



leo72

Spedisci 2 caratteri: il primo indicherà a quale asse si riferisce il secondo byte ricevuto.

aerospike

potresti scrivermi un esempio ? è la prima vota che uso IRremote e non sono molto pratico

leo72

Vedo che spedisci dati così:
Code: [Select]
datiX.sendSony(0x0+Xaxis,6);

Potresti spedire prima un carattere prestabilito e poi il dato:
Code: [Select]
datiX.sendSony(0xff,6);
datiX.sendSony(0x0+Xaxis,6);

aerospike

Ok grazie  :) e per il ricevimento come sarebbe lo sketch?

PS: voglio andare sul sicuro

Go Up