Informe - Escuela de Ingeniería Eléctrica

Anuncio
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("");
}
}
Descargar