Problema al mezclar control IR con motores

Como he comentado en mi presentación, estoy en un atolladero del que no logro salir por mi mismo, por eso recurro al foro y sus componentes para pedir un ayuda.

Después de haber entrado en este mundillo del Arduino y de haber hecho pruebas por separado con leds, motores, sensores de luz y un receptor IR, he comenzado a intentar combinarlos para construir con mi hijo un pequeño vehículo con ciertas funciones.

Ya he construido la base del vehículo (mas torpe de lo que hubiese querido, pero de momento es lo que hay). Con un Sketch sencillo que mueve los motores de manera sencilla y fija, el vehículo se mueve: un ratito para adelante, un ratito para atrás y un unos giros (esto es lo que peor hace :~ ).

El problema viene cuando añado un receptor IR para controlar las funciones del vehículo. De momento que avance y que se pare, después se irán añadiendo más funciones. Pero no funciona =( , mal empezamos.

¡¡¡En cuanto inicio la función del IR [ ir.begin() ; ] los motores dejan de funcionar!!! ¿porqué? ni idea.

// Preparamos el mando
#include <NECIRrcv.h>

#define pausa 1000
#define IRPIN 2   // pin para el receptor IR

// Teclas del mando a distancia
#define A1 4278238976
#define B1 4261527296
#define C1 4244815616
#define A2 4211392256
#define B2 4194680576
#define C2 4177968896
#define A3 4144545536
#define B3 4127833856
#define C3 4111122176
#define A4 4077698816
#define B4 4060987136
#define C4 4044275456
#define A5 4010852096
#define B5 3994140416
#define C5 3977428736
#define A6 3944005376
#define B6 3927293696
#define C6 3910582016
#define A7 3877158656
#define B7 3860446976
#define C7 3843735296

NECIRrcv ir(IRPIN) ;

//Preparamos los motores
#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_64KHZ); // crea motor #1, 64KHz pwm
AF_DCMotor motor2(2, MOTOR12_64KHZ); // crea motor #2, 64KHz pwm

void setup() 
{ 
  Serial.begin(9600) ;
  Serial.println("Probando: ") ;
  
    // PONEMOS LAS VELOCIDADES
  motor1.setSpeed(255);     
  motor2.setSpeed(255);
  
  ir.begin() ; //si elimino esta linea (y pongo los motores fuera del switch), funcionan
} 

void loop() 
{ 
   Serial.println(" inicio bucle");

   unsigned long ircode = 0 ;
   while (ir.available()) 
   {
   ircode = ir.read() ; // leemos el mando a distancia
   
   switch (ircode) {
    case B2: // adelante
      Serial.println(ircode,DEC);
      Serial.println("adelante");
      motor1.run(FORWARD);     
      motor2.run(FORWARD);
      break;
    case B3: // parar
      Serial.println(ircode,DEC);
      Serial.println("parar");
      motor1.run(RELEASE);     
      motor2.run(RELEASE);
      break;
    default:
      Serial.println("otro");
   }
   delay(pausa); 
   }
}

Decir que el código está hecho a base de corta-pegas de lo que encuentro por la red.
El IR lee bien y los case funcionan. Veo en el monitor las escrituras que tengo puestas para vigilar la ejecución del código. Pero los motores no se mueven ni un ápice.

¿Alguien sabe porqué el ir.begin() ; anula mis motores?

¿Como tienes conectado todo?

Utilizo un shield para los motores, y un pin digital para la entrada del IR.

En principio no creo que sea un problema de conexión, porque si pruebo el mismo hardware con un sketch para IR y otro para los motores, funcionan bien. De hecho, con el código que he puesto, con la línea de begin.ir funciona el mando a distancia pero no los motores, pero si la elimino (sin hacer ningún cambio de conexiones) los motores ya funcionan.

¿Y alimentas los motores con una fuente de alimentacion separada de arduino?

Si la fuente es la misma, o sea, que alimentas motores y sensor de infrarrojos con la tension del arduino no te extrañe que se quede sin fuerza para mover y las interferencias sean las culpables.

Del sensor de infrarrojos no especificas que tipo es, ni como lo has conectado, a ver si es de vishay de los de 3v3 en vez de 5v y tambien puede cargar el arduino.

Por eso te pregunto la conexion de los aparatos.

Los motores van alimentados de forma independiente del arduino, poniendo dos juegos de baterías y el jumper del shield de motores en su correspondiente posición.

El lector IR vino con el kit inicial que compré. Lo alimento con los 5v del arduino, y lee sin problemas estén o no conectados los motores.

Gracias por tu interés.

Sé que la librería IR configura el prescaler y utiliza el timer2, interrupción de desbordamiento de éste e interrupción por cambio de estado del pin2. No controlo demasiado, sin embargo, si algo de todo lo dicho puede alterar el funcionamiento de los pwm que supongo que utilice la librería AFMotor. Creo que el problema podría venir por ahí. Podrías intentar que los motores se inicien después del infrarrojo, a ver si ocurre al revés (que funcionen los motores y no el ir) o suena la flauta y chuta todo. Saludos

Sigo sin solucionar el problema =( =( =( .

He probado a cambiar el orden, como comenta noter, pero nada, sigue igual.

He buscado una alternativa a la librería NECIRrcv.h y he encontrado IRremote.h. Tenía la esperanza de que con otra librería funcionase bien, pero no, mi gozo en un pozo :~ :( .

Pasa lo mismo que con la librería inicial, en cuanto está el comando de inicio del receptor, en este caso irrecv.enableIRIn();, los motores dejan de funcionar.

Si alguien tiene algún consejo o conoce algún proyecto que use mando IR con shield de motores le agradezco que lo ponga por aquí.

En cualquier caso, gracias por haber leído esto.

¡Ah! También he probado a usar el pin 14 (análogico) en vez del 2 digital (que es el único que deja libre el shell de motores) por si el problema fuese ese, pero no, hace exactamente lo mismo.

ricar69: Utilizo un shield para los motores, y un pin digital para la entrada del IR.

En principio no creo que sea un problema de conexión, porque si pruebo el mismo hardware con un sketch para IR y otro para los motores, funcionan bien. De hecho, con el código que he puesto, con la línea de begin.ir funciona el mando a distancia pero no los motores, pero si la elimino (sin hacer ningún cambio de conexiones) los motores ya funcionan.

¿No cabe la posibilidad que el shield de los motores esté compartiendo algún pin con el Ir? Por lo que dices, al activar el Ir, deja de funcionar el shield. Lo más probable es que te pase eso. Enterate de cuales pines hace uso ese shield a ver si es eso. Si por separado funcionan, y juntos, no... lo más probable es que el Ir "desactive" a nivel del hardware al shield de los motores.

Por lo que he leído entiendo que estás utilizando un Arduino Mega, la motorshield y el IR.

Leyendo tu código declaras los motores en los pinas 1 y 2. Si estás con la shield deben ir en el 3 y el 11.

¿Has probado a meter algún Serial.print en los cases para ver si entra? Yo siempre he tenido problema con los switch y solo consigo entrar si es un int o char.

Un saludo

el problema creo que lo tienes en la linea de unsigned long ircode = 0 ; quitale el =0 y seguro o casi seguro que funciona, un saludo.

Heee hola...

Justo me paso lo mismo.. un arduino mega + el shield de adafruit y un receptor de RF.. y las librerias de estos dos ultimos entran en conflicto y genera problemas de funcionamiento...

En mi caso por no quere ir a ver el problema en la libreria quite el shield y monte los integrados por fuera y el resto lo programe sin la libreria

Tengo el mismo problema que se plantea en este post.

Al usar la librería NECIRrcv.h y la función ir.begin() el puente h de motores no funciona bien.

Lo curioso es que a mí me funciona un motor, pero el otro no. Es de lo más extraño.

he abierto un post con mi problema:

http://forum.arduino.cc/index.php?topic=331205.0

Creo que he encontrado la solución.

contesto en el post que he abierto.

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

jpablogg: Creo que he encontrado la solución.

contesto en el post que he abierto.

Después de una eternidad (por motivos personales) he retomado el tema y he leído tu hilo. Y SI, FUNCIONA.

Usando las salidas de motor 3 y 4 en vez de 1 y 2, se soluciona el problema.

Dejo constancia por si alguien entra en este hilo con el mismo problema.

jpablogg, mil gracias en especial a ti, y en general a todos los que escribisteis.