COCHE CONTROL REMOTO

Construir un coche con Arduino que pueda ser dirigido con un mando a distancia por infrarrojos.

Funcionamiento

El coche lleva instalado un Módulo TSOP que recibe las señales que envía el emisor infrarrojo del mando a distancia. Este módulo pasa la señal a Arduino, que se encargará de procesarla y generar el movimiento correspondiente en el vehículo.

Lista de materiales

8 Bulones de plástico LOG S220P

2 Soportes para micro reductora LOG 3D16

1 Plataforma móvil LOG DM8080

1 Hoja Técnica H1405

Construcción de la plataforma y conexión de los motores

Conexión del módulo tsop

El módulo TSOP esta formado por 3 pines que conectaremos a:

–  5V de Arduino
–  GND
–  Señal 11 PWM

Cuando realizamos una lectura de los datos, la lectura del pin 11 nos devolverá un valor numérico. El modelo de mando a distancia con el que hemos hecho este ejemplo asocia cada botón a los siguientes códigos numéricos:

– Flecha arriba : 24
– Flecha abajo : 82
– Flecha derecha : 90
– Flecha izquierda : 8
– Botón central OK: 28

 

Programación

Para programar este modelo de coche es necesario instalar en Arduino IDE la librería IRremote. 

  • Pulsa en el menú Herramientas > gestionar bibliotecas
  • En el buscador introduce IRremote. Selecciona «IRremote by shirriff» y pulsa en Instalar.

Ya podemos empezar a programar.

Es posible que los códigos que recibe el coche del mando varíen con respecto al programa de esta documentación. Es recomendable revisar los códigos realizando lecturas y visualizaciones a través del monitor del puerto serie.

El siguiente programa lee los códigos recibidos por el TSOP conectado al pin 11 y los muestra en el puerto serie:

#include <IRremote.h>


const byte IR_RECEIVE_PIN = 11;


void setup()
{
  pinMode(IR_RECEIVE_PIN, INPUT);
  Serial.begin(9600);
}


void loop() {
  if (IrReceiver.decode())
  {
    int value = IrReceiver.decodedIRData.command;
    Serial.println(value, DEC);
    IrReceiver.resume();
    delay(500);
  }
}

Sube el código a tu placa Arduino y accede al monitor serie (en el menú herramientas). A continuación pulsa cada botón del mando a distancia y anota el código que se muestra en el monitor serie para cada botón. Necesitarás esos códigos para controlar el coche.

En el siguiente programa, el TSOP lee los códigos que recibe del mando a distancia. Utilizando un conjunto de condicionales, se comprueba qué código se ha recibido, y en función de su valor se opta por mover los motores para que el coche avance o gire. Utiliza los códigos que viste en el monitor serie para adaptar el siguiente programa a tu proyecto:

#include <IRremote.h>

 

const byte IR_RECEIVE_PIN = 11;

 

int motor1Avance = 6; // usamos un pin de salida al motor
int motor1Atras = 5;  // usamos un pin de salida al motor
int motor2Avance = 9; // usamos un pin de salida al motor
int motor2Atras = 10; // usamos un pin de salida al motor
int value=0;

 

void setup()
{
   Serial.begin(9600);
   Serial.println(«IR Receive test»);
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

 

//definimos los pines de los motores como salidas
  pinMode(motor1Avance, OUTPUT);
  pinMode(motor1Atras, OUTPUT);  
  pinMode(motor2Avance, OUTPUT);  
  pinMode(motor2Atras, OUTPUT);

 

//La plataforma móvil LOG 8080 comienza en estado parada  
  analogWrite(motor1Avance, 0);
  analogWrite(motor1Atras, 0);
  analogWrite(motor2Avance, 0);
  analogWrite(motor2Atras, 0);
}

 

void loop() {  

 

  if (IrReceiver.decode())
  {
      value = IrReceiver.decodedIRData.command;
      Serial.println(value, DEC);
     
      IrReceiver.resume();

 

// Si el dato recibido es 24, corresponde a la flecha avance  

 

if (value==24){
        Serial.println(«delante»); // el coche avanza
        analogWrite(motor1Avance, 255);
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 255);
        analogWrite(motor2Atras, 0);
       
       }
       
// si el dato recibido es 28, corresponde con el botón central ok (parar)

 

      if (value==28){
        Serial.println(«parar»);
        analogWrite(motor1Avance, 0); // El coche se para
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 0);
        analogWrite(motor2Atras, 0);
       }

 

//si el dato recibido es 82,corresponde con la flecha abajo

 

  if (value==82){
        Serial.println(«atras»);
        analogWrite(motor1Avance, 0); // El coche retrocede

 

        analogWrite(motor1Atras, 255);
        analogWrite(motor2Avance, 0);
        analogWrite(motor2Atras, 255);
       }
//si el dato recibido es 8, corresponde con la flecha izquierda

 

    if (value==8){
        Serial.println(«IZQUIERDA»);
        analogWrite(motor1Avance, 100); // El coche gira a la izquierda
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 250);
        analogWrite(motor2Atras, 0);
       }

 

//si el dato recibido es 90, corresponde con la flecha derecha

 

   if (value==90){
        Serial.println(«DERECHA»);
        analogWrite(motor1Avance, 250); // El coche gira a la derecha
        analogWrite(motor1Atras, 0);
        analogWrite(motor2Avance, 100);
        analogWrite(motor2Atras, 0);
       }
  }
}

Calibración

En los programas el control de los motores se realiza a través del envío de señales analógicas a los pares de salidas 5-6 y 9-10. Cada motor está controlado por dos pines de la tarjeta controladora, y cada pin determinará el sentido de giro del motor, permitiendo que el robot circule de frente o marcha atrás. Estos pines serán tratados como señales analógicas, enviándoles datos de 0 a 255 para poder controlar la velocidad del motor.

Si en ambas salidas enviamos un 0, el coche se parará.

La lógica nos dice que para que el coche circule en línea recta habrá que enviar a ambas salidas el mismo dato (mayor que 0). Si hacemos la prueba observamos que el coche tiende a girar en un determinado sentido. Esto es debido a la imprecisión de este tipo de motores. La mejor solución es regular la velocidad por programación enviando a un motor una señal ligeramente inferior con respecto al otro motor.

Para que el coche gire en un sentido, disminuiremos notablemente la velocidad de uno de los motores (enviando un dato de valor inferior a su salida de Arduino) provocando el giro gracias a la diferencia de velocidad entre ambos motores.

En cuanto al sentido de giro de los motores, éste viene controlado por las conexiones al puente H. Si observamos que cada rueda gira en un sentido, tendremos que modificar el cableado. Por ejemplo si tenemos los motores conectados a las salidas 1 y 3 del puente H y cada motor gira en un sentido, tendremos que cambiar uno de los motores y, o bien pasarle de la salida 1 a la 2, o sino de la salida 3 a la 4.

 

Detalles de tipo práctico

Necesita 4 pilas R6 de 1,5 V, 1 pila 6F22 de 9 V y 1 pila botón CR2025.

Tiempo de construcción: 6 H.

Nivel: Difícil

Pruebas

 

– Aumentar o disminuir la velocidad de los motores