scieee AI-readable full text Open interactive document viewer

Vehículo autónomo para gestión de trayectorias basado en Arduino y Raspberry

Gómez Guerrero, Francisco Antonio

Abstract

Este proyecto consiste en el desarrollo de un sistema de monitorización remoto de un robot autónomo. El objetivo principal es hacer que el robot se desplace a través de un laberinto desde un punto de origen hasta un punto final de la forma más rápida posible. El sistema cuenta con acceso a internet y una aplicación web accesible mediante cualquier navegador web en cualquier plataforma, ya sea en un smartphone, tablet u ordenador personal. Mediante esa aplicación web el usuario podrá interactuar con el sistema, ya sea para conocer la situación y estado actual o para dar órdenes. En este proyecto se utilizan tecnologías como HTML, PHP, Python, C y C# entre otras. Como plataformas hardware se utilizan Raspberry Pi y Arduino.

Full text

Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 1 Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 2 Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 3 ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA DE SOFTWARE Vehículo autónomo para gestión de trayectorias basado en Arduino y Raspberry Autonomous vehicle for trayectory management based on Arduino and Raspberry Realizado por Francisco Antonio Gómez Guerrero Tutorizado por Luis Manuel Llopis Torres Departamento Lenguajes y ciencias de la computación UNIVERSIDAD DE MÁLAGA MÁLAGA, septiembre de 2016 Fecha defensa: El Secretario del Tribunal Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 4 Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 5 Resumen/Summary Español Este proyecto consiste en el desarrollo de un sistema de monitorización remoto de un robot autónomo. El objetivo principal es hacer que el robot se desplace a través de un laberinto desde un punto de origen hasta un punto final de la forma más rápida posible. El sistema cuenta con acceso a internet y una aplicación web accesible mediante cualquier navegador web en cualquier plataforma, ya sea en un smartphone, tablet u ordenador personal. Mediante esa aplicación web el usuario podrá interactuar con el sistema, ya sea para conocer la situación y estado actual o para dar órdenes. En este proyecto se utilizan tecnologías como HTML, PHP, Python, C y C# entre otras. Como plataformas hardware se utilizan Raspberry Pi y Arduino. English This project involves the development of a remote monitoring system for an autonomous robot. The main goal is to make the robot move through a maze from an start point to an end point as quick as possible. The system has internet access and an accessible web application through any web browser on any platform, whether is on a smartphone, tablet or personal computer. Through this web application the user can interact with the system, either to know it’s current situation and state or to give orders. In this project technologies such as HTML, PHP, Python, C and C # among others are used. Arduino and Raspberry Pi are used as hardware platforms. Palabras clave/Keywords Arduino, robot, laberinto, Raspberry, resolución, PHP, Python, C, multilenguaje, vehículo, autónomo, internet. Maze, resolution, vehicle, autonomous, Arduino, robot, Raspberry, Python, C, multilanguaje , internet. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 6 Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 7 ÍNDICE 1.INTRODUCCIÓN 1.1 Introducción al proyecto 1.2 Objetivo del proyecto 2.TECNOLOGÍAS UTILIZADAS 2.1 PHP 2.2 HTML 2.3 Python 2.4 C# 2.5 Socket 2.6 Arduino(Lenguaje) 2.7 PWM 2.8 Bootstrap 2.9 SSH 2.10 SFTP 3. SOFTWARE UTILIZADO 4. ANÁLISIS DE HARDWARE Y SOFTWARE 4.1 Requisitos de hardware 4.2 Requisitos de software 5. DISEÑO HARDWARE 5.1 Raspberry PI 5.2 Arduino 5.3 Servomotores 5.4 Potenciómetros 5.5 Batería 5.6 Protoboard y cableado 6. MONTAJE 7. DISEÑO SOFTWARE Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 8 7.1 Sistema operativo 7.2 PHP 7.3 Python 7.4 Arduino 7.5 C# 8. PRUEBAS 9. INTEGRACIÓN 10. INSTRUCCIONES DE USO 11. CONCLUSIONES 12. PROTOCOLOS DE COMUNICACIÓN 12.1 Protocolo de comunicación PHP-Python 12.2 Protocolo de comunicación Arduino-Python 13. CODIGOS DE REPRESENTACIÓN 13.1 Mapa del laberinto (VALOR DE MAPA) 13.2 Estado del camino (VALOR DE CAMINO) 13.3 Direcciones (VALOR DE DIRECCIONES) 13.4 Progreso (VALOR DE PROGRESO) 13.5 Estado del dispositivo (VALOR DE ESTADO) 14.BIBLIOGRAFÍA Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 9 1.INTRODUCCIÓN 1.1 Introducción al proyecto. Este proyecto pretende desarrollar un sistema autónomo capaz de desplazarse por el mundo físico desde un lugar de origen hasta un destino y que pueda ser controlado fácilmente por un usuario mediante una aplicación web. Un robot autónomo es capaz de operar con un alto grado de autonomía, con un pequeño aporte de información proveída por un usuario. El robot presentado en este proyecto es capaz de desplazarse dentro de un laberinto desde un origen hasta un destino de la forma más rápida posible. Durante el desarrollo del proyecto se utilizan tecnologías como PHP, Python, C y C# entre otros. Cada una de estas tecnologías es apropiada para un uso concreto, donde resultan de más utilidad, combinadas facilitan el desarrollo. PHP se enfoca en presentar la interfaz al usuario por medio de la web. Python permite un código muy limpio, legible y sencillo, sirve de enlace para conectar las demás partes del sistema. Por último, C es un lenguaje muy potente para programar microcontroladores. Las plataformas hardware elegidas en el proyecto son: La Raspberry Pi es un ordenador de tamaño reducido, con potencia suficiente para este proyecto, será utilizado como soporte donde hacer funcionar PHP y Python. Ambas tecnologías cuentan con mucha información y soporte para funcionar sobre este ordenador. Arduino es un microcontrolador, usado para facilitar el uso de la electrónica que será la que permitirá al robot desplazarse. 1.2 Objetivo del proyecto. El objetivo principal del proyecto es que el robot sea capaz de llegar desde un punto de origen a otro de destino dentro de un laberinto. Para ello el usuario solo debe suministrar un esquema de dicho laberinto que contendrá, la posición de partida, la posición objetivo y los lugares donde existan obstáculos que no pueden ser atravesados. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 16 Ayuda en la creación de casi todo tipo de diagramas UML posibles, diagramas de clase, de casos de uso, diagramas de secuencia, etc. Se ha usado para crear los diagramas de clase de este proyecto. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 17 4. ANALISIS DE HARDWARE Y SOFTWARE 4.1 Requisitos hardware Para el análisis hardware se expondrán que requisitos deberán cumplir los componentes integrados en el proyecto para que este tenga la capacidad hardware que se espera. El robot debe contar con una capacidad de procesamiento que le permita que todas las tecnologías que usemos en él funcionen simultáneamente y de forma correcta. Debe contar con un sistema operativo y con conexión a internet. El robot debe poder desplazarse por el espacio, para ello necesita, avanzar en línea recta y girar. Dado que el sistema es móvil debe ser compacto y ligero. Por último, el sistema debe ser eléctricamente autónomo por lo que deberá llevar una fuente de energía. 4.2 Requisitos Software Para el análisis software se describirán los requisitos que debe cumplir el sistema para tener la funcionalidad software que se espera. El sistema debe permitir que múltiples usuarios interactúen con él de forma simultánea y desde múltiples plataformas. A todos ellos deberá proporcionarles una información actualizada sobre el estado actual en el que se encuentra, la posición dentro del laberinto si se conoce y el camino que ha recorrido. Además de proporcionar información el sistema debe ser capaz de recibirla. El sistema debe ser capaz de recibir del usuario ficheros con la información sobre el laberinto, ordenes de pausa y de reinicio. El sistema debe ser estable ante los fallos, de haberlos, su propagación debe estar controlada. También debe ser modularizable para una posible expansión futura y proporcionar un registro de depuración. El usuario debe contar con una herramienta que permita diseñar laberintos y exportarlos en forma de ficheros. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 18 5. DISEÑO HARDWARE Para cumplir con los requisitos expuestos en la fase de análisis se ha elegido el siguiente hardware para el proyecto. 5.1 Raspberry Pi Es un ordenador de placa reducida de bajo coste desarrollado por la fundación Raspberry Pi. Para este proyecto se ha elegido la Raspberry Pi 1 Modelo B, contienen una CPU con arquitectura ARM de la familia ARM11 mononúcleo a 700MHz con un conjunto de instrucciones RISC, 512 MB de memoria RAM compartida con la gráfica (se ha ajustado mediante software la memoria disponible para sistema y para gráfica siendo para esta última 16MB y el resto para el sistema). La memoria de almacenamiento principal consiste en una tarjeta microSD de 16GB de capacidad marca Samsung conectada al puerto especifico de la Raspberry a través de un adaptador a SD. La Raspberry tiene disponible muchos sistemas operativos, todos de código libre GNU/Linux como Debian (Raspbian), Fedora (Pidora), Arch (Arch ARM) entre otros. En este proyecto se ha usado Raspbian Jessie versión 4.4 disponible en la página oficial. Posee dos puertos USB, en uno de ellos se conecta un adaptador wifi TL-WN723N dado que este modelo de Raspberry no posee conexión wifi propia, al otro USB se conecta un cable que pasa a USB tipo B conectado a la placa arduino. El consumo medio de la Raspberry está alrededor de 700mA (3.5W) según dice en su especificación, quizás este consumo es un poco elevado dado que otro modelo puede funcionar con 500mA, pero solo se disponía del utilizado aquí. La alimentación proviene de un conector microUSB de 5 voltios. Para anclar la placa Raspberry a la base del robot se ha usado una carcasa transparente con orificios para tornillos. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 19 5.2 Arduino Es una compañía de hardware libre que diseña y manufactura placas de desarrollo de hardware y software. Para este proyecto se ha elegido la placa de circuito impreso Arduino Uno revisión 3 con un microcontrolador en su socket ATmega328. Este microcontrolador posee un oscilador interno que le permite trabajar a 8MHz, pero la placa de circuito incorpora otro oscilador externo que eleva la frecuencia hasta 16MHz. También posee 32KB de memoria flash, 2KB de memoria SRAM y 1KB de memoria EEPROM. El microcontrolador posee 14 entradas y salidas digitales, 6 de ellas dan soporte para PWM y 2 se usan para la comunicación con el chip UART también incluido en la placa de circuito. Este microcontrolador ofrece una facilidad adicional a la hora de cargar nuevos programas (sketches) en él. Tiene instalado un cargador (bootloader) que permite que el editor escriba la información de los programas de forma más rápida a través del puerto serie. El consumo medio de la placa Arduino Uno es de unos 50mA aproximadamente. Recibe la alimentación por su entrada de USB tipo B desde la Raspberry por la que también recibe los datos del puerto serie. 5.3 Servomotores Los servomotores son dispositivos parecidos a los motores de corriente continua, pero tienen la capacidad de ubicarse en cualquier posición dentro de su rango de operación y mantener dicha posición. Los servomotores están compuestos de un motor, una caja reductora y un circuito de control. Los servomotores hacen uso del PWM para controlar la dirección y la velocidad, arduino es capaz de mover estos motores en ángulos entre 0º y 180º. Para este proyecto se ha elegido usar 4 servomotores modificados. El circuito de control está formado por un circuito integrado y un potenciómetro que gira solidario al movimiento del motor. Al girar el servomotor también gira el potenciómetro por lo que Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 20 el circuito sabe exactamente en qué posición se encuentra. La modificación realizada consiste en reemplazar ese potenciómetro por dos resistencias de valor 10Kohm para hacer creer al circuito que el potenciómetro siempre se encuentra en la posición central. De esa manera mediante software se indica que el servomotor vaya a su posición central para que se quede inmóvil y se le indica que vaya a alguna de sus posiciones en los extremos para que el motor quede girando continuamente en una dirección permitiendo el movimiento. 5.4 Potenciómetros Es un elemento de electrónica, posee 3 terminales conectando los dos de los extremos a una tensión a regular se obtiene en el central una fracción de esa tensión dependiendo de la posición del potenciómetro. En el proyecto se usan 4, uno por cada servomotor, para corregir el error introducido por las resistencias que se han usado para sustituir al potenciómetro. Por su tolerancia del 5% la posición central no queda bien establecido en el servomotor por lo que estos potenciómetros se ajustan manualmente y se corrige el error por software. 5.5 Batería La alimentación usada en este proyecto es una batería externa para móviles, con una conexión USB a microUSB de salida, tiene 5000mAh de capacidad, salida de 5 voltios y puede ser recargada con cualquier cargador microUSB por su puerto de carga. 5.6 Protoboard y cableado O placa de pruebas en español, es un tablero con orificios que se conectan eléctricamente entre sí de manera interna formando patrones en línea. Esta placa hace el montaje sencillo ahorrando soldaduras. En el proyecto se usa para conectar los servomotores a la alimentación y para alojar los potenciómetros. Se usan cables con punta metálica adecuados para la placa de protoboard y los conectores de arduino. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 21 6 MONTAJE El robot está montado sobre una lámina de PVC de 18cmx18cm que sirve como base. En la parte trasera se han unido con pegamento de PVC dos laminas verticales del mismo material para sostener la batería. Pegada a la parte trasera y hasta el centro se encuentra la Raspberry metida dentro de su carcasa. Esta se ha unido a la base con dos tornillos de 1cm de longitud. En la parte frontal se han colocado la placa protoboard y el arduino, la placa protoboard está fijada con cinta de doble cara a la base y el arduino no dispone de funda y va fijado a la base con dos tornillos de 1cm directamente en la placa. Los servomotores están unidos cada uno a la base mediante bridas que pasan por dos agujeros. Están dispuestos formando un cuadrado. Foto del resultado hardware final. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 22 En cuanto a las conexiones de cables, el arduino va unido a la Raspberry mediante un cable USB tipo B (Azul en la foto). Todos los servomotores toman su alimentación de las líneas de positivo (cables rojos) y negativo (cables verdes) de la placa protoboard que a su vez son alimentadas por la salida de 5v (cables rojos) de arduino y GND (cables negros) respectivamente. Los cables de salida de la señal PWM para los servomotores se toman de los pines del arduino numerados como: - Motor delantero derecha pin 6. - Motor delantero izquierda pin 9. - Motor trasero derecha pin 10. - Motor trasero izquierda pin 11. Los potenciómetros también toman su alimentación de las líneas de la protoboard (rojos y verdes) y su pin central va a las entradas analógicas del arduino nombrados como: - Potenciómetro motor delantero derecha pin A1 - Potenciómetro motor delantero izquierda pin A0 - Potenciómetro motor trasero derecha pin A3 - Potenciómetro motor trasero izquierda pin A2 Esquema de conexiones del circuito arduino Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 23 7. DISEÑO SOFTWARE En esta sección se expondrá la solución software a la que se ha llegado y que pretende cubrir todos los requisitos generados durante la fase de análisis. El sistema está dividido en tres capas muy apreciables modelo, vista y controlador. PHP generará la vista para el usuario, Python formará el controlador y el módulo de arduino formará el modelo. La herramienta para diseñar y exportar los esquemas de laberintos se desarrollará en C#. Se expondrá el sistema operativo elegido y cada parte que compone el software como módulos separados. La forma en la que estas tecnologías se comunican se abordará más adelante. 7.1 Sistema operativo El sistema operativo seleccionado ha sido Raspbian Jessie. Un sistema operativo GNU/Linux de código libre basado en Debian. Disponible en la página oficial de Raspberry, es compatible con todos los modelos de Raspberry Pi. En este momento la última versión estable del sistema es la 4.4 publicada el 21/05/2016. Cuenta con un intérprete de Python preinstalado además gracias a su sistema de paquetes se podrá instalar de forma sencilla el servidor web apache con soporte para PHP. 7.2 Módulo PHP En primer lugar, se abordan los requisitos referentes a la interfaz. El diseño se ha dividido en 5 ficheros, donde cada uno hace una función propia. Fichero ‘index.html’, es un fichero en formato HTML, la función de este fichero es básica, presenta toda la información junta y de manera estructurada en una misma aplicación web. Incorpora los 3 botones con los que el usuario podrá interaccionar con el sistema además de dos iframe que referencian a otros dos ficheros ‘mapa.php’ y ‘estado.php’ que muestran información. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 24 Fichero ‘operaciones.php’, es un fichero en formato PHP, su función es recibir el formulario generado por el navegador cuando un usuario presiona un botón en la página de ‘index.html’. Analiza la información contenida en el formulario y envía un comando acorde al botón pulsado al módulo Python además de más información relevante. Fichero ‘mapa.php’, es un fichero en formato PHP, contiene una línea de metadatos en HTML para refrescar la página en un intervalo de tiempo. Su función principal es conectar con el módulo Python a través de un socket y solicitar la información del mapa actual si lo hubiese, una vez obtenida la información genera una salida HTML con una tabla que representa de forma visual al usuario el laberinto. Fichero ‘estado.php’, es un fichero en formato PHP, contiene la misma línea de metadatos del fichero ‘mapa.php’. Su función principal es conectar con el módulo Python a través de un socket y solicitar la información del estado actual del sistema, una vez obtenida la información genera una salida HTML que depende del estado recibido. Fichero ‘conexion.php’, es un fichero en formato PHP, contiene una función para crear el socket de conexión que usan el resto de ficheros. 7.3 Módulo Python El módulo de Python hace la función de controlador dentro del patrón MVC. El desarrollo en este lenguaje se ha dividido en 5 scripts. Script ‘Principal.py’, como su nombre indica es en el que se da comienzo al programa. Su función principal es establecer los parámetros de control inicial. Al comienzo del script se analizan los parámetros pasados al ser iniciado desde la línea de comandos. Estos parámetros pueden ser ‘PHP’, ‘arduino’ y ‘conexión’. Si el script es llamado con alguno o varios de estos parámetros se mostrará la información de depuración correspondiente. Crea la instancia de la clase ModuloArduino y después abre un socket de red para escuchar en la interfaz y puerto en la que va a trabajar. Cuando llega una conexión nueva se crea una instancia de la clase ModuloPHP que atiende la conexión. La señal Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 25 elegida para finalizar el programa es la interrupción por teclado, cuando esta señal llega se finalizan de forma segura todos los hilos creados. Script ‘ModuloArduino.py’, contiene la clase ModuloArduino, esta clase es la encargada de la comunicación con arduino, extiende de la clase Thread, contenida en la biblioteca Threading, por lo que opera de forma separada en su propio hilo. La comunicación con la placa arduino se hace mediante la clase serial, contenida dentro de la biblioteca ‘Serial’ de Python. Esta clase mantiene datos sobre el estado de la placa arduino, estos datos son actualizados normalmente mediante comandos que son recibidos desde la misma. Para satisfacer el requisito de conexiones simultaneas de varios usuarios se ha creado una lista de comandos pendientes, cuando una clase externa usa los métodos de esta clase para mandar comandos a arduino estos se añaden a dicha lista. Para controlar el uso compartido de esta lista entre varios hilos se usa un mecanismo de protección conocido como Lock, proveído por la biblioteca Threading, ese es el propósito de la variable lock. El Lock se cierra cada vez que se hace uso de la lista y se abre cuando se finaliza. La función más relevante es run(), que se inicia cuando se crea el hilo. La función comprueba periódicamente si hay algún comando pendiente en la lista. Si lo hay coge el primero y lo manda la placa arduino. Después la función comprueba si hay algún comando enviado desde la placa arduino, si lo hay lo lee y lo envía a la función comandoRecibido(), que lo procesa. Se ha elegido el periodo de medio segundo para el envío de datos dado que el buffer de entrada de la placa arduino es muy pequeño, de esta manera se asegura que no se pierdan datos en el envío, proporcionándole a la placa arduino suficiente tiempo para leer el buffer y limpiarlo. Para controlar el periodo de espera se usa la función ‘time.sleep’, que detiene la ejecución del hilo durante el tiempo indicado, mientras que el hilo está detenido no se pueden capturar las excepciones, por ejemplo la que hace finalizar al programa. Por ello se cuenta con la variable booleana ‘finalizar’ que establecida a ‘True’ indica que en la siguiente iteración dentro de run() finalizará el hilo de forma segura. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 32 -ejecutarComando(String): Recibe una línea de comando completa y la ejecuta. -reiniciar(int): Reestablece todas las variables y cambia el estado al recibido por parámetro. 7.5 C# La variable estado indica que tipo de casilla se está colocando, con el valor 0 la primera casilla seleccionada será el origen. Cuando se identifica pasa al valor 1 en el que se indica el final. Cuando el final también es establecido pasa a valor 2 y se identifican las casillas transitables. -reiniciar(): Devuelve todas las variables a su estado de inicio. -Onb2Click(object,EventArgs): Este método es llamado cuando se pulsa un botón de la cuadricula del mapa y cambia el valor de ese botón según el estado actual. -button1_click(object,EventArgs): Es el método llamado por el botón ‘Crear cuadricula’, genera una matriz de botones en la parte central de la interfaz, la matriz tiene las dimensiones que el usuario ha indicado en un control numérico. -button1_click(object,EventArgs): Es el método llamado por el botón ‘Guardar’, abre una ventana de dialogo para seleccionar el nombre del fichero y su ubicación, una vez seleccionado guarda en ese fichero el mapa. El formato utilizado para almacenar el mapa es el siguiente. N n0 n1 … nN2-1 N identifica las dimensiones y n0 n1 … identifican los VALORES DE MAPA. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 33 Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 34 8. PRUEBAS Durante el desarrollo y una vez finalizado se han elaborado una serie de pruebas para comprobar el correcto funcionamiento del sistema. -Pruebas de carga. El sistema es accesible mediante web, por lo que muchos usuarios pueden conectarse al mismo tiempo. Se han realizado pruebas con 30 conexiones web simultaneas. No se ha detectado ninguna anomalía, la conexión con Python toma un tiempo muy breve y la configuración recomendada para Apache establece el límite de conexiones en 100 por lo que será este quien limite el número de usuarios simultáneos. -Pruebas de autonomía. El consumo medio en reposo se ha medido entorno a los 800mA que se eleva a 1,3A cuando todos los servomotores están activos. Dado que la batería tiene una capacidad de 5000mAh y una eficiencia media del 75% contamos con 3750mAh de capacidad real. Si dividimos la capacidad real entre el consumo medio en reposo obtenemos 3750mAh/800mA = 4.68 horas de funcionamiento en reposo. En la práctica la batería a plena carga pudo mantener el sistema en funcionamiento más de 5 horas ya que el cálculo ha sido muy conservador y no se dejó que la batería llegara a su mínima carga por seguridad para el sistema. Si repetimos el mismo cálculo para el consumo a plena carga obtenemos: 3750mAh/1300mA = 2.88 horas de funcionamiento a plena carga. Este resultado no ha sido verificado en la práctica. -Prueba de precisión en el desplazamiento recorrido. Se ha sometido al sistema a pruebas relacionadas con la precisión cuando se desplaza. No se ha podido tener en cuenta durante el desarrollo la imprecisión que generan 4 motores girando al mismo tiempo, dado que en la práctica no todos funcionan a la misma velocidad, no todas las ruedas tienen la misma adherencia y no todas las superficies son iguales. Por lo tanto, se ha medido una variación de la trayectoria cuando el vehículo se desplaza en línea recta de unos 10 cm sobre la posición correcta. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 35 Cuando el vehículo gira sobre sí mismo se produce un error de unos 10º respecto al ángulo correcto. Todas estas imprecisiones se suman con cada movimiento del vehículo, si el recorrido es muy largo la posición final puede diferir mucho de la esperada. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 36 9. INTEGRACIÓN Una vez finalizado el desarrollo del software hay que implantarlo en el sistema real. Para preparar la placa Raspberry pi se hay que instalar RASPBIAN JESSIE descargado desde la página oficial de la fundación Raspberry pi. https://www.raspberrypi.org/downloads/raspbian/ Se descarga la imagen del sistema, en este proyecto este proceso se ha realizado en Windows. Con el programa win32diskimager se ha procedido a grabar en la tarjeta microSD usada como memoria de la Raspberry la imagen de Raspbian. Una vez grabada se ha conectado a la Raspberry la tarjeta, un monitor, un ratón y teclado y el adaptador wifi. En el primer inicio el sistema nos da una serie de opciones para la configuración inicial. Los cambios que se han realizado han sido: -Expandir el sistema de ficheros, para que se utilice toda la capacidad de la memoria. -Se ha establecido la frecuencia de trabajo a la normal 700Mhz. -Se ha reducido la RAM de la GPU a 16MB y se ha aumentado la RAM de sistema a 496MB -Se ha habilitado el soporte para SSH. -Se ha seleccionado como pantalla de inicio predeterminada el modo consola, donde se pide usuario y contraseña. Una vez finalizados el sistema se reiniciará. Cuando vuelva a iniciar, introducimos las credenciales por defecto (Usuario: pi, Contraseña: raspberry) y procedemos a configurar la conexión wifi manualmente. Se introduce el comando: ‘sudo nano /etc/network/interfaces’ Se abrirá el editor nano para el fichero interfaces. La configuración exacta depende del router que dé servicio a dicha conexión wifi. En este proyecto el fichero debe quedar así: Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 37 Presionamos CTRL+X y presionamos ‘y’ para guardar los cambios. Después de este paso se vuelve a trabajar desde Windows, accediendo a la consola mediante SSH usando Putty como cliente usando la dirección de red que le asignamos anteriormente. Una vez iniciemos sesión será necesario ejecutar estos comandos consecutivamente para actualizar las librerías y binarios del sistema a la última versión. sudo apt-get update sudo apt-get grade Raspbian ya cuenta con un intérprete de Python por lo que no será necesario instalar nada. Para instalar el servidor apache se introduce en la consola el siguiente comando. sudo apt-get install apache2 -y Y para instalar el soporte para PHP sudo apt-get install php5 libapache2-mod-php5 -y Para la instalación de Bootstrap se ha descargado desde su página oficial un fichero .zip que contiene las carpetas css, fonts y js. http://getbootstrap.com/getting-started/ Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 38 Estas carpetas deberán se ubicadas en ‘/var/www/html’ directorio por defecto de apache. Por último, instalamos el programa ‘screen’, este programa permite que una consola local pueda quedar abierta al finalizar una conexión remota. Se usará para iniciar el script de Python en cada inicio y poder retomar la consola local para ver la salida desde una consola remota. sudo apt-get install screen El sistema ya cuenta con todos los programas necesarios para funcionar, solo resta colocar los ficheros de nuestro programa en sus respectivos lugares. Los correspondientes a PHP se colocan en ‘/var/www/html’ Estos ficheros son conexión.php, estado.php, mapa.php y operacion.php Los ficheros correspondientes a Python pueden colocarse en cualquier lugar, en este proyecto se han ubicado en ‘/home/pi/Desktop/python’. Los ficheros son Mapa.py, ModuloPHP.py, ModuloArduino.py, settings.py y Principal.py. Como paso final debemos editar el fichero de inicio de sistema ‘/etc/rc.local’ añadiendo esta línea. screen –d –m python /home/pi/Desktop/Python/Principal.py Para que el script de Python se ejecute en cada inicio. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 39 10. INSTRUCCIONES DE USO El proceso comienza realizando un esquema del laberinto mediante una interfaz gráfica para Windows, se le indica las dimensiones del mapa que será cuadrado y está dividido en casillas y se pulsa el botón ‘Crear cuadricula’, mediante clicks de ratón se marca la casilla de inicio y la de finalización, por defecto el resto de casillas son paredes y el robot no puede caminar por ellas, para hacer caminos se marcan las casillas que sí son transitables. Una vez terminado el esquema se pulsa el botón ‘Guardar’ y se genera un archivo de salida que contiene toda la información. Para la interacción del usuario con el robot se usa una aplicación web accesible a través de un navegador web que contiene 3 botones y dos campos de información. Un campo muestra el estado actual de todo el sistema y el otro si procede muestra el mapa que ha sido proporcionado anteriormente y la posición actual del robot en el mismo. Continuando con el proceso en la aplicación web se nos pide que seleccionemos desde nuestra computadora el esquema realizado anteriormente, una vez seleccionado, el botón ‘Enviar’ subirá el archivo a la aplicación. Después de resolver el laberinto el robot comenzara a desplazarse por él hasta que alcance la posición final. Los dos botones restantes de la aplicación son ‘Pausar’ que detiene momentáneamente el recorrido hasta que vuelva a pulsarse y ‘Reiniciar’ que devuelve todo el sistema al estado de inicio. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 40 11. CONCLUSIONES Este proyecto me pareció mucho más complejo en el momento en el que lo plantee con mi tutor. He usado varias tecnologías que no conocía previamente como Python y PHP ambas con tipado dinámico, algo que no había visto antes. Por suerte ya tenía bastante experiencia con Arduino, plataforma con la que siempre he querido realizar un proyecto y que me motivó a la hora de elegir este. Durante todo el grado no me había encontrado con la necesidad de comunicar varias partes de un sistema complejo que estén realizadas en lenguajes distintos y al comienzo requirió mucho análisis de las posibilidades que me ofrecía cada uno de esos lenguajes. A medida que iba avanzando en el desarrollo se hacía más fácil y rápido pues ya conocía la sintaxis de cada lenguaje y por la grandísima cantidad de información disponible en internet, en páginas web especializadas y foros de usuarios con dudas similares. También han surgido muchos problemas inesperados durante la fase de implementación lo que me ha enseñado que la de diseño requiere un tiempo similar o mayor. Así un proyecto con un diseño muy estudiado y pulido da como resultado una implementación más rápida, clara y sencilla. Realizar el proyecto por partes ha ayudado mucho a contener los errores, controlando y analizando los mensajes que recibe cada módulo me aseguro que los errores no se propagan. Esto hace el sistema más estable y lo hace mucho más sencillo de depurar. Desde el primer momento el tema de desplazar un vehículo físico por el mundo real ya me pareció una tortura, del mundo del software donde todo es en gran medida predecible di el salto al hardware, donde controlar las variables de entorno se vuelve imposible, cosa que ha quedado demostrada cuando he hecho pruebas y he observado que conseguir que el vehículo se desplace en una línea recta era muy complicado. Francisco Antonio Gómez Guerrero Vehículo autónomo para gestión de trayectorias 41 12. PROTOCOLOS DE COMUNICACIÓN Para comunicar todas las tecnologías se han usado comandos, es decir, líneas de texto con parámetros variables separados por un delimitador y con un carácter de final de línea para delimitar cada línea. En todos los protocolos se ha usado el espacio como carácter delimitador y el carácter ‘\n’ (final de línea) como carácter de finalización. 12.1 Protocolo de comunicación PHP-Python La comunicación entre PHP y Python se realiza de forma síncrona, en la misma conexión PHP transmite el comando hacia Python y si así se requiere se manda la información de vuelta, después se cierra la conexión. La conexión es creada con sockets, Python escucha en el puerto 9999 de la interfaz localhost, esa misma dirección es usada por PHP para conectar. Comando: ‘exit’ Formato: exit Descripción: Cierra la conexión, no se usa en la solución final, pero fue útil durante la fase de pruebas y desarrollo. Formato salida: - Comando: ‘getstado’ Formato: getstado Descripción: Devuelve el VALOR DE ESTADO del módulo Arduino. Formato salida: Devuelve el VALOR DE ESTADO que identifica al estado. Comando: ‘getmapa’ Formato: getmapa