Logo Studenta

Construccion_y_control_de_un_robot_movil

¡Este material tiene más páginas!

Vista previa del material en texto

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 derechaL 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(𝜃) 0
0 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 unafunció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 
 
http://www.docsity.com/es/apuntes/ingenieria/
 
 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 precisacomo 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 presentanruido 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 alimentaen 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 ningunacombinació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 utilizarpara 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/]. 
 
 
 
https://www.arduino.cc/en/Main/Software
https://www.arduino.cc/en/Tutorial/HomePage

Continuar navegando