+ All Categories
Home > Documents > Proyecto Fin de Grado -...

Proyecto Fin de Grado -...

Date post: 29-Sep-2018
Category:
Upload: truongngoc
View: 217 times
Download: 0 times
Share this document with a friend
77
Equation Chapter 1 Section 1 Proyecto Fin de Grado Grado en Ingeniería Electrónica, Robótica y Mecatrónica Construcción y control de un robot móvil Autor: Iván Baena Álvarez Tutor: Federico Cuesta Rojo Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2016
Transcript

Equation Chapter 1 Section 1

Proyecto Fin de Grado

Grado en Ingeniería Electrónica, Robótica y

Mecatrónica

Construcción y control de un robot móvil

Autor: Iván Baena Álvarez

Tutor: Federico Cuesta Rojo

Dep. Ingeniería de Sistemas y Automática

Escuela Técnica Superior de Ingeniería

Universidad de Sevilla

Sevilla, 2016

iii

Proyecto Fin de Grado

Grado en Ingeniería Electrónica, Robótica y Mecatrónica

Construcción y control de un robot móvil

Autor:

Iván Baena Álvarez

Tutor:

Federico Cuesta Rojo

Profesor titular

Dep. Ingeniería de Sistemas y Automática

Escuela Técnica Superior de Ingeniería

Universidad de Sevilla

Sevilla, 2016

v

Proyecto Fin de Grado: Construcción y control de un robot móvil

Autor: Iván Baena Álvarez

Tutor: Federico Cuesta Rojo

El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros:

Presidente:

Vocales:

Secretario:

Acuerdan otorgarle la calificación de:

Sevilla, 2016

El Secretario del Tribunal

vii

Resumen

El presente proyecto lleva a cabo la construcción de un robot móvil de bajo coste incluyendo la selección,

integración y validación de componentes, así como el control del mismo. Como entorno de programación se ha

utilizado Arduino. El objetivo del proyecto se alcanza al conseguir que el robot sea capaz de adaptar una

trayectoria fijada por el usuario cuando se encuentra con obstáculos.

ix

Abstract

This project carries out the construction of a low cost mobile robot including the selection, integration and

validation of components and control over it. As programming environment has been used Arduino. The project

objective is achieved by getting the robot is able to adapt a path set by the user when it encounters obstacles.

xi

Índice

Resumen vii

Abstract ix

Índice xi

Índice de Gráficas xv

Índice de Figuras xvii

Índice de Tablas xix

Notación xxi

1 Introducción 1 1.1 Lista de materiales 1 1.2 Configuración del robot 5 1.3 Objetivo del proyecto 6 1.4 Organización de la memoria 7

2 Manejo de componentes 9 2.1 Esquema general 9 2.2 Elección de la placa Arduino 10 2.3 Ultrasonido 12

2.3.1 Conexiones 12 2.3.2 Pruebas 12

2.4 Infrarrojo 14 2.4.1 Conexiones 15 2.4.2 Pruebas 15

2.5 Encoders 18 2.5.1 Conexiones 18 2.5.2 Pruebas 19

2.6 Comparaciones 20 2.6.1 Sensor ultrasonido frente a infrarrojo 20 2.6.2 Sensor ultrasonido frente a encoder 21

2.7 Puente H 22 2.8 Pan & Tilt 24

3 Modelado y control 25 3.1 Recogida de datos 25 3.2 Modelo del robot 26

3.2.1 Ganancia k 26 3.2.2 Tiempo de subida τ 27

3.3 Diseño del controlador 27

xiii

3.3.1 Objetivo de control 27 3.3.2 Controlador tipo P 28 3.3.3 Otras posibilidades de control 30

3.4 Pruebas 30

4 Seguimiento de trayectorias y evitación de obstáculos 33 4.1 Sistema de referencia 33 4.2 Seguimiento de trayectoria 34 4.3 Detección de obstáculos 35

4.3.1. Barrido panorámico 35 4.3.2. Probabilidad de obstáculo 36

4.4 Método para evitar obstáculos 37 4.5 Seguimiento de trayectoria con obstáculos 39

5 Conclusiones y Trabajo futuro 41 5.1 Conclusiones 41 5.2 Desarrollos futuros 41

Anexos 43

Bibliografía 55

xv

ÍNDICE DE GRÁFICAS

Gráfica 2-1. Medida sensor ultrasonido (objeto grande cercano).

Gráfica 2-2. Medida sensor ultrasonido (objeto grande lejano).

Gráfica 2-3. Medida sensor ultrasonido (objeto pequeño cercano).

Gráfica 2-4. Medida sensor ultrasonido (objeto pequeño lejano).

Gráfica 2-5. Calibración sensor infrarrojo.

Gráfica 2-6. Medida sensor infrarrojo (objeto grande cercano).

Gráfica 2-7. Medida sensor infrarrojo (objeto grande lejano).

Gráfica 2-8. Medida sensor infrarrojo (objeto pequeño cercano).

Gráfica 2-9. Medida sensor infrarrojo (objeto pequeño lejano).

Gráfica 2-10. Medida encoder de la distancia en línea recta.

Gráfica 2-11. Medida encoder del ángulo girado.

Gráfica 2-12. Comparación sensor ultrasonido e infrarrojo.

Gráfica 2-13. Comparación sensor ultrasonido y encoder.

Gráfica 3-1. Experimento para sacar la función de transferencia.

Gráfica 3-2. Controlador P con Kp = 80.

Gráfica 3-3. Controlador P con Kp = 100.

Gráfica 3-4. Controlador P con Kp = 150.

Gráfica 3-5. Control de posición a 20 centímetros de objeto.

Gráfica 4-1. Sistema de referencia.

xvii

ÍNDICE DE FIGURAS

Figura 1-1. Chasis del robot.

Figura 1-2. Placas Arduino.

Figura 1-3. Sensor ultrasonido.

Figura 1-4. Puente H.

Figura 1-5. Sensor infrarrojo.

Figura 1-6. Micro Servo Digital.

Figura 1-7. Piezas del “Pan and Tilt”.

Figura 1-8. “Pan and Tilt” montado.

Figura 1-9. Bateria externa.

Figura 1-10. Módulo Bluetooth.

Figura 1-11. Resto de materiales.

Figura 1-12. Encoder.

Figura 1-13. Señales de un encoder.

Figura 1-14. Movimientos de un robot diferencial.

Figura 1-15. Robot con configuración diferencial.

Figura 1-16. Vista frontal del robot.

Figura 1-17. Vista lateral del robot.

Figura 2-1. Esquema modular de componentes.

Figura 2-2. Información conexión Wifi de Arduino YUN.

Figura 2-3. Uso del terminal Putty.

Figura 2-4. Arduino YUN.

Figura 2-5. Arduino MEGA.

Figura 2-6. Conexión sensor ultrasonido con Arduino.

Figura 2-7. Conexión sensor infrarrojo con Arduino.

Figura 2-8. Sensores midiendo distancia.

Figura 2-9. Placa puente H.

Figura 2-10. Conexión placa puente H con placa de Arduino.

Figura 2-11. Pan & Tilt con sensor ultrasonido.

Figura 3-1. Esquema de control en Simulink.

Figura 3-2. Captura vídeo control de posición.

Figura 4-1. Detección de obstáculo durante el barrido.

Figura 4-2. Captura vídeo de barrido

Figura 4-3. Distancia entre intervalos de detección.

Figura 4-4. Trayectoria con obstáculos.

Figura 4-5. Captura vídeo de trayectoria con obstáculos.

Figura 5-1. Logo de Fritzing.

xix

ÍNDICE DE TABLAS

Tabla 2-1. Pines de Arduino MEGA para interrupciones.

Tabla 3-1. Distancia obstáculo frente a velocidad.

Tabla 4-1. Posición servo frente a probabilidad de obstáculo (I).

Tabla 4-2. Posición servo frente a probabilidad de obstáculo (II).

xxi

Notación

r Radio de las ruedas

vl Velocidad de la rueda izquierda

vr Velocidad de la rueda derecha

v Velocidad absoluta del robot

wl Velocidad angular de la rueda izquierda

wr Velocidad angular de la rueda derecha

L Anchura del robot: longitud entre ruedas

H Longitud del tobot: distancia entre la parte frontal y la trasera

X Eje horizontal

x Posición eje horizontal

Y Eje vertical

y Posición eje vertical

θ Ángulo de orientación del robot: ángulo entre la dirección de avance y el eje

horizontal

θi Ángulo de orientación del robot en la posición inicial (90º)

ẋ Derivada de la componente x de la posición

ẏ Derivada de la componente y de la posición

θ Derivada del ángulo de orientación

k Ganancia del sistema

τ Tiempo de subida

Kp Ganancia del controlador

Ti Tiempo integral

Td Tiempo derivativo

dobj Distancia entre el sensor y el objeto

vs Velocidad del sonido en el aire

tv Tiempo de vuelo

T Tensión

Pi(xi,yi) Coordenadas del punto inicial del movimiento

Pf(xf,yf) Coordenadas del punto final del movimiento

ds Distancia del sensor al obstáculo

dc Distancia del centro del robot al obstáculo

β Ángulo entre la horizontal y la línea que une el sensor con el obstáculo

α Ángulo entre la horizontal y la línea que une el centro del robot con el obstáculo

Px Coordenada horizontal del obstaculo detectado

Py Coordenada vertical del obstaculo detectado

di Distancia entre intervalos de detección consecutivos.

Pi Punto de detección i

Pi+1 Punto de detección consecutivo a i

Ni Número de intervalos

1 INTRODUCCIÓN

El presente proyecto lleva a cabo la construcción de un robot móvil de bajo coste incluyendo la selección,

integración y validación de componentes, así como el control del mismo. Como entorno de programación se ha

utilizado Arduino. El objetivo del proyecto se alcanza al conseguir que el robot sea capaz de adaptar una

trayectoria fijada por el usuario cuando se encuentra con obstáculos.

En este capítulo se presentan los distintos componentes utilizados a lo largo del proyecto. También se explica el

