Mi servirebbe una conferma su IRremote

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

#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 è

#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);
}

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?

Corretto :grin: 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:

   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

  irrecv.decode(&datiX);

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

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

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

Vedo che spedisci dati così:

datiX.sendSony(0x0+Xaxis,6);

Potresti spedire prima un carattere prestabilito e poi il dato:

datiX.sendSony(0xff,6); 
datiX.sendSony(0x0+Xaxis,6);

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

PS: voglio andare sul sicuro