Robot Evasor
Robot Evasor
Física
Especialidad: electricidad
Materia: informática
El robot que vamos a construir es un pequeño robot móvil que evita los
obstáculos. A través de unos sensores infrarrojos, detectará la distancia a
los objetos que tiene frente a sí. Cuando se acerque a una determinada
distancia, el microcontrolador mandará una señal a los motores para que
haga girar al robot y así evitar el obstáculo.
Índice
1.Introducción................................................................9
1.1 Descripción de los objetivos del proyecto...................9
1.2 Contenido de la memoria......................................10
2.Análisis....................................................................11
2.1 Análisis de requerimientos de Hardware...................11
2.2 Análisis de requerimientos de Software....................12
3.Diseño......................................................................12
3.1 Diseño físico......................................................13
3.2 Diseño lógico.....................................................15
4.Herramientas y entorno...............................................17
4.1 Herramientas utilizadas en la manufacturación del
robot....................................................................17
4.1.1 Tornillo de banco........................................17
4.1.2 Sierra de marquetería..................................18
4.1.3 Taladro y destornillador...............................19
4.2 Herramientas y entorno de programación.................19
4.2.1 SmartDraw CI 21.2.4.6.................................19
4.2.2 Entorno de programación Arduino 1.0.5-r2.......21
4.2.2.1 Writing Sketches................................22
4.2.2.2 Sketchbook.......................................22
4.2.2.3 Tabs, múltiples archivos y compilación....23
4.2.2.4 Carga de archivos...............................24
4.2.2.5 Librerías..........................................25
4.2.2.6 Lenguaje de programación Arduino.........26
5.Desarrollo.................................................................28
5.1 Construcción y montaje del robot...........................28
5.2 Programación.....................................................37
5.2.1 Inicialización del programa...........................42
5.2.2 Detección de obstáculos...............................43
5.2.3 Movimiento hacia adelante y evasión de
obstáculos........................................................47
6.Pruebas y correcciones................................................52
4
6.1 Comprobación del funcionamiento de los sensores IR...52
6.2 Desviación a la derecha........................................54
6.3 Choque de las ruedas...........................................55
7.Conclusiones..............................................................56
7.1 Mejoras y usos futuros..........................................56
8.Referencias...............................................................58
8.1 Índice de imágenes..............................................58
8.2 Índice de extractos de código.................................59
5
Desarrollo de un pequeño robot móvil basado en microcontrolador
6
1. Introducción
La robótica surgió por el deseo humano de hacer máquinas a su
semejanza y que lo descargaran de trabajo. Hoy en día, los robots más
extendidos son los de uso industrial. Éstos suelen ser estáticos y estar
instalados en cadenas de montaje donde no paran de realizar siempre una
función específica.
7
Desarrollo de un pequeño robot móvil basado en microcontrolador
El primer apartado es una introducción que habla del objetivo del proyecto
y el principal rasgo del robot que vamos a construir, la evasión de
obstáculos. El punto actual se incluye dentro de dicho apartado dedicado a
la introducción.
8
Por último, en el octavo apartado se encuentran las referencias utilizadas y
el índice de imágenes y código de la memoria.
2. Análisis
Para la construcción del robot hemos de tener en cuenta dos aspectos
fundamentales: los requerimientos de hardware y los de software.
Para ello, aunque podríamos haber elegido entre diferentes tipos de chasis
(4 ruedas, ruedas oruga...), hemos elegido un chasis con dos ruedas traseras
bidireccionales y una rueda delantera omnidireccional. Esto, además de
conferirle una mayor movilidad al robot, supone un ahorro de energía
importante, ya que en vez de tener que alimentar cuatro servomotores
(chasis de 4 ruedas) o tener unas ruedas más pesadas (chasis oruga) sólo
tenemos que alimentar dos servomotores (la rueda omnidireccional es
puramente mecánica, no necesita alimentación). Además de los requisitos
de diseño, para la construcción del chasis vamos a utilizar metacrilato, que
es muy ligero.
9
Desarrollo de un pequeño robot móvil basado en microcontrolador
Por último, el centro alrededor del cual se crea el robot es la placa Arduino
UNO. Esta placa es la encargada de distribuir la alimentación por los
diferentes componentes hardware que lo necesiten y recibir las señales de
los sensores infrarrojos y enviarla a los servomotores. Para recibir y enviar
las señales necesarias, esta placa cuenta con el microcontrolador donde se
carga el programa que gestiona las funciones que ha de realizar el robot en
general y cada componente en particular.
Las funciones principales que tiene que realizar el robot son: detectar los
obstáculos, moverse hacia delante y girar para evitar los obstáculos que
encuentre a su paso.
Una vez localizado un obstáculo, el robot debe de girar hacia el lado donde
contrario al que ha localizado el obstáculo hasta que ninguno de los dos
sensores detecta ningún obstáculo.
Cuando el robot tiene el camino libre deberá moverse hacia adelante hasta
que vuelva a detectar algo que le bloquee el paso.
10
3. Diseño
El diseño del robot se compone de dos partes claramente
diferenciadas. El diseño físico del robot, que comprende el chasis y los
componentes hardware utilizados, y el diseño lógico, en el cual hablaremos
de la estructuración del programa realizado para el funcionamiento del
robot.
11
Desarrollo de un pequeño robot móvil basado en microcontrolador
El chasis estará compuesto de la base, una pieza frontal, una pieza trasera y
dos piezas laterales.
12
Como podemos ver en la Imagen 1(medidas en mm), las piezas laterales
tienen un hueco para poder introducir los servomotores.
13
En el siguiente boceto vemos como quedaría el chasis con las tres ruedas y
los sensores montados en él.
14
A partir de este bucle es desde donde diseñaremos el programa del
robot.
Las funciones "derecha" e "izquierda" hacen que las ruedas giren hacia el
lado correspondiente y llaman a "detectar" para comprobar si sigue
habiendo obstáculos o no. Para que el robot no entre en un bucle de
movimiento, seguirá girando hacia el mismo lado hasta que ninguno de los
dos sensores detecte obstáculos en el camino. Si no fuera así, el robot
podría entrar en un punto muerto, en el que detectara un obstáculo a un
lado, comenzara a girar hacia el lado contrario, dejara de detectar el
obstáculo y detectara otro en el lado contrario, por lo que giraría en sentido
contrario y volvería a detectar el primer obstáculo, lo que conllevaría que
girase hacia ambos lados sin parar.
15
Desarrollo de un pequeño robot móvil basado en microcontrolador
4. Herramientas y entorno
Para la realización de este proyecto hemos utilizado diferentes
herramientas. A lo largo de este apartado las detallaremos, así como el
entorno de programación Arduino.
16
Imagen 4. Tornillo de banco.
17
Desarrollo de un pequeño robot móvil basado en microcontrolador
Estas herramientas las hemos utilizado para realizar los agujeros en las
piezas de metacrilato del chasis del robot y en la fijación de los diferentes
componentes hardware a éste.
18
Imagen 6. Taladro. Imagen 7. Destornillador.
19
Desarrollo de un pequeño robot móvil basado en microcontrolador
20
Imagen 9. Diagramas de flujo en SmartDraw CI 21.2.4.6.
21
Desarrollo de un pequeño robot móvil basado en microcontrolador
4.2.2.2 Sketchbook
22
desde el botón "Abrir" de la barra de herramientas. La primera vez que se
ejecuta el software de Arduino, se creará automáticamente un directorio
para su "sketchbook". Puede ver o cambiar la ubicación del "sketchbook"
en el cuadro de diálogo Preferencias.
23
Desarrollo de un pequeño robot móvil basado en microcontrolador
Una vez que ha seleccionado la placa y el puerto serie correctos, hay que
pulsar el botón de carga en la barra de herramientas o seleccionar la opción
"Cargar" en el menú "Archivo". Las placas Arduino actuales se
restablecerán automáticamente y comenzarán la carga. Con placas más
antiguas (pre - Diecimila ) que carecen de auto-reset , hay que pulsar el
botón de reinicio de la placa justo antes de comenzar la carga. En la
mayoría de las placas, se verá como se encienden los LED's RX y TX
mientras el "sketch" se carga. El entorno de Arduino mostrará un mensaje
de carga completa o error cuando finalice.
24
Imagen 12. Menú "Carga" en Arduino.
4.2.2.5 Librerías
25
Desarrollo de un pequeño robot móvil basado en microcontrolador
26
27
Desarrollo de un pequeño robot móvil basado en microcontrolador
5. Desarrollo
A continuación pasaremos a explicar todos los pasos realizados para la
construcción del robot evita obstáculos. Para construirlo se han realizado
trabajos físicos de bricolaje y ensamblaje, y se ha desarrollado un programa
en Arduino para controlar el comportamiento del autómata.
28
Una vez cortada la plancha separando la parte útil para le construcción de
la estructura del robot de la restante, nos disponemos a cortar cada una de
las 6 piezas de las que se compone el chasis del robot. Éste no es un trabajo
sencillo, ya que hay que trabajar con mucha precisión para no desviarnos y
realizar mal los cortes, lo que supondría tener que empezar de nuevo con el
dibujo en el resto de plancha y el corte de la pieza.
Una vez cortadas todas las piezas, hay que taladrarlas para poder montar
los componentes en ellas. En el punto "3.1-Diseño físico" se indicó la
distribución de los componentes en las piezas del chasis, por lo tanto,
siguiendo estas indicaciones, realizamos 6 agujeros en la base de la
estructura (2 para la base para baterías y 4 para la placa Arduino), 4 en el
frontal (2 para cada uno de los sensores de infrarrojos), y 2 en cada una de
las dos piezas laterales (para fijar los servomotores en los huecos creados
para ellos).
29
Desarrollo de un pequeño robot móvil basado en microcontrolador
30
y un pulsador para el reset. Para empezar a utilizar la placa sólo es
necesario conectarla al PC a través de un cable USB, o alimentarla con un
adaptador de corriente AC/DC. También, para empezar, puede alimentarse
sencillamente con una batería. Una de las características principales de la
UNO es que no utiliza el convertidor USB-serial FTDI. Por el contrario,
ofrece el microcontrolador Atmega16U2 programado como convertidor
USB-serial.
31
Desarrollo de un pequeño robot móvil basado en microcontrolador
La base para baterías tiene dos cables, uno rojo y uno negro. El cable rojo
se conecta al pin de entrada Vin y el cable negro al pin Gnd.
32
horario o en sentido contrario a la agujas del reloj, según las ordenes
recibidas por el microcontrolador.
33
Desarrollo de un pequeño robot móvil basado en microcontrolador
34
Imagen 23. Sensor IR SHARP. Imagen 24. Cable JST
Conectamos los cables JST a las conexiones JST de los sensores. Los cables
negros se conectan a "Gnd", los rojos al pin "5V" y los cables amarillos a los
pines de entrada analógica. El cable amarillo del sensor derecho al pin
analógico A5 y el del sensor izquierdo al A4.
35
Desarrollo de un pequeño robot móvil basado en microcontrolador
36
Imagen 28. Vista lateral del robot.
5.2 Programación
Una vez construida la estructura con sus componentes y conectados los
cables pasamos a programar el microcontrolador. Tal y como dijimos en los
puntos "2.2-Análisis de requerimientos de Software" y "3.2-Diseño del
Software", el programa tiene que realizar la detección de obstáculos y
dependiendo de si los encuentra o no, deberá girar en sentido contrario a
donde ha encontrado el obstáculo o seguir hacia adelante.
37
Desarrollo de un pequeño robot móvil basado en microcontrolador
void
loop()
{
detectar();
adelante();
}
void
detectar()
{
dato2=leersensor(sensorizquierda);
dato=leersensor(sensorderecha);
obstaculoIzquierda = false;
obstaculoDerecha = false;
if(dato2>260)
{
obstaculoIzquierda = true;
}
else if (dato>260)
{
obstaculoDerecha = true;
}
else
{
38
obstaculoIzquierda = false;
obstaculoDerecha = false;
}
}
int leersensor(int
pin)
{
for ( contador=0; contador<5;contador=contador+1)
{
vector[contador]=analogRead(pin);
}
mediaSensor=calcularmedia();
return mediaSensor;
}
int
calcularmedia()
{
minimo=1023;
maximo=0; suma=0;
for(contador=0;contador<5;contador=contador+1)
{
minimo=min(minimo,vector[contador]);
maximo=max(maximo,vector[contador]);
suma = suma+vector[contador];
}
void
adelante()
{
if(obstaculoDerecha==true)
{
izquierda();
}
39
Desarrollo de un pequeño robot móvil basado en microcontrolador
else if (obstaculoIzquierda==true)
{
derecha();
}
else
{
dosmotor(1257,1700);
}
}
void
izquierda()
{
while ((obstaculoDerecha==true) ||
(obstaculoIzquierda==true))
{
dosmotor(1300,1300);
detectar();
}
}
void
derecha()
{
while ((obstaculoIzquierda==true) ||
(obstaculoDerecha==true))
{
dosmotor(1700,1700);
detectar();
}
}
void dosmotor(int anchodepulsom1, int
anchodepulsom2)
{
pulso(anchodepulsom1,pinMotor1);
pulso(anchodepulsom2,pinMotor2);
}
boolean pulso (int anchoPulso, int servo)
{
40
unsigned long tiempoantiguo;
if(servo==pinMotor1)
{
tiempoantiguo=tiempo1;
}
else if(servo==pinMotor2)
{
tiempoantiguo=tiempo2;
}
tiempoactual=millis();
if( tiempoactual>tiempoantiguo+22)
{
if(servo==pinMotor1)
{
tiempo1=millis();
}
else if(servo==pinMotor2)
{
tiempo2=millis();
}
digitalWrite(servo, HIGH);
delayMicroseconds(anchoPulso);
digitalWrite(servo, LOW);
return true;
}
else
{
return false;
}
}
41
Desarrollo de un pequeño robot móvil basado en microcontrolador
En esta parte del programa declaramos las variables que vamos a utilizar
en el programa.
void setup()
{
Serial.begin(115200);
pinMode(pinMotor1, OUTPUT);
pinMode(pinMotor2, OUTPUT);
pinMode(sensorizquierda, INPUT);
42
pinMode(sensorderecha, INPUT); tiempo1
=0; tiempo2 =0;
}
void loop()
{
detectar();
adelante();
}
void detectar()
{
dato2=leersensor(sensorizquierda);
dato=leersensor(sensorderecha);
obstaculoIzquierda = false;
obstaculoDerecha = false;
43
Desarrollo de un pequeño robot móvil basado en microcontrolador
if(dato2>260)
{
obstaculoIzquierda = true;
}
else if (dato>260)
{
obstaculoDerecha = true;
}
else
{
obstaculoIzquierda = false;
obstaculoDerecha = false;
}
}
mediaSensor=calcularmedia();
return mediaSensor;
}
44
Código 6. Método "leersensor(int pin)".
45
Desarrollo de un pequeño robot móvil basado en microcontrolador
int calcularmedia()
{
minimo=1023;
maximo=0; suma=0;
for(contador=0;contador<5; contador=contador+1)
{
minimo=min(minimo,vector[contador]);
maximo=max(maximo,vector[contador]);
suma = suma+vector[contador];
}
46
estos valores en la variable "suma" y después sacamos la media aritmética
de los tres valores restantes. Este resultado se asigna a la variable "media"
que es devuelta por el método.
void adelante()
{
if(obstaculoDerecha==true)
{
izquierda();
}
else if (obstaculoIzquierda==true)
{
derecha();
}
else
{
dosmotor(1300,1700);
}
}
47
Desarrollo de un pequeño robot móvil basado en microcontrolador
void izquierda()
{
while ((obstaculoDerecha==true) ||
(obstaculoIzquierda==true))
{
dosmotor(1300,1300);
detectar();
}
}
void
derecha()
{
while ((obstaculoIzquierda==true) ||
(obstaculoDerecha==true))
{
dosmotor(1700,1700);
detectar();
}
}
48
variables siguen siendo "true" o cambian a "false", terminando la ejecución
del bucle y del método.
if(servo==pinMotor1)
{
tiempoantiguo=tiempo1;
}
else if(servo==pinMotor2)
{
tiempoantiguo=tiempo2;
}
tiempoactual=millis();
if( tiempoactual>tiempoantiguo+22)
{
if(servo==pinMotor1)
{
tiempo1=millis();
}
49
Desarrollo de un pequeño robot móvil basado en microcontrolador
else if(servo==pinMotor2)
{
tiempo2=millis();
}
digitalWrite(servo, HIGH);
delayMicroseconds(anchoPulso);
digitalWrite(servo, LOW);
return true;
}
else
{
return false;
}
}
50
El método "pulso" recibe el valor del ancho de pulso que vas a introducir
en el servomotor y el pin de salida al que está conectado el cable de señal
de del servomotor como parámetros. Utilizando el parámetro "servo",
comprobamos cuál de los servos es sobre el que vamos a actuar. Una vez
comprobado, asignamos el valor de la variable "tiempo1" o "tiempo2"
(dependiendo del servo sobre el que estamos trabajando) a la variable
"tiempoantiguo". Después de esto, a la variable "tiempoactual" se le asigna
el valor, en milisegundos, del tiempo de ejecución del programa con la
función "millis( )". Teniendo las variables "tiempoantiguo" y
"tiempoactual" con valores asignados, comprobamos si "tiempoactual" es
22 milisegundos mayor que "tiempoantiguo". Si lo es, volvemos a
comprobar con qué motor estamos trabajando y asignamos el valor del
tiempo de ejecución (función "millis( )") a la variable "tiempo1" o
"tiempo2", dependiendo del servo con el que trabajamos en ese momento.
Para poder mandar la señal al servomotor utilizamos las funciones
"digitalWrite(servo, HIGH)" y "digitalWrite(servo, LOW)". Entre estas dos
sentencias hay que escribir el ancho de pulso que mandamos al servomotor
sobre el que estamos actuando con la función
"delayMicroseconds(anchoPulso)".
51
Desarrollo de un pequeño robot móvil basado en microcontrolador
6. Pruebas y correcciones
int ir_sensor0 = 4;
int ir_sensor1 = 5;
void
setup()
{
Serial.begin(9600);
}
void loop()
{
int lectura, cm;
lectura = analogRead(ir_sensor0);
Serial.print("Izquierda:");
Serial.println(lectura); cm =
52
pow(3027.4 / lectura, 1.2134);
Serial.print("Sensor Izquierda: ");
Serial.println(cm); delay(2000);
lectura = analogRead(ir_sensor1);
Serial.print("Derecha:");
Serial.println(lectura); cm =
pow(3027.4 / lectura, 1.2134);
Serial.print("Sensor Derecha: ");
Serial.println(cm); // lectura del sensor 1
delay(4000);
}
53
Desarrollo de un pequeño robot móvil basado en microcontrolador
void adelante()
{
if(obstaculoDerecha==true)
{
izquierda();
}
else if (obstaculoIzquierda==true)
{
derecha();
}
else
{
dosmotor(1257,1700);
}
}
54
Como podemos observar en la llamada a “dosmotor(1275,1700)”, hemos
modificado el valor del primer parámetro a 1275 en vez de 1300 que es el
que nos indican las especificaciones técnicas del servomotor. Reducir este
valor hace que el servomotor gire más rápido y por lo tanto ajusta la
desviación del robot hacia la derecha.
55
Desarrollo de un pequeño robot móvil basado en microcontrolador
7. Conclusiones
56
Debido a que la función de este robot es la evasión de obstáculos, se puede
pensar en casi cualquier mejora y/o uso. Hay muchísimos ámbitos en los
que puede ser útil incorporar la evasión de obstáculos en robots móviles.
En este apartado vamos a mostrar algunos ejemplos de ello.
57
Desarrollo de un pequeño robot móvil basado en microcontrolador
8. Referencias
1.http://www.arduino.cc/en/pmwiki.php?n=
2.http://arduino.cc/en/Reference/HomePage
3.http:/arduino.cc/en/Guide/Introduction
4.http:/arduino.cc/en/Guide/Environment
5.http:/arduino.cc/en/Main/ArduinoBoardUno
6.http:/www.smartdraw.com/product/
7.http:/www.pololu.com/product/1248
8.https://www.sparkfun.com/datasheets/Components/GP2Y0A21YK.pdf9.
9.http://es.wikipedia.org/wiki/Tornillo_de_banco
10.http://es.wikipedia.org/wiki/Segueta
58
Imagen 7. Destornillador.
Imagen 8. Menú de inicio de SmartDraw CI 21.2.4.6.
Imagen 9. Diagramas de flujo en SmartDraw CI 21.2.4.6.
Imagen 10. Entorno de programación Arduino.
Imagen 11. Menú "Sketchbook" en Arduino.
Imagen 12. Menú "Carga" en Arduino.
Imagen 13. Menú "Importar Librerías" en Arduino. Imagen
14. Plancha de metacrilato.
Imagen 15. Placa Arduino UNO rev3.
Imagen 16. Esquema Placa Arduino UNO rev3.
Imagen 17. Regleta de empalme de cables.
Imagen 18. Base para baterías 4xAA.
Imagen 19. Servomotor Pololu SM-S4303R.
Imagen 20. Especificaciones técnicas y dimensiones Servomotor Pololu
SM-S4303R.
Imagen 21. Rueda.
Imagen 22. Rueda omnidireccional.
Imagen 23. Sensor IR SHARP.
Imagen 24. Cable JST
Imagen 25. Especificaciones técnicas físicas Sensor SHARP.
Imagen 26. Vista del robot en perspectiva.
Imagen 27. Vista frontal del robot.
Imagen 28. Vista lateral del robot.
Imagen 29. Voltaje de salida vs. distancia reflectada.
Imagen 30. Gráfico voltaje vs. distancia.
Imagen 31. Sentido de rotación de los servos con respecto al ancho de
pulso.
59
Desarrollo de un pequeño robot móvil basado en microcontrolador
60