tipo de configuración del robot que viene definido por el chasis empleado para su construcción. Y por último,

se hace una valoración de las dos placas de Arduino empleadas, comparándolas y sopesando pros y contras de

cada una de ellas.

1.1 Lista de materiales

A continuación se muestra una lista de todos los materiales que se han utilizado para la parte hardware a lo largo

del proyecto:

Chasis del robot “ROVER 5”.

6 pilas recargables AA de 1.2 Voltios.

Figura 1-1. Chasis del robot

El conocimiento de nadie puede ir

más allá de su experiencia.

- John Locke -

Introducción

2

Placa Arduino YUN.

Placa Arduino MEGA.

Figura 1-2. Placas Arduino

Sensor Ultrasonido HC-SR04.

Figura 1-3. Sensor Ultrasonido

Puente H: MD1.3 2A Dual Motorl Controller SKU DRI0002.

Figura 1-4. Puente H

3

3 Construcción y control de un robot móvil

Sensor Infrarrojo SHARP 2Y0A21 F 08.

Figura 1-5. Sensor infrarrojo

Micro Servo Digital DS65HB.

Figura 1-6. Micro Servo Digital

Soporte “Pan and Tilt”.

Figura 1-7. Piezas del “Pan and Tilt” Figura 1-8. “Pan and Tilt” montado

Introducción

4

Batería externa mini USB.

Figura 1-9. Bateria externa

Módulo Bluetooth HC-05 FC-114.

Figura 1-10. Módulo Bluetooth

Placa de prueba.

Cables.

Figura 1-11. Resto de material

5

5 Construcción y control de un robot móvil

También cabe mencionar los distintos programas que se han necesitado para la parte software:

MATLAB R2014a.

Simulink.

Putty Terminal.

Arduino 1.6.5.

BlueTerm (Aplicación Android).

1.2 Configuración del robot

Para este proyecto se ha usado como base el chasis del robot “ROVER 5”. Este chasis tiene una configuración

diferencial en la que las ruedas de cada lado están unidas mediante correas. En la rueda trasera de cada lado se

dispone de un motor de corriente continua y un encoder.

Los motores de corriente continua han sido alimentados por 6 pilas en serie de 1.2 Voltios, lo que hace un total

de 7.2V que es la tensión nominal de los motores.

Los encoders tienen 4 señales: cable rojo para alimentación (5V), cable negro para tierra, cable blanco señal A

y cable amarillo señal B. La resolución de estos encoders es de 1000 interrupciones por cada 3 vueltas de la

rueda. Las señales A y B están desfasadas de tal forma que cualquier cambio en una de ellas será interpretado

como una interrupción.

Figura 1-12. Encoder Figura 1-13. Señales de un encoder

Como ya se ha dicho anteriormente, la configuración del robot es diferencial, esto significa que se podrá

controlar unicamente la velocidad de ambas ruedas individualmente. Asi pues, no se podrá actuar directamente

sobre la orientación del robot. En la imagen siguiente se pueden ver los distintos movimientos que puede hacer

el robot en función de la velocidad de cada rueda:

Figura 1-14. Movimientos de un robot diferencial

Introducción

6

A continuación, se presentan las ecuaciones que rigen este tipo de configuración diferencial:

𝑣𝑙 = 𝑤𝑙 ∗ 𝑟 ; 𝑣𝑟 = 𝑤𝑟 ∗ 𝑟

𝑣 = 𝑣𝑟+ 𝑣𝑙

2 ; 𝑤 =

𝑣𝑟− 𝑣𝑙

𝐿

[��𝑦

��

] = [−𝑠𝑒𝑛(𝜃) 0

cos(𝜃) 00 1

] ∗ [𝑣𝑤

]

Combinando las ecuaciones anteriores se obtiene lo siguiente:

[��𝑦

��

] = [

−𝑟 ∗ 𝑠𝑒𝑛(𝜃)/2 −𝑟 ∗ 𝑠𝑒𝑛(𝜃)/2

𝑟 ∗ cos(𝜃) /2 𝑟 ∗ cos(𝜃) /2−𝑟/𝐿 𝑟/𝐿

] ∗ [𝑤𝑙

𝑤𝑟]

Por otro lado, para la parte de control, se ha modelado el robot con una función de transferencia de primer orden

con integrador. Esta función de transferencia relaciona la señal de entrada (tension) con la salida que en nuestro

caso será la posición. Se trabajará con una función de transferencia que tiene la siguiente forma:

𝐺(𝑠) =𝑘

(1 + 𝜏𝑠) ∗ 𝑠

1.3 Objetivo del proyecto

Una vez introducidos los componentes que se han utilizado y se definidos algunos conceptos básico sobre la

configuración y modelado del robot, se va a explicar un poco el objetivo al cual se llegará al concluir el proyecto.

Después de estudiar y probar los distintos compenentes el objetivo del proyecto es conseguir integrar los

componentes en el robot para poder aprovechar de la major forma posible los beneficios de cada uno de ellos.

El proyecto concluye cuando el robot es capaz de generar una trayectoria en un entorno desconocido en el cual

puede encontrar diferentes obstáculos que ha de esquivar con el fin de llegar a un punto dado por el usuario.

A continuación se muestran unas imagenes del robot visto desde distinto ángulo:

Figura 1-15. Robot con configuración

diferencial

7

7 Construcción y control de un robot móvil

Figura 1-16. Vista frontal del robot

Figura 1-17. Vista lateral del robot

1.4 Organización de la memoria

Para finalizar este capítulo introductorio del proyecto se va a detallar el contenido de los capítulos restantes que

se verán a lo largo de la memoria.

En el capítulo 2 se estudiará principalmente la parte hardware del proyecto, así como las placas de Arduino,

varios sensores, encoders, y demás componentes. Se compararán entre ellos analizando ventajas e

inconvenientes y también se explirán como habría que hacer las conexiones necesarias para poder realizar las

distintas pruebas.

En el capítulo 3 se realizará un modelo del robot basado en una función de transferencia a partir de la cual

mediante un entorno de simulación se hará un diseño de controladores y se probará en el robot el controlador

elegido.

Introducción

8

El capítulo 4 será dedicado al seguimiento de trayectorias y a la detección y evitación de obstáculos.

Finalmente, en un último capítulo se plantearán una serie de conclusiones donde se incluyen posibles

aplicaciones del proyecto y mejoras que se podrían añadir.

A lo largo de la memoria se hace referencia a una serie de anexos donde se incluyen códigos de programas en

Arduino. Estos anexos están numerados y recogidos al final de la memoria.

2 MANEJO DE COMPONENTES

La ciencia puede divertirnos y fascinarnos, pero

es la ingeniería la que cambia el mundo.

-Isaac Asimov-

En este capítulo se estudiarán los distintos componentes que se han utilizado en el proyecto. El objetivo es

conocer sus prestaciones para poder aprovechar al máximo el rendimiento de cada uno de ellos. Se incluye tanto

la forma de conectar el componente a la placa como pruebas realizadas.

2.1 Esquema general

Para tener una idea de como se quieren integrar los componentes en el conjunto del robot se muestra a

continuación un esquema general donde se pueden ver las interacciones entre componentes. En este esquema

no se entra en detalle de conexiones de cableado ya que posteriormente se explicará para cada componente como

se tiene que hacer dicha conexión.

Figura 2-1. Esquema modular de componentes

Manejo de componentes

10

10

2.2 Elección de la placa Arduino

A la hora de controlar un robot móvil se busca comodidad lo que nos lleva principalmente a utilizar la placa de

Arduino YUN ya que posee un módulo Wifi que permite la comunicación sin cables entre la placa y el

ordenador.

Si se quiere realizar dicha comunicación, a continuación se explica paso a paso como se configura el Wifi de

nuestro Arduino YUN:

Lo primero será conectar la placa al ordenador por el puerto USB, se esperará unos segundos hasta que se

encienda la luz WLAN de la placa. Ahora ya aparecerá una nueva red Wifi en el ordenador. Esa red será la

perteneciente al módulo Wifi del Arduino.

A continuación, se tendrá que abrir el navegador y entrar en la web “arduino.local” introduciendo como

contraseña “arduino”. Aquí se podrá ver la información de nuestra placa y configurar la misma. En mi caso la

he configurado con el nombre de “arduivan” y la he conectado a la red Wifi de mi hogar. Para volver a mirar la

información lo hago en la web “arduivan.local” una vez que tenga la placa alimentada.

Figura 2-2. Información conexión Wifi de Arduino YUN

Ya se podrá cargar el programa a la placa sin necesidad de cables. Ahora será necesario usar algún tipo de

comunicación para trasmitir datos. El protocolo que se ha usado es SSH (Secure SHell).

Es necesario un software que permita abrir un terminal. En mi caso he usado el Putty. Al abrirlo se tendrá que

introducir la dirección IP que aparece en la información de la placa. El terminal pedirá un usuario que por defecto

será “root” y una contraseña que será con la que haya configurado la red. Finalmente para conectarse se tiene

que introducir el siguiente comando:

11

11 Construcción y control de un robot móvil

“telnet localhost 6571”

Figura 2-3. Uso del terminal Putty

Se puede encontrar el código de un programa que permite hacer la lectura del sensor de ultrasonido mediante

conexión Wifi en el anexo 1 al final de la memoria.

Sin embargo a medida que se ha avanzado en el proyecto se empezó a encontrar problemas para seguir

trabajando con la placa de Arduino YUN debido al reducido número de pines en general y de pines reservados

para interrupciones en particular.

Para el uso de los encoders se necesitan 2 pines de interrupción por cada encoder lo que hace un total de 4 pines

de interrupción. La placa de Arduino YUN tiene 4 pines con los que se podrían utilizar interrupciones, pero el

fabricante solo recomienda su uso en 2 de ellos ya que los otros 2 actúan como puerto serie y se ha comprobado

que usando alguno de estos pines no se puede llevar correctamente la cuenta de las interrupciones.

Este problema llevó a un cambio de placa y se utilizó la placa de Arduino MEGA que posee una gran cantidad

