SOLUCIONADO :motores cc e interrupciones.

Saludos comunidad.

He construido un pequeño coche con 2 motores cc, una placa arduino leonardo y una shield L298N.
Funciona perfectamente en modo autónomo. Ambos motores giran en los dos sentidos.

El problema viene al añadir una interrupción para controlar un receptor ir VS1838 .
Al ejecutar el código, la interrupción funciona correctamente, pero solo funciona uno de los motores. Descarto malas conexiones o mal funcionamiento del hardware, puesto que con el otro código todo funciona.

El Código que utilizo es sencillo, y no tiene ninguna lógica que en una sentencia switch…case , dentro del mismo case no se ejecute la parte de código correspondiente al motor B.

Estoy totalmente desconcertado. Si alguien puede poner un poco de luz, se agradecería.

//Control de 2 motores CC con control remoto IR
//Utilizando interrupciones
//Arduino Leonardo
#include <IRremote.h>
int IN3 = 7;    // Input3 conectada al pin 7
int IN4 = 4;    // Input4 conectada al pin 4 
int ENB = 6;    // ENB conectada al pin 6 de Arduino
int IN1= 8; // Input 1 conectada al pin 8
int IN2 = 9;    // Input2 conectada al pin 9
int ENA = 10;    // ENB conectada al pin 10 de Arduino
int RECEIVE_PIN= 2; //Utilizo la interrupción 1 correspondiente al pin2 de ALeonardo
//En ese pin conecto la patilla de señal del receptor
IRrecv irreceiver(RECEIVE_PIN);
decode_results results;

//Se declara una variable volátil que almacenará el codigo correspondiente al botón pulsado del mando
//esta variable es accesible desde fuera de la interrupción

volatile int estado_actual = 0;

//Se crea la función que se ejecutará cada vez que se el receptor IR
//detecte una señal

void fun_cambio_estado()// La función que se ejecuta al saltar la interrpción
{
  //Se recibe una señal y se guarda su valor 
 if (irreceiver.decode(&results)) {
    
    estado_actual=(results.value);
    Serial.println(estado_actual, HEX); 
   
    irreceiver.resume(); // Recibe el siguiente valor
  }
}
void setup()
{
  //Se declara el pin digital correspondiente al LED como salida.
 pinMode (ENB, OUTPUT); 
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
 pinMode (ENA, OUTPUT); 
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (2, INPUT);
Serial.begin(9600);
irreceiver.enableIRIn(); // Start the receiver
  //Se determina la interrupción 1 (por lo que el pin asociado al receptor Ir
  //será el 2 en caso de tratarse de un Arduino LEONARDO) a la que se
  //le asocia la función fun_cambio_estado que se activará al presionar el
  //pulsador (por tratarse del modo change).
  attachInterrupt(1, fun_cambio_estado, CHANGE);
  
}

void loop()
{
  //Se comprueba la tecla del mando
 switch (estado_actual)
       {
            Serial.println(estado_actual, HEX); 
            case 0x61D6D827: //codigo boton adelante 0x61D6D827:
            
            digitalWrite (IN3, HIGH);
            digitalWrite (IN4, LOW);
            digitalWrite (IN2, HIGH);
            digitalWrite (IN1, LOW);
            analogWrite(ENB,175);  
            analogWrite(ENA,105);  
                    
            break;

            case 0x61D620DF: //codigo boton stop 0x61D620DF:
            
            analogWrite(ENB,0);
            analogWrite(ENA,0);               
            break;
            
            case 0x61D6609F: //codigo boton derecha 0x61D6609F:
           
            digitalWrite (IN3, HIGH);
            digitalWrite (IN4, LOW);
            digitalWrite (IN2, LOW);
            digitalWrite (IN1, HIGH); 
            analogWrite(ENB,105);
            analogWrite(ENA,105);                  
            break;
            
            case 0x61D658A7: //codigo boton atras
            digitalWrite (IN3, LOW);
            digitalWrite (IN4, HIGH);
            digitalWrite (IN2, LOW);
            digitalWrite (IN1, HIGH);
            analogWrite(ENB,175);  
            analogWrite(ENA,105); 
                             
            break;                
            break;

            
       }
   
}

