L293 Shield con 4 motori DC

Ciao,
sto cercando di programmare un robot con 4 motori DC da comandare tramite telecomando impiegando un Arduino UNO, uno Shield L293D ed un sensore infrarossi 1838.
Ho uno sketch molto basilare ma non riesco a risolvere questo problema. Il ricevitore funziona, il comando parte ma si muovono soltanto i motori 3 e 4.
Modificando lo sketch ed inserendo la Void forward dentro la void Loop, se rimuovo la parte di controllo di decodifica dei risultati e del valore i motori girano e funziona,

#include <AFMotor.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
 
AF_DCMotor motor2(2, MOTOR12_64KHZ); 
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR34_64KHZ);
AF_DCMotor motor4(4, MOTOR34_64KHZ);



void setup() {
  
motor1.setSpeed(200);
motor2.setSpeed(200);
motor3.setSpeed(200);
motor4.setSpeed(200);


}

void loop() {

  
 
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);       
delay(8000); 
//motor1.run(BACKWARD);
//motor2.run(BACKWARD);
//motor3.run(BACKWARD);
//motor4.run(BACKWARD);      
//delay(1000);  
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);       
delay(1000); 
  
}

Se invece carico lo sketch come sotto si muovono soltanto i motori 3 e 4 e non riesco a capire perchè.
Qualcuno ha qualche idea?

#include <AFMotor.h>
#include <IRremote.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
int RECV_PIN = (A5);

IRrecv irrecv(RECV_PIN);
decode_results results;
int vel=200;

void setup() {

irrecv.enableIRIn(); 

}

void loop() {

   if (irrecv.decode(&results))
{     
 int value = results.value;    
 switch(value){     
 case 3969528025: 
 forward(); 
 }

irrecv.resume(); 
}  
} 

void forward()
{
motor1.setSpeed(vel);motor2.setSpeed(vel);motor3.setSpeed(vel);motor4.setSpeed(vel);
motor1.run(FORWARD);motor2.run(FORWARD);motor3.run(FORWARD);motor4.run(FORWARD);
delay(8000); 
motor1.run(RELEASE);motor2.run(RELEASE);motor3.run(RELEASE);motor4.run(RELEASE);       
delay(2000);
}

Anche se nei due sketch i motori sono dichiarati con dei parametri diversi, ho provato più combinazioni per entrambi i casi (diversi KHZ) e quello non fa differenze

Grazie

Purtroppo la IRremote usa il timer2 e anche AFmotor usa il timer2 per l'uscita 1 e 2. Mentre per l'uscita 3 e 4 usa il timer0. Nota che il timer0 è impiegato normalmente per il timer millis() e pertanto non puoi usare millis(), ma questa ultima cosa non la ho verificata.

L'unico modo per fare lavorare IRremote e AFmotor assieme è di modificare il codice della libreria in modo di liberare il timer2 e impegnare il timer1. Serve anche modificare il cablaggio poiché le uscite PWM sul timer1 sono pin 9 e 10.

Ciao.

Oppure (ricordavo bene) si può modificare la IRremote per usare il timer1 al posto di timer2.
Apri il file boarddefs.h
Trova il codice sotto.

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
// ATmega48, ATmega88, ATmega168, ATmega328
	//#define IR_USE_TIMER1   // tx = pin 9
	#define IR_USE_TIMER2     // tx = pin 3

#endif

Commenta la #define IR_USE_TIMER2 // tx = pin 3 e togli il commento davanti a //#define IR_USE_TIMER1 // tx = pin 9, cioè:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
// ATmega48, ATmega88, ATmega168, ATmega328
	#define IR_USE_TIMER1   // tx = pin 9
	//#define IR_USE_TIMER2     // tx = pin 3

#endif

Prova e fa sapere se lavora.
Ciao.

Funziona, ti ringrazio molto perchè da solo non ci sarei arrivato.
Ho impiegato questo ricevitore ma nel frattempo ho acquistato sia dei moduli ricevitore/trasmettitore a 433 mhz che dei ricetrasmettitori NRF2401 anche per avere un raggio di copertura maggiore. A questo punto spero che non ci siano problemi di questo tipo, cercherò di stanare eventuali conflitti nell'utilizzo dei timer tra le varie librerie.
Ti ringrazio molto

Funziona, ti ringrazio molto perchè da solo non ci sarei arrivato.

Si tratta di un problema conosciuto, comunque i timer hardware dentro ATmega328 sono 3 in totale, quindi gira e rigira si fa presto ad impegnarli tutti. Vabbe c'è anche un altro timer chiamato watchdog ma non ha pin PWM ed è prevalentemente impiegato per resettare la MCU in caso in cui il programma entri in un loop infinito non previsto (e non gestito).

Ho impiegato questo ricevitore ma nel frattempo ho acquistato sia dei moduli ricevitore/trasmettitore a 433 mhz che dei ricetrasmettitori NRF2401 anche per avere un raggio di copertura maggiore.

Non mi intendo di ricevitori RF, ma capisco che li userai al posto di IRremote per comandare il modello, quindi ti si libera un timer.
Bene c'è da capire se la libreria usa qualcosa di già impegnato e quindi non solo se usa un timer.

Eventualmente la arduino MEGA ha 4 (mi pare) timer e 4 seriali hardware ma certamente è più ingombrante della UNO.

Ciao.