de pines en general y además, tiene mayor número de pines reservados para interrupciones.

Para intentar compensar esa pérdida de comodidad que proporcionaba la conexión Wifi, se ha utilizado un

módulo Bluetooth que permite la recogida de datos durante la navegación del robot sin necesidad de cables.

Estos datos vía Bluetooth, serán recogidos por una aplicación instalada en nuestro móvil que permite la conexión

al módulo Bluetooth integrado en el robot.

VS

Figura 2-4. Arduino YUN

Manejo de componentes

12

12

2.3 Ultrasonido

Un sensor ultrasonido es capaz de medir la distancia a la que se encuentra de un objeto. Para ello, emite impulsos

ultrasónicos que los humanos no somos capaces de oir. Estos impulsos rebotan en el objeto volviendo de nuevo

al sensor. La velocidad de estos impulsos es conocidad, ya que viajan a la velocidad del sonido en el aire. De

esta manera, el sensor lo que hace es comenzar a contar el tiempo una vez que emite el impulso, y para de contar

cuando el impulso llega de vuelta. Este tiempo se conoce como tiempo de vuelo. Conociendo este tiempo y la

velocidad del sonido en el aire se calcula facilmente la distancia a un objeto:

𝑑𝑜𝑏𝑗 = 𝑣𝑠 ∗𝑡𝑣

2

2.3.1 Conexiones

El sensor de ultrasonido presenta 4 pines: Vcc (pin de alimentación), Trig (pin de salida para emitir el pulso),

Echo (pin de entrada que nos proporciona el tiempo) y GND (pin de conexión a tierra). En la siguiente imagen

se puede ver como quedaría conectado el sensor a la placa de Arduino:

Figura 2-6. Conexión sensor ultrasonido con Arduino

2.3.2 Pruebas

Para el testeo del sensor se han realizado distintas pruebas con el mismo código. Dicho código se puede encontrar

en el anexo 2 al final de la memoria. Las distintas pruebas se basan en detectar la distancia a la que el sensor se

encuentra de un objeto. Se ha probado con objetos de distinto tamaño y colocando estos objetos a diferente

proximidad.

Para comenzar se ha probado colocar un objeto de grandes dimensiones a una distancia relativamente próxima

al sensor. El resultado obtenido es el siguiente:

Figura 2-5. Arduino MEGA

13

13 Construcción y control de un robot móvil

Gráfica 2-1. Medida sensor ultrasonido (objeto grande cercano)

Los resultados obtenidos muestran gran precisión del sensor, exceptuando los 3 picos donde el error es de unos

0.4 centímetros (tampoco es un error demasiado significativo), se puede ver que la señal que se recibe es bastante

buena.

A continuación, se ha alejado significativamente el objeto:

Gráfica 2-2. Medida sensor ultrasonido (objeto grande lejano)

En la imagen anterior se puede ver como el error en la medida aumenta en valor absoluto ya que la señal está

oscilando en un rango de 1 centímetro. Aunque si se tiene en cuenta que se está midiendo una distancia mayor,

el error en valor porcentual no es demasiado grande por lo que se puede considerar que es una medida de

aceptable precisión.

Finalmente, se han realizado ambas simulaciones anteriores para un objeto mucho más pequeño, obteniendo lo

siguiente:

Manejo de componentes

14

14

Gráfica 2-3. Medida sensor ultrasonido (objeto pequeño cercano)

Gráfica 2-4. Medida sensor ultrasonido (objeto pequeño lejano)

Al intentar detectar un objeto más pequeño ya se esperaba que la medida no sería tan precisa como con un objeto

mayor. Se produce mayor número de rebotes y la señal no se mantiene constante prácticamente en ningún

momento. En la última imagen, se puede ver como el rango de variación de la medida es de hasta 5 centímetros.

2.4 Infrarrojo

Un sensor de de infrarrojos permite medir distancias de manera constante. No es necesario ningún tipo de de

temporización ni de circuito de control externo. En la placa de Arduino entra una señal analógica desde un

convertidor ADC de 10 bits por lo que se recibirán valores entre 0 y 1023 desde el sensor. Sabiendo que se

trabaja con una tensión máxima de 5V se puede calcular la tensión equivalente con cada medida. Una vez

conocida la tensión se obtiene la distancia del sensor al objeto.

15

15 Construcción y control de un robot móvil

Para poder hacer la conversion de tensión a distancia se ha realizado una calibración del sensor cuyo resultado

es el siguiente:

Gráfica 2-5. Calibración sensor infrarrojo

Aquí se puede ver el rango de funcionamiento del sensor que podemos considerar que está entre los 8 y los 80

centímetros, siguiendo la ecuación:

𝑑𝑜𝑏𝑗(𝑐𝑚) = 1674.6 ∗ 𝑇−1.2134

Estas conversiones se pueden ver en el código que se muestra en el anexo 3 al final de la memoria.

2.4.1 Conexiones

Las conexiones de este sensor son muy sencillas ya que solo posee 3 pines: alimentación, tierra y una entrada

analógica de donde se reciben los datos. Conectado a la placa de Arduino quedaría de la siguiente forma:

Figura 2-7. Conexión sensor infrarrojo con Arduino

2.4.2 Pruebas

Las pruebas que se han realizado con este sensor han sido las mismas que se hicieron con el sensor de

ultrasonido.

Manejo de componentes

16

16

Objeto grande a distancia cercana:

Gráfica 2-6. Medida sensor infrarrojo (objeto grande cercano).

Objeto grande a distancia lejana:

Gráfica 2-7. Medida sensor infrarrojo (objeto grande lejano).

En ambos casos se puede ver que la medida se encuentra oscilando en un valor. La presencia de unos máximos

y mínimos con un error notablemente alto a la medida real nos llevaría a usar un filtrado para eliminar esos

extremos y obtener una medida más limpia.

17

17 Construcción y control de un robot móvil

Objeto pequeño a distancia cercana:

Gráfica 2-8. Medida sensor infrarrojo (objeto pequeño cercano).

Objeto pequeño a distancia lejana:

Gráfica 2-9. Medida sensor infrarrojo (objeto pequeño lejano).

Comparando las pruebas realizadas con los dos objetos distintos se puede decir que si se utiliza un sensor de

infrarrojo la medida no se ve afectada con el tamaño del objeto a detectar.

Se puede concluir con estas pruebas diciendo que la superficie del objeto a medir influye en nuestra medición,

siendo el objeto ideal con una superficie totalmente lisa y de color blanco. De esta forma si la superficie del

objeto presenta rugosidad y/o es de un color más oscuro, la medida que obtendremos tendrá un error mayor.

Manejo de componentes

18

18

2.5 Encoders

Ya se habló un poco en la introdución sobre los encoders, pero es un tema muy importante del proyecto y require

que se entre en más profundidad para poder entender mejor como funciona y que puede aportar su uso.

Un encoder es un dispositivo que sirve para medir el giro de una rueda. Su uso permite tener información de la

distancia que se ha recorrido. Esto desemboca en una palabra muy importante para la robótica móvil, odometría.

La odometría se encarga de estimar la posición de vehículos con ruedas.

El robot usado en este proyecto tiene incorporado un encoder a cada lado. Cada uno de estos encoders es capaz

de detectar 1000 interrupciones por cada 3 vueltas de la rueda. Esto en distancia linea se traduciría de la siguiente

forma:

1000 𝑖𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖𝑜𝑛𝑒𝑠 = 3 ∗ 𝑃𝑒𝑟í𝑚𝑒𝑡𝑟𝑜 𝑑𝑒 𝑙𝑎 𝑟𝑢𝑒𝑑𝑎 = 3 ∗ (2 ∗ 𝜋 ∗ 𝑟)

1 𝑖𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 = 3 ∗ (2 ∗ 𝜋 ∗ 𝑟)

1000= 0.058 𝑐𝑚

Con el uso de los encoders, también se puede estimar el ángulo que gira el robot cuando ambas ruedas giran con

la misma velocidad en sentidos opuesto, el robot gira en torno a un eje vertical que pasaría por su centro. La

traducción de interrupciones a ángulo se ha realizado con experimentos en los que se hace girar el robot un

número determinado de interrupciones y se mide el ángulo que ha girado. Se ha obtenido la siguiente

equivalencia:

1 𝑖𝑛𝑡𝑒𝑟𝑟𝑢𝑝𝑐𝑖ó𝑛 = 0.199º

2.5.1 Conexiones

Cada encoder tiene 4 cables: alimentación (5V), tierra y las dos señales (A y B). Estas 2 señales tienen que ir

conectadas a un pin que nos permita monotorizar cuando se produce una interrupción en ese pin. Como ya se ha

explicado, esto fue principalmente lo que nos hizo utilizar la placa de Arduino MEGA que presenta los siguientes

pines dedicados a interrupciones:

Placa INT 0 INT 1 INT 2 INT 3 INT 4 INT 5

Arduino MEGA 2 3 21 20 19 18

Tabla 2-1. Pines de Arduino MEGA para interrupciones

Se puede ver como se programa la configuración de las interrupciones y la tarea que se realiza cuando se produce

una interrupción en el anexo 4 al final de la memoria.

19

19 Construcción y control de un robot móvil

2.5.2 Pruebas

Las dos cosas que se van a estudiar con el encoder son: la distancia que avanza el robot y el ángulo que gira.

Por lo tanto para probar que los encoder funcionan correctamente, se han realizado dos pruebas independientes.

En la primera prueba, se desplaza al robot en línea recta hacia delante y hacia detrás. De esta forma, cuando el

robot avanza los contadores de ambos encoders van incrementando su valor en una unidad cada vez que se

produce una interrupción, y cuando el robot retrocede los contadores decrementan. Así se lleva la cuenta de la

distancia que el robot se ha desplazado con referencia al punto donde comenzó el movimiento,

El robot estará el mismo tiempo avanzando y retrocendiendo mientras envía los datos recogidos por los encoders.

Estos datos vendrán ya traducidos de número de interrupciones a distancia en centímetros.

