problemas con ir.begin() al usar un controlador de motores H. (SOLUCIONADO)

Estoy probando controlar un coche con dos motores controlados por un puente H a través de un mando de infrarrojos.

El coche con el puente por separado funciona.
El decodificador de infrarrojos por separado funciona.

Al juntar todo solo se acciona un motor del coche (el otro es como si no estuviera).

He averiguado que quitando ir.begin() si que funcionan los dos motores.

Pongo el códiigo que estoy usando a ver si alguien me puede ayudar:

#include <Arduino.h>
#include <NECIRrcv.h>
#define IRPIN 5   // pin that IR detector is connected to

    #define MOTOR1_CTL1 8  // I1  
    #define MOTOR1_CTL2 9  // I2  
    #define MOTOR1_PWM 11 // EA  
      
    #define MOTOR2_CTL1 6  // I3  
    #define MOTOR2_CTL2 7  // I4  
    #define MOTOR2_PWM 10 // EB  
      
    #define MOTOR_DIR_FORWARD 0  
    #define MOTOR_DIR_BACKWARD 1 

//int led = 4;
//static int aux = 1;
NECIRrcv ir(IRPIN) ;
void setup()
{
//  pinMode(led, OUTPUT);
  ir.begin();
  
        // Setup pins for motor 1  
       pinMode(MOTOR1_CTL1,OUTPUT);  
       pinMode(MOTOR1_CTL2,OUTPUT);  
       pinMode(MOTOR1_PWM,OUTPUT);  
         
      // Setup pins for motor 2  
       pinMode(MOTOR2_CTL1,OUTPUT);  
       pinMode(MOTOR2_CTL2,OUTPUT);  
       pinMode(MOTOR2_PWM,OUTPUT); 
  
}







void setSpeed(char motor_num, char motor_speed)  
    {  
       if (motor_num == 1)  
       {  
          analogWrite(MOTOR1_PWM, motor_speed);  
       }     
       else  
       {  
          analogWrite(MOTOR2_PWM, motor_speed);  
       }  
    }  
      
    void motorStart(char motor_num, byte direction)  
    {  
        
       char pin_ctl1;  
       char pin_ctl2;  
         
       if (motor_num == 1)  
       {  
          pin_ctl1 = MOTOR1_CTL1;  
          pin_ctl2 = MOTOR1_CTL2;  
       }     
       else  
       {  
          pin_ctl1 = MOTOR2_CTL1;  
          pin_ctl2 = MOTOR2_CTL2;       
       }  
        
       switch (direction)  
       {  
         case MOTOR_DIR_FORWARD:  
         {  
           digitalWrite(pin_ctl1,LOW);  
           digitalWrite(pin_ctl2,HIGH);            
         }  
         break;   
                
         case MOTOR_DIR_BACKWARD:  
         {  
            digitalWrite(pin_ctl1,HIGH);  
            digitalWrite(pin_ctl2,LOW);            
         }  
         break;           
       }  
    }  
      
    void motorStop(char motor_num)  
    {  
       setSpeed(motor_num, 0);  
       if (motor_num == 1)  
       {  
         digitalWrite(MOTOR1_CTL1,HIGH);  
         digitalWrite(MOTOR1_CTL2,HIGH);       
       }  
       else  
       {  
         digitalWrite(MOTOR2_CTL1,HIGH);  
         digitalWrite(MOTOR2_CTL2,HIGH);       
       }  
    }  








