Robot Siguelineas Con Arduino
Robot Siguelineas Con Arduino
Robot Siguelineas Con Arduino
PROYECTO PROFUNDIZA
ROBTICA CON ARDUINO
CONSTRUCCIN Y PROGRAMACIN DE UN ROBOT SIGUE LINEAS
Pg. 1
ndice
1. INTERS DEL PROYECTO........................................................................................3
2. INTRODUCCIN A LA ROBTICA..........................................................................4
3. DESCRIPCIN BSICA DE LA TARJETA ARDUINO............................................4
4. MATERIALES PARA EL ROBOT...............................................................................5
5. EJEMPLOS BSICOS DE PROGRAMACIN EN ARDUINO................................8
6. MONTAJE DEL PUENTE EN H PARA EL CONTROL DE LOS MOTORES........12
7. CONTROL DE LOS MOTORES DC.........................................................................15
8. IMPLEMENTANDO LOS SENSORES AL ROBOT.................................................20
9. CONTROLANDO LOS SENSORES INFRARROJOS.............................................23
10. CONTROLANDO EN PIEZOBUZER Y LOS LEDS..............................................26
11. PROGRAMA FINAL................................................................................................27
12. IMGENES Y RESULTADOS FINALES...............................................................30
Pg. 2
Sus aplicaciones son muy motivadoras, resultando unos proyectos innovadores, atractivos y
creativos.
La programacin del robot sienta las bases para continuar esos contenidos en estudios
posteriores, carreras tcnicas o formacin profesional.
Anima a los alumnos a crear por ellos mismos a modificar sobre lo hecho y conseguido,
adaptndolo a otras necesidades.
Pg. 3
2. INTRODUCCIN A LA ROBTICA
Un robot es una mquina o ingenio electrnico programable, capaz de manipular objetos y
realizar trabajos, por lo general, en instalaciones industriales.
La arquitectura de un robot se fundamenta en 3 elementos:
Sensores: permiten al robot recoger informacin del exterior para que pueda realizar
acciones.
Actuadores: Son dispositivos que proporcionan la fuerza motriz real para las articulaciones
del robot. Los actuadores suelen obtener su energa a partir de una de estas tres fuentes: aire
comprimido, fluido por presin o electricidad.
Sistema de control: El sistema de control es el cerebro del robot. Procesa todos los datos de
los diferentes sensores y realiza operaciones a travs los actuadores conforme al programa
almacenado y bajo la supervisin de un microcontrolador.
Pg. 4
Barato: Las placas de Arduino son relativamente baratas y se pueden incluso ensamblar a
mano.
Hardware abierto y extensible: Los planos de los mdulos estn publicados bajo licencia
Creative Commons, por que diseadores experimentados de circuitos pueden hacer su
propia versin del mdulo, extendindolo o mejorndolo.
El significado de los pines de Arduino lo tienes a continuacin:
Bricogeek: http://www.bricogeek.com/shop/
Cooking-hacks: http://www.cooking-hacks.com/
Pg. 5
Componente
Imagen
Rueda de goma
Arduino Uno
Fundas/soporte motores
Direccin Web
http://www.bricogeek.com/shop/
motores/115-motor-micro-metaldc-con-reductora-50-1.html
http://www.bricogeek.com/shop/
robotica/110-rueda-de-goma32x7mm.html
http://www.bricogeek.com/shop/
arduino/305-arduino-uno.html
http://www.bricogeek.com/shop/
sensores/217-sensor-opticoqrd1114.html
http://www.bricogeek.com/shop/
robotica/116-funda-protectorapara-motor-micro-metal.html
Pg. 6
Rueda loca
Zumbador piezo
http://www.bricogeek.com/shop/
robotica/108-rueda-locametalica-3-8.html
http://www.ondaradio.es/esp/cata
logoConsulta.aspx?
TextBuscar=L293D
http://www.bricogeek.com/shop/
componentes/299-zumbadorpiezo-12mm.html
Pg. 7
Cables de conexin
http://www.bricogeek.com/shop/
cables/331-cable-adaptador-9vjack.html
http://www.cookinghacks.com/index.php/arduinojumper-cables.html
(Se puede encontrar en tiendas
de electrnica)
http://www.bricogeek.com/shop/
cables/343-cable-usb-a-b.html
Cable USB (A/B)
(Se puede encontrar en tiendas
de electrnica)
Tubo Termoretrctil
http://www.bricogeek.com/shop/
cables/386-tubotermoretractil.html
(Se puede encontrar en tiendas
de electrnica)
Pg. 8
programa que tiene cargado la placa arduino nada ms sacarla de la caja. Los comentarios al
programa apararen detrs de la doble barra //. La ejecucin del programa los ignora as que
podemos poner todos los que queramos. Leyendo los comentarios de los programas
aprenders mucho!
void setup()
//comienza la configuracin de los pines.
{
pinMode(13, OUTPUT);
//asignamos el pin 13 como salida .
}
void loop()
//comienza el bucle.
{
digitalWrite(13, HIGH);
//activamos el pin 13.
delay(1000);
//esperamos 1000 milisegundos (=1s)
digitalWrite(13, LOW);
//apagamos el led.
delay(1000);
//esperamos 1000 milisegundos.
}
2. Creando una variable. Vamos a crear una variable llamada LED para almacenar en ella el
nmero del pin que vamos a utilizar en el programa. Aunque en este caso, dada la sencillez
del ejemplo no sera necesario, es una buena prctica cuando tengamos ms dispositivos
conectados a la placa arduino, ya que facilita la comprensin de los programas.
int LED = 13;
//creamos una variable llamada LED y le asignamos
//el valor 13. Como 13 es un nmero entero por ello se escribe int
delante
void setup() {
pinMode(LED, OUTPUT);
//Aqu hemos utilizado ya la variable
//creada anteriormente, cuando escribimos LED, el programa
//interpreta el valor //asignado, 13.
}
void loop() {
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
3. Creamos ms variables. Ahora vamos a aadir al programa una variable llamada t_on para
guardar en ella el tiempo de encendido del LED, y otra variable t_off para el tiempo de
apagado, que sern de 0,5s y 0,1s respectivamente.
int t_on = 500;
Pg. 9
//valor de 500
int t_off = 100; //creamos la variable t_off y le asignamos un
//valor de 100 milisegundos
int LED = 13;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(t_on);
digitalWrite(LED,LOW);
delay(t_off);
}
4. Programando un semforo. Vamos a programar el encendido de tres leds conectados en los
pines 4, 5 y 6 correspondientes a las luces rojo, amarilla y verde respectivamente. El tiempo
de encendido ser de 3s, 1s y 4s respectivamente.
void setup() {
pinMode(4,OUTPUT); //configuramos los pines 4,5 y 6 como salidas
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
}
Pg. 10
void loop()
{
digitalWrite(4, HIGH); //activamos el pin 4 (led rojo)
delay(3000); //esperamos 3 segundos
digitalWrite(4, LOW); //apagamos el led rojo
digitalWrite(5, HIGH); //activamos el pin 5 (led amarillo)
delay(1000); //esperamos 1 segundo
digitalWrite(5,LOW); //apagamos el led amarillo
digitalWrite(6,HIGH); //activamos el pin 6 (led verde)
delay(4000); //esperamos 4 segundos
digitalWrite(6,LOW); //apagamos el led verde
}
5. Utilizamos un bucle for? En ocasiones puede resultar muy til escribir este tipo de bucle,
ejecutando, en pocas lneas de programa, muchas rdenes. Por ejemplo, nos puede servir
para acelerar poco a poco un motor hasta llegar a su mxima velocidad. En este caso lo
vamos a aplicar para definir los pines 4,5 y 6 como salidas del ejercicio anterior. Su
estructura es la siguiente:
void setup() {
for (int i=4;i<7;i=i+1) {
pinMode(i,OUTPUT);
}
}
//Para definir el bucle se requieren tres parmetros:
a) definir una variable y un valor inicial
b) definir la condicin para que se repita el bucle (interprtalo
como repite esto mientras que 'i' valga menos de 7)
c) definir el incremento (o decremento) del valor de la variable
en cada repeticin. En este caso 'i' se incrementa en una unidad
en cada repeticin
// el resto del programa continua igual que el anterior.
Tarea: Modifica el programa anterior para conseguir que el led amarillo parpadee 5 veces durante 1
segundo antes de conectar el led rojo.
Pg. 11
Puente en H
Es necesario observar que es fcil hacer un corto de batera al cerrar por descuido los
interruptores A y B o cerrando los interruptores C y D. Esto pondra en peligro la batera. Una buena
medida para evitarlo es automatizar al mximo el control de los interruptores.
Para permitir controlar el Puente H al
microcontrolador, los interruptores mecnicos
deben ser sustituidos por transistores. Observa el
empleo de diodos en el circuito. El bobinado en el
motor es esencialmente un inductor. Cuando el
flujo de corriente en un inductor de repente es
cortado, la corriente de pronto no puede ir a 0. Por
consiguiente, inducen un voltaje oponindose a
esta corriente. Este voltaje puede ser tan alto que
esto destruya los transistores. Los diodos de retorno proporcionan un camino de vuelta seguro para
esta corriente que evita y protege los transistores.
El puente-H, puede ser realizado con transistores discretos o puede ser comprado como un
circuito integrado. Utilizar un circuito integrado ayudar a mantener el proyecto compacto y la
lgica interna previene que la batera pueda ser cortocircuitada cono se describi como ms arriba.
6.1. DESCRIPCIN
Para conseguir amplificar las seales de control de la tarjeta Arduino, invertir el sentido de
giro de los motores mediante puente en H y proteger de las cargas inductivas, utilizamos para ello
un chip L293D. Aqu tienes el significado de cada uno de sus 16 pines:
Pg. 12
Pg. 13
Pg. 14
Marcha adelante.
Marcha atrs.
Giro izquierda.
Giro derecha.
Rotacin a izquierda sobre su propio eje.
Rotacin a derecha sobre su propio eje.
Una vez que hemos realizado la conexin del chip L293D o puente en H, procedemos a la
programacin en el IDE de Arduino:
1. Calentando motores: Vamos a comprobar el funcionamiento del motor izquierdo, que
hemos conectado a los pines 4 y 5 de Arduino Uno. Para su programacin, vamos a utilizar
por primera vez las funciones, que son como unas rutinas que por su frecuencia de uso,
si las etiquetamos con un nombre, facilitan y estructuran la programacin a la vez que lo
simplifican. Su uso es fcil, observa el siguiente ejemplo:
void setup () {
pinMode(4,OUTPUT); //configuramos los pines 4 y 5 como salidas
pinMode(5,OUTPUT);
}
void adelante () {
digitalWrite(4,LOW);
/*Esta sera la configuracin ideal, ya
digitalWrite(5,HIGH);
que
el
pin
5
es
del
tipo
PWM
}
lo
que
nos
permitir
variar
la
velocidad del motor en su avance. Si con esta conexin el motor no
gira hacia adelante, entonces habr que invertir la conexin del
motor al chip L293D*/
void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
void loop () {
adelante();
delay(2000);
paro();
delay(1000);
}
Pg. 15
3. Y ahora los dos! Una vez que hemos comprobados que todo funciona bien y como
nosotros queremos, vamos a utilizar los dos motores a la vez y vamos a introducir la funcin
atrs:
void setup () {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
void adelante () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}
void paro () {
digitalWrite(4,LOW);
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 16
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void atras () {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}
void loop () {
adelante();
delay(2000);
paro();
delay(1000);
atras();
delay(2000);
paro();
delay(1000);
}
4. Y ahora los giros: Como ya puedes entender, para conseguir que el robot gire a la izquierda
debes parar el motor de ese lado y mantener en marcha el derecho. Al contrario, para girar a
la derecha, debes parar el motor derecho y mantener en marcha el motor izquierdo. Como
ejemplo vamos a programar los siguientes movimientos:
Adelante 2 s
Paro 0,5 s
Gira a izquierdas 0,25 s
Paro 0,5 s
Atrs 2 s
Paro 0,5 s
Gira a derechas 0,25 s
Paro 0,5 s
void setup () {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
void adelante () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 17
}
void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void atras () {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}
void giraizquierda () {
digitalWrite(4,LOW); //paramos el motor izquierdo
digitalWrite(5,LOW);
digitalWrite(6,HIGH); //mantenemos el motor derecho en marcha
digitalWrite(7,LOW);
}
void giraderecha () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH); //mantenemos el motor izquierdo en marcha
digitalWrite(6,LOW); //paramos el motor derecho
digitalWrite(7,LOW);
}
void loop () {
adelante();
delay(2000);
paro();
delay(500);
giraizquierda();
delay(250);
paro();
delay(500);
atras();
delay(2000);
paro();
delay(500);
giraderecha();
delay(250);
paro();
delay(500);
}
5. Regulando la velocidad: Aplicar toda la energa al motor DC, har que ste, gire a la
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 18
mxima velocidad y quitando la energa al motor, haremos que el motor deje de girar. El
puente-h que hemos comentado antes es capaz de controlar estos dos estados. Para conseguir
hacer que el motor pueda girar a velocidades inferiores, puede usarse una tcnica conocida
como, Modulacin de Anchura de Pulso (PWM). Para el control adecuado del robot y
hacerlo seguir bien la lnea sin perderla, es conveniente utilizar velocidades de giro menores.
La tarjeta Arduino Uno integra 6 pines del tipo PWM. Estos pines pueden tomar 256 valores
diferentes comprendidos entre 0 y 5V. El controlador consigue proporcionando en realidad
una seal digital.
El PWM es un modo eficiente, para simular una gama de valores analgicos en circuitos
digitales. Conmutando rpidamente entre encendido y apagado, se puede simular un valor
medio. Se muestran tres seales en la figura.
Las tres seales comparten la misma frecuencia, pero la anchura de los pulsos es diferente. Por
medio de la variacin del tiempo en "alto", podemos hacer que el motor "vea" un valor entre 0V y
+5V.
Para programar una salida analgica, debemos escribir:
analogWrite(pin,valor);//valor debe estar comprendido entre 0 y
255
Ejemplo:
analogWrite(5,100);
//activa el pin 5 con un valor de 100,
que correspondera al 100/256 = 39% de su voltaje mximo.
6. Acelerando los motores: si queremos conseguir una aceleracin gradual de la velocidad los
motores debemos introducir un concepto nuevo de programacin, el bucle for. Observa el
siguiente ejemplo:
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 19
void acelera () {
digitalWrite(4,HIGH);
digitalWrite(7,HIGH);
for (int i=0;i<255;i=i+10) {
analogWrite(5,i);
analogWrite(6,i);
delay(100);
}
}
Sensores de luz
Sensores inclinacin
Pg. 20
Sensores de temperatura
Sensores de humedad
Sensores emisor/receptor de
infrarrojos
Sensores de giro
Sensores de aceleracin
Sensores de presin, etc.
Sensores de presencia
Por medio de los sensores conseguiremos que nuestro robot sea capaz de seguir una lnea
negra. Para ello utilizaremos dos sensores emisor/receptor de infrarrojos del tipo QRD 1114
(tambin es vlido un sensor CNY70). Los colocaremos a una distancia tal que la lnea negra pase
justo entre los dos sensores.
8.2. DESCRPCIN DEL SENSOR DE INFRARROJOS.
Como ya hemos indicado, utilizaremos
unos sensores del tipo QRD 1114. Este
sensor consta de un diodo emisor de
infrarrojos y de un fototransistor receptor.
En total tiene 4 patillas, 2 para el diodo
emisor y otras 2 para el receptor.
Pg. 21
Sensor
derecho
Situacin
Accin
LOW
LOW
Coche en lnea
LOW
HIGH
Coche se desva a
izquierda
Girar a derecha
HIGH
LOW
Girar a izquierda
HIGH
HIGH
Parar motores
Nota: Las pistas del circuito que puedes ver en las galeras web del ltimo apartado, se han realizado con cartulina para
las curvas y con cinta aislante en los tramos rectos. Los sensores infrarrojos devuelven lecturas completamente
diferentes sobre la cartulina y sobre la cinta aislante, a pesar de que las dos son negras. Por ejemplo, en el monitor serie
leemos valores de 36 sobre lo blanco, 890 sobre la cinta aislante y 39! sobre la cartulina negra. Para remediar este
inconveniente, repasa con rotulador negro indeleble los tramos de cartulina y voil!, asunto arreglado.
Pg. 22
1. Tomando las lecturas de los sensores: Bien, ya tenemos listos y en su sitio los sensores de
infrarrojos QRD 1114. Ahora debemos comprobar si funcionan bien y, lo que es ms
importante, las lecturas que arrojan cuando los colocamos sobre una superficie blanca y
sobre una superficie negra.
void setup () {
Serial.begin(9600);
}
void loop () {
int lectura_izq = analogRead(0);
Pg. 23
Despus de tomar las lecturas de los sensores infrarrojos, observamos que cuando el sensor
est sobre blanco da valores bajos, entorno a 35, y cuando el sensor est sobre negro da valores
altos, entorno a 890. Como referencia debemos tomar un valor por encima del cual sabremos con
seguridad que el sensor est sobre negro, y por lo tanto, que el robot est perdiendo la trayectoria.
Nos parece adecuado tomar como referencia un valor de 500. Valores superiores a este, darn la
orden de rectificar la trayectoria mediante un giro a derecha o a izquierda segn el caso.
2. En lnea: Vamos a programar ya lo que ser el ncleo central del control del robot.
Debemos tomar las lecturas de los sensores y decidir en funcin de stas, si el robot est en
lnea o si est desviado. En cualquiera de los casos, las lecturas debern ir seguidas de una
orden correspondiente:
Sensor
izquierdo
Sensor
derecho
Situacin
Accin
<500
<500
Coche en lnea
<500
>500
Coche se desva a
izquierda
Girar a derecha
>500
<500
Girar a izquierda
>500
>500
Parar motores
En el programa de control del robot siguelneas cobra una especial relevancia la orden if
(si). If es un estamento que se utiliza para probar si una determinada condicin se ha
alcanzado, como en nuestro caso, averiguar si un valor analgico est por encima de un cierto
nmero. Si la condicin probada es verdadera (se cumple), se ejecutan una serie de operaciones que
se escriben dentro de llaves y si la condicin es falta (no se cumple) el programa salta y no ejecuta
las operaciones que estn dentro de las llaves. El formato para if es el siguiente:
if ( condicin )
{
instrucciones;
}
Si la condicin es cierta, se ejecutan las rdenes contenidas entre las llaves. Si no es as, el
programa salta sobre ellas y contina.
El programa de control quedara as:
void setup () {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
int valorsensor_i;
int valorsensor_d;
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 24
void adelante () {
digitalWrite(4,LOW);
analogWrite(5,100);
analogWrite(6,100);
digitalWrite(7,LOW);
}
void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void gira_der () {
digitalWrite(4,LOW);
analogWrite(5,80);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void gira_izq () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
analogWrite(6,80);
digitalWrite(7,LOW);
}
void loop () {
int valorsensor_i = analogRead(0);
int valorsensor_d = analogRead(1);
if (valorsensor_i<500 && valorsensor_d<500)
{
adelante();
}
if (valorsensor_i>500 && valorsensor_d<500)
{
gira_izq();
}
if (valorsensor_i<500 && valorsensor_d>500)
{
gira_der();
}
if (valorsensor_i>500 && valorsensor_d>500)
{
paro();
}
}
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 25
Pg. 26
digitalWrite(led_d,LOW);
digitalWrite(led_i,HIGH);
delay(100);
digitalWrite(led_i,LOW);
}
}
Pg. 27
}
void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void gira_der () {
digitalWrite(4,LOW);
analogWrite(5,250);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void gira_izq () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
analogWrite(6,250);
digitalWrite(7,LOW);
}
void aviso() {
tone(buz,880,200);
delay(200);
noTone(buz);
}
void tonosalida() {
for (int i=1;i<3;i++)
{
tone(buz,784,200);
delay(200);
noTone(buz);
delay(200);
}
tone(buz,1568,400);
delay(400);
noTone(buz);
}
void loop () {
tiempo=millis();
if(tiempo<5) {
delay(2000);
tonosalida();
delay(1000);
}
Robtica con arduino: Construccin y programacin de un robot sigue lneas
Pg. 28
Pg. 29
http://www.youtube.com/watch?v=RQ8rT4itIVY
http://www.youtube.com/watch?v=26pcZ0fuhDc
http://www.youtube.com/watch?v=-zGiToJY4WM
https://picasaweb.google.com/103046050225234591647/RobotSigueLineasProyectoProf
undiza?feat=directlink
El siguiente robot es un experiencia del profesor surgida a raz del desarrollo del proyecto.
Dispone de un snar de distancias montado sobre un servo, un barra de 10 leds conectados a un expansor de puertos por i2c, 6 sensores infrarrojos,
brjula electrnica en bus i2c, conector para el control mediante el mando nunchuk de la consola wii, dos pulsadores, un display serie 16x2
caracteres, un piezo buzzer, dos led azules de alta intensidad y dos interruptores para el robot y el display, control por PID.
https://picasaweb.google.com/103046050225234591647/RobotOter_0?feat=directlink
Pg. 30