Robot controlado por Infrarrojos

¡Robótica!

Esta categoría vamos a inaugurar hoy después de un largo periodo de inactividad y con la que intentaré mantener un ritmo algo más elevado de escritura 🙂

Después de múltiples peticiones al canal de YouTube, correo y comentarios, vamos a construir el robot controlado mediante un mando a distancia infrarrojos convencional:

Para empezar debemos identificar todas las partes que necesitaremos para la construcción de un robot de tipo vehículo:

– Chasis y ruedas: Todo robot necesita un cuerpo, un chasis que le dé estabilidad y robustez y que permitirá que se unan el resto de piezas para formar el conjunto del robot. En mi caso, tal y como se ve en la siguiente imagen, he diseñado e impreso en 3D un chasis en plástico PLA, perfecto para sujetar 2 servomotores y un Arduino UNO. Dispone de un pequeño cajón trasero para poder guardar una batería de 9V y justo debajo de dicho cajón (Aunque no se ve en la imagen), una rueda loca. Del mismo modo necesitará unas ruedas para desplazarse. No es necesario que sean tan bestias como las que utilizo yo :D.

– Microcontrolador: Necesitará un cerebro para poder controlarlo, en mi caso utilizo un Arduino UNO, aunque cualquier otro Arduino o microcontrolador es válido.

– Motores: Todo vehículo necesita de motor, yo voy a utilizar 2 servomotores trucados de modo que sean capaces de girar 360º. Podemos ver como trucar un servomotor para que gire 360º en este tutorial: ¿Cómo trucar servos Futaba S3003?.

– Driver de potencia para motores: Para poder alimentar los motores independientemente del control, deberemos utilizar un driver de potencia que permita el giro en ambos sentidos de los motores. Existen muchos drivers de potencia, el L293D es un driver formado interiormente por un doble puente en H capaz de manejar cargas pequeñas como por ejemplo, motores de corriente continua. Es muy sencillo de utilizar, económico y suficiente para este proyecto. Aquí podemos ver su datasheet: L293D Quadruple Half-H Drivers

– Alimentación del conjunto: Estos robots normalmente necesitan de varias tensiones de alimentación para poder alimentar correctamente todas las partes. Como no es muy eficaz disponer de 2 o 3 baterías para alimentar un mismo conjunto, he realizado un “shield casero” para Arduino UNO donde conectaré una batería de 9V como la de la imagen.

Este shield dirigirá por una parte los 9V de la batería al pin Vin de Arduino. Este pin Vin acepta tensiones recomendadas de entre 7V  y 12V, que posteriormente regulará a 5V para la alimentación del microcontrolador Atmega328P.

A su vez, el shield dispone de un regulador de tensión LM7806, que regulará los 9V de la batería a 6V para la alimentación de los motores. Más abajo veremos el esquema electrónico del shield en cuestión.

– Receptor de infrarrojos: Al ser un robot controlado por infrarrojos, necesita un sensor capaz de captar las señales infrarrojas del mando a distancia, utilizaremos el TSOP1238.

No entraré en muchos detalles de la recepción de infrarrojos con Arduino ya que es el mismo método utilizado en esta otra entrada: Recepción IR con Arduino.

Partes principales del robot

Partes del robot

Bien, sabiendo las partes que necesitamos, vamos a ponernos manos a la obra:

La construcción del robot es a elección de cada uno evidentemente, yo decidí poner los servomotores en la parte delantera y una rueda loca detrás.

Una vez construido el robot, entremos en la electrónica que hará funcionar el conjunto.
El microcontrolador, en mi caso es una placa Arduino UNO sobre la que va montado un shield casero que he realizado, veamos el esquema electrónico de dicho shield:

Esquema electronico shield

Aquí podéis descargar los archivos del diseño del shield, tanto el esquema electrónico como el layout de la placa: Shield para robot controlado por infrarrojos en OrCAD 10.5.
(Link actualizado 25-02-2015).

Como he hecho otras veces, he dividido el esquema electrónico en 3 partes numeradas:

El cuadro número 1 corresponde a la parte de la alimentación. Vemos el conector de alimentación donde conectaremos la batería de 9V que posteriormente al interruptor, serán regulados mediante el 7806 a 6V para alimentación de los motores. Del mismo modo una línea sale anterior al regulador y se conecta con el pin Vin del Arduino UNO. La misma placa Arduino se encargará de regular esta línea de 9V  a 5V para alimentación del microcontrolador.