Gráfica 2-10. Medida encoder de la distancia en línea recta.

En la gráfica se puede ver la distancia que el robot ha avanzado calculada por el encoder. Existe un pequeño

error con respecto a la posición real donde termina el movimiento. El error no es demasiado significativo por lo

que el cálculo que realiza el encoder puede ser considerado aceptable.

En el anexo 5 al final de la memoria se encuentra el código con el que se ha realizado esta primera prueba.

En la segunda prueba se hace girar al robot una vuelta completa en un sentido y posteriormente en el otro sentido.

La cuenta de las interrupciones se incrementarán cuando el robot gira en sentido antihorario y se decrementarán

cuando el giro es en sentido horario.

El giro se realiza sin desplazamiento, es decir, el centro del robot permanece inmóvil durante todo el giro. Solo

cambia la orientación del robot.

A continuación se puede ver una gráfica donde se recogen los datos obtenidos en esta prueba:

Manejo de componentes

20

20

Gráfica 2-11. Medida encoder del ángulo girado.

En el anexo 6 al final de la memoria se encuentra el código con el que se ha realizado esta primera prueba.

2.6 Comparaciones

2.6.1 Sensor ultrasonido frente a infrarrojo

Para comparar ambos sensores se han colocado los dos sensores a la misma distancia de un objeto

suficientemente grande para ser detectado por los dos simultáneamente.

Figura 2-8. Sensores midiendo distancia

21

21 Construcción y control de un robot móvil

Los resultados de la prueba se pueden ver en la siguiente gráfica:

Gráfica 2-12. Comparación sensor ultrasonido e infrarrojo

Como se puede apreciar en la gráfica de la prueba anterior, ambas medidas presentan ruido por lo que si se

quiere tener mayor precisión, se tendría que realizar un filtrado de la medida. La medida del sensor de infrarrojo

presenta mayor error absoluto que la del sensor de ultrasonido, aunque por otro lado, la medidad del infrarrojo

se mantiene más constante por lo que el error se puede intentar compensar.

2.6.2 Sensor ultrasonido frente a encoder

Para poder comparar la medida del sensor de ultrasonido con la medida del encoder, se ha hecho avanzar el

robot un cierto tiempo y ver cuales son los valores que miden cada uno.

Por un lado, la medida procedente del encoder se obtiene igual que en la prueba que se hizo para calcular la

distancia que avanza el robot en línea recta. Y por otro lado, la medida procedente del sensor de ultrasonido se

obtiene guardando la distancia hasta el objeto más cercano y restando las medidas en las posiciones por las que

pasa el robot. De esta forma se mide la distancia que ha avanzado el robot como una diferencia de distancia del

robot al objeto más cercano.

A continuación se muestra una gráfica en la que se comparan ambas medidas:

Manejo de componentes

22

22

Gráfica 2-13. Comparación sensor ultrasonido y encoder

Se puede apreciar en la gráfica anterior que ninguna de las 2 medidas es exactamente la teórica aunque ambas

se aproximan. La función verde sería la distancia teórica que el robot va avanzando durante la trayectoria hasta

llegar a los 76 centímetros donde termina la prueba.

Por debajo de la función teórica, aparece una funcón roja que es la recibida por el sensor de ultrasonido. Esta

función en algunos momentos se ve afectada por el ruido y en todo momento tiene error respecto a la teórica.

Finalmente, también se puede ver otra función de color azul que corresponde con la medida del encoder. Esta

es una medida donde prácticamente no aparece ruido, y el error es considerablemente más pequeño que el del

sensor de ultrasonido a lo largo de toda la trayectoria.

A la vista de estas pruebas con sus respectivos resultados, posteriormente se utilizará el sensor de infrarrojo para

la aproximación a obstáculos, el sensor de ultrasonido para detectar los obstáculos que podemos encontrar en

los alrededores del robot y por último, los encoders se utilizarán para estimar la posición y orientación del robot

conforme éste se mueve.

2.7 Puente H

El puente H es un circuito electrónico que permite controlar el giro de un motor eléctrico de corriente continua

mediante la modulación del PWM. El robot que queremos controlar tiene dos motores de corriente continua por

lo que el integrado que se ha elegido para el puente H nos viene bastante bien ya que permite el control de los

dos motores tanto en velocidad como en dirección con un reducido número de pines.

23

23 Construcción y control de un robot móvil

Figura 2-9. Placa puente H

La placa presenta a cada uno de su lado las conexiones de cada motor. En los pines +/- del terminal se conectarán

directamente los motores, y los pines de control situados debajo son los que se conectan a la placa de Arduino.

Hay un pin digital (M) que define la dirección de giro del motor y un pin analógico que se tiene que conectar a

un pin de Arduino para permitir el uso del PWM, este pin (E), define la velocidad a la que gira el motor. En caso

de querer que el motor no gire, se tendría que mandar un 0 en el pin E, el valor que tenga el pin M será indiferente.

Por otro lado, se quiere que la alimentación de los motores sea mayor que la que viene de la placa de Arduino

por lo que se ha alimentado la placa del puente H por el pin VD y los motores por el pin VS. Esto queda mejor

reflejado en la siguiente imagen donde se puede ver como sería la conexión del puente H con la placa de Arduino:

Figura 2-10. Conexión placa puente H con placa de Arduino

Manejo de componentes

24

24

2.8 Pan & Tilt

El kit “Pan and Tilt” junto con 2 servomotores hacen posible crear una estructura con dos grados de libertad,

uno en el eje horizontal y otro en el eje vertical.

El objetivo de incluir este componente en el proyecto es fusionar este mecanismo junto con un sensor de

ultrasonido para poder realizar un barrido panorámico de 180º con el sensor. Puesto que solo se necesita que la

estructura gire alrededor del eje vertical se ha utilizado un único servomotor fijando el otro grado de libertad de

tal forma que el recorrido de la medida del sensor es paralelo a la horizontal del suelo.

En la siguiente figura se puede apreciar como queda dicha estructura:

Figura 2-11. Pan & Tilt con sensor ultrasonido

25

25 Construcción y control de un robot móvil

3 MODELADO Y CONTROL

Aprenderás Lecciones.

Estás inscrito en una escuela informal

de tiempo completo llamada vida.

-Benjamin Franklin-

Para realizar el diseño de controladores, lo más práctico es modelar nuestro robot con una función de

transferencia para poder hacer simulaciones y probar diferentes estrategias de control. En este capítulo se estudia

como realizar un modelo del robot en MATLAB y también se explica como sería el diseño de diferentes

controladores.

3.1 Recogida de datos

Para la recogida de datos se ha realizado un programa en el que se hace avanzar al robot hacia un obstáculo

variando la velocidad a medida que se acerca. Asi pues, comienza avanzando a la velocidad máxima y va

reduciendo un 20% la velocidad conforme la distancia a la que se encuentra el obstáculo es inferior a una cota

establecidad. Se ha seguido la siguiente tabla:

Distancia a obstáculo Velocidad del robot

Más de 80 cm 100%

Entre 80 y 60 cm 80%

Entre 60 y 40 cm 60%

Entre 40 y 20 cm 40%

Menos de 20 cm 0% (Robot parado)

Tabla 3-1. Distancia obstáculo frente a velocidad

Esto se ha implantado en Arduino como se puede observar en el anexo 7 al final de la memoria.

Una vez realizada la prueba se detectó que por debajo del 40%, la tensión que se consigue no es capaz de dar la

fuerza necesaria para mover el robot de forma constante, por lo que a la hora de hacer el modelo se ha obtado

por descartar este tramo para evitar cometer errores.

Con los datos obtenido se han creado dos vectores (uno con el tiempo y otro con la distancia) para poder trabajar

cómodamente en MATLAB.

Modelado y control

26

26

A continuación se muestra una gráfica que representa estos dos vectores donde se han marcado los puntos

significativos con los que posteriormente se ha calculado la función de transferencia del sistema:

Gráfica 3-1. Experimento para sacar la función de transferencia

3.2 Modelo del robot

Lo que se pretende hacer es calcular una función de transferencia que actúe de la misma forma que nuestro robot.

Dicha función de transferencia se puede suponer que será un modelo de primer orden y presentará la siguiente

forma:

𝐺(𝑠) =𝑌(𝑠)

𝑈(𝑠)=

𝑘

(1 + 𝜏𝑠)

Este modelo relaciona la velocidad con la que avanza el robot, Y(s), con la tensión de entrada que se le

proporciona, U(s).

Dicho esto, para tener la función de transferencia definida basta con obtener la ganancia del sistema (𝑘) y el

tiempo de subida (𝜏). El tiempo de subida se ha definido como el tiempo que tarda el sistema en alcanzar el 63%

del valor de referencia.

3.2.1 Ganancia k

Para el cálculo de la ganancia del sistema se han calculado las ganancias de cada uno de los 3 tramos y se ha

hecho una media aritmética.

La ganancia tiene que presentar unidades de velocidad/tensión, se ha obtado por las siguientes unidades: la

velocidad en metros por segundo y la tensión en voltios.

27

27 Construcción y control de un robot móvil

Sabiendo que cuando se alimentan los motores al máximo estamos dando 7.2 V, se puede saber la tensión con

la que se alimenta en los demás tramos: 80% 5.76 V // 60% 4.32 V.

Se ha calculado la velocidad de cada tramo con la pendiente de la gráfica.

En el primer tramo el robot avanza 0.35 metros en 2.9 segundos lo que hace una velocidad de 0.121 m/s.

Teniendo en cuenta que se ha alimentado con 7.2 V, la ganancia de este tramo es de 0.0168 m/Vs.

En el segundo tramo el robot avanza 0.2 metros en 2.27 segundos lo que hace una velocidad de 0.088 m/s.

Teniendo en cuenta que se ha alimentado con 5.76 V, la ganancia de este tramo es de 0.0153 m/Vs.

En el primer tramo el robot avanza 0.2 metros en 2.63 segundos lo que hace una velocidad de 0.076 m/s.