No te puedo poner nada de luz si no me das la energía necesaria.
En términos coloquiales: "explícate mejor".

Cuál pin es el "motor B"?
Muéstrame la ISR (función ejecutada en la interrupción)
Usas librerías?
Muéstrame el setup

Es que así como lo pones, no encuentro el error :confused:

prueba asi a ver

void loop() {
  //Se comprueba la tecla del mando
  Serial.println(estado_actual, HEX); 
  switch (estado_actual)     {
            
      case 0x61D6D827: //codigo boton adelante 0x61D6D827:
                        digitalWrite (IN3, HIGH);
                        digitalWrite (IN4, LOW);
                        digitalWrite (IN2, HIGH);
                        digitalWrite (IN1, LOW);
                        analogWrite(ENB,175);  
                        analogWrite(ENA,105);  
                        break;

      case 0x61D620DF: //codigo boton stop 0x61D620DF:
                        analogWrite(ENB,0);
                        analogWrite(ENA,0);               
                        break;
      case 0x61D6609F: //codigo boton derecha 0x61D6609F:
                        digitalWrite (IN3, HIGH);
                        digitalWrite (IN4, LOW);
                        digitalWrite (IN2, LOW);
                        digitalWrite (IN1, HIGH); 
                        analogWrite(ENB,105);
                        analogWrite(ENA,105);                  
                        break;
      case 0x61D658A7: //codigo boton atras
                        digitalWrite (IN3, LOW);
                        digitalWrite (IN4, HIGH);
                        digitalWrite (IN2, LOW);
                        digitalWrite (IN1, HIGH);
                        analogWrite(ENB,175);  
                        analogWrite(ENA,105);                                          
                        break;                
       }
}

Lucario448:
No te puedo poner nada de luz si no me das la energía necesaria.
En términos coloquiales: "explícate mejor".

Cuál pin es el "motor B"?
Muéstrame la ISR (función ejecutada en la interrupción)
Usas librerías?
Muéstrame el setup

Es que así como lo pones, no encuentro el error :confused:

Por error no pegué el código entero. Edito mi primer post y agrego el código completo

En contestación a surbyte.
Lo primero gracias por tu interés.

Elimino el segundo break siguiendo tus indicaciones.

El programa corre sin errores, pero el resultado es el mismo. Solo funciona un motor.

En un principio creí que podía ser alguna incompatibilidad de pines con la interrupción. Por eso en el código utilizo la interrupción 1. Antes lo intenté con la interrupcion 0 y el pin 3.

También cambié el cableado de los motores. Y el motor conectado a ENB no funciona.

Puedo subir el otro código. Sin interrupciones y sin receptor. Un programa de testeo que mueve los motores en un sentido, hace una pausa y los mueve en sentido inverso. Con ese los dos motores funcionan correctamente

Ya recuerdo tu problema.
la libreria IRremote usa el timer2 que condiciona estos pines en el y el motor usa pines que estan siendo usado por dicho timer.
Cambia los pines del motor y verás que cambia todo.

Esta librería por ejemplo usa Timer2 que condiciona el pin3 asi que ese pin no puedes usarlo.
Una solucion es usar otro timer según este link.
Acá tenes otra posible alternativa, mira el ejemplo

Gracias de nuevo Surbyte.

Ahora si funciona, cambiando el pin del PWM del motor B todo funciona correctamente.

Yo ya me temía que el problema venía por incompatibilidad de pines, pero sospechaba de la interrupción. Nunca se me pasó por la cabeza la IRremote.

Solo me falta ponerle unas ruedas, los motores vienen con el eje al desnudo y tengo que buscar la forma de que la rueda no patine en el eje.

Muchas gracias a todos