Descarga la aplicación para disfrutar aún más
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
Compartir