void loop()
{

 
  unsigned long ircode ;
  while (ir.available()) 
  { 
    ircode = ir.read() ;
     switch (ircode)
     {
        case 3810328320: //tecla 5 parada
        motorStop(1);
        motorStop(2);
        delay(5); 
        break;
       
        case 3877175040: // tecla 2 avanza
        motorStart(1, MOTOR_DIR_FORWARD);    
        setSpeed(1, 200);  
        //motorStart(2, MOTOR_DIR_FORWARD);        
        //setSpeed(2, 200);    
        delay(5);
        break;
       
        case 2907897600: // tecla 8 retrocede
        motorStart(1, MOTOR_DIR_BACKWARD);    
        setSpeed(1, 200);  
        motorStart(2, MOTOR_DIR_BACKWARD);    
        setSpeed(2, 200);                    
        delay(5);
        break;
       
        case 2774204160:  // tecla 6 giro derecha
        motorStart(1, MOTOR_DIR_FORWARD);    
        setSpeed(1, 200);  
        motorStart(2, MOTOR_DIR_BACKWARD);    
        setSpeed(2, 200);                    
        delay(5);
        break;
       
        case 4144561920: //  tecla 4 giro izquierda
        motorStart(1, MOTOR_DIR_BACKWARD);    
        setSpeed(1, 200);  
        motorStart(2, MOTOR_DIR_FORWARD);    
        setSpeed(2, 200);                    
        delay(5);
        break;
         
     }
    
    
    
    } 
}

No recuerdo si usan el mismo timer ambas librerías. Compruebo y confirmo o no.

Confirmado:
La de motor usa Timer2 y la IR NEC usa el mismo timer2.

Después de todo el día dándole vueltas y googleando... he encontrado el problema, aunque no el motivo porque soy muy novato en arduino.

El problema viene porque las salidas PWM experimentan algún problema con la librería del sensor de infrarrojos. Pero lo que más me mosquea es que funciona uno de los motores y el otro no, o sea que una de las salidas pwm que controla el motor 2 si que está funcionando, mientras que la del motor 1 no.

He quitado los cables de las salidas pwm que van al L298N (los que le dicen la velocidad del motor), he puenteado ENA y ENB en el L298N para que siempre lleva la misma potencia y listo. Ahora si que funciona.

Pero sigo sin saber como solucionarlo para que funcine con PWM y pueda controlar la veloicidad de los motores.

surbyte:
No recuerdo si usan el mismo timer ambas librerías. Compruebo y confirmo o no.

Confirmado:
La de motor usa Timer2 y la IR NEC usa el mismo timer2.

Muchas gracias por la ayuda!!
¿Cómo lo soluciono?

¿Por qué entonces funciona bien uno de los motores y el otro no?

busca una librería que no use Timer2 ya sea para IR o para el motor o a la inversa una libreria IR que no use el Timer2.

surbyte:
busca una librería que no use Timer2 ya sea para IR o para el motor o a la inversa una libreria IR que no use el Timer2.

gracias.

voy a buscar.

Aunque creo que para el motor no estoy usando ninguna librería.

Las librerías que uso son:

#include <Arduino.h>
#include <NECIRrcv.h>

y ambas son necesarias para el sensor de infrarrojos.

Veo que no.. pero entonces confundí con otro post que dice tener el mismo problema pero usa AFmotor para mover los motores. Por eso esta respuesta.
Entonces olvida mi comentario.
No aplica.

Muchas gracias por la ayuda!!

He detectado que el problema está en la salida pwm que va hacia el puente H. Pero sólo en una de las salidas, porque la otra funciona bien y el motor funciona bien.

Si cojo el mismo código de programa y quito ir.begin() se solucionan todos los problemas...

¿alguien sabe cual puede ser el problema?

La librería NEC usa el timer2
El timer2 controla los pines
Pins 11 and 3: controlled by Timer2
Pin 11 está usado para contolar tu

#define MOTOR1_PWM 11 // EA

Aqui esta el problema.
Usa otra salida PWM que no sea la 11 ni la 3

surbyte:
La librería NEC usa el timer2
El timer2 controla los pines
Pins 11 and 3: controlled by Timer2
Pin 11 está usado para contolar tu

#define MOTOR1_PWM 11 // EA

Aqui esta el problema.
Usa otra salida PWM que no sea la 11 ni la 3

Muchas gracias....

Acabo de darme cuenta del problema y venía a postear la respuesta.

Yo no sabía que el timer2 controlaba los pines 3 y 11, pero cambiando las salidas pwm de ambos motores me he dado cuenta que el problema estaba en el pin11.

Lo he cambiado al pin5 y ahora funciona a la perfección.

Poco a poco voy aprendiendo.

A ver si llevo a poder ayudar a gente.

Un saludo y muchísimas gracias.

Edita el titulo y ponle SOLUCIONADO