Universidad de Costa Rica Facultad de Ingenierı́a Escuela de Ingenierı́a Eléctrica Monitoreo vehicular mediante módulos GPS y GPRS controlados por Intel Galileo Por: Sergio Andrés Valverde Vega Ciudad Universitaria “Rodrigo Facio”, Costa Rica Julio de 2014 Monitoreo vehicular mediante módulos GPS y GPRS controlados por Intel Galileo Por: Sergio Andrés Valverde Vega IE-0499 Proyecto eléctrico Aprobado por el Tribunal: M.Sc. Teodoro Willink Castro Profesor guı́a Dr. Jaime Cascante Vindas Profesor lector Dr. Lucky Lochi Yu Lo Profesor lector Dedicatoria Dedico este proyecto a las siguientes personas: • A mamá, que me llevo de la mano a la escuela. • A papá, que se sentó conmigo a entender. • A mi hermana, para que haga su propio camino. • A todos los familiares y amigos que creyeron en mi cuando yo no lo hacı́a. • A Gabriel, con quien comparto cicatrices. • A la familia Ulloa Murillo, que me las perdonó. • A la familia Chaves León, por dejarme entrar en su casa. • A Titina, Sammy y Turi, solo porque sı́. • A Cata, quien nunca dejó que me cayera. Gracias por dejarme ser parte de la historia. Entonces, corrijo mi dedicatoria: Dedico este proyecto a todos los que me hicieron el hombre en el que me convertı́. v Reconocimientos Agradezco a mi profesor guı́a, Teodoro Willink Castro, MSc., asi como a mis profesores lectores, Jaime Cascante Vindas, Dr., y Lochi Yu Lo, Dr., por su invaluable apoyo, consejo, guı́a y amistad. También, agradezco a Eduardo Bolaños, Christian Gutierrez y a mi grupo de trabajo en Componentes Intel Costa Rica, por el apoyo técnico y recursos brindados. vii Resumen En el siguiente documento se describe el desarrollo del prototipo de un sistema de posicionamiento de buses, alrededor de un Intel Galileo. El trabajo nace a partir de la iniciativa de un grupo de trabajo de Componentes Intel Costa Rica por realizar una aplicación móvil de información de rutas y posicionamiento de buses; se requiere de una plataforma incrustada que viaje con los vehı́culos y que pueda proveer al servidor remoto que alimenta la aplicación móvil de los datos de ubicación de los autobuses. Además, se impulsa el proyecto debido a la necesidad de evaluar la tarjeta de desarrollo Intel Galileo en relación a otros productos similares del mercado. Se realiza un prototipo basado en el Galileo aprovechando las tecnologı́as GPS y GPRS, que funciona apropiadamente para proveer de datos de posicionamiento al servidor remoto. Se describen las diferentes tecnologı́as y equipos utilizados para el desarrollo del proyecto, se detallan los esquemas de proyecto que explican la conexión de los diferentes módulos y, por último, se comenta la implementación de la solución con todos los elementos pertinentes y la programación escrita para el microcontrolador. Se obtiene un sistema robusto, con programación a bajo y alto nivel, que aprovecha en gran medida las capacidades de cada elemento en la operación, pero que opera con menor efectividad que un Arduino normal, debido a mayores dificultades de implementación, consumo de potencia y menor velocidad de puertos de uso general en el microcontrolador Galileo. Sin embargo, se presenta un prototipo robusto, con operación autónoma y con una programación eficiente, que cumple los parámetros de diseño. Se concluye, al final, que se puede desarrollar un sistema autónomo para la tarea encomendada, con microcontroladores que controlan módulos cuidadosamente escogidos para tareas especificas y con un trabajo en armonı́a de tanto software como hardware en un producto final. Sin embargo, se destaca que el Intel Galileo, a pesar de sus ventajas técnicas respecto a otros microcontroladores, no es el equipo ideal para este tipo de prototipos ni para proyectos que requieren microcontroladores sin sistema operativo. ix Índice general Índice de figuras xiii Índice de cuadros xiii Nomenclatura 1 Introducción 1.1 Justificación . . . . . 1.2 Alcance del proyecto 1.3 Objetivos . . . . . . 1.4 Metodologı́a . . . . . 1.5 Desarrollo . . . . . . xv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Antecedentes 2.1 Contexto actual de sistemas incrustados . 2.2 Microcontroladores . . . . . . . . . . . . . 2.3 Intel Galileo . . . . . . . . . . . . . . . . . 2.4 Sistemas de posicionamiento de vehı́culos 2.5 Sistema de Posicionamiento Global (GPS) 2.6 General Packet Radio Service (GPRS) . . 3 Diseño del prototipo 3.1 Equipo utilizado . . . . . . . . . 3.2 Conexión del sistema . . . . . . . 3.3 Consideraciones especiales . . . . 3.4 Algoritmo de programa principal 3.5 Página web de prueba . . . . . . 3.6 Alimentación del prototipo . . . 3.7 Caja del prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Resultados 4.1 Posicionamiento mediante módulo GPS 4.2 Envı́o de datos mediante módulo GPRS 4.3 Integración de módulos GPS y GPRS . 4.4 Prototipo final . . . . . . . . . . . . . . 4.5 Intel Galileo . . . . . . . . . . . . . . . . xi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 3 . . . . . . 5 5 6 8 12 13 14 . . . . . . . 17 17 21 24 25 27 28 28 . . . . . 31 31 33 34 34 35 4.6 Recepción del prototipo en Intel Costa Rica . . . . . . . . . . . 37 5 Conclusiones y recomendaciones 41 Bibliografı́a 43 A Subir código al Intel Galileo 45 B Código de aplicación principal de posicionamiento vehicular para Intel Galileo 47 C Código de página web de prueba para el sistema de posicionamiento vehicular 55 D Código de corrección de tasa de datos para comunicación serial en SIM900 de Seeed GPRS Shield V2.0 59 xii Índice de figuras 2.1 2.2 2.3 Vista superior de un Arduino Uno (Schmidt, 2011) . . . . . . . . . Vista superior de un Intel Galileo . . . . . . . . . . . . . . . . . . . Esquema del hardware del Intel Galileo (Intel, 2014b) . . . . . . . 8 9 10 Diagrama de bloques del sistema de posicionamiento vehicular . . Adafruit Ultimate GPS Breakout Board (Adafruit, 2014) . . . . . Seeed GPRS Shield (Studio, 2014) . . . . . . . . . . . . . . . . . . Encapsulado del multiplexor quádruple 2 a 1 74LS157 (Instruments, 2014) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Diagrama de bloques final del sistema de posicionamiento vehicular 3.6 Diagrama de conexión del sistema de posicionamiento vehicular . . 3.7 Conexión del sistema de posicionamiento vehicular . . . . . . . . . 3.8 Diagrama de flujo del programa principal . . . . . . . . . . . . . . 3.9 Página de prueba del prototipo . . . . . . . . . . . . . . . . . . . . 3.10 Baterı́a para el prototipo . . . . . . . . . . . . . . . . . . . . . . . 3.11 Caja para el prototipo - Vista superior . . . . . . . . . . . . . . . . 3.12 Caja para el prototipo - Vista inferior . . . . . . . . . . . . . . . . 17 18 19 20 21 22 23 26 28 29 29 30 4.1 4.2 4.3 4.4 4.5 4.6 . . . . . . 32 32 33 34 38 39 3.1 Detalle de materiales del proyecto . . . . . . . . . . . . . . . . . . 21 4.1 Prueba dinámica de GPS . . . . . . . . . . . . . . . . . . . . . . . 33 3.1 3.2 3.3 3.4 Resultados de GPS en iPhone 5s . . . . . . . Resultados de GPS en Galileo . . . . . . . . . Resultados de operación de GPRS en Galileo Prototipo final . . . . . . . . . . . . . . . . . Afiche del prototipo en Makers Faire . . . . . Certificado de segundo lugar en Makersthon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Índice de cuadros xiii Nomenclatura AP I Application Programming Interface, especifica interoperación de componentes especı́ficos de software, normalmente en forma de librerı́as. AP N Access Point Name, puerta de acceso entre red celular y otra red de computadoras. ARM arquitectura basada en conjuntos de instrucciones reducidas, desarrollada por la empresa ARM Holdings. CISC Reduced Instruction Set Computing, estrategia de diseño de procesadores con instrucciones complejas. GP IO General-purpose input/output, pin genérico controlado por el usuario en un circuito integrado o microcontrolador. GP RS General Packet Radio Service, sistema de transmisión de paquetes de datos por conmutación de paquetes, mediante GSM. GP RM C formato NMEA para comunicar datos GPS. GP S Global Positioning System, sistema de navegación satelital. GSM Global System for Mobile communications, protocolos de segunda generación para redes celulares digitales. HT T P Hypertext Transfer Protocol, protocolo para sistemas de información en Internet. I 2C Inter-Integrated Circuit, protocolo de comunicación digital. IDE Integrated Development Environment, ambiente de desarrollo de código para desarrolladores de software. LED Light-Emitting Diode, semiconductor que emite luz. xv N M EA National Marine Electronics Association, estándares de comunicación entre equipos electrónicos de la marina de Estados Unidos. P IN Personal Identification Number, contraseña numérica para autentificar a un usuario ante un sistema determinado. P CI protocolo de comunicación digital en computadoras. RAM Random-Access Memory, memoria volátil de almacenamiento en computadoras. RISC Reduced Instruction Set Computing, estrategia de diseño de procesadores con instrucciones sencillas. RDI Research, Development and Innovation, grupo de trabajo de Intel Costa Rica. SD Secure Digital, formato de tarjetas de memoria para equipos incrustados. SIM Subscriber Identity Module, circuito integrado que autentifica equipos de telefonı́a móvil en la red celular. SoC System On a Chip, circuito integrado que incluye todos los componentes de una computadora y otros sistemas electrónicos en un solo chip. SP I Serial Peripheral Interface, protocolo de comunicación digital en computadoras. U ART Universal Asynchronous Receiver/Transmitter, protocolo de comunicación digital en computadoras. U RL Uniform resource locator, lı́nea de caracteres que apunta a una dirección en Internet especı́fica. x86 arquitectura basada en conjuntos de instrucciones complejas, desarrollada por la empresa Intel. xvi 1 Introducción 1.1 Justificación Actualmente, en Costa Rica, la mayorı́a de usuarios de autobuses no tienen una manera digital de comprobar la ubicación del bus. No hay una aplicación o sistema que informe a las personas si el bus viene atrasado, si ya pasó por cierta ubicación o si tuvo que cambiar su ruta preestablecida por algún imprevisto. Desde este punto, se genera la inquietud de un grupo de trabajo en Componentes Intel para la realización de una aplicación móvil que llene el vacı́o nacional de un sistema digital de información para el transporte público que existe en otras partes del mundo. Por tanto, se busca generar, en una primera etapa hacia el producto final necesario de la aplicación móvil, un primer prototipo que detalle la ubicación en tiempo real de los buses internos de la empresa, para enviar estos datos remotamente a un servidor que pueda operar esta información y alimentar la aplicación móvil deseada. Sumado a esto, existe el interés particular de parte de Intel de evaluar el equipo incrustado y arquitecturas de la misma empresa para proyectos de desarrollo abierto, coincidiendo con la filosofı́a moderna del desarrollo de plataformas embebidas y los nuevos productos que empiezan a surgir en Intel. Se realiza un proyecto centrado en el Intel Galileo que permita exponer las caracterı́sticas positivas y negativas del equipo, y que genere conocimiento de código abierto respecto a la plataforma. Este sistema se adhiere a un proyecto eléctrico de la Escuela de Ingenieria Eléctrica, para lograr un beneficio mutuo de los recursos de la empresa y generar conocimiento de diferentes tecnologı́as y arquitecturas de computadoras que pueda ser utilizado por parte de la Universidad de Costa Rica en el futuro. 1.2 Alcance del proyecto Se desarrolla un sistema incrustado que consiste en un Intel Galileo como nodo central, conectado a un módulo GPS y un módulo GPRS, y una baterı́a de corriente directa de alimentación. El módulo GPS indica al Galileo las coordenadas geográficas del sistema, fecha y hora, mediante comunicación serial. Con la información del GPS, se hace un llamado HTTP a una página web para enviar los datos obtenidos, mediante la conexión del módulo GSM a In1 2 1 Introducción ternet. Además, el sistema contará con circuiterı́a apropiada para conectar los módulos, LEDs que informen al usuario del estado del sistema (es decir, si los módulos están funcionando correctamente o si ocurrió un problema con ellos) y una caja para el prototipo hecha a la medida, diseñada en un programa de modelado de sólidos y fabricada mediante una impresora 3D. 1.3 Objetivos Objetivo general Desarrollar un sistema incrustado móvil que determine la posición de un vehı́culo en particular y que envı́e las coordenadas de su ubicación a un servidor remoto. Objetivos especı́ficos • Determinar las posiciones que ha recorrido el vehı́culo mediante una revisión de las coordenadas obtenidas por un módulo GPS. • Enviar los datos de coordenadas del vehı́culo hacia un servidor remoto mediante un módulo GPRS. • Entregar un prototipo funcional que pueda ser utilizado por sus vehı́culos internos. • Evaluar el desempeño del producto Intel Galileo mediante el desarrollo de un proyecto que utilice sus caracterı́sticas de funcionamiento como microcontrolador. 1.4 Metodologı́a Para realizar este proyecto, se ejecutaron las siguientes tareas, en el orden que se presentan, para poder entregar un sistema autónomo que cumpla los parámetros de diseño. 1. Estudio de las diferentes tecnologı́as por utilizar para la operación necesaria del proyecto, como microcontroladores, GPS, GPRS, multiplexores y baterı́as. 2. Elección de componentes por utilizar en el proyecto. Se debe realizar este paso con el cuidado de que cada parte sean compatible con el resto del equipo. 1.5. Desarrollo 3 3. Revisión adecuada de los datos del fabricante de la tarjeta de desarrollo Intel Galileo, para conocer las especificaciones de la herramienta y conocer a cabalidad sus ventajas y limitaciones de operación. 4. Aprendizaje de uso especı́fico del Intel Galileo. En detalle, se programan funciones sencillas con la tarjeta, utilizándola como microcontrolador, para desarrollar las habilidades necesarias para la programación de programas más complejos. 5. Escritura de los programas que permiten al Galileo obtener los datos de posicionamiento necesarios del módulo GPS. 6. Programación del código que perimten al Galileo hacer llamados a páginas web, en Internet, mediante módulo GPRS. 7. Integración apropiada del código desarrollado anteriormente, para que el Galileo pueda enviar a una página web los datos obtenidos por el GPS. 8. Desarrollo de una página web de prueba que pueda recibir los datos del Galileo, hospedada en un servidor remoto personal. 9. Alimentación del Galileo mediante una baterı́a de corriente directa de 5V y 2A, para que pueda funcionar de manera autónoma. 10. Diseño y fabricación, en programas de modelado sólido y una impresora 3D, de una caja a la medida que pueda contener al Intel Galileo, una protoboard con la circuiteria externa y los módulos externos (GPS y GPRS). 11. Elaboración de pruebas de funcionamiento del sistema apropiadas, para comprobar el funcionamiento del sistema completo en un operación real. 1.5 Desarrollo Se presenta en este informe una división por capı́tulos que permita la completa y estructurada descripción del proyecto desarrollado. 1. En el Capı́tulo I, se ha descrito a profundidad la justificación del proyecto, el motivo de su desarrollo, el sistema por entregar y los objetivos que éste debe cumplir, y la metodologı́a para la elaboración del prototipo. 2. En el Capı́tulo II, se describe el equipo y tecnologı́as utilizadas. Esto se refiere a una explicación de las tecnologı́as GPS, GSM/GPRS, multiplexores y microcontroladores. En especial, se detalla el Intel Galileo, debido a su rol central en este proyecto. 4 1 Introducción 3. En el Capı́tulo III, se describe el diseño que se realiza para obtener el prototipo final. Se comenta el código desarrollado para cada función especı́fica y se añade al trabajo los esquemáticos correspondientes a cada etapa del proyecto. 4. En el Capı́tulo IV, se describen los resultados del proyecto y se comenta su alcance dentro de su área de efecto. Además, se hace una evaluación del Intel Galileo en su rol como microcontrolador. 5. En el Capı́tulo V, se exponen las conclusiones del proyecto y recomendaciones para el desarrollo posterior del prototipo; este capı́tulo es el que resume el aprendizaje del proyecto y el que determina los siguientes pasos para mejorar el esfuerzo en el futuro. 2 Antecedentes 2.1 Contexto actual de sistemas incrustados Los sistemas incrustados son sistemas computacionales dedicados a realizar una función especı́fica dentro de un sistema eléctrico o mecánico más grande, con procesamiento de entradas y salidas en tiempo real. Se comparan con las computadoras de uso general utilizadas por la mayorı́a de las personas. Las computadoras de uso personal se diseñan para trabajar en diversas tareas, mientras que los sistemas incrustados tienden a concentrarse en algunas tareas especı́ficas siempre (Peter Barry, 2012). La mayorı́a de los sistemas incrustados modernos están basados en microcontroladores. Sin embargo, se siguen utilizado computadoras con sistema operativo de alto nivel para tareas y sistemas más complejos. Por su uso tan especı́fico, se debe tener un rango de opciones muy grande, para poder adaptar la herramienta correcta al trabajo más óptimo para ella. Esto funciona especialmente para tener una optimización máxima en sus tareas. También, es importante tener en mente qué se va a utilizar en caso de seguir mejorando el sistema o si se necesita aumentar sus dimensiones de acción, debido a que el mundo de los sistemas incrustados avanza a grandes pasos mientras que se siguen solucionando las demandas industriales, domésticas y académicas que presenta el mundo moderno (Peter Barry, 2012). Debido a todo esto, la arquitectura incrustada con más relevancia actualmente es la ARM, que se beneficia de conjuntos de instrucciones reducidas (RISC) para la programación de sus microprocesadores y microcontroladores, los cuales tendrán operaciones superiores con consumos de potencia menores. Los sistemas incrustados se utilizan en dispositivos con una amplia gama de especificaciones y necesidades. Entre ellas, se cuentan el desarrollo de interfaces gráficas, capacidad de conexiónes de redes complejas e integración con otros sistemas incrustados (Peter Barry, 2011). Esto se aleja de los sistemas incrustados de décadas anteriores, en las que se tenı́an dispositivos industriales con funciones muy limitadas que no se conectaban directamente con las de los dispositivos aledaños. Por su misma naturaleza, los esfuerzos que utilizan sistemas incrustados en la actualidad pueden ir de un tamaño muy pequeño a aparatos de gran tamaño. Sin embargo, las tarjetas de desarrollo para estos dispositivos no son quienes dictan la complejidad del sistema incrustado en sı́. Ejemplos prominentes de uso de estos sistemas van desde relojes digitales, reproductores de música y 5 6 2 Antecedentes teléfonos inteligentes hasta sistemas complejos como sistemas aeronáuticos, de transporte y recreación. Los sistemas incrustados siguen siendo piezas centrales de máquinas de producción y robótica en todas sus ramas (Peter Barry, 2012). 2.2 Microcontroladores Según Ross Bannatyne (1995a), se define un microcontrolador como un circuito integrado que contiene los elementos mı́nimos necesarios para poder conformar un sistema de computación completo: Unidad de procesamiento, memoria, reloj, entradas y salidas. Sin embargo, una definición más completa describe su enfoque, el cuál es la integración de periféricos necesarios para el control veloz, efectivo y eficiente dentro de un ambiente incrustado. Todo esto los describe como pequeñas computadoras que pueden ser programadas para tareas especificas. Para poder resolver problemas del mundo real, el microcontrolador no puede operar con sólo una unidad de procesamiento, programas y memoria. La interacción con el mundo fı́sico es una parte clave en todo este ambiente y se realiza por medio del equipo especializado para obtener información del entorno y devolver las acciones deseadas con comunicación binaria de diferentes tipos (Ross Bannatyne, 1995b). Este equipo se conoce como periféricos; algunos de los más importantes son los puertos GPIO, UART, I2 C y SPI, que manejan diferentes protocolos de comunicación necesarios para la conexión con otros periféricos más complejos. Un programa escrito para operarse en un microcontrolador normalmente tiene ciertas etapas definidas, debido a que son hechos para trabajar en tareas especı́ficas durante su operación. Por tanto, usualmente, un programa escrito para un microcontrolador leerá las señales de entrada que esté recibiendo, operará los datos internamente para la función que deba efectuar y, por último, controlará la señal de salida que ejecutará la labor del sistema (Ross Bannatyne, 1995b). A pesar de que esto puede suponer, en la mayorı́a de los casos, algoritmos sencillos de operación, no son casos que se puedan resolver de manera trivial con componentes discretos. Esto significa que los microcontroladores pueden reemplazar circuitos muy complejos. Por sus propias limitaciones y por la efectividad de toda la operación, se acostumbra programar microcontroladores en lenguaje ensamblador o en lenguajes de alto nivel que tengan un manejo eficiente de memoria, como el lenguaje C. Se utilizan ambientes de desarrollo integrados (IDE ) especı́ficos para cada microcontrolador, para poder compilar y subir los programas a la memoria del equipo (Ross Bannatyne, 1995a). Los microcontroladores están presentes en muchas de las actividades cotidianas de nuestras vidas. Operan diferentes dispositivos relacionados al hogar, 2.2. Microcontroladores 7 transportes, comunicaciones, deportes y demás, debido a su versatilidad y bajo consumo de potencia. Por tanto, la selección de un microcontrolador debe ser cuidadosa y apropiada para cada aplicación especı́fica (Ross Bannatyne, 1995b). Por lo tanto, es de vital importancia considerar el poder de procesamiento necesario, la memoria que se planea utilizar, los periféricos necesarios, las demandas especı́ficas de la aplicación por desarrollar e inclusive el precio. Arduino Arduino es una familia de tarjetas de prototipos de desarrollo libre, concebida por varios estudiantes en Italia y optimizada por la colaboración de diferentes personas adicionales. Su particularidad principal se centra en la creación de tarjetas de desarrollo en las que el microcontrolador está soldado directamente a una placa con sus diferentes periféricos habilitados, en una implementación que permita la creación sencilla y económica de prototipos. Al ser de desarrollo libre, un Arduino puede ser ensamblado y modificado para diferentes necesidades. La programación se realiza directamente sobre el Arduino IDE, una aplicación multiplataforma escrita Java que permite que se suban los programas al microcontrolador. Los programas de Arduino están escritos en lenguaje C o en lenguaje C++ (Arduino, 2014). Se describe el Arduino Uno, el cual es el producto más básico de la familia Arduino. Sus caracterı́sticas principales son las que se ennumeran a continuación: 1. Utiliza un microcontrolador ATmega328P de 16 MHz de velocidad. 2. Interfaz USB. 3. 14 GPIOs (6 con modulación de ancho de pulso, PWM). 4. 6 pines digitales. 5. Puerto SPI. 6. 1 kB de memoria EEPROM. 7. 2 kB de memoria SRAM. 8. 32 kB de memoria Flash. El arreglo fı́sico de puertos del Arduino Uno se observa la figura 2.1, que muestra la vista superior de la tarjeta y las etiquetas de los componentes (Schmidt, 2011). 8 2 Antecedentes Figura 2.1: Vista superior de un Arduino Uno (Schmidt, 2011) 2.3 Intel Galileo El Intel Galileo es una tarjeta de desarrollo con un procesador Intel Quark SoC X1000, un ”system on chip” (SoC) Pentium de instrucciones de 32 bits. Se ajusta al nuevo modelo de negocios de la empresa Intel, en el que se orienta hacia productos para sistemas incrustados. Es la primera tarjeta con arquitectura x86 diseñada para tener compatibilidad con el entorno Arduino, tanto en hardware como en software (Intel, 2014a). En especı́fico, intenta ser suficientemente compatible con equipo que originalmente fue diseñado para utilizarse con el Arduino Uno. El Intel Galileo se muestra en la figura 2.2. Caracterı́sticas principales del Galileo Algunas de sus caracteristicas principales son las siguientes (Intel, 2014b): 1. Velocidad del Quark SoC de 400MHz. 2. Caché de 16kB. 3. 512kB de SRAM. 4. Tensiones lógicas de 3,3V o a 5V. 5. Puerto mini-PCI Express. 2.3. Intel Galileo 9 Figura 2.2: Vista superior de un Intel Galileo 6. Puerto Ethernet de 100 Mb. 7. Puerto para tarjeta micro-SD. 8. Puerto serial RS-232. 9. Puerto USB Host. 10. Puerto USB Client. 11. 6 pines analógicos, que otorgan hasta 40mA de corriente. 12. 14 pines digitales (6 con PWM), que otorgan hasta 40mA de corriente. 13. Un puerto UART asociado a los pines 0 y 1 de los pines digitales 14. Puertos I2 C y SPI. 15. Pines de salida de tensión de 3,3V y 5V, con capacidad de otorgar hasta 800 mA de corriente. 10 2 Antecedentes Figura 2.3: Esquema del hardware del Intel Galileo (Intel, 2014b) 16. Tiene 8 MB de memoria Flash para guardar el firmware (o bootloader, dependiendo del uso que se le quiera dar) 17. 256MB de DRAM habilitados. El esquema del hardware del Galileo se muestra en la figura 2.3. Lo que realmente destaca al Galileo es su capacidad de funcionar tanto como un microcontrolador sencillo, de la manera que funciona un Arduino, o corriendo un sistema operativo pequeño (Intel da soporte a una distribución GNU/Linux pequeña, sin interfaz gráfica, pero se pueden crear distribuciones a la medida). Esta caracterı́stica no se explora en este proyecto. Sin embargo, este detalle añade una versatilidad muy novedosa al sistema, debido a que puede funcionar en un rango de aplicaciones más grande que el de muchos otros productos de este tipo (Intel, 2014a). 2.3. Intel Galileo 11 Comparación entre Intel Galileo y Arduino Uno Por la misma naturaleza del Galileo y su esfuerzo por tener compatibilidad con el entorno Arduino, aparecen comparaciones inmediatas con el Arduino Uno. Por tanto, se ennumeran las ventajas y desventajas del Galileo respecto al Arduino Uno. Para iniciar, se describen las ventajas del Galileo: 1. Mayor poder de procesamiento, debido a que el Quark SoC del Galileo corre a 400MHz, mientras que el ATmega328P corre a 16MHz. 2. Mejor manejo de memoria, gracias a que el Galileo tiene mucha más memoria dinámica que el Galileo. 3. Mayor versatilidad en sus funciones, ya que el Galileo puede utilizar un sistema operativo. 4. Mayor cantidad de puertos disponibles, como lo son el puerto mini-PCI Express y el puerto de Ethernet. Posteriormente, se comentan las desventajas del Galileo en perspectiva: 1. Mayor consumo de potencia debido a mayor procesamiento. Mientras que, con alimentaciones de 5V, el Arduino puede operar siempre a menos de 500mA, la corriente que demanda el Galileo puede llegar a 2A. 2. Costo muy elevado en comparación al Arduino (alrededor de $30 de diferencia en la mayorı́a de puntos de venta electrónicos disponibles), si se quisiera considerar su uso como microcontrolador. 3. Baja velocidad de conmutación en puertos digitales en el Galileo (alrededor de 230Hz), debido a que estos puertos están conectados a un expansor de puertos que hace que se comparta un ancho de banda común entre todos los pines. El Arduino no tiene este problema y la conmutación de los puertos digitales es bastante veloz. Esto se detalla más adelante. 4. El Galileo solo funciona con una tensión de entrada de 5V mientras que el Arduino Uno tiene un rango mayor de tensiones de entrada, lo que hace que el uso del Galileo sea menos adecuado para principiantes. 5. La documentación del Arduino Uno está muy desarrollada y con una comunidad virtual muy grande de apoyo. El Galileo, por su parte, tiene muy poca documentación, la información no es precisa y la comunidad virtual de apoyo está desarrollándose muy lentamente. 12 2 Antecedentes Debido a la dificultad de implementar funciones sencillas en el microcontrolador Galileo, tanto por documentación errónea y escasa, y por las mismas condiciones del equipo, es una tarjeta de desarrollo que no se recomienda para principiantes en programación de sistemas incrustados. Sin embargo, puede tener ventajas importantes en el desarrollo, como lo son mayor procesamiento y memoria disponible para los programas y la conexión a Internet por medio de la conexión Ethernet. Con la comparación directa entre ambas plataformas y al revisar las especificaciones de cada equipo detalladas en este documento, se puede observar, antes de usar cualquiera de las dos tarjetas, que los nichos de operación de cada una son diferentes. El Arduino Uno es una plataforma de gran sencillez que se utiliza en tareas simples, con un consumo de potencia limitado y orientado a desarrolladores con poca experiencia. Sin embargo, el Intel Galileo se debe utilizar en tareas de mayor demanda de procesamiento, cuando se requiera un sistema operativo y cuando el usuario posea mayor experiencia en la programación de estos sistemas incrustados. Velocidad de puertos de uso general en el Intel Galileo Los puertos de uso general en el Intel Galileo están conectados a un expansor de puertos I2 C, que corre en modo estándar (a alrededor de 100kHz). Cada pedido al I2 C para actualizar cada puerto de uso general toma 2 ms. Adicional a lo que tome en procesarse la información que se maneja en el software del microcontrolador, esto restringe la frecuencia disponible en los puertos de uso general a aproximadamente 230Hz. En pines de microcontroladores, frecuencias menores a 500Hz son extremadamente lentas para usos realmente útiles. 2.4 Sistemas de posicionamiento de vehı́culos Los sistemas de posicionamiento de vehı́culos actuales son de diversa complejidad y de diversas funciones, pero su arquitectura más tı́pica incluye un sistema de posicionamiento global (usualmente se utiliza GPS), un servidor dedicado a recibir esta información, un método de transferencia de información y una interfaz de usuario (Blackman, 1999). Un sistema de posicionamiento global es indispensable para estos dispositivos, debido a que es el que determina la ubicación del vehı́culo en el espacio. Éstos son los datos primordiales con los que se alimenta el servidor dedicado a recibir la información. Sin embargo, se pueden almacenar otros tipos de datos que pueden ser de gran relevancia para los usos que se requieran. Por ejemplo, se puede monitorear velocidades, rutas, combustibles, tiempos de viajes, horas de posiciones de los vehı́culos, uso de puertas del transporte, cantidad 2.5. Sistema de Posicionamiento Global (GPS) 13 e identidad de los pasajeros, calidad de la información de posicionamiento y otros (Blackman, 1999). Estos dispositivos pueden ser activos o pasivos. Cuando son pasivos, el dispositivo viaja con el vehı́culo y recolecta información que después se pasa manualmente al servidor, con el método de almacenamiento que utilice todo el sistema incrustado. El posicionamiento activo significa que la información se envı́a directamente al servidor remoto en intervalos de tiempo cortos, haciendo una transferencia en tiempo real de la información recolectada. Este método incluye, normalmente, una conexión a Internet estable por medio de las redes celulares disponibles(Blackman, 1999). En estos casos, la tecnologı́a GSM y el envı́o de paquetes de información por GPRS son las elecciones más usuales y más robustas. Toda esta información tiene validez hasta que se encuentra con la interfáz de usuario, a quien se le entregan los datos recolectados para que haga uso de la información en la manera que mejor convenga. Esta información se entrega, por lo tanto, por medio de interfaces gráficas en medios móviles (páginas de internet, mensajes de texto, correos electrónicos o aplicaciones móviles) o en aplicaciones de computadoras de uso general. También es posible almacenar esta información para futuras referencias. El uso de estos sistemas es muy popular en la actualidad. Sus aplicaciones más comunes son las de posicionamiento de transporte público, monitoreo de carros rentados, alarmas de vehı́culos (Blackman, 1999). Incluso, se pueden utilizar estos sistemas para tareas menos usuales, como el estudio demográfico de las personas que utilizan determinado servicio y la hospitalidad con personas que requieren transporte inmediato después de viajes complejos, al poder proveerles un vehı́culo siempre en relación al anterior que utilizaron. 2.5 Sistema de Posicionamiento Global (GPS) La tecnologia GPS consiste en un sistema de navegación por satélite desarrollado por el Departamento de Defensa de Estados Unidos. Incluye 24 satelites en una órbita semigeosı́ncrona que provee una cobertura global contı́nua y una precisión excelente en sus datos de ubicación (Dougherty, 1995). Un receptor GPS calcula la posición del usuario al obtener la señal de al menos 4 satélites; determina la posición al hacer un cálculo que incluye la hora en que se envió la señal y el tiempo que transcurre hasta que la señal es recibida. Se necesitan al menos 4 satélites para obtener un resultado acertado de posicionamiento, debido a que se correlacionan para poder dar una respuesta a las interrogantes del dispositivo receptor de elevación, latitud, longitud y curso. Si el dispositivo GPS se conecta con más satélites, su precisión aumenta (van Diggelen, 2002). Su operación es robusta y tiene una accesabilidad global, por lo que se 14 2 Antecedentes posiciona como el mejor sistema de navegación para proyectos y prototipos de desarrollo abierto. Un equipo GPS de usuario tiene una interacción de software y hardware para poder obtener los datos de ubicación adecuados. En general, los diseños tienen la forma de receptores de información para estimar su propia posición y velocidad, con las adecuadas compensaciónes por errores de medición conocidos (van Diggelen, 2002). Por tanto, son dispositivos relativamente sencillos que leen la información que proviene de los satélites pertinentes y la comunican al usuario. Los satélites GPS envı́an señales moduladas de microondas para que los receptores en la Tierra puedan obtener la información. Estos receptores se han desarrollado para poder ser utilizados por sistemas embebidos con protocolos de comunicación usuales, por lo que se encuentran en el mercado tarjetas impresas con receptores GPS comerciales que son sencillos de conectar a diferentes microcontroladores (van Diggelen, 2002). 2.6 General Packet Radio Service (GPRS) Los protocolos de segunda generación (2G) de redes celulares son descritos por el estándar conocido como GSM (Global System for Mobile Communications). Es en esta red donde se introducen las redes celulares digitales y se transmiten los datos primarios de comunicación entre dispositivos móviles, como lo son las llamadas de voz. La telefonı́a implementa la telefonı́a full duplex y una red de conmutación de circuitos. Es la tecnologia en la que se basan los protocolos de generaciones más modernas de redes celulares (3G, 4G), ya que los nuevos estándares implementan comunicaciones que se desarrollaron desde la segunda generación (Rhee, 2009). Las tecnologias móviles 2G, incluyendo GSM, se han optimizado por diseño para funcionar con comunicaciones de voz. Esto dejó una capacidad de transferencia de datos muy pequeña en sus sistemas. Por tanto, se desarrolló el Servicio de Radio de Paquetes Generales (GPRS) como una extensión de GSM, que ha evolucionado para dar un sistema simplificado para el acceso remoto a Internet, lo que permite a los usuarios transferir paquetes de datos entre estaciones móviles GSM y otras redes de paquetes de datos externas a estas redes. Efectivamente, lo que permite es conectar dispositivos que se comunican en redes celulares GSM a Internet, con tiempos de acceso relativamente cortos y altos niveles de transferancia de datos. Su formato se basa en una conmutación de paquetes, cuya definición es bastante amplia pero en el caso del GPRS se trata de una división de datos por comunicar en paquetes. De esta manera, se puede hacer una transferencia más eficiente de los canales por los que se comunica la información del tráfico de Internet que si se utilizara 2.6. General Packet Radio Service (GPRS) 15 la conmutación de circuitos que se utiliza en las llamadas telefónicas (Rhee, 2009). 3 Diseño del prototipo En este capı́tulo se detalla el proceso de diseño del prototipo desarrollado, con sus diversas consideraciones de hardware y software para lograr el entregable final. 3.1 Equipo utilizado Diagrama de bloques inicial Se elabora el diagrama de bloques de la figura 3.1 para poder implementar la solución deseada. En la figura 3.1, se muestra el Intel Galileo como una constante en el diseño (el enfoque de este proyecto está orientado hacia él), por lo que el resto del equipo se escoge en función a esta tarjeta de desarrollo. Figura 3.1: Diagrama de bloques del sistema de posicionamiento vehicular 17 18 3 Diseño del prototipo Figura 3.2: Adafruit Ultimate GPS Breakout Board (Adafruit, 2014) Módulo GPS En el mercado, la mayorı́a de módulos GPS hechos para trabajar con sistemas incrustados funcionan con una simple comunicación serial de la información que están recibiendo por parte de los satélites. Por tanto, se determina que se utilizará el Adafruit Ultimate GPS Breakout Board que se muestra en la figura 3.2. Algunas de las caracterı́sticas principales del Adafruit Ultimate GPS son las siguientes (Adafruit, 2014): 1. Trabaja con tensiones de 3,3 V a 5 V, tanto en sus pines lógicos como en la alimentación. 2. Tiene una sensibilidad de -165 dB de recepción de señales. 3. Trabaja con una tasa de baudios de 9600bd. 4. Tiene una precisión reportada de 1,8 metros y un tamaño muy reducido. Se escoge este equipo principalmente por su gran sensibilidad en la recepción de señales, lo que hace que el GPS mantenga la comunicación con los satélites en gran cantidad de condiciones de operación. Además, su desarrollo está muy bien documentado por el fabricante. Su comunicación con el Galileo será por medio del puerto serial UART1. Módulo GPRS Debido a que se conectará todo el sistema a Internet por medio de la red celular, se importante aclarar que la elección del equipo debe funcionar en 3.1. Equipo utilizado 19 Figura 3.3: Seeed GPRS Shield (Studio, 2014) la banda de frecuencia en la que funciona la red GSM nacional. Se escoge la tarjeta Seeed GPRS Shield V2.0, de la figura 3.3, para mandar los datos al servidor remoto. El Seeed GPRS Shield tiene las siguientes caracteristicas (Studio, 2014): 1. Utiliza un SIM900, que es un circuito integrado dedicado a la comunicación con las redes celulares 2G. 2. Se programa con comandos AT y puede trabajar a distintas tasas de baudios, por lo que se puede programar para que trabaje a 9600bd (como el módulo GPS). 3. Trabaja con tarjetas SIM normales y tiene un puerto de fácil acceso para introducirlas al módulo, por lo que se pueden utilizar diferentes operadores telefónicos con solo cambiar esta tarjeta. 4. Tiene soporte para las bandas de 850 MHz, 900 MHz, 1800 MHz y 1900 MHz. La banda de 1900 MHz es a la que funciona la red celular GSM nacional, por lo que este equipo está habilitado para trabajar en Costa Rica. Al igual que el Ultimate GPS, el GPRS Shield se comunicará con el Galileo por medio del puerto serial UART1. Se escoge este módulo debido su precio, que es menor al de la mayorı́a de tarjetas similares. En general, los módulos GPRS que se utilizan con tarjetas Arduino son muy similares entre si. 20 3 Diseño del prototipo Figura 3.4: Encapsulado del multiplexor quádruple 2 a 1 74LS157 (Instruments, 2014) Circuiteria externa Como se observa en las subsecciones anteriores, se utilizan dos equipos que se comunican con el mismo puerto serial, debido a que es el único de uso general disponible en el Intel Galileo. En un Arduino Uno y otros Arduinos, es posible implementar puertos seriales en pines de uso general al usar librerı́as y programación especı́fica para esto, pero en el Galileo se tiene una velocidad muy baja de conmutación de pines (por razones que se detallan en la sección 2.3) y esto es imposible. Entonces, se requiere algún medio externo que habilite esta posibilidad al multiplexar las señales de los módulos involucrados. Por lo tanto, se requiere circuiterı́a externa y utilizar un multiplexador normal para esta labor. Se escoge utilizar el multiplexor 2 a 1 74LS157 de la figura 3.4. El 74LS157 tiene 4 salidas y 8 entradas, para poder multiplexar cuatro señales al mismo tiempo. Se alimenta a 5 V y tiene una velocidad de conmutación suficiente para poder multiplexar comunicaciones de 9600bd (Instruments, 2014). Diagrama de bloques final Ası́, el diagrama de bloques de la figura 3.1 evoluciona en el de la figura 3.5, para introducir la multiplexación necesaria. 3.2. Conexión del sistema 21 Figura 3.5: Diagrama de bloques final del sistema de posicionamiento vehicular Cuadro 3.1: Detalle de materiales del proyecto Equipo ($) Intel Galileo Placa de pruebas Microtivity (400 puntos) Adafruit Ultimate GPS Breakout Board Seeed GPRS Shield V2.0 Baterı́a DC Intocircuit 5V, 2A 74LS157 El detalle de materiales parcial se muestra en la tabla 3.1. 3.2 Conexión del sistema Una vez que se realiza la selección de los equipos, se procede a la conexión del mismo. El diagrama de conexión se puede observar gráficamente en la figura 22 3 Diseño del prototipo Figura 3.6: Diagrama de conexión del sistema de posicionamiento vehicular 3.6. La primera etapa de la conexión empieza al alimentar los diferentes dispositivos con los que se trabaja. Por tanto, se dará una alimentación a 5V a todos los sistemas involucrados, desde los pines 5V y GND del Galileo. El pin GND se conecta con el pin GND del módulo GPS, el pin GND del módulo GPRS y el pin 8 del multiplexor. El pin 5V, por su parte, se conecta con el pin 5V del módulo GPS, el pin 5V del módulo GPRS y el pin 16 del multiplexor. Posteriormente, se requiere comunicar los dispositivos. La comunicación serial se efectúa en los pines digitales D0 (RX) y D1 (TX) del Galileo, por lo que serán los utilizados aquı́. Se debe destacar que la comunicación serial tiene que ser de pines de transmisión (TX) a pines de recepcion (RX). También, se nota que el módulo GPS sólo comunica sus datos sin esperar respuestas, por lo que solo se utilizará su pin de transmisión TX hacia la multiplexación. Asi, el Galileo conecta su pin D1 (TX) con el pin D2 (RX) del módulo GPRS, mientras que el pin D0 (RX) va hacia el pin 4 del multiplexor. Este pin es el encargado de dar la salida a la señal especificada entre las dos que puede escoger, las cuales estarán conectadas a los pines 2 y 3. Entonces, la transmisión del GPRS en el pin D0 (TX) se envı́a al pin 2 del multiplexor; la transmisión del GPS en el pin TX se envia al pin 3. Por último, se deben realizar conexiones auxiliares, para permitir la ope- 3.2. Conexión del sistema 23 Figura 3.7: Conexión del sistema de posicionamiento vehicular ración completa del sistema. Se conecta el pin FIX del módulo GPRS al pin analógico A5 del Galileo, para permitir una revisión de señales que permita indicar si el sistema está recibiendo datos confiables de posicionamiento por medio de los satélites de ubicación GPS en el espacio. También, se conecta el pin 8 con el pin 15 del multiplexor, para asegurar una operación de multiplexación que solo sea definida por el pin de selección del multiplexor. Si el pin 15 llega a estar en alto, la salida en el pin 4 se mantendra en bajo, por lo que se conecta a tierra en el pin 8 y, de esta manera, se evita esta condición. Finalmente, se conecta el pin 1, de selección del multiplexor, al pin digital D1 del Galileo. Cuando este pin está en bajo, se da salida a la señal del módulo GPRS, mientras que cuando está en alto, se escuchará la información del módulo GPS. También, queda abierta la posibilidad de utilizar LEDs que indiquen el estado del sistema. Esto se efectúa conectando las patillas positivas (las más largas) de los LEDs a pines digitales del Galileo y las patillas negativas a resistencias de 1 kΩ, que van a tierra. La conexión del sistema real se observa en la figura 3.7. 24 3.3 3 Diseño del prototipo Consideraciones especiales Se deben considerar algunos aspectos especiales antes de empezar la programación real del prototipo en desarrollo. Tasa de datos De fábrica, los módulos utilizados en el sistema trabajan con tasas de datos diferentes. El módulo GPS y su chip MTK3339 trabajan, por defecto, en 9600bd. Sin embargo, el chip SIM900 del módulo GPRS trabaja a 19200bd por defecto. Esto hace que se tenga que manejar dos tasas de datos en la comunicación serial del Galileo, complicando la programación. Por lo tanto, se trabaja alrededor de esto al configurar el SIM900 para que trabaje a 9600bd. Esto no sólo facilita la programación, sino que hace que se trabaje con velocidades menores, lo que es deseable en el Galileo debido a la velocidad tan baja de sus puertos digitales. Se utiliza el comando AT AT+IPR para hacer esta modificación. Es un comando especı́fico para operar el SIM900,. Para realizarlo, se establece una comunicación serial entre el módulo GPRS y el Intel Galileo, al conectar los pines digitales 0 (RX) y 1 (TX) del Galileo a los pines digitales 0 (TX) y 1 (RX). Posteriormente, se alimenta el módulo a 5V y se hace correr un pequeño código que se comunique, en una velocidad de datos de 19200bd, con el SIM900, para enviar el comando AT AT+IPR 9600. Después de este punto, ambos módulos van a estar trabajando a 9600bd. Se utiliza el código del anexo D. Ajuste de GPS Se define el ajuste de un GPS como la verificación de la ubicación calculada mediante la información de satélites GPS. Una vez que la información que recibe el módulo GPS es suficiente, se puede definir una ubicación precisa del sistema. Para comprobar que el módulo GPS llegó a tener su ajuste, se hace una lectura analógica del pin FIX del módulo. Este pin está conectado al LED que parpadea en la tarjeta Adafruit Ultimate GPS, indicando el estado del ajuste: Cuando hay un parpadeo continuo de este LED, significa que todavı́a no se ha alcanzado un ajuste, pero cuando el LED se enciende cada 15 segundos, se sabe que el ajuste se ha alcanzado. Se escribe la subrutina gps fix del código del anexo B para este propósito, en donde se lee el pin FIX del módulo GPS en el Galileo y si se encuentra que está apagado en doce lecturas realizadas durante 1,2 segundos, se sabe que el LED no está parpadeando y que se tiene 3.4. Algoritmo de programa principal 25 un ajuste; en caso contrario, se sigue esperando hasta que se logre obtener este ajuste. Operador telefónico utilizado Para utilizar el módulo GPRS, se debe utilizar una tarjeta SIM. Por facilidad, se le remueve el código PIN con un teléfono celular Samsung Galaxy SIII Mini corriendo Android Jelly Bean. Posteriormente, se debe utilizar los parámetros adecuados para configurar el APN de la tarjeta SIM (nombre APN y contraseña). Para este prototipo, se utilizó una tarjeta SIM del operador Movistar (cuya configuración APN incluye el nombre APN es internet.movistar.cr y no tiene contraseña). Adicionalmente, se intentó utilizar una tarjeta SIM del operador Kolbi, pero su configuración falló por razones desconocidas. 3.4 Algoritmo de programa principal El algoritmo principal se ilustra en la figura 3.8. Se puede apreciar de buena forma cómo es que funciona el algoritmo implementado en el programa del anexo B que hace operar el prototipo desarrollado. Se divide en dos subrutinas principales: Setup y Loop. En la subrutina Setup, se realizan las configuraciones iniciales del sistema. Por lo tanto, lo primero que se realiza es habilitar la comunicación serial que se utilizará en el sistema. Es importante que se realice a 9600bd, por las caracterı́sticas del equipo descritas anteriormente, y que se utilice comunicación serial tanto en el puerto Serial (correspondiente al USB Host del Galileo, quien se comunica con la computadora), para imprimir en consola los resultados del programa, y en el puerto Serial1, correspondiente a los pines digitales 0 y 1 del Galileo y en donde se realiza la comunicación con los módulos externos GPS y GPRS. También, se deben habilitar las funciones de los pines, para que se defina si los pines estarán leyendo datos de módulos externos o si estarán, por su parte, dando información a los mismos. Una vez que se ha realizado esta parte, se conecta el sistema a Internet por medio del módulo GPRS, utilizando comandos AT. En el caso de este sistema, se conecta con la red de Movistar, con los parámetros de autentificación establecidos en el código. Por su parte, en la subrutina Loop se pone a operar la función completa del microcontrolador. Ası́, inicia con una revisión del estado del GPS (conocido como el Fix del GPS), una vez que el GPRS esta funcionando y el sistema está conectado a Internet. Si está obteniendo una señal de los satélites GPS en el espacio, se permite que la rutina continúe. A partir de ahı́, se empieza a hacer una lectura de los datos que se reciben del GPS. Estos datos vienen en un formato NMEA, utilizando los datos GPRMC. De estos 26 3 Diseño del prototipo Figura 3.8: Diagrama de flujo del programa principal datos se puede observar en pantalla un desgloce general de toda la información GPS disponible. Sin embargo, sólo se operan los datos de estado del GPS, hora, fecha, latitud y longitud, debido a que son los que interesan para la operación del microcontrolador y de las aplicaciones externas. Estos datos se separan en variables y se revisan, para determinar si hay errores en ellos. Si los hay, se revisa de nuevo si el Fix se perdió y se repite la operación. Si no se encuentran errores, se realiza una operación HTTP Get (un acceso sencillo a un URL, del tipo que se realiza en un navegador de Internet normal) para accesar un URL establecido con un servicio web que permita operar los datos de posicionamiento. Este URL se conforma con la dirección del servicio web y con los datos obtenidos del módulo GPS; esta URL tiene la siguiente forma: http://EXAMPLE.com/broadcast.php?lat=LATITUD& lon=LONGITUD& hour=HORA& date=FECHA, donde se sustituyen los nombres en mayúscula por los valores pertinentes. Es importante destacar que esta operación HTTP Get es una solicitud de información de un servidor remoto 3.5. Página web de prueba 27 (y no un envı́o de datos como tal). Lo que se hace es incluir información propia del sistema en esta solicitud para que el servidor reconozca esos datos y los pueda almacenar (es un truco utilizado para enviar los datos deseados al servidor de una manera sencilla aunque indirecta). Una vez que se completa la operación HTTP Get y se envı́an los datos mediante la URL al servidor remoto, se espera 10 segundo para renaudar el ciclo y volver al principio de la función, leyendo nuevos datos del módulo GPS. 3.5 Página web de prueba Se programa una página web de prueba hospede una función que reconozca cuando hay datos del prototipo en la URL que accesa el módulo GPRS desde el Galileo. Por lo tanto, se tiene una página cuyo diseño se realiza en lenguaje HTML, pero con scripts dentro del código en lenguaje Javascript y PHP. En el script PHP, se identifican las variables necesarias en el URL. Si se introducen las cuatro variables requeridas en el URL (latitud, longitud, hora y fecha), se crea un archivo de texto (.txt), de donde se actualizarán las cajas de texto que se muestran en la página y de donde se obtendrá la información para el mapa. Dentro del código en Javascript, se utiliza un API de Google Maps para poder presentar un mapa en la pantalla, en donde se programa un marcador que utilice las coordenadas del URL obtenidas en el archivo de texto creada por el script PHP, convierta los datos de latitud y longitud en grados, minutos y segundos a grados decimales (formatos estándar para expresar coordenadas geograficas) para que puedan ser aprovechados por Google Maps y, finalmente, muestre en el mapa el punto en donde se encuentra el prototipo. Esta página se debe hospedar en un servidor público, de manera que pueda ser accesado por el módulo GPRS. Éste es un punto importante, debido a que el Internet que tiene el sistema viene de una red celular, la cual (en una configuración de usuario normal) no va a poder accesar servidores privados, al no ser parte de las mismas redes. Se hace énfasis en que la creación y programación de esta página se realiza por motivos de prueba del sistema y demostración del prototipo. A pesar de tener un funcionamiento robusto y de poder utilizar los datos de la manera que se requiere, tiene acceso público y no protege los datos de los usuarios, algo que serı́a requerido en una empresa privada que quiere resguardar la ubicación de sus empleados. Por tanto, para una implementación real, la página y la configuración del servidor remoto se deben realizar con las consideraciones de seguridad del caso. La página se muestra en la figura 3.9. Se observa el código de esta página en el anexo C. 28 3 Diseño del prototipo Figura 3.9: Página de prueba del prototipo 3.6 Alimentación del prototipo Para las pruebas, se utiliza la baterı́a de la figura ??. Es una baterı́a genérica, de 50000mAh, 5V y 2A. Se alimenta el sistema con una baterı́a debido a que se quiere tener la opción de mover el sistema a diferentes vehı́culos (no solo autobuses). En primera instancia, se consideró conseguir la alimentación desde alguna disponible en el autobus, pero se decidió no hacer esto debido a que los autobuses disponibles en Intel Costa Rica no tienen una salida de tensión disponible de fábrica y se preferı́a no modificar los autobuses. La baterı́a otorga 5V a los dispositivos que tiene conectados y puede tolerar 2A. Sin embargo, no es regulada y, una vez que se le conecta la carga del Galileo, su tensión baja a alrededor de 3V. Por lo tanto, se debe utilizar un convertidor DC-DC Boost como regulador de conmutación, para que la tensión de 3V pase a ser 5V. Para la operación real del prototipo, se planea utilizar la baterı́a del equipo seleccionado al inicio de este capı́tulo, debido a que tiene una regulación interna comprobada. 3.7 Caja del prototipo Se diseña una caja apropiada para albergar el prototipo, hecha para ser manufacturada por una impresora 3D. El objeto está diseñado para permitir la ventilación de las partes, separar la operación de cada módulo, permitir conexiones sencillas y ser una base para todos los módulos. Su diseño se realiza 3.7. Caja del prototipo 29 Figura 3.10: Baterı́a para el prototipo Figura 3.11: Caja para el prototipo - Vista superior en Solidworks 2012 en dos partes separadas; se puede observar en las figuras 3.11 y 3.12. Su manufactura no se realiza debido a problemas de funcionamiento de la impresora 3D del Laboratorio de Innovación de Intel Costa Rica. Sin embargo, se adjunta el código para introducir a la impresora 3D en el momento que esté lista para imprimir con precisión. Una vez impresa, se debe taladrar la caja en 30 3 Diseño del prototipo Figura 3.12: Caja para el prototipo - Vista inferior puntos estratégicos para poder utilizar tornillos y unir las dos partes diseñadas. Se realiza de esta forma para que se puedan introducir y sacar los elementos del prototipo, y para que el diseño se pueda imprimir en una impresora 3D pequeña. 4 Resultados En esta sección se comentan los resultados obtenidos en el proyecto. Es importante recordar que el proyecto pasó por diversas complicaciones que hacen que no se entregue el prototipo final pensado originalmente, respecto a la caja del prototipo y su baterı́a. Sin embargo, se entrega un sistema que funciona de manera robusta y como se requiere. 4.1 Posicionamiento mediante módulo GPS Para obtener los resultados del módulo GPS operado por el Galileo, se hacen dos pruebas principales: Una sin movimiento, que sea sólo para dar una idea principal de la precisión del equipo, y otra con el prototipo en movimiento, para evaluar su funcionamiento en operación real. Para las pruebas, se compara la posición obtenida en Google Maps con las coordenadas que otorga el GPS de un iPhone 5s contra la posición que marca el prototipo de posicionamiento. Se activan los dos equipos GPS al mismo tiempo y se espera un minuto para anotar los resultados, mientras estabilizan sus lecturas. Prueba estática de GPS Se opera el GPS en una posición conocida y se obtienen los resultados que se observan en las figuras 4.1 y 4.2. Se puede observar que la diferencia en ambas posiciones es de alrededor de 4 metros, con lo que se obtiene bastante precisión en el sistema en relación a las especificaciones del diseño. Considerando que el sistema funcionará en un vehı́culo en movimiento, la precisión en un radio de 10 metros es aceptable para quienes requieren el sistema dentro de Intel Costa Rica. Prueba dinámica de GPS Se realiza la prueba en una recta de 250 metros. Se realiza en una recta para poder tener un experimento más controlado. Los resultados se observan en la tabla 4.1. Como se puede apreciar en esta tabla, la diferencia de distancias siempre es menor a 10 m, por lo que son resultados bastante positivos en relación a los requerimientos de entrega del prototipo. 31 32 4 Resultados Figura 4.1: Resultados de GPS en iPhone 5s Figura 4.2: Resultados de GPS en Galileo 4.2. Envı́o de datos mediante módulo GPRS 33 Cuadro 4.1: Prueba dinámica de GPS Posición 1 2 3 4 5 iPhone 5s 9◦ 59’37,7” N 9◦ 59’38,2” N 9◦ 59’39,1” N 9◦ 59’39,6” N 9◦ 59’40,0” N 84◦ 10’31,7” W 84◦ 10’29,8” W 84◦ 10’26,5” W 84◦ 10’24,9” W 84◦ 10’23,7” W Intel Galileo 9◦ 59’37,9” N 9◦ 59’38.1” N 9◦ 59’39,1” N 9◦ 59’36,6” N 9◦ 59’40,0” N Diferencia (m) 84◦ 10’31,8” W 84◦ 10’29,7” W 84◦ 10’26,4” W 84◦ 10’24,8” W 84◦ 10’23,8” W Figura 4.3: Resultados de operación de GPRS en Galileo 4.2 Envı́o de datos mediante módulo GPRS Los resultados de la operación HTTP Get del módulo GPRS del prototipo se pueden apreciar en la figura 4.3. En esta figura, se puede apreciar cómo se accesa el URL deseado y cómo la operación tiene éxito, el cuál es evaluado desde la lı́nea +HTTPACTION:0,200,.... Esta lı́nea indica que la acción HTTP Get se realizó sin problemas; también se indica cuántos bytes regresa la operación al accesar la página web. En los momentos en los que existı́a un error en la acción HTTP Get, se daba por falta de Internet en el prototipo, errores al configurar el APN del proveedor de red celular o por errores del lado del servidor ajenos al sistema desarrollado. No se realizaron pruebas de retardo debido a que se trabajó con una página web de prueba que no pasa refrescando sus valores y que estaba hospedada en 7 4 2 2 3 34 4 Resultados Figura 4.4: Prototipo final un servidor propio, por lo que era complicado lograr esta medición y que se ajustara a la operación que tendrı́a el sistema con un servidor de la empresa Intel Costa Rica. Es fundamental que se realicen estas pruebas una vez que el sistema trabaje con su aplicación móvil y servidor dedicado. 4.3 Integración de módulos GPS y GPRS La integración del sistema se realizó de manera que se pueda tener una funcionalidad sencilla y robusta. En operación normal, se tuvo que trabajar con los códigos más sencillos posibles para poder tener un trabajo fluido del Galileo. Se hizo un manejo muy cuidadoso de la memoria utilizada por el microcontrolador; sin embargo, la lentitud de los pines hizo que el código necesitara una sincronización robusta al comunicarse con los módulos externos para que, al multiplexar las entradas provenientes de los módulos externos, no existiera mucho ruido en estas señales. Inclusive, se evitó el uso de librerı́as externas, lo que resultó en un mejor rendimiento del equipo. 4.4 Prototipo final Para el prototipo final, se agrega la baterı́a escogida para el proyecto; el case diseñado para albergar el sistema no se entrega, debido a la inoperabilidad actual de la impresora 3D del Laboratorio de Innovación de Intel Costa Rica. El resultado se observa en la figura 4.4. 4.5. Intel Galileo 4.5 35 Intel Galileo Evaluación general de la herramienta La operación con el Intel Galileo no tuvo un desempeño satisfactorio. Esto porque en su mismo desarrollo y publicidad inicial se explica que se apunta su uso tanto para funciones tı́picas de un Arduino como para proyectos que requieren el uso de un sistema operativo pequeño. Sin embargo, al utilizar el Galileo como un microcontrolador de la misma manera que funciona un Arduino Uno, se notan bastantes diferencias en su funcionamiento. Algunas de ellas se anunciaron desde que salió el equipo y no son tan significativas, pero otras fueron una sorpresa en el trabajo de este proyecto. 1. No es sencillo de usar: A pesar de que el procedimiento para subir código al Galileo no es tan complicado y no es tan diferente en relación a un Arduino, se tiene que tomar en cuenta detalles de alimentación, escritura de código y caracterı́sticas especiales de los protocolos de comunicación del Galileo que pueden resultar en dificultades para el desarrollo de proyectos en la plataforma. Durante el desarrollo del proyecto, fue común la necesidad de reescribir código para cada etapa de la función del Galileo, debido a que algunas lı́neas no funcionaban bien cuando se combinaban con otras. Estos errores parecı́an aleatorios, en algunos casos no se encuentra una justificación robusta, pero la mayorı́a de las veces se podı́a determinar qué causaba el error. Algunos de los problemas encontrados fueron errores con la librerı́a de tarjetas SD, limitaciones con el protocolo SPI, diferentes puertos seriales entre el USB y los pines digitales 0 y 1, baja velocidad en puertos de uso general que generaban basura y errores en el código y la información recolectada, y complicaciones al utilizar altas velocidades de datos en los módulos externos. La forma de utilizar el Galileo como microcontrolador se documenta en el anexo A. 2. Velocidad en puertos de uso general: Anteriormente, en la descripción del Intel Galileo, se describen las caracteristicas de la velocidad en los puertos de uso general de la tarjeta. Se puede observar, experimentalmente, que se tienen grandes problemas con el manejo de tasas de datos muy altas en pines que no sean de un puerto UART (es decir, todos los pines conectados al expansor de puertos I2 C). 3. Documentación: El Intel Galileo es una tarjeta de desarrollo que salió al mercado en octubre del 2013. Para la escritura de este informe, aún tiene muy poco tiempo en las manos de los desarrolladores con sistemas incrustados. Además, no ha sido un sistema tan popular, debido a sus caracterı́sticas, desventajas y, especialmente, precio. Esto ha hecho que 36 4 Resultados no se haya generado tanta documentación como se necesita para que se utilicen estos dispositivos por personas que no tengan tanta experiencia en el uso de microcontroladores. Además, en el momento de inicio de este proyecto, la documentación seguı́a siendo muy técnica y no apropiada para usuarios no experimentados, y en algunos casos se encontraban errores. Uno de los principales errores fue el anuncio de que se podı́an habilitar puertos de uso general para comunicación serial (fuera del puerto serial en los pines digitales 0 y 1), pero ni la librerı́a estaba habilitada para trabajar con una arquitectura x86 ni se tiene suficiente velocidad de pines para este fin. 4. Protocolos de alimentación: Se tiene que seguir un procedimiento preestablecido para dar energı́a al Galileo y conectarlo a la computadora para programarlo como un microcontrolador. Primero, se debe conectar la alimentación de 5V al Galileo por el puerto DC apropiado. Posteriormente, si se debe conectar a la computadora, se debe conectar el cable USB al puerto USB Host. Para apagar el Galileo, se debe tener desconectado este cable micro-B USB. Esto genera algunos inconvenientes. Primero, se tiene que tener la consideración de sólo usar 5V en el Galileo; cualquier otra tensión puede dañar severamente al Intel Quark. También, sólo se puede alimentar al Galileo desde el puerto DC, ya que el puerto USB Host no está habilitado para que alimente a la tarjeta. Un puerto USB de una computadora común solo puede entregar alrededor de 500mA, mientras que el Galileo puede llegar a requerir hasta 2A. Desempeño de baterı́a Para medir el desempeño del prototipo creado, se hacen evaluaciones comparando el rendimiento del Galileo con el de un Arduino Uno. Para este efecto, se hacen dos pruebas principales: Corriente promedio y duración de operación con una baterı́a externa. Para la ambas pruebas, tanto el Galileo como el Arduino van a estar corriendo el programa desarrollado para este proyecto. En la prueba de corriente promedio, se toman mediciones cada 5 minutos durante media hora; para la prueba de baterı́a, se anota cuánto dura una baterı́a cargada totalmente, de 50000 mAh y 5V, en perder su carga. 1. En el Arduino Uno, se encuentra que el consumo promedio de corriente se encuentra en 212,44 mA, alimentado desde un puerto USB de una computadora a 5V. La baterı́a dura alrededor de 228 horas en descargarse en su totalidad. 4.6. Recepción del prototipo en Intel Costa Rica 37 2. En el Galileo, el consumo promedio de corriente se encuentra en 462,32 mA, cargado a 5V desde un adaptador de corriente externo. La baterı́a dura aproximadamente 102 horas en descargarse por completo. Se nota la gran diferencia entre ambos sistemas en el consumo de potencia. La diferencia principal radica en que el Galileo debe cargar un sistema operativo GNU/Linux para que corra el programa de microcontrolador, mientras que el Arduino lo corre sin necesidad de este sistema operativo. Por tanto, el consumo no se ajusta a la aplicación. Además, se puede determinar que es un consumo bastante alto para un microcontrolador simple; sin embargo, para un sistema incrustado de más bajo nivel con sistema operativo, es un consumo muy bueno. El último resultado no es conclusivo y se añade para incentivar la exploración futura, debido a que no se está utilizando el sistema operativo directamente para la aplicación, pero se reafirma que el Intel Galileo no es una alternativa directa al Arduino Uno. 4.6 Recepción del prototipo en Intel Costa Rica El prototipo se presentó en tres áreas fundamentales: Dentro del grupo RDI, donde se gestó este proyecto, en el evento Makers Faire, donde se expuso el alcance del sistema desarrollado, y en el evento Makersthon, donde se empezaron los avances para desarrollar la aplicación que utilice los datos del sistema para mostrarlos al usuario final. Grupo RDI El esfuerzo de investigación, desarrollo e innovación de Intel Costa Rica (RDI, por sus siglas en inglés) aprovechó todo el desarrollo de este sistema para obtener conclusiones directas del impacto del uso de sistemas incrustados de arquitectura x86 para resolver problemas directos de la empresa. Por tanto, los principales resultados por parte de este grupo fueron los siguientes: • El microcontrolador Intel Galileo tiene gran potencial para resolver inquietudes de desarrolladores con gran éxito; su desarrollo tiene que ser mejorado en productos posteriores, para que sea realmente efectivo. • Se debe seguir profundizando en el uso de sistemas incrustados, tanto en su desarrollo como en su utilización, para cumplir con las demandas del mundo tecnológico moderno. 38 4 Resultados Figura 4.5: Afiche del prototipo en Makers Faire Makers Faire Se realizó una feria para exhibir los proyectos del grupo RDI hacia la organización Intel Costa Rica e invitados especiales, donde el proyecto tuvo exposición y retroalimentación sobre aspectos técnicos y alcance proyectado. En esta Makers Faire se generó suficiente interés para comenzar el desarrollo de la plataforma de software necesaria para llevar la información del prototipo al usuario final. Uno de los afiches utilizados para la promoción del evento fue el mostrado en la figura 4.5. En general, la recepción fue muy positiva por parte de las personas que asistieron a la feria; sin embargo, se reafirman los resultados relacionados al Galileo y la conclusión de que no es el equipo adecuado para utilizar como microcontrolador de funciones pequeñas. Makersthon En el evento Makersthon, se hizo una competencia entre 5 grupos de trabajo para desarrollar proyectos cortos durante tres dı́as laborales con un gran valor 4.6. Recepción del prototipo en Intel Costa Rica 39 Figura 4.6: Certificado de segundo lugar en Makersthon agregado a la empresa Intel Costa Rica. Se inscribió el proyecto para el desarrollo de una aplicación móvil que pueda aprovechar los datos del prototipo y mostrarlos al usuario. Se le dio soporte al sistema y se logró unificar el esfuerzo en software con el hardware desarrollado, por lo que se obtuvo el segundo lugar en dicha competición. Se muestra el certificado de segundo lugar en la competencia, en la figura 4.6. 5 Conclusiones y recomendaciones Para finalizar este informe, se presentan conclusiones y recomendaciones derivadas del desarrollo de este proyecto. Las conclusiones se realizan en relación directa con los objetivos formulados en el proyecto y los resultados del mismo. De igual manera, se escriben las recomendaciones para optimizar el desarrollo de sistemas similares y para la utilización del Intel Galileo. Conclusiones • El Intel Galileo puede operar, con procesamiento muy eficiente y resultados precisos, módulos GPS como el Adafruit Ultimate GPS Breakout Board para determinar las coordenadas de ubicación en las que se ubica el sistema de posicionamiento vehicular desarrollado. • El Intel Galileo tiene la habilidad de utilizar un módulo GPRS como el Seeed GPRS Shield V2.0 para conectarse a Internet y enviar datos a un servidor remoto, mediante una acción HTTP Get hacia un servicio web establecido. • Se puede desarrollar un prototipo funcional y un producto final con un Intel Galileo, como el que se ha desarrollado en este proyecto, para ubicar los vehı́culos internos de la empresa Intel Costa Rica. • Se puede desarrollar, con herramientas de desarrollo abierto como el API de Google Maps, una página web con un servicio web que permita operar los datos de posicionamiento recibidos por acciones HTTP Get del sistema desarrollado. • Se concluye que el producto Intel Galileo no es el mejor dispositivo para utilizar como un microcontrolador puro; se puede aprovechar mejor la herramienta cuando se utiliza con un sistema operativo. Recomendaciones • Para el uso del Intel Galileo o de cualquier otro microcontrolador es importante aprovechar los distintos puertos de comunicación que están disponibles para el desarrollo. En este proyecto, se utilizó únicamente el puerto serial para conectar los diferentes módulos utilizados, pero se 41 42 5 Conclusiones y recomendaciones podrı́a explorar el uso de módulos con otros protocolos y ası́ eliminar la necesidad de circuiterı́a externa en el equipo. • El conocimiento de la herramienta es indispensable para el desarrollo de un proyecto de este tipo. Para favorecer la efectividad en el trabajo, familiarizarse con el equipo antes del desarrollo de un sistema es una buena práctica. • Crear, para estos prototipos, un circuito impreso que permita una conexión más seria de la circuiterı́a externa y ası́ lograr un producto más cercano a uno que se pueda posicionar en el mercado. • La documentación del Galileo es insuficiente, por lo que serı́a prudente contribuir más a su desarrollo y a la exploración de sus diferentes caracterı́sticas. • A pesar de que el trabajo se basó en la documentación existente, se podrı́an desarrollar pruebas especı́ficas del consumo de potencia del Galileo, para que de esta forma sea más sencillo escoger los métodos de alimentación y sus verdaderas limitaciones al respecto. Bibliografı́a Adafruit (2014). Adafruit Ultimate GPS https://learn.adafruit.com/adafruit-ultimate-gps/overview. Overview. Arduino (2014). Arduino Uno. http://arduino.cc/en/Main/arduinoBoardUno. Blackman, S. (1999). Design and Analysis of Modern Tracking Systems. Artech House, United States. Dougherty, J. J. (1995). Gps modeling for designing aerospace vehicle navigation systems. En IEEE Transactions on Aerospace and Electronic Systems. Instruments, T. (2014). Quad 2-Line to 1-Line Data Selectors/Multiplexers. http://www.ti.com/lit/ds/symlink/54ls157.pdf. Intel (2014a). Intel Galileo. http://www.intel.com/content/www/us/en/doit-yourself/galileo-maker-quark-board.html. Intel (2014b). Intel Galileo Datasheet. https://communities.intel.com/servlet/JiveServlet/downloadBody/21835102-5-25148/Galileo Datasheet 329681 003.pdf. Peter Barry, P. C. (2011). Computer Architecture, Fifth Edition. Morgan Kaufmann, United States. Peter Barry, P. C. (2012). Modern Embedded Computing. Morgan Kaufmann, United States. Rhee, M. Y. (2009). Mobile Communications Systems and Security. John Wiley and Sons, Chichester, UK. Ross Bannatyne, G. V. (1995a). Introduction to microcontrollers i. En Wescon/98. Ross Bannatyne, G. V. (1995b). Introduction to microcontrollers i. En Wescon/98. Schmidt, M. (2011). Arduino: A Quick Start Guide. Pragmatic, North Carolina, United States. Studio, S. (2014). GPRS Shield http://www.seeedstudio.com/wiki/GPRS Shield V2.0. 43 V2.0. 44 Bibliografı́a van Diggelen, D. F. (2002). Indoor gps theory and implementation. En IEEE Position, Location and Navigation Symposium. A Subir código al Intel Galileo Se detallan los siguientes pasos para subir código al Intel Galileo. Estos pasos son especı́ficos para utilizar el Galileo como microcontrolador, de la manera que funciona un Arduino Uno. 1. Se descarga el IDE apropiado para subir código al Galileo. Se escoge el software adecuado de la siguiente dirección: https://communities.intel.com/docs/DOC22226. Existen versiones para los sistemas operativos Microsoft Windows, Mac OS X y Linux. Se debe destacar que se utiliza un programa diferente al que se utiliza con cualquier otra plataforma Arduino. 2. Se descomprime el archivo descargado y se ubica el directorio apropiado. En Windows, se recomienda el directorio C:/ ; en Mac, se prefiere el directorio Aplicaciones. Para Linux, no se especifica el directorio. 3. Conectar la fuente de poder de 5V al Galileo. 4. Conectar un cable micro-B USB al puerto USB Client del Galileo. Este cable siempre se conecta después de conectar la alimentación de 5V y se desconecta antes de desconectar la alimentación. 5. Si se utiliza el sistema operativo Windows, se debe instalar el driver apropiado. • Esperar a que Windows falle al tratar de instalar el driver. • Abrir Administrador de dispositvos (Panel de control >Sistema >Administrador de dispositivos). • Ubicar Gadget Serial v2.4, click derecho a ese ı́tem y presionar Actualizar software de controlador. • Elegir la opción que permite buscar el software requerido en el equipo y, en la ventana que emerge, presionar Examinar. • Navegar la carpeta de instalación del IDE hasta la dirección hardware\arduino\x86\tools; escoger esa dirección. • Presionar Instalar en la ventana de seguridad siguiente y esperar a que el sistema termine la instalación. 45 46 A Subir código al Intel Galileo • Confirmar el éxito de la instalación al revisar que en Administrador de dispositivos el Galileo aparece en la lista Puertos. 6. Anotar el puerto utilizado por el Galileo. Los pasos difieren para distintos sistemas operativos. • Para Windows, revisar en Administrador de dispositivos y en la lista Puertos el puerto COM utilizado. • En Mac, abrir la ventana de Información de sistema (Opciones >menú de Apple >Información de sistema), buscar la pestaña Red y encontrar el puerto del Galileo (su nombre será similar a usbmodemXXXX ). • En Linux, abrir una terminal y escribir ls /dev/ttyACM para averiguar el nombre del Galileo (será de la forma ttyACMX ). 7. Reiniciar al Galileo. Desconectar el sistema y volverlo a conectar, con el cuidado del paso 4. 8. Abrir el IDE instalado anteriormente. 9. Ir al menú Tools y escoger, en Serial Port, el puerto anotado en el paso 6. En Board, escoger al Galileo. 10. Actualizar el firmware del Galileo en el menú Help y escogiendo ”Firmware update”. 11. Escribir el código en el espacio apropiado y presionar el botón Upload, para subir el código al Galileo. 12. En adelante, repetir los pasos 8, 9, 10 y 11 para subir código al Galileo. B Código de aplicación principal de posicionamiento vehicular para Intel Galileo El texto siguiente es el código que permite al Galileo operar todo el sistema de posicionamiento. /* * Intel Galileo + Adafruit Ultimate GPS Breakout Board + Seeed GPRS Shield: GPS + GPRS Code (MUX) */ /* * * * * * * * * * Description: Galileo and GPS/GPRS interaction. Galileo reads data from GPS, operates external multiplexor and sends information to server via HTTP Get action via GPRS shield. Copyright (C) 2014, Sergio Valverde [email protected] This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Version 1.0 * Author: Sergio Valverde 47 48 B Código de aplicación principal de posicionamiento vehicular para Intel Galileo */ // Import libraries #include <string.h> #include <ctype.h> // Global variables int GPSLedPin = 13; int GPRSLedPin = 12; int sel = 11; String stat; String latitude; String dir1; String longitude; String dir2; String hour; String date; String url; // // // // // // // // // // // GPS LED pin GPRS LED pin Select pin for MUX operation Status variable Latitude variable Direction variable Longitude variable Direction variable Time variable Date variable URL char // setup: Initial configuration of the system void setup() { serial_setup(); // serial.println("Turn GPRS module on"); // delay(10000); // Serial.println("Begin setup"); // pin_setup(); // gprs_setup(); // gps_fix(); // Serial.println("Setup OK"); // } Serial setup Turn GPRS module on Wait 30 seconds Begin setup Pin mode setup GPRS module setup Initial GPS fix wait Setup OK // loop: Main program working void loop() { gps_parse(); // Get GPS data if (stat == "A" && (dir1 == "N" || dir1 == "S") && (dir2 == "E" || dir2 == "W")) { // Check if GPS data is ok url_setup(); // Set the URL up with GPS data http_get(); // Perform the HTTP Get function in order to communicate with the server } else { // If "stat" isn’t "A", data isn’t ok gps_fix(); // Wait GPS fix } } B Código de aplicación principal de posicionamiento vehicular para Intel Galileo 49 // serial_setup: Enables Serial communication with GPS and GPRS void serial_setup() { Serial.begin(9600); // Initialize Serial communication Serial1.begin(9600); // Initialize Serial1 communication delay(1000); // Waits 1 second } // pin_setup: Configures the status LEDs. Also, configures the MUX select pin. void pin_setup() { pinMode(GPSLedPin, OUTPUT); // Initialize GPS LED pinMode(GPRSLedPin, OUTPUT); // Initialize GPRS LED pinMode(sel, OUTPUT); // Initialize ’sel’ pin as an output pin delay(1000); // Waits 1 second } // gprs_setup: Connect GPRS to internet (SIM card Pin input, APN configuration and confirmation) void gprs_setup() { digitalWrite(sel, LOW); // Puts ’sel’ pin in LOW (GPRS Operation) delay(1000); // Wait 1 second Serial1.println("AT+CGATT?"); // Attach to GPRS service delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor delay(2000); // Wait 2 seconds Serial1.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""); // Bearer settings delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor delay(2000); // Wait 2 seconds Serial1.println("AT+SAPBR=3,1,\"APN\",\"internet.movistar.cr\""); // APN and provider settings delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor delay(2000); // Wait 2 seconds Serial1.println("AT+SAPBR=1,1"); // Bearer settings delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor delay(2000); // Wait 2 seconds digitalWrite(GPRSLedPin, HIGH); // Light GPS LED up when GPS has a fix } 50 B Código de aplicación principal de posicionamiento vehicular para Intel Galileo // toSerial: Writes in Serial port what is being sent and recieved by the GPRS module void toSerial() { while(Serial1.available()!=0) { // Checks if Serial1 information is available and not null Serial.write(Serial1.read()); // Print available Serial1 information in Serial port } } // url_setup: Sets the URL up with the GPS data void url_setup() { url = "AT+HTTPPARA=\"URL\",\"http://EXAMPLE.com/broadcast.php?lat="; // Initialization of the URL url.concat(latitude); // Concatenation of the GPS data url.concat("&lon="); url.concat(longitude); url.concat("&hour="); url.concat(hour); url.concat("&date="); url.concat(date); url.concat("\""); } // gps_fix: Checks if the GPS has a fix void gps_fix() { digitalWrite(GPSLedPin, LOW); // Turns off GPS LED up when GPS searches fix Serial.println("Getting GPS Fix"); // Getting GPS Fix int fixled; // Stores the analog read of the FIX led pin int fix = 0; // Counter while (fix < 12) { // If fix > 12, FIX led is off for more than a second (GPS has a fix) fixled = analogRead(A0); // Analog read to ’fixled’ if ( fixled > 100 ) { // Checks if ’fixled’ is over 100 (over around 0.5 V). If it is, it’s on fix = 0; // Restore ’fix’ to 0 to continue the loop } else { // FIX led is off fix++; // Increment ’fix’ } delay(100); // Wait 0.1 second } Serial.println("Fix obtained"); // Fix obtained digitalWrite(GPSLedPin, HIGH); // Light GPS LED up when GPS B Código de aplicación principal de posicionamiento vehicular para Intel Galileo 51 has a fix } // gps_parse: Parse the GPS data collected from the GPS module void gps_parse() { int byteGPS = -1; // Stores GPS immediate input char GPR[7] = "$GPRMC"; // Initial string of NMEA data from GPS int cont = 0; // Index for ’index’ array int ok = 0; // Counter for $GPR matching int count = 0; // Marks position of commas and asterisks in NMEA phrases int ind[13]; // Index of ’buffer’ char buffer[300] = ""; // GPS Buffer for (int i = 0; i < 300; i++) { buffer[i]=’ ’; // Fill ’buffer’ with empty data } stat = ""; // Status variable latitude = ""; // Latitude variable dir1 = ""; // Direction variable longitude = ""; // Longitude variable dir2 = ""; // Direction variable hour = ""; // Time variable date = ""; // Date variable digitalWrite(sel, HIGH); // Puts ’sel’ pin in HIGH (GPS Operation) delay(1000); // Waits 1 second do { byteGPS = Serial1.read(); // Read a byte from the GPS software serial port if (byteGPS == -1) { // Check if the GPS serial port is empty delay(100); // If port is empty, wait 0.1 seconds } else { buffer[count] = byteGPS; // If there is GPS serial port data, store it in ’buffer’. Potential ’buffer’ overflow here count++; // Increment ’count’ Serial1.write(byteGPS); if (byteGPS == 13) { // If received byte is 13, end of transmission (actual end is <CR><LF>). If not, go back to loop cont = 0; // Index for ’index’ array ok = 0; // Counter for $GPR matching for (int i = 1; i < 7; i++) { // Verifies the incoming command 52 B Código de aplicación principal de posicionamiento vehicular para Intel Galileo starts with $GPR. Loop starts at 1 because the first byte is <LF> (0x10) from the previous transmission if (buffer[i] == GPR[i-1]) { ok++; // If ’buffer[i]’ matches ’GPR[i-1]’, increment ’ok’ } } if(ok == 6) { // If ok == 6 (command starts with $GPR), continue and process the data for (int i = 0; i < 300; i++) { // Review whole ’buffer’ variable if (buffer[i] == ’,’) { // Check position of the coma (",") ind[cont] = i; // Store position of comma. Potential ’buffer’ overflow here cont++; // Increment ’cont’ } if (buffer[i] == ’*’) { // Check position of the asterisk (",") ind[12] = i; // Store position of asterisk cont++; // Increment ’cont’ } } Serial.println(""); // Print the GPS Data in the Serial monitor Serial.println(""); Serial.println("---------------"); for (int i = 0; i < 12; i++) { switch(i) { case 0 :Serial.print("Time in UTC (HhMmSs): ");break; case 1 :Serial.print("Status (A=OK,V=KO): ");break; case 2 :Serial.print("Latitude: ");break; case 3 :Serial.print("Direction (N/S): ");break; case 4 :Serial.print("Longitude: ");break; case 5 :Serial.print("Direction (E/W): ");break; case 6 :Serial.print("Velocity in knots: ");break; case 7 :Serial.print("Heading in degrees: ");break; case 8 :Serial.print("Date UTC (DdMmAa): ");break; case 9 :Serial.print("Magnetic degrees: ");break; case 10 :Serial.print("(E/W): ");break; case 11 :Serial.print("Mode: ");break; case 12 :Serial.print("Checksum: ");break; } for (int j = ind[i]; j < (ind[i+1]-1); j++) { B Código de aplicación principal de posicionamiento vehicular para Intel Galileo 53 // Review whole ’index’ variable Serial.print(buffer[j+1]); if (i == 1) { // If i = 2, ’status’ data stat += String(buffer[j+1]); // Store ’buffer’ status data in ’stat’ } else if (i == 2) { // If i = 2, ’latitude’ data latitude += String(buffer[j+1]); // Store ’buffer’ latitude data in ’latitude’ } else if (i == 3) { // If i = 2, ’latitude’ data dir1 += String(buffer[j+1]); // Store ’buffer’ latitude data in ’latitude’ } else if (i == 4) { // If i = 4, ’longitude’ data longitude += String(buffer[j+1]); // Store ’buffer’ longitude data in ’longitude’ } else if (i == 5) { // If i = 2, ’latitude’ data dir2 += String(buffer[j+1]); // Store ’buffer’ latitude data in ’latitude’ } else if (i == 0) { // If i = 0, ’time’ data hour += String(buffer[j+1]); // Store ’buffer’ time data in ’time’ } else if (i == 8) { // If i = 8, ’date’ data date += String(buffer[j+1]); // Store ’buffer’ date data in ’date’ } } Serial.println(""); } Serial.println("---------------"); } count = 0; // Reset the ’buffer’ index for (int i = 0; i < 300; i++){ // Review whole ’buffer’ variable buffer[i]=’ ’; // Empty ’buffer’ } } } 54 B Código de aplicación principal de posicionamiento vehicular para Intel Galileo } while (byteGPS != 13 || ok != 6); } // http_get: Send the GPS data to the remote server void http_get() { digitalWrite(sel, LOW); // Puts ’sel’ pin in LOW (GPRS Operation) delay(1000); // Waits 1 second Serial1.println("AT+HTTPINIT"); // Initialize HTTP service delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor Serial1.println("AT+HTTPPARA=\"CID\",1"); // Set CID parameter delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor Serial1.println(url); // Set URL delay(2000); // Wait 2 seconds toSerial(); // Send data to Serial monitor Serial1.println("AT+HTTPACTION=0"); // Set HTTP Action type (0 = GET, 1 = POST, 2 = HEAD) delay(6000); // Wait 6 seconds toSerial(); // Send data to Serial monitor Serial1.println(""); Serial1.println("AT+HTTPTERM"); // Finish HTTP service toSerial(); // Send data to Serial monitor delay(300); // Wait 0.3 seconds Serial1.println(""); delay(10000); // Wait 10 seconds } C Código de página web de prueba para el sistema de posicionamiento vehicular El siguiente código habilita la página web, con su servicio web, para la comunicación con el sistema fı́sico de posicionamiento vehicular desarrollado. Utiliza la API de Google Maps para permitir una interacción gráfica con el usuario. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <title>Bus Position Broadcast Prototype - RDI @ Intel Costa Rica</title> <style> html, body, #map-canvas { height: 75 %; margin: 30px; padding: 0px } </style> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script> <script> function initialize() { var getlat = document.getElementById(’gpslat’).value; var getlon = document.getElementById(’gpslon’).value; var partsLat = getlat.split(""); var lat0 = partsLat[0] + partsLat[1]; var lat1 = (partsLat[2] + partsLat[3])/60; var lat2 = (partsLat[5] + partsLat[6] + "." + partsLat[7] + partsLat[8])/3600; var maplat = +lat0 + +lat1 + +lat2; var partsLon = getlon.split(""); var lon0 = partsLon[1] + partsLon[2]; var lon1 = (partsLon[3] + partsLon[4])/60; 55 56 C Código de página web de prueba para el sistema de posicionamiento vehicular var lon2 = (partsLon[6] + partsLon[7] + "." + partsLon[8] + partsLon[9])/3600; var maplon = -(+lon0 + +lon1 + +lon2); var myLatlng = new google.maps.LatLng(maplat,maplon); var mapOptions = { zoom: 15, center: myLatlng } var map = new google.maps.Map(document.getElementById(’map-canvas’), mapOptions); var marker = new google.maps.Marker({ position: myLatlng, map: map, title: ’Prototype Position’ }); } google.maps.event.addDomListener(window, ’load’, initialize); </script> </head> <body> <div align="center"> <p> <?php $latitude = $_GET["lat"]; $longitude = $_GET["lon"]; $hour = $_GET["hour"]; $date = $_GET["date"]; if($latitude != "" && $longitude != "" && $hour != "" && $date != "") { $f = fopen("broadcastlog.txt", "w"); fwrite($f,$latitude); fwrite($f,"\n"); fwrite($f,$longitude); fwrite($f,"\n"); fwrite($f,$hour); fwrite($f,"\n"); fwrite($f,$date); fclose($f); } ?> <img src="galileo_logo.png" width="220" height="60" alt="intel_galileo_logo" /> </p> <p><strong><font size="5" face="verdana">Bus Position Broadcast</font></strong> <br> <font size="4" face="verdana">Prototype Test</font> C Código de página web de prueba para el sistema de posicionamiento vehicular 57 <br> </p> <table width="200" border="0"> <tr> <th scope="row"><font size="2" face="verdana">Latitude</font></th> <td><input type="text" name="gpslatitude" id="gpslat" value="<?php $myFile = "broadcastlog.txt"; $lines = file($myFile); echo $lines[0]; ?>" /></td> </tr> <tr> <th scope="row"><font size="2" face="verdana">Longitude</font></th> <td><input type="text" name="gpslongitude" id="gpslon" value="<?php $myFile = "broadcastlog.txt"; $lines = file($myFile); echo $lines[1]; ?>" /></td> </tr> <tr> <th scope="row"><font size="2" face="verdana">Time</font></th> <td><input type="text" name="gpshour" value="<?php $myFile = "broadcastlog.txt"; $lines = file($myFile); echo $lines[2]; ?>" /></td> </tr> <tr> <th scope="row"><font size="2" face="verdana">Date</font></th> <td><input type="text" name="gpsdate" value="<?php $myFile = "broadcastlog.txt"; $lines = file($myFile); echo $lines[3]; ?>" /></td> </tr> </table> </div> <div id="map-canvas"></div> </body> <footer> <div align="center"> <p style="color:#B6B6B4"> <font size="2" face="verdana">________________________________________________________________________ <font size="2" face="verdana">Bus Position Broadcast Prototype, 2014 | Sergio Valverde, RDI @ Intel Costa Rica</font><br><br> <font size="2" face="verdana"><a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/"><img alt="Licencia de Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">BPB Prototype Webservice</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Sergio Valverde</span> is licensed 58 C Código de página web de prueba para el sistema de posicionamiento vehicular under a <a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/">Creative Commons Attribution-NonCommercial 4.0 International License</a>.</font><br><br> </p> </div> </footer> </html> D Código de corrección de tasa de datos para comunicación serial en SIM900 de Seeed GPRS Shield V2.0 El texto siguiente es el código que permite al Galileo cambiar la tasa de datos con la que el SIM900 del Seeed GPRS Shield V2.0 se comunica de manera serial. /* * Intel Galileo + Seeed GPRS Shield: Change SIM900 baud rate */ /* * * * * * * Description: Changing the SIM900 baud rate from 19200 to 9600. Copyright (C) 2014, Sergio Valverde [email protected] This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Version 1.0 * Author: Sergio Valverde */ 59 60 D Código de corrección de tasa de datos para comunicación serial en SIM900 de Seeed GPRS Shield V2.0 // Import libraries #include <string.h> #include <ctype.h> // setup: Initial configuration of the system void setup() { Serial.begin(19200); // Begin Serial comunication with computer at 19200 bd Serial1.begin(19200); // Begin Serial comunication with SIM900 at 19200 bd delay(1000); // Wait 1 minute Serial1.write("AT+IPR 9600"); // Send AT Command to SIM900 and change baud rate to 9600 while(Serial1.available()!=0) { // Checks if Serial1 information is available and not null Serial.write(Serial1.read()); // Print available Serial1 information in Serial port } } // loop: Main program working void loop() {} E Código alternativo para obtención de datos GPS en Arduino Se adjunta una subrutina alternativa para el manejo de datos GPS desde un Arduino, con un módulo GPS de Cooking Hacks. Se modificó esta subrutina para adaptarla al Intel Galileo pero su funcionamiento tuvo grandes deficiencias, especialmente al detenerse sin razón aparentemente mientras el microcontrolador corrı́a el código. /* * Copyright (C) 2013 Libelium Comunicaciones Distribuidas S.L. * http://www.libelium.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Version 0.2 * Author: Marcos Yarza, Jorge Casanova */ // Include the SoftwareSerial library #include <SoftwareSerial.h> // Constants #define txPin 8 #define rxPin 9 //tx pin in GPS connection //rx pin in GPS connection 61 62 E Código alternativo para obtención de datos GPS en Arduino // Set up the GPS serial port SoftwareSerial gps = SoftwareSerial(rxPin, txPin); // Variables byte byteGPS = 0; int i = 0; int state = 0; char dataGPG[100]=""; char *pch; char *GGA[15]; int sat = 0; void setup() { //setup for Serial Port Serial.begin(9600); Serial.flush(); //setup for GPS Serial Port pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); gps.begin(4800); gps.flush(); //setup satellites signal pinMode(13, OUTPUT); // Turn off the led until a satellite signal digitalWrite(13, LOW); } void loop() { gps.flush(); Serial.flush(); Serial.println("Waiting GPS data..."); // Prepare all for reading GPS Serial Port memset(dataGPG, 0, sizeof(dataGPG)); // Remove previous readings byteGPS = 0; // Remove data byteGPS = gps.read(); // Read the byte that is in the GPS serial port delay(1000); // Find the desired string while(byteGPS != ’$’) { byteGPS = gps.read(); E Código alternativo para obtención de datos GPS en Arduino 63 } // Save the string in an array i=1; dataGPG[0] = ’$’; while(byteGPS != ’*’ ) { byteGPS = gps.read(); dataGPG[i]=byteGPS; i++; } dataGPG[i]= ’\0’; string(); // Call to the function that manipulates our string } /* This function will allow us to identify the data we need to get the longitude, latitude ... */ void string() { i=0; memset(GGA, 0, sizeof(GGA)); // Remove previous readings pch = strtok (dataGPG,","); // Analyze the saved interval in pch to see if it the needed string if (strcmp(pch,"$GPGGA")==0) { while (pch != NULL) { pch = strtok (NULL, ","); GGA[i]=pch; i++; } plot(GGA,"$GPGGA"); // Call to the function that is going to display the data } } /* This function organize the gps data received for printing in the serial monitor. */ void plot(char **GGAPrint, char *trama) { state = atoi(GGAPrint[5]); sat = atoi(GGAPrint[6]); if(trama=="$GPGGA" && state==1) { digitalWrite(13, HIGH); // Then 64 E Código alternativo para obtención de datos GPS en Arduino there are satellites, the LED switch ON Serial.println(""); Serial.println("----------------------------------------------"); Serial.print("UTC Hour -> "); Serial.println(GGAPrint[0]); Serial.print("Latitude -> "); Serial.print(GGAPrint[1]); Serial.println(GGAPrint[2]); Serial.print("Longitude -> "); Serial.print(GGAPrint[3]); Serial.println(GGAPrint[4]); Serial.print("GPS quality: 0=null; 1=GPS fixed -> "); Serial.println(GGAPrint[5]); Serial.print("Number of satellites -> "); Serial.println(sat); Serial.print("Horizontal Dilution of Precision -> "); Serial.println(GGAPrint[7]); Serial.print("Antenna altitude -> "); Serial.print(GGAPrint[8]); Serial.println(GGAPrint[9]); Serial.print("Geoid Separation -> "); Serial.print(GGAPrint[10]); Serial.println(GGAPrint[11]); Serial.println("----------------------------------------------"); Serial.println(""); } else { // If no satellite connection digitalWrite(13, LOW); // Turn off the LED Serial.println(""); Serial.println("-----------------------------"); Serial.print("|--- Satellites Used -->"); Serial.print(sat); Serial.println(" |"); Serial.println("|----Waiting location----|"); Serial.println("-----------------------------"); Serial.println(""); } }