El cuadro número 2 corresponde a los pines donde conectaremos el receptor de infrarrojos TSOP1238/1738. Si bien podemos añadirle un condensador de pequeño valor a modo de filtro entre los pines de 5V y GND, siempre es bueno mirar su datasheet para comprobar las especificaciones recomendadas por el fabricante.

El cuadro numero 3 corresponde al driver L293D y motores, así como a los pines que conectarán con Arduino el shield. Como vemos a los laterales del esquema, los conectores J1 y J2 corresponden a los pines digitales del Arduino UNO y el J3 y J4 corresponden a los pines de alimentación y analógicos del Arduino UNO.

Dado que la distribución de pines podemos realizarla “al gusto”, ya que utilizaremos pocos pines para este proyecto, vamos a utilizar los 4 pines digitales que son capaces de proporcionar señales PWM, como son los pines digitales 5, 6, 9 y 10, para poder controlar la velocidad de los motores.

Vemos que en el pin correspondiente al pin analógico A5 del Arduino, conectaremos el pin de señal del receptor de infrarrojos (INPUT en el esquema).

Bien, vamos al L293D, este integrado como podemos observar en el datasheet, es prácticamente simétrico a excepción de los pines de los extremos. Esto es porque con un solo integrado podremos controlar 2 pequeñas cargas, en nuestro caso, 2 motores de corriente continua. Según el datasheet, podemos controlar dos cargas de hasta 600mA cada una, suficiente para mover los dos servomotores trucados. 😀

L293D-Datasheet

Enumerando los pines observamos los siguientes:

– 1, ENABLE: Un valor HIGH en este pin habilitará el motor conectado en pines 3 y 6 (1Y/2Y).

– 2 y 7,  1A y 2A: Estos pines recibirán las señales del microcontrolador, podemos observar la tabla de arriba, donde veremos la combinación de valores disponibles. Por ejemplo, en la primera linea de la tabla, vemos que teniendo ENABLE a HIGH, si aplicamos un valor LOW en el pin 1A y un valor HIGH en el pin 2A, el motor girará hacia la derecha.

– 3 y 6, 1Y y 2Y: En estos pines conectaremos uno de los motores. Dado que los motores DC no tienen polaridad, dependiendo de cómo conectemos el motor, se cumplirán los valores dados en la tabla u ocurrirá exactamente lo contrario a lo que explica la tabla.

– 4 y 5, HEAT SINK AND GROUND: Estos pines irán conectados a GND/Masa.

– 8, Vcc2: En esta patilla debemos conectar la fuente de alimentación de los motores, en nuestro caso, volviendo al esquema del shield, vemos que se conecta con el pin llamado “Potencia” que será la salida de 6V de la fuente de alimentación. Observando el datasheet del L293D vemos que este pin acepta tensiones de hasta 36V.

Los pines 9, 10, 11, 12, 13, 14, y 15 son equivalentes a los pines anteriormente explicados, donde conectaríamos el 2do motor, el ENABLE de dicho motor y las señales correspondientes del microcontrolador para controlar este 2do motor.

– 16, Vcc1: Por último, el pin Nº16 corresponde a Vcc del circuito integrado L293D, que podrá alimentarse con tensiones de hasta 36V, pero nosotros lo alimentaremos con los 5V que proporciona la salida de 5V de Arduino, tal y como se ve en el esquema del shield.

~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·

Ya por último, solo nos queda programar el Arduino 🙂

Como primer paso, debemos descargar la librería NECIRrcv, colocarla en la carpeta “libraries” de Arduino, y ejecutar el código de ejemplo. En el entorno de Arduino (Recomiendo utilizar el IDE 0022 o 0023), vamos a File>Examples>NECIRrcv>Printcodes

Cargamos este código en nuestro Arduino asegurándonos de tener el receptor infrarrojos conectado en el pin adecuado y alimentado correctamente, abrimos el Serial Monitor y vamos pulsando las teclas de nuestro mando a distancia para poder visualizar los códigos correspondientes a cada botón que vayamos a utilizar para los movimientos del robot.
Este paso está mas detallado en el post: Recepción IR con Arduino.