Teniendo en cuenta que se ha alimentado con 4.32 V, la ganancia de este tramo es de 0.0176 m/Vs.

Con las ganancias de los 3 tramos se ha hecho la media y se ha obtenido como resultado el siguiente valor:

𝑘 = 0.01653 (𝑚/𝑠

𝑉)

3.2.2 Tiempo de subida 𝝉

Como se ha dicho anteriormente, se ha definido el tiempo de subida como el tiempo que tarda el sistema

en alcanzar el 63%. En la prueba realizada, el valor que se alcanza es 115 centímetros por lo que el 63%

son 72.45 centímetros. Se ha marcado en la gráfica ese punto, así que para calcular el tiempo de subida

únicamente habría que calcular el tiempo que ha transcurrido desde el comienzo hasta alcanzar dicho punto.

𝜏 = 6.541 − 6.355 = 0.186 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠

Ya con ambos parámetros calculados queda como resultado la siguiente función de transferencia:

𝐺(𝑠) =0.01653

(1 + 0.186𝑠)

3.3 Diseño del controlador

3.3.1 Objetivo de control

El objetivo del controlador que se va a diseñar es el de mantener al robot a una distancia de referencia del

obstáculo que se encuentre delante.

Partiendo de la función de transferencia calculada en el apartado anterior, a la cual se ha añadido un integrador

para poder controlar la posición del robot en lugar de la velocidad, se ha obtenido la siguiente función de

transferencia:

𝐺(𝑠) =0.01653

(1 + 0.186𝑠)𝑠

Modelado y control

28

28

Para realizar las simulaciones se ha utilizado la herramienta Simulink de MATLAB. El esquma de control que

se ha seguido ha sido el siguiente:

Figura 3-1. Esquema de control en Simulink

En el bucle de control de tiene el controlador genérico al que llamaremos C(s) y la función de transferencia G(s)

que modela el robot. Como entrada se da una referencia de posición en la cual se quiere que el robot se detenga.

Esta entrada se simula con un escalón cuyo valor inicial es la posición inicial del robot y valor final la referencia

que se quiere alcanzar. Por último, la salida del sistema se corresponde con la posición instantánea del robot.

Esta salida se realimente para poder calcular el error entre la posición actual y la de refencia.

3.3.2 Controlador tipo P

Como restricción principal a la hora de controlar se ha obtado por evitar las oscilaciones, ya que si se quisiera

aproximar mucho a un objeto el robot podría colisionar con dicho objeto.

Lo primero que se ha hecho ha sido probar un controlador tipo P, es decir, solo presenta parte proporcional. Este

controlador, debido a que el sistema presenta un integrador, permite trabajar con una respuesta sin error en

régimen permanente. Cabe mencionar que si la señal de actuación es baja y no llega a un mínimo en el que

consiga aplicar la fuerza suficiente para hacer que el robot se mueva, la integración dejaría de funcionar y el

error en régimen permanente ya no sería nulo.

A continuación se han realizado varias pruebas con diferente ganancia del controlador (Kp).

Gráfica 3-2. Controlador P con Kp = 80

29

29 Construcción y control de un robot móvil

Gráfica 3-3. Controlador P con Kp = 100

Gráfica 3-4. Controlador P con Kp = 150

Se puede comprobar que a medida que se aumenta la ganancia del controlador, el sistema responde de manera

más rápida, pero llega un momento que hacer un control tan agresivo hace que el sistema sobreoscile. Como ya

se ha dicho, se va a intentar evitar la sobreoscilación, por lo que de estos tres controladores que se han simulado

el que mejor se adapta a lo que se busca es el controlador con ganancia Kp = 100 ya que sin oscilar presenta una

respuesta más rápida que el de ganancia Kp = 80.

Modelado y control

30

30

3.3.3 Otras posibilidades de control

El objetivo que se buscaba ya se ha conseguido con un controlador tipo P, pero cabe mencionar que si la

referencia no fuera constante seguramente no sería suficiente este controlador. Cabría la posibilidad de añadir

una parte derivativa y diseñar un controlador PD que funcionaría muy bien si lo que se buscara fuera seguir una

referencia en forma de rampa. Por otro lado, en el caso de que el sistema no presentara un integrador, sería

conveniente añadir una parte integral al controlador para poder hacer nulo el error en régimen permanente.

Dicho esto, un controlador puede reunir los tres parámetros de control mencionados: parte proporcional (P),

parte derivativa (D) y parte integral (I). La función de transferencia quedaría de la siguiente forma:

𝐶𝑃𝐼𝐷 = 𝐾𝑝 ∗ (1 +1

𝑇𝑖 ∗ 𝑠+ 𝑇𝑑 ∗ 𝑠)

3.4 Pruebas

Una vez diseñado el controlador, se ha puesto en práctica en el robot para hacer pruebas reales. La posibilidad

de ir variando la señales de actuación sobre los motores se tiene con el integrado del puente H que se encargará

de aplicar la tension necesaria a cada motor para que se consiga la velocidad adecuada para su control.

La prueba que se ha realizado consiste en dar como distancia de referencia 20 cm. El robot ha comenzado a 90

cm del obstáculo más próximo y una vez alcanzado el régimen permanente se ha provocado una perturbación

acercando el obstáculo al robot, éste ha respondido alejándose hasta mantener la distancia de referencia.

Finalmente se vuelve a alejar el obstáculo y el robot se vuelve a aproximar.

Grafica 3-5. Control de posición a 20 centímetros de objeto.

31

31 Construcción y control de un robot móvil

Como se puede apreciar en la gráfica anterior, la medida que se obtiene del sensor de ultrasonido presenta ruido,

aún así, se puede ver que el control que se hace es bastante bueno. Aunque en algunos momentos no se termina

de alcanzar un error nulo el régimen permante, se puede observar que en ningún momento hay sobreoscilación.

El hecho de que se produzca un pequeño error en régimen permanente se debe a que los motores necesitan una

fuerza determinada para comenzar a moverse y se ha optado por mantener parado los motores hasta que la señal

de control que define el PWM no alcanza un valor suficiente para que los motores funcionen de manera fluida.

En el anexo 8 incluido al final de la memoria se muestra el código con el que se ha realizado esta prueba.

Figura 3-4. Captura vídeo control de posición

Modelado y control

32

32

33

33 Construcción y control de un robot móvil

4 SEGUIMIENTO DE TRAYECTORIAS Y EVITACIÓN

DE OBSTÁCULOS

Nuestras virtudes y nuestros defectos son

inseparables, como la fuerza y la materia.

Cuando se separan, el hombre deja de existir.

-Nikola Tesla-

En este capítulo se lleva a cabo la integración de los componentes anteriormente estudiados con el fin de alcanzar

un objetivo práctico, dotar al robot de cualidades que le permitirán realizar tareas. Para ello es necesario definir

un sistema de referencia en el que se moverá el robot y crear un algoritmo de trabajo para la detección y evitación

de obstáculos,

4.1 Sistema de referencia

El sistema de referencia que se ha utilizado está basado en un plano 2D donde el origen de coordenadas es la

posición inicial del centro del robot. Su posición en el plano cambiará conforme se desplace en relación con los

ejes X e Y. Otra variable que tendremos que definir como referencia es la de la orientación del robot. En este

caso se ha optado por el ángulo que forma la trayectoria que haría el robot si se desplazara en línea recta hacia

delante y el eje X. Se va a designar este ángulo con la variable θ e inicialmente este ángulo tendrá un valor de

90º.

Gráfica 4-1. Sistema de referencia

Seguimiento de trayectorias y evitación de obstáculos

34

34

4.2 Seguimiento de trayectoria

En este apartado se hace que el robot se desplace desde su punto inicial (origen de coordenadas) hasta un punto

dado por el usuario dentro del sistema de referencias. A este punto se le domina punto objetivo o de referencia.

𝑃𝑢𝑛𝑡𝑜 𝑖𝑛𝑖𝑐𝑖𝑎𝑙 = 𝑃𝑖 = (𝑋𝑖 , 𝑌𝑖)

𝑃𝑢𝑛𝑡𝑜 𝑜𝑏𝑗𝑒𝑡𝑖𝑣𝑜 = 𝑃𝑓 = (𝑋𝑓 , 𝑌𝑓)

Se ha dejado el punto inicial como variables ya que se podría dar el caso que quisieramos que el robot se mueva

hacia varios puntos consecutivamente. Si fuera el caso, el punto objetivo del primer movimiento sería el punto

inicial del siguiente movimiento.

El camino más rápido entre dos puntos es una línea recta siempre y cuando no encontremos un obstáculo. De

momento se va a suponer que la zona donde se realiza el movimiento no tiene obstáculos, ya se complicará la

cosa posteriormente.

La trayectoria se basará en dos movimientos fundamentales, el primero en el que el robot se orienta hacia el

punto objetivo y el segundo en el que avanza hasta llegar a dicho punto.

La orientación se rige por la siguiente ecuación:

tan 𝜃 =𝑌𝑓 − 𝑌𝑖

𝑋𝑓 − 𝑋𝑖

De esta forma el ángulo que se quiere alcanzar es:

θ = tan−1 (𝑌𝑓 − 𝑌𝑖

𝑋𝑓 − 𝑋𝑖)

Como se ha definido el ángulo inicial (θ𝑖) 90º, el ángulo a girar será:

θ𝑖 − θ = 90º − θ

Se considera sentido de giro positivo el sentido de las agujas del reloj.

Para finalizar el movimiento, sería suficiente conocer el modulo de la distancia entre los dos puntos que se

obtiene de la siguiente forma:

35

35 Construcción y control de un robot móvil

|𝑃𝑓 − 𝑃𝑖| = √(𝑋𝑓 − 𝑋𝑖)2

+ (𝑌𝑓 − 𝑌𝑖)2

Se ha realizado un programa donde el robot recibe una serie de puntos objetivos por donde tiene que pasar en su

trayectoria. Este programa se puede encontrar en el anexo 9 al final de la memoria.

4.3 Detección de obstáculos

4.3.1. Barrido panorámico

