Sie sind auf Seite 1von 15

Robot controlado por Infrarrojos

Para empezar debemos identificar todas las partes que necesitaremos para la
construccin de un robot de tipo vehculo:
- 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
diseado e impreso en 3D un chasis en plstico PLA, perfecto para sujetar 2
servomotores y un Arduino UNO. Dispone de un pequeo cajn trasero para poder
guardar una batera de 9V y justo debajo de dicho cajn (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
vlido.
- Motores: Todo vehculo 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: Cmo 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 pequeas como por ejemplo, motores de corriente continua. Es muy
sencillo de utilizar, econmico y suficiente para este proyecto. Aqu podemos ver su
datasheet: L293D Quadruple Half-H Drivers
- Alimentacin del conjunto: Estos robots normalmente necesitan de
varias tensiones de alimentacin para poder alimentar correctamente todas
las partes. Como no es muy eficaz disponer de 2 o 3 bateras para alimentar un
mismo conjunto, he realizado un shield casero para Arduino UNO donde conectar
una batera de 9V como la de la imagen.
Este shield dirigir por una parte los 9V de la batera al pin Vin de Arduino. Este pin
Vin acepta tensiones recomendadas de entre 7V y 12V, que posteriormente regular
a 5V para la alimentacin del microcontrolador Atmega328P.

A su vez, el shield dispone de un regulador de tensin LM7806, que regular


los 9V de la batera a 6V para la alimentacin de los motores. Ms abajo veremos el
esquema electrnico del shield en cuestin.
- Receptor de infrarrojos: Al ser un robot controlado por infrarrojos, necesita un
sensor capaz de captar las seales infrarrojas del mando a distancia, utilizaremos el
TSOP1238.
No entrar en muchos detalles de la recepcin de infrarrojos con Arduino ya que es el
mismo mtodo utilizado en esta otra entrada: Recepcin IR con Arduino.

Partes principales del robot

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

La construccin del robot es a eleccin de cada uno evidentemente, yo decid poner


los servomotores en la parte delantera y una rueda loca detrs.
Una vez construido el robot, entremos en la electrnica 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
electrnico de dicho shield:

Aqu podis descargar los archivos del diseo del shield, tanto el esquema electrnico
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 electrnico en 3 partes


numeradas:
El cuadro nmero 1 corresponde a la parte de la alimentacin. Vemos el conector
de alimentacin donde conectaremos la batera de 9V que posteriormente al
interruptor, sern regulados mediante el 7806 a 6V para alimentacin de los motores.
Del mismo modo una lnea sale anterior al regulador y se conecta con el pin Vin del
Arduino UNO. La misma placa Arduino se encargar de regular esta lnea de 9V a 5V
para alimentacin del microcontrolador.
El cuadro nmero 2 corresponde a los pines donde conectaremos el receptor de
infrarrojos TSOP1238/1738. Si bien podemos aadirle un condensador de pequeo
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 conectarn 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 alimentacin y analgicos del Arduino UNO.
Dado que la distribucin 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 seales 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 analgico A5 del Arduino, conectaremos el
pin de seal del receptor de infrarrojos (INPUT en el esquema).
Bien, vamos al L293D, este integrado como podemos observar en el datasheet, es
prcticamente simtrico a excepcin de los pines de los extremos. Esto es porque con
un solo integrado podremos controlar 2 pequeas cargas, en nuestro caso, 2 motores
de corriente continua. Segn el datasheet, podemos controlar dos cargas de hasta
600mA cada una, suficiente para mover los dos servomotores trucados. :D

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 recibirn las seales del microcontrolador, podemos
observar la tabla de arriba, donde veremos la combinacin 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 cmo conectemos el motor, se

cumplirn 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 irn conectados a GND/Masa.
- 8, Vcc2: En esta patilla debemos conectar la fuente de alimentacin de
los motores, en nuestro caso, volviendo al esquema del shield, vemos que se
conecta con el pin llamadoPotencia que ser la salida de 6V de la fuente de
alimentacin. 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 conectaramos el 2do motor, el ENABLE de dicho motor y las
seales correspondientes del microcontrolador para controlar este 2do motor.
- 16, Vcc1: Por ltimo, el pin N16 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 librera NECIRrcv, colocarla en la carpeta
libraries de Arduino, y ejecutar el cdigo de ejemplo. En el entorno de
Arduino (Recomiendo utilizar el IDE 0022 o 0023), vamos a
File>Examples>NECIRrcv>Printcodes
Cargamos este cdigo en nuestro Arduino asegurndonos 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 cdigos correspondientes a cada botn que vayamos a utilizar para los
movimientos del robot.
Este paso est mas detallado en el post: Recepcin IR con Arduino.
Ya sabiendo cuales son los cdigos 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 cdigo en cuestin:

// iPadNanito @ 2014 - Electronicavm.wordpress.com

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

// 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


{

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

digitalWrite(motor1Pin1,
digitalWrite(motor1Pin2,
digitalWrite(motor2Pin1,
digitalWrite(motor2Pin2,

void atras() // Ir atras


{
digitalWrite(motor1Pin1,
digitalWrite(motor1Pin2,
digitalWrite(motor2Pin1,
digitalWrite(motor2Pin2,
}

HIGH);
LOW);
HIGH);
LOW);

LOW);
HIGH);
LOW);
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,
digitalWrite(motor1Pin2,
digitalWrite(motor2Pin1,
digitalWrite(motor2Pin2,
}

LOW);
LOW);
LOW);
LOW);

Esto es todo, un robot sencillo y muy til si lo utilizamos de un modo didactico.


Cualquier duda, crtica o correccin, en los comentarios.

VIDEO DEL ROBOT: https://www.youtube.com/watch?


v=__WfO8kPoxI

Recepcin IR con Arduino.


Hace tiempo que vengo queriendo toquetear un poco las tecnologas inalmbricas, ya
que nos permiten la transmisin de datos entre dos puntos sin necesidad de utilizar
cables para conectarlos, lo que es una gran ventaja en muchos proyectos.
Hoy por hoy, hay muchos tipos de tecnologa inalmbrica como wifi, bluetooth,
radiofrecuencia, infrarrojos, gprs, gsm, etc. Yo me voy a centrar en los infrarrojos.

Esta tecnologa conocida como IrDA (Infrared Data


Association), es desarrollada por HP, IBM y SHARP all por 1993 y est basada
en rayos de luz que se mueven en el espectro infrarrojo.
(Invisible a los ojos humanos).
Se trata de mediante emisores y receptores (normalmente leds) de ondas infrarrojas,
establecer comunicacin desde un punto al otro. Es necesario que emisor y receptor
se vean, sin obstculos de por medio.
Existen muchos protocolos de comunicacin infrarroja, ya que este tipo de tecnologa
inalmbrica se ha utilizado en muchos dispositivos como porttiles, mviles, PDAs, y
los que ms conocemos y seguro todos tenemos en casa, los mandos de TV.
Yo voy a utilizar el protocolo NEC, protocolo que utilizan los mandos universales de
TV.
Sigue leyendo!!

Para empezar, necesitamos de un receptor de infrarrojos. Yo en mi caso, destroz un


TV de 28 hace tiempo para reciclaje electrnico, y uno de los componentes
reciclados fue un receptor TSOP 1238. (Datasheet) .
El TSOP1238 es un receptor de seales infrarrojas, con pre-amplificador de
seal includo que puede alimentarse desde 2,5V hasta 5,5V y su encapsulado de
epoxy funciona como filtro IR.
Este receptor, est preparado para ser conectado a un microcontrolador (Arduino en
mi caso) y es capaz de recibir seales a 38Khz, que para mi suerte, es la
misma frecuencia que utiliza el protocolo NEC de los mandos universales
de TV.
Para entender el protocolo NEC me he ayudado de esta web Wiki-Altium
NEC donde est muy bien explicado y bsicamente copiar el funcionamiento.
El protocolo NEC utiliza pulsos a distancia para la transmisin de un mensaje.
Cada rfaga de pulsos tiene una duracin de 562.5 s a una frecuencia de 38Khz.
Para transmitir los bits correspondientes al mensaje, lo hace de la siguiente manera:
- 0 lgico: Enva un pulso de 562,5 s, seguido de un espacio de 562,5 s de
duracin, con un tiempo de transmisin de 1,125 ms.
- 1 lgico: Enva un pulso de 562,5 s seguido de un espacio de 1.6875 ms de
duracin, con un tiempo de transmisin de 2,25 ms.
Al pulsar una tecla del mando, el mensaje se compone de la siguiente cadena de
pulsos:
1) Una rfaga de pulsos de 9 ms.
2) Un espacio 4,5 ms
3) La direccin para el dispositivo receptor (8 bits)
4) El inverso lgico de la direccin (8 bits)

5) El comando (8 bits)
6) El inverso lgico del comando (8 bits)
7) Un pulso de 562.5 s para indicar el final de la transmisin del mensaje.
La siguiente imagen ilustra perfectamente el mensaje transmitido en la pulsacin de
una tecla de un mando a distancia para una direccin 00000000b y un
comando 10110101b.

Para mi suerte, existe una librera para Arduino que se encarga de recibir esta seal y
entregarnos un cdigo hexadecimal a partir de los 4 bytes (32 bits) enviados por el
mando para poder distinguir cada una de las teclas que hemos pulsado y as poder
configurar las teclas del mando a nuestro antojo.
La librera en cuestin, se llama NECIRrcv y podemos descargarla de aqu:
NECIRrcv
Aparcamos la librera un momento y procedemos al montaje del circuito, utilizando el
esquema que viene en el datasheet del receptor TSOP1238 para conectarlo al
Arduino.

Donde
vemos que el IR Receiver (TSOP1238) se conecta por su pin Vs a una resistencia
(100 valen) y esta a 5V. El pin GND conectado a masa. Y el pin OUT, al
microcontrolador, que en nuestro caso ser el Arduino.
Listo el circuito y conectado al Arduino, el siguiente paso ser recibir los cdigos
de los botones del mando que vayamos a utilizar en nuestro proyecto, por lo
que cargamos en el entorno de Arduino el ejemplo que viene en la
librera NECIRrcv y lo ejecutamos.
Este ejemplo viene preparado para mostrar por el Serial Monitor los cdigos
correspondientes al botn que hayamos pulsado, como vemos en la siguiente imagen:

Cdigos Hexadecimales

Ya utilizando estos cdigos o su correspondiente en decimal (Al mostrarlos por el


serial monitor quitamos el formateo en hexadecimal de modo que
quede: Serial.println(ircode);) podemos controlar cualquier tipo de elemento
conectado al Arduino con un mando de TV.
Yo sin complicarme mucho, conect un led RGB al Arduino y con el mando a
distancia podemoscontrolar el apagado y encendido de los distintos
colores del led.
Est programado para controlar el led de la siguiente manera.
Con el botn Power del mando apagamos el led.
Con el botn 1 del mando encendemos el color ROJO.
Con el botn 2 del mando encendemos el color VERDE.
Con el botn 3 del mando encendemos el color AZUL.
El circuito:

Y con el circuito terminado, solo queda hacer las pruebas.


El cdigo de este ejemplo lo dejo para descarga en los siguientes enlaces:

Archivos librera protocolo NEC para Arduino: NECIRrcv


- Cdigo ejemplo de control de un led RGB con mando a distancia: LedRGBIR.pde
LedRGBIR.pde

// Sketch para controlar un led RGB con un


// mando a distancia IR con protocolo NEC
#include <WProgram.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 8 // Pin del receptor IR
NECIRrcv ir(IRPIN);
int rojo = 9; //Pin del color ROJO del led RGB
int verde = 10; //Pin del color VERDE del led RGB
int azul = 11; //Pin del color AZUL del led RGB
long power = 4228087680; //Codigo correspondiente al boton POWER del
mando a distancia
long butrojo = 4161240960; //Codigo correspondiente al boton 1 del mando
a distancia
long butverde = 4194664320; //Codigo correspondiente al boton 2 del mando
a distancia
long butazul = 4177952640; //Codigo correspondiente al boton 3 del mando
a distancia
void setup()
{
//Serial.begin(9600); //Iniciamos comunicacion serie
ir.begin(); //Iniciamos la recepcion IR
pinMode(rojo, OUTPUT);
pinMode(verde,OUTPUT);
pinMode(azul, OUTPUT);
}
void loop()
{
unsigned long ircode; //Variable que contendra el codigo decimal del
boton pulsado
while (ir.available())
{
ircode = ir.read(); //Leemos el codigo del boton pulsado
if (ircode == power) //Si el boton de power... apagamos el led
{
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
digitalWrite(azul, LOW);
}
else if (ircode == butrojo) digitalWrite(rojo,HIGH); //Si boton 1,
encendemos color rojo
else if (ircode == butverde) digitalWrite(verde,HIGH); //Si boton 2,
encendemos color verde

else if (ircode == butazul) digitalWrite(azul,HIGH); //Si boton 3,


encendemos color azul
}
}

Das könnte Ihnen auch gefallen