Ya sabiendo cuales son los códigos de los botones que utilizaremos, programamos el Arduino para que realice las funciones de ir hacia adelante, atras, izquierda, derecha y parar, dependiendo de los botones que pulsemos en el mando a distancia.

El código en cuestión:

// iPadNanito @ 2014 - Electronicavm.wordpress.com
// Twitter: @iPadNanito

#include
#include  // Libreria Infrarrojos

// Pin donde va conectado el sensor TSOP1738
#define IRPIN A5

// Instancia de la libreria IR
NECIRrcv ir(IRPIN);

// Pines de los motores
#define motor1Pin1 9
#define motor1Pin2 10
#define motor2Pin1 5
#define motor2Pin2 6

// Codigos correspondientes a los botones del mando a distancia
#define ADELANTE 4144529280
#define ATRAS 4010835840
#define DERECHA 4278222720
#define IZQUIERDA 3810295680
#define STOP 4077682560

unsigned long ircode; // Variable para almacenar el codigo recibido

void setup()
{
     // Declaramos los motores como salida
     pinMode(motor1Pin1, OUTPUT);
     pinMode(motor1Pin2, OUTPUT);
     pinMode(motor2Pin1, OUTPUT);
     pinMode(motor2Pin2, OUTPUT);

     ir.begin(); // Iniciamos la recepcion infrarroja
}

void loop()
{
   while (ir.available()) // Mientras que el sensor este disponible...
   {
      // Leemos y almacenamos el codigo en la variable ircode
      ircode = ir.read();

      if (ircode == ADELANTE) adelante(); //Si el codigo recibido = ADELANTE
      if (ircode == ATRAS) atras();       //Vamos hacia adelante! ...
      if (ircode == DERECHA) derecha();
      if (ircode == IZQUIERDA) izquierda();
      else if (ircode == STOP) parar();
   }
}

void adelante() // Ir adelante
{
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, HIGH);
    digitalWrite(motor2Pin2, LOW);
}

void atras() // Ir atras
{
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);
}

void derecha() // Ir a la derecha
{
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
    digitalWrite(motor2Pin1, HIGH);
    digitalWrite(motor2Pin2, LOW);
}

void izquierda() // Ir a la izquierda
{
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);
}

void parar() // Parar motores
{
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, LOW);
}

Esto es todo, un robot sencillo y muy útil si lo utilizamos de un modo didactico.
Cualquier duda, crítica o corrección, en los comentarios. 😛

😀

Anuncios

88 comentarios en “Robot controlado por Infrarrojos

  1. soy novato en arduino .. y tengo una duda como todo novato. cuando copie el codigo y lo verifique.. me dice que ahi un error de filename o y otros errores mas.. que en realidad no se como solucionar

      • así aperase el error en el programa de arduino cuando se compila

        Arduino:1.6.4 (Windows 8.1), Placa:”Arduino Uno”

        infrarrojo:4: error: #include expects “FILENAME” or
        infrarrojo:5: error: #include expects “FILENAME” or
        infrarrojo:11: error: ‘NECIRrcv’ does not name a type
        infrarrojo.ino: In function ‘void setup()’:
        infrarrojo:36: error: ‘ir’ was not declared in this scope
        infrarrojo.ino: In function ‘void loop()’:
        infrarrojo:41: error: ‘ir’ was not declared in this scope
        #include expects “FILENAME” or

        This report would have more information with
        “Show verbose output during compilation”
        activala desde Archivo > Preferencias

        • Es por la librería, debes tener instalada la librería para que no te de esos errores.

  2. DISCULPA TENGO UN PROBLEMA PODRÍAS DAR EL DIAGRAMA DEL SHIELD PERO MAS EXPLICADO POR FAVOR. :3 AH Y EL CÓDIGO TIENE ERRORES QUE NO PUEDO REPARAR ME PODRÍAS ATYUDAR

  3. Amigo, una consulta: se pueden controlar 5 servos como ese con el arduino uno? para un proyecto que estoy haciendo necesito poder controlarlos los 5 con un control remoto. Qué me recomiendas? Saludos !

  4. hola ,bnas tardes me interesa hacer su carro pero tengo problemas con la programacion , la libreria del NECIRrcv me compila bien pero al momento de meter la programacion del todo el carro me dice que error

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s