Para realizar un barrido panorámico de 180º y comprobrar con que se puede encontrar el robot en su alrededor,

se ha utilizado la estructura vista en el capítulo 2 que fusiona el “Kit Pan and Tilt” con el sensor de ultrasonido.

El barrido consiste en tomar medidas con el sensor a lo largo de los 180º de la parte delantera del robot. Se ha

programado el servomotor de tal forma que se posicionará en intervalos de 10º.

Esta estructura se ha colocado en la parte frontal del robot, por lo que el obstáculo que sea detectado tendrá unas

coordenadas que no pertenecen al sistema de referencia que se definió anteriormente. Será necesario hacer una

transformación de esas coordenadas.

Figura 4-1. Detección de obstáculo durante el barrido

Seguimiento de trayectorias y evitación de obstáculos

36

36

En caso de la imagen anterior, el sensor está detectando un obstáculo en el punto P a una distancia “ds” y el

servomotor se encuentra girado “β” grados. Las coordenadas de este punto en referencia a la posición del robot

es la siguiente:

𝑃𝑥(𝑠𝑒𝑛𝑠𝑜𝑟) = 𝑑𝑠 ∗ cos 𝛽

𝑃𝑦(𝑠𝑒𝑛𝑠𝑜𝑟) = 𝑑𝑠 ∗ sin 𝛽

Transformando esas coordenadas al sistema de referencia definido se tiene que:

𝑃𝑥 = 𝑃𝑥(𝑠𝑒𝑛𝑠𝑜𝑟)

𝑃𝑦 = 𝑃𝑦(𝑠𝑒𝑛𝑠𝑜𝑟) +𝐻

2

Con está transformación ya está el punto referido al centro del robot, así pues, se puede calcular a la distancia

que se encuentra y el giro que tendría que hacer el robot para orientarse hacia el objeto:

𝑑𝑐 = √𝑃𝑥2 + 𝑃𝑦

2

𝛼 = tan (𝑃𝑦

𝑃𝑥)

4.3.2. Probabilidad de obstáculo

Para poder realizar una estimación de la probabilidad que puede haber de encontrar obstáculo en una posición

concreta. Se han tomado 10 medidas en cada posición del servomotor. De esta forma se establece una cuenta de

las veces que se ha detectado un obstáculo, un valor de 10 en una posición concreta se tomará como una

probabilidad del 100% de que podemos encontrar un obstáculo y un valor de 0 significaría seguridad completa

de que en esa posición no se encuentra ningún obstáculo.

Se ha realizado una prueba en la que se ha realizado un barrido considerando obstáculo cualquier objeto que se

detecte a menos de 40 centímetros del sensor. Con dicha prueba se ha obtenido el siguiente vector como

resultado: [0, 0, 0, 1, 9, 9, 10, 10, 1, 1, 1, 2, 10, 10, 10, 10, 2, 1, 0]. Relacionando este vector con las posiciones

del servomotor tenemos:

Posición del

servo

0º 10º 20º 30º 40º 50º 60º 70º 80º 90º

Probabilidad

de obstáculo

0% 0% 10% 90% 90% 100% 100% 10% 10% 10%

Tabla 4-1. Posición servo frente a probabilidad de obstáculo (I)

37

37 Construcción y control de un robot móvil

Posición del

servo

100º 110º 120º 130º 140º 150º 160º 170º 180º

Probabilidad

de obstáculo

10% 10% 20% 100% 100% 100% 20% 10% 0%

Tabla 4-1. Posición servo frente a probabilidad de obstáculo (II).

En la siguiente captura de un vídeo tomado durante la prueba se puede apreciar los dos obstáculos que detecta

el sensor de ultrasonido, en las tablas anteriores esto se refleja en una subida considerable de la probabilidad de

obstáculo en ciertas posiciones.

Figura 4-2. Captura vídeo de barrido

4.4 Método para evitar obstáculos

Lo primero será definir cuando se considerará que en una posición hay obstáculo y cuando se considerará que

esa posición esta libre. El criterio que se ha establecido para diferencia zonas libres de zonas ocupadas es que

cuando la probabilidad de encontrar un obstáculo sea menos o igual al 20%, esa posición está libre. Por el

contrario, si la probabilidad es mayor del 20% no se podrá asegurar que la posición esté libre por lo que

consideramos que se podría encontrar un obstáculo y se debe evitar pasar por ahí.

Los obstáculos se detectarán con un umbral de 40 centímetros, por lo que habrá que calcular cuántas posiciones

libres consecutivas necesitará el robot para poder pasar por una zona sin colisionar con un obstáculo cercano

detectado.

Seguimiento de trayectorias y evitación de obstáculos

38

38

Figura 4-3. Distancia entre intervalos de detección

Teniendo en cuenta la figura anterior se puede calcular la distancia entre dos puntos de detección consecutivos

Pi y Pi+1:

𝑑𝑖

2= 40 ∗ cos 85º

𝑑𝑖 = 6.97 𝑐𝑚

Conocida la anchura del robot (L = 23cm) se tiene que poder asegurar que el robot es capaz de evitar un obstáculo

correctamente.

𝑁𝑖 ∗ 𝑑𝑖 ≥ 𝐿

Respetando la ecuanción anterior se neceitarán al menos 4 intervalos (Ni = 4) en los que no se encuentren

obstáculos para que el robot pueda pasar sin que se produzca una colisión. Traduciendo esto a los puntos

detección, serían necesario encontrar 5 puntos consecutivos donde no se detecten obstáculos y el robot se tendrá

que posicionar para avanzar orientado al punto intermedio de estos 5 puntos.

Pasos a seguir para implementar este método de evitar obstáculos:

Realizar el barrido con el sensor de ultrasonido para obtener el vector de probabilidades de encontrar

obstáculos en las diferentes posiciones.

Traducir ese vector de probabilidades en un vector de ceros y unos donde el 0 indicará posición libre y

el 1 posición ocupada por un obstáculo.

Buscar las 5 posiciones consecutivas más próximas a la orientación del robot en las que el valor del

vector valga 0. En caso de que no exista ninguna combinación posible el robot mandará un mensaje

indicando que el punto objetivo es inalcanzable.

Guardar el ángulo de la posición central de las 5 posiciones encontradas anteriormente.

39

39 Construcción y control de un robot móvil

Traducir ese ángulo desde el punto de vista del sensor al punto de vista del centro del robot.

Orientar al robot con este ángulo y hacerlo avanzar hasta superar el obstáculo.

Esta serie de pasos nos hacen evitar un obstáculo aislado, pero la tarea no termina aquí, en el siguiente apartado

se integrará este método en un programa de seguimiento de trayectoria para que el robot sea capaz de evitar un

obstáculo cuando se dirige a un punto y una vez evitado el obstáculo vuelve a buscar ese punto objetivo con la

mayor rapidez posible.

Se ha incluido en el anexo 11 un programa que pone en práctica este método, más tarde este programa se utilizará

como una función a la que llamar cuando se quiera esquivar un obstáculo.

4.5 Seguimiento de trayectoria con obstáculos

Para poner punto y final al proyecto, se han integrado los distintos compenentes y las técnicas usadas como

sistema de referencias, detección de obstáculos y evitación de colisión del robot con los obstáculos.

El objetivo de este apartado es el de conseguir que el robot se mueva hacia un punto objetivo dado por el usuario

evitando los obstáculos que encuentre por el camino.

Los pasos a seguir para realizar la tarea son los siguientes:

Orientar el robot hacia el punto objetivo.

Avanzar hasta mantener una distancia fijada con el obstáculo más cercano o alcanzar el punto objetivo.

En caso de alcanzar el punto objetivo el programa terminaría aquí, por el contrario, si se encontrara un obstáculo

tendría que seguir de la siguiente manera:

Realizar barrido para detectar zonas libres.

Orientar hacia la zona libre más cercana.

Avanzar distancia fijada para superar el obstáculo.

Volver al primer punto y reorientar el robot hacia el punto objetivo.

Se seguirán siguiendo los pasos en un bucle hasta que el robot alcance el punto objetivo.

A continuación se muestra una representación gráfica de lo que sería la trayectoria del robot en un entorno con

obstáculos:

Seguimiento de trayectorias y evitación de obstáculos

40

40

Figura 4-4. Trayectoria con obstáculos

En la figura anterior, el punto rojo hace referencia al punto objetivo donde tiene que ir el robot, los puntos verdes

son los puntos donde se detectan los obstáculos y donde se realiza el barrido. Por último, los puntos azules son

donde el robot después de esquivar los obstáculos vuelve a reorientarse hacia el punto objetivo.

A continuación, se muestra una captura de un vídeo tomado durante una prueba en la que se colocaron 2

obstáculos interferiendo en la trayectoria del robot hasta un punto objetivo, ese punto se marcó en el suelo con

una cruz para comprobar la fiabilidad del programa desarrollado.

Figura 4-5. Captura vídeo de trayectoria con obstáculos

41

41 Construcción y control de un robot móvil

5 CONCLUSIONES Y TRABAJO FUTURO

Puedo aceptar el fracaso, pero no acepto no intentarlo.

-Michael Jordan-

5.1 Conclusiones

A lo largo de este trabajo se han realizado tareas tanto de programación como de montaje y selección de material.

Ha sido una buena experiencia enfrentarse a un trabajo de estas características ya que en algunas ocasiones hay

que buscar información de cosas que no están demasiado maduras y también es necesario aprender a adaptarse

al material del que se dispone y encontrar soluciones que permitan seguir avanzando.

Hay momentos frustrantes en los que da la sensación que dedicas mucho tiempo a intentar hacer algo que no

vas a conseguir o que más adelante te das cuenta que tienes que modificar y volver a empezar desde cero, pero

todo este tiempo no es tiempo perdido. Todo el tiempo que se dedica a algo cuenta, la experiencia es un grado y

cometer errores ayuda a aprender de éstos para futuras ocasiones.

Una vez alcanzado el objetivo, la sensación de satisfacción que se siente compensa todo el tiempo que se ha

dedicado.

5.2 Desarrollos futuros

El proyecto realizado deja abiertas muchas ramas por las que se podría seguir trabajando. El proyecto se ha dado

por concluido al alcanzar el objetivo de que el robot sea capaz de ir de un punto a otro de la forma más óptima

posible evitando los obstáculos que encuentre en su trayectoria. En este sentido, se podría añadir al robot algún

mecanismo para realizar una tarea concreta a lo largo de la trayectoria que recorre. Estos mecanismos podrían

encargarse de: limpiar suelos o piscinas, cortar césped, labrar la tierra, etc.

Siguiendo en la misma línea de ir de un punto a otro, también se podría utilizar al robot como método de

transporte de material en un entorno controlado de oficina o incluso industrial.

Otra aplicación por donde se podría seguir trabajando puede ser la de crear un mapa de una zona desconocida.

La forma de implementar esto se puede basar en hacer que el robot haga un seguimiento de la pared y guarde

los puntos en los que se detecta una esquina o rincón. Una vez terminada la exploración de la zona se podría

crear un mapa uniendo esos puntos anteriormente guardados.

Conclusiones y Trabajo futuro

42

42

Como ampliación para un posterior proyecto, se podría estudiar diferentes formas para obtener la odometría y

poder hacer una estimación más precisa de la posición del robot. Además, diseñar un protocolo de

comunicaciones para poder controlar una flota de robots que sean capaces de coordinarse para llevar a cabo una

tarea común. Se podría añadir un módulo de conexión Wifi a la placa de Arduino MEGA para poder facilitar la

comunicación inalámbrica. También sería interesante realizar pruebas con distintos tipos de alimentación con el

fin de mejorar el tiempo de autonomía. Por último, la integración de todas las conexiones en un único cirtuito

nos ahorraría material y podría optimizar el espacio de los componentes situados sobre el chasis del robot. Para

esto vendría bien el uso de un programa llamado Fritzing que ayuda a la hora de crear diagramas esquemáticos

de circuitos.

Figura 5-1. Logo Fritzing

43

43 Construcción y control de un robot móvil

ANEXOS

Anexo 1:

En este anexo se incluye el código de un programa realizado para Arduino YUN donde se reciben los datos de

un sensor ultasonido a través del modulo Wifi de la placa.

#include <Console.h>

int incomingByte;

long distancia;

long tiempo;

void setup(){

Bridge.begin();

Console.begin();

pinMode(8, OUTPUT); //TRIG

pinMode(9, INPUT); //ECHO

while (!Console){

; // Se espera hasta que se conecte la consola

}

Console.println("Se ha conectado a la consola!!!!");

}

void loop(){

if (Console.available() > 0) {

incomingByte = Console.read();

if (incomingByte == 'L') {

while (incomingByte != 'H')

{

digitalWrite(8,LOW);

delayMicroseconds(5);

digitalWrite(8, HIGH);

delayMicroseconds(10);

tiempo=pulseIn(9, HIGH);

distancia= int(0.017*tiempo);

Console.println("Distancia ");

Console.print(distancia);

Console.println(" cm");

delay(100);

}

}

}

delay(100);

}

Anexos

44

44

Anexo 2:

En este anexo se presenta el código con el que se ha utilizado el sensor de ultrasonido. Como particularidades,

decir que se hace una limpieza en el pin 2 correspondiente al “Trigger” poniendo el pin a nivel bajo durante 5

microsegundos para asegurarnos que la señal comenzara a emitir el pulso cuando lo mandemos nosotros. En el

pin 3 correspondiente al “Echo” nos viene el “tiempo” que vamos a utilizar para el cálculo de la “distancia”.

float distancia;

long tiempo;

void setup(){

Serial.begin(9600);

pinMode(2, OUTPUT); /* (TRIG)*/

pinMode(3, INPUT); /* (ECHO)*/

}

void loop(){

digitalWrite(2,LOW);

delayMicroseconds(5);

digitalWrite(2, HIGH);

delayMicroseconds(10);

tiempo=pulseIn(3, HIGH);

distancia= (0.017*tiempo);

Serial.println(distancia);

}

Anexo 3:

En este anexo se presenta el código con el que se ha utilizado el sensor de infrarrojo. Se han utilizado dos

ficheros, uno con el programa principal y otro con el código dos funciones que hemos utilizado para la

conversión de los datos.

Programa principal: aquí lo único a destacar es que hacemos la llamada a la función “IR_Sensor”

pasando como parámetro el pin al que conectamos el sensor.

void setup(){

Serial.begin(9600);

}

void loop(){

float medida;

medida=IR_Sensor(4);

Serial.print(medida);

}

Funciones: aquí podemos encontrar dos funciones, la función “IR_Sensor” y la función “ADC_V”.

La primera convierte el valor de tensión en distancia y lo devuelve al programa principal, pero para

tener el valor de tensión necesita llamar a la segunda función que se encarga de convertir en tensión

el valor que recibe del convertidor ADC.

float IR_Sensor(int pin){

int ADC;

float Tension,distancia;

ADC=analogRead(pin);

Tension=ADC_to_Volt(ADC);

distancia=26.434*pow(Tension,-1.211);

return distancia;

45

45 Construcción y control de un robot móvil

}

float ADC_V(int ADC_value){

float V=0;

V=(ADC*5.0)/1023;

return V;

}

Anexo 4:

Configuración de las interrupciones: se realiza mediante la función “attachInterrupt” que recibe 3

parámetros: el primero es el número de la interrupción que se relaciona con el pin que detecta la

interrución, el segundo es el nombre que se le da a la interrupción y el último indica la forma de

detectar la interrupción. En este caso “CHANGE” que detecta cualquier tipo de cambio (ya sea

flanco de subida o de bajada.

void configInterrupciones()

{

attachInterrupt(0, inter0, CHANGE); //pin2

attachInterrupt(1, inter1, CHANGE); //pin3

attachInterrupt(2, inter2, CHANGE); //pin21

attachInterrupt(3, inter3, CHANGE); //pin20

}

Tareas que se realizan cuando se produce una interrupción: aquí se programa una interrupción

como una función normal a la que se entra cuando se produce la interrupción. En este caso lo que

hace es incrementar o decrementar el contador asociado al encoder de la rueda correspondiente.

void inter0 () // Se ejecuta cuando se detecta un cambio de estado del Pin 2

{

if(direccion==1){

contador_izq++;

}

if(direccion==-1) {

contador_izq--;

}

}

void inter1 () // Se ejecuta cuando se detecta un cambio de estado del Pin 3

{

if(direccion==1){

contador_der++;

}

if(direccion==-1){

contador_der--;

}

}

void inter2 () // Se ejecuta cuando se detecta un cambio de estado del Pin 21

{

if(direccion==1){

contador_izq++;

}

if(direccion==-1){

Anexos

46

46

contador_izq--;

}

}

void inter3 () // Se ejecuta cuando se detecta un cambio de estado del Pin 20

{

if(direccion==1){

contador_der++;

}

if(direccion==-1){

contador_der--;

}

}

Anexo 5:

Este código es el perteneciente a la primera prueba de los encoders donde se mide la posición del robot con

respecto a la posición inicial. La función “datos()” se encarga de traducir las interrupciones en distancia y de

imprimir por pantalla los datos.

void loop() {

while(!fin){

direccion = 1;

mover(direccion,150);

datos();

datos();

datos();

datos();

direccion = 0;

mover(1,0);

datos();

delay(1000);

datos();

direccion = -1;

mover(direccion,150);

datos();

datos();

datos();

datos();

direccion = 0;

datos();

mover(1,0);

delay(1000);

datos();

fin = 1;

}

}

47

47 Construcción y control de un robot móvil

Anexo 6:

Este código es el perteneciente a la segunda prueba de los encoders donde se mide el ángulo girado por el robot.

La función “datos()” se encarga de traducir las interrupciones en ángulo y de imprimir por pantalla los datos.

void loop() {

while(!fin){

giro = 1;

girar(giro);

datos();

datos();

datos();

mover (0);

datos();

delay(1000);

datos();

giro = -1;

girar(giro);

datos();

datos();

datos();

mover (0);

datos();

delay(1000);

datos();

fin = 1;

}

}

Anexo 7:

Aquí se muestra el código del programa con el que se define el PWM para los pines donde se conectan los

motores. Se ha utilizado una estructura “switch-case” para facilitar su uso posterior. La variable “motor” se

relaciona con la velocidad del robot y la variable “distancia” es el valor que nos devuelve el ultrasonido.

switch (motor){

case 0: //Stop

analogWrite(LeftPin1,0); // Señal PWM a 0%

analogWrite(RightPin1,0); // Señal PWM a 0%

analogWrite(LeftPin2,0); // Señal PWM a 0%

analogWrite(RightPin2,0); // Señal PWM a 0%

break;

case 1: //Adelante1

analogWrite(LeftPin1,0); // Señal PWM a 0%

analogWrite(RightPin1,102); // Señal PWM a 40%

analogWrite(LeftPin2,0); // Señal PWM a 0%

analogWrite(RightPin2,102); // Señal PWM a 40%

break;

case 2: //Adelante2

analogWrite(LeftPin1,0); // Señal PWM a 0%

analogWrite(RightPin1,153); // Señal PWM a 60%

analogWrite(LeftPin2,0); // Señal PWM a 0%

analogWrite(RightPin2,153); // Señal PWM a 60%

case 3: //Adelante3

Anexos

48

48

analogWrite(LeftPin1,0); // Señal PWM a 0%

analogWrite(RightPin1,204); // Señal PWM a 80%

analogWrite(LeftPin2,0); // Señal PWM a 0%

analogWrite(RightPin2,204); // Señal PWM a 80%

break;

case 4: //Adelante4

analogWrite(LeftPin1,0); // Señal PWM a 0%

analogWrite(RightPin1,255); // Señal PWM a 100%

analogWrite(LeftPin2,0); // Señal PWM a 0%

analogWrite(RightPin2,255); // Señal PWM a 100%

break;}

if (distancia>=80){

motor=4;}

else if (distancia<80 && distancia>=60){

motor=3;}

else if (distancia<60 && distancia>=40){

motor=2;}

else if (distancia<40 && distancia>=20){

motor=1;}

else if (distancia<20){

motor=0;}

Anexo 8:

Aquí se tiene el código del programa con el que se ha llevado a cabo la prueba del controlador. En el programa

se define tanto el parámetro de control (Kp) como el valor de referencia. El valor del PWM esta dado por la

variable “control” que se satura cuando supera el valor máximo de 255 y también se hace que valga 0 si no se

supera un valor mínimo que en este caso se ha establecido 50 (PWM al 20%).

#include <Console.h>

int incomingByte;

int distancia_medida;

long tiempo;

long time;

int Kp=100;

int referencia=20;

float control=0,error=0;

void setup() {

Bridge.begin();

Console.begin();

while (!Console){

; // Se espera hasta que se conecte la consola

}

Console.println("Se ha conectado a la consola!!!!");

}

void loop() {

if (Console.available() > 0) {

while(1){

digitalWrite(8,LOW);

delayMicroseconds(5);

digitalWrite(8, HIGH);

delayMicroseconds(10);

tiempo=pulseIn(9, HIGH);

distancia_medida = int(0.017*tiempo);

49

49 Construcción y control de un robot móvil

Console.println(distancia_medida);

error=referencia-distancia_medida;

control = Kp*error;

if(control>0)

{

digitalWrite(M1,1);

digitalWrite(M2,1);

}

else

{

digitalWrite(M1,0);

digitalWrite(M2,0);

}

control = abs(control);

if (control>=255){

control = 255;

}

if (control<=50){

control = 0;

}

analogWrite(E1,control);

analogWrite(E2,control);

}

}

}

Anexo 9:

Aquí se muestra un programa que recibe una matriz “trayectoria” de dos columnas donde se dan las coordenadas

X e Y de los puntos que tiene que recorrer el robot. El programa va recorriendo dicha matriz definiendo el punto

objetivo siguiente, calcula el ángulo que tiene que girar y el módulo de la distancia que tiene que avanzar. El

ángulo es enviado a una de estas dos funciones: “giro_derecha” o “giro_izq” según corresponda. Y la distancia

se envía a la función “mover” como tercer parámetro. Esta función también recibe como primer parámetro la

dirección de avance: 0 (parado), 1(hacia delante), -1(hacia detrás).

int trayectoria[10][2] = {{0,30},{20,40},{30,60},{30,80},{20,90},{25,100},{50,100},{60,80},{75,90},{100,100}};

float x_ahora = 0;

float y_ahora = 0;

void loop() {

while (!fin)

{

if(i>=10){

direccion = 0;

mover (direccion,0,0,0);

fin = 1;}

else{

x_siguiente = trayectoria[i][0];

y_siguiente = trayectoria[i][1];

Console.println("X_objetivo:");

Console.println(x_siguiente);

Console.println("Y_objetivo:");

Console.println(y_siguiente);

Anexos

50

50

d_x = (x_siguiente-x_ahora);

d_y = (y_siguiente-y_ahora);

if (d_y==0 && d_x>0){

angulo_ref = 90;

}

else if (d_y==0 && d_x<0){

angulo_ref = 270;

}

else if (d_y>0){

angulo_ref = atan(d_x/d_y);

angulo_ref = angulo_ref*180/pi;

}

else if(d_y<0){

angulo_ref = atan(d_x/d_y);

angulo_ref = 180-angulo_ref*180/pi;

}

d_x = d_x*d_x;

d_y = d_y*d_y;

modulo=sqrt(d_x + d_y);

d_angulo = angulo_ref-angulo;

Console.println("Angulo a girar:");

Console.println(d_angulo);

Console.println("Modulo linea recta:");

Console.println(modulo);

if(angulo!=angulo_ref){

if(d_angulo>0)

{

giro_derecha(d_angulo);

}

if(d_angulo<0)

{

giro_izq(abs(d_angulo));

}

}

direccion = 1;

mover (direccion,200,200,modulo);

angulo = angulo + d_angulo;

x_ahora = x_siguiente;

y_ahora = y_siguiente;

i++;}

}

}

51

51 Construcción y control de un robot móvil

Anexo 10:

Para el control del servo es necesario incluir la librería “Servo.h” y definir una variable del tipo “Servo” en el

siguiente programa esa variable es “servo1”. Llamando a la función “servo1.write” se manda la posición a la

que se quiere llevar el servomotor. El programa va recorriendo las posiciones realizando 10 medidas en cada

una de ellas. En el vector “prob_obstaculo[j]” se almacena el valor del contador de medidas que han detectado

obstáculo en la posición “j”. La función “ultrasound()” es la que se encarga de realizar la medida del ultrasonido.

void loop() {

servo1.write(0);

ultrasound();

delay(200);

while (!fin){

while(j<=18){

i = 0;

servo1.write(j*10);

delay(100);

while(i<10){

ultrasound();

d_obstaculo = 0.017*tiempo;

if(d_obstaculo<50){

prob_obstaculo[j] = prob_obstaculo[j]+1;

}

delay(100);

i++;

}

Serial.println(prob_obstaculo[j]);

j++;

}

fin = 1;

Anexo 11:

En este anexo se implementa el método estudiado para esquivar obstáculos. Se llama a la función “barrido” que

ya ha sido explicada anteriormente. Este programa lo que hace es guardar los datos obtenidos en el barrido en

un vector e ir recorriendo el vector con una serie de “ifs anidados” hasta encontrar una zona libre suficientemente

grande para que el robot pueda pasar.

void loop() {

while (!fin)

{

barrido();

i = 0;

while (i<=18)

{

if(prob_obstaculo[i]<=2){

prob_obstaculo[i]=0;

}

else{

Anexos

52

52

prob_obstaculo[i]=1;

}

i++;}

libre = 0;

i=9;

while (i>=0 && libre==0)

{

if(prob_obstaculo[i-1]==0)

{

if(prob_obstaculo[i-2]==0)

{

if(prob_obstaculo[i-3]==0)

{

if(prob_obstaculo[i-4]==0)

{

if(prob_obstaculo[i-5]==0)

{

posicion_avance = i-3;

libre = 1;

}

else

i--;}

else

i--;}

else

i--;}

else

i--;}

else

i--;}

i=9;

while(i<=18 && libre==0)

{

if(prob_obstaculo[i+1]==0)

{

if(prob_obstaculo[i+2]==0)

{

if(prob_obstaculo[i+3]==0)

{

if(prob_obstaculo[i+4]==0)

{

if(prob_obstaculo[i+5]==0)

{

posicion_avance = i+3;

libre = 1;

}

else

i++;}

else

i++;}

else

i++;}

else

i++;}

else

i++;}

if(libre==0){

Serial.println("No se puede encontrar espacio libre para avanzar");

}

else{

angulo = posicion_avance*10;

d_angulo = angulo_ini-angulo;

if(d_angulo>0)

{

giro_derecha(d_angulo);

53

53 Construcción y control de un robot móvil

}

else

{

giro_izq(abs(d_angulo));

}

mover(1,200,200,40);

}

fin=1;

}

}

Anexo 12:

Este último anexo incluye el programa final cuyo objetivo es hacer que el robot avance hasta un punto objetivo

dado por el usuario evitando los obstáculos que encuentre por el camino siguiendo el método implementado en

el anexo anterio. A este método para esquivar en este programa se le llama con la función “esquivar_obs()”. El

programa orienta al robot hacia la posición del punto objetivo y lo hace avanzar hasta que o bien llegue a ese

punto o encuentre un obstáculo (el obstáculo se detecta con el sensor infrarrojo y se mantiene a una distancia de

20 centímetros). En caso de encontrar el obstáculo llama a la función para esquivarlo y vuelve a reorientar el

robot hacia el punto objetivo.

void loop() {

while (x_ahora!=x_objetivo && y_ahora!=y_objetivo){

d_x = (x_objetivo-x_ahora);

d_y = (y_objetivo-y_ahora);

angulo = atan(d_x/d_y);

angulo = angulo*180/pi;

d_angulo = angulo-angulo_ahora;

if(d_angulo>0){

giro_derecha(d_angulo);

angulo_ahora = angulo_ahora-d_angulo;

}

else{

giro_izq(abs(d_angulo));

angulo_ahora = angulo_ahora-d_angulo;

}

if(x_ahora!=x_objetivo && y_ahora!=y_objetivo){

if(distancia_obs>20){

m_infrarrojo=IR_Sensor(4);

error=referencia-m_infrarrojo;

control = Kp*error;

if(control>0){

direccion = 1;}

else{

direccion = -1;}

control = abs(control);

if (control>=255){

Anexos

54

54

control = 255;}

if (control<=50){

control = 0;}

mover_control(direccion,control,control);

}

else{

parar();

esquivar_obstaculo();

}

}

else{

Serial.println("Se ha alcanzado del punto objetivo.");

}

}

}

55

55 Construcción y control de un robot móvil

BIBLIOGRAFÍA

[1] S. Thrun, W. Burgard, D. Fox, Probabilistic Robotics, 2005.

[2] D. Cook, Robot Building for Beginners, 2002.

[3] J-D. Warren, J. Adams, H. Molle, Arduino Robotics,2011.

[2] Software de Arduino. Disponible en: [https://www.arduino.cc/en/Main/Software].

[3] Tutoriales de Arduino. Disponible en: [https://www.arduino.cc/en/Tutorial/HomePage].

[4] A. García González, K. Navarro, Sitio web Panamá Hitek. Disponible en: [http://panamahitek.com/arduino/].

[5] Sitio Web: Comunidad Arduino en Español. Disponible en: [http://rduinostar.com/].

[6] Manual de programación de Arduino. Disponible en: [http://dfists.ua.es/~jpomares/arduino/page_01.htm].

[7] Tienda de electrónica, soporte técnico y aporte de ejemplos y tutoriales. SparkFun Electronics. Disponible

en: [https://www.sparkfun.com/].


Recommended