jueves, 11 de octubre de 2007

Comenzamos

Ante el mar de dudas que había en torno al regalo que realizar a nuestro buen amigo Ángel, el pasado martes 28 de Agosto se tomo la decisión salomónica de crear especialmente para él un gadget representativo de la distancia que va ha poner entre nosotros.

Le regalaremos un Latinómetro; dispositivo portable y autónomo que indica en cualquier parte del mundo la distancia y dirección a la que se encuentra La Latina.

Coordenadas

Lo primero es saber donde está La Latina; sí, ya se que todo el mundo lo sabe, pero necesitamos conocer sus coordenadas geodésicas.



Ver mapa más grande

De momento utilizaremos las que nos facilita Google Maps:
  • Latitud: 40.411290
  • Longitud: -3.708580

Project plan

Ya tenemos la idea, ahora tenemos que implementarla.
Naturalmente, el Latinómetro obtendrá su posición mediante el sistema de posicionamiento global NAVSTAR (NAVigation System Time and Ranging-Global Position), comúnmente conocido como GPS, cuyos receptores están muy extendidos, incorporando la mayoría de ellos sensores magnéticos que permiten conocer la situación del Norte magnético.

Será necesario un elemento que procese la posición actual con respecto a la posición de referencia y el Norte magnético, calculando la distancia y dirección a ella; usaremos un microcontrolador.

Sólo nos falta un medio para visualizar los resultados, un display numérico para la distancia y una circunferencia de leds para la dirección, por ejemplo; y todo esto dentro de un contenedor.

Resumiendo, los componentes principales serán:
  • GPS (60€)
  • Microcontrolador (10€)
  • Sistema de visualización (20€)
  • Estuche (20€)

El presupuesto rondará los 110€ a los que habrá que sumarle los gastos de envío a certificado a Noruega. El plazo aproximado de ejecución será de unos 15 días invirtiendo alrededor de 50 horas de trabajo.

Esperamos tenerlo finalizado y listo para enviarlo el 11 de Septiembre.

El GPS

Empezaremos por conseguir la pieza más importante, el GPS.
Hemos seleccionado el modelo GPS-41MLR de marca Británica RF Solutions, que compraremos en Amidata (617-2230) por 59,60€.

Sus prestaciones no son para nada destacables, sus tiempos de arranque y readquisición son bastante pobres, pero es barato, fácil de conseguir, cuenta con conexión serie tanto RS-232 como LVTTL (0-3.3v), consume tan sólo 110mW alimentado entre 3.8v y 8.0v, y sólo pesa 14 gramos (34.0mm x 34.0mm x 8.6mm).


El microcontrolador

El microcontrolador, el autentico motor del Latinómetro, es a su vez el elemento más barato y fácil de conseguir. Utilizaremos uno de los nuevos microcontroladores con CPU de 8 bits hasta 48Mhz y controlador USB incorporado de la casa Microchip, concretamente el modelo de 28 pines 18LF2550, variante de bajo voltaje capaz de funcionar con tan sólo 2.0 voltios.

El Latinómetro será totalmente autónomo, aunque contará con puerto serie RS-232 para la realización tests y reprogramación del firmware. El puerto USB lo dejaremos configurado y preparado, aunque por falta de tiempo, no podremos implementar su uso, dejando esta funcionalidad a futuras revisiones del firmware.

Ya disponemos de él gracias a la generosidad del programa de "samples" de Microchip.

El sistema de visualización

El Latinómetro proporcionará dos valores, distancia y dirección.
La distancia será mostrada por medio de seis displays numéricos de 7 segmentos LED de cátodo común, cinco dígitos más un decimal para la distancia expresada en kilómetros. Los displays serán gobernados por el controlador MAX7219 de la casa
MAXIM.

La dirección será representada por un diodo LED triangular de 5mm de lado que se iluminará de entre los 32 ó 40 leds colocados formando una circunferencia alrededor de los displays. Serán controlados directamente por el microcontrolador, estando dispuestos como una matriz de 8 x 4 para 32 leds con una precisión de 10º, o de 8 x 5 para 40 leds con una precisión de 9º.

Los leds ya han sido adquiridos en Conectrol al precio de 0,10€ la unidad, unos 4€.
El MAX7219 se ha encargado en Diotronic, su precio rondará los 10€.
Los displays los compraremos en Telkon, a 1€ la unidad serán 6€.

Tres afamadas tiendas de componentes electrónicos de Madrid, en las que en total nos gastaremos 20€.

El estuche

Para que el acabado final sea lo más profesional posible, reutilizaremos un estuche originalmente pensado para contener una consola Nintendo DS de gran calidad de la marca MadCatz. El espació hábil para ubicar nuestros componentes será el mismo de la NDS; 148.6mm de ancho, por 84.6mm de alto, por 28.7mm de grosor.

Se puede encontrar en cualquier VIPS a 19.90€

El software

La única parte software del Latinómetro será el firmware que ejecutará el microcontrolador. Su desarrollo se realizará en C, utilizando el compilador integrado en el IDE de desarrollo de CCS.

El firmware deberá ser actualizable por lo que es necesario utilizar un bootloader; como de costumbre usaremos el Colt Bootloader que tan buen resultado ha dado en otras ocasiones.

El bootloader usa para cargar el firmware la UART hardware del microcontrolador, lo que implica utilizar un driver TTL/RS-232, usualmente un MAX232A, para obtener así un puerto serie RS-232 totalmente operativo tanto para actualizar el firmware, como para el diálogo (entrada/salida) con el dispositivo en funcionamiento.

El 18F2550 cuenta únicamente con una UART hardware, que al disponerla como entrada/salida del dispositivo impediría utilizarla para la conexión con el GPS. En este punto hay varias opciones, la más "fácil" es utilizar una UART emulada por software, ya que el dialogo con el GPS se realiza únicamente a 4800bps, pero al no ser estrictamente necesario usar la conexión de entrada/salida y la conexión con el GPS de forma simultanea, existe la posibilidad de utilizar la misma UART hardware para las dos conexiones mediante el cambio de las líneas de I/O. La conexión con el GPS se realizará también a niveles RS-232 aprovechando así los 4 drivers del MAX232A. Esta es una opción interesante que al menos probaremos.

El diálogo con el MAX7219, el controlador de los displays numéricos, se realiza mediante un protocolo serie de tres líneas (3-wire) algo diferente al SPI de su hermano gemelo el MAX7221 y cuyo driver posee implementado por hardware el 18F2250, pero al ser menos común es más caro y difícil de encontrar, y la implementación por software del 3-wire para "hablar" con el MAX7219 ha resultado bastante sencilla, este es un extracto del archivo "MAX7219.h".

Simulando el hardware

En el hardware encontramos el primer inconveniente y las primeras dudas.
Ya tenemos el estuche, adquirido según lo previsto, posee una ventana de 82mm de ancho, transparente con un tinte rojizo, lo que nos permite poder optar por dos variantes:
  • Estuche de tapa cerrada el cual hay que abrirlo para ver los indicadores.
  • Estuche de tapa translúcida a través de la cual se observan los indicadores.
Hasta aquí parece que todo bien, pero con tan solo 82mm de ancho, dejando 2mm de margen por cada lado, y teniendo en cuenta el tamaño de los leds triangulares, 5mm de lado, entran de forma cómoda sólo 24 leds lo que ofrecería una precisión de 15º, suficiente pero algo alejada de los 9º ó 10º de la estimación inicial con 36 ó 40 leds.
Pero lo peor es que el espacio interior no permite alojar seis comunes displays de media pulgada (0.5"), obligandonos a utilizar los raros displays de 0.4", ya que los también comunes de 0.3" quedarían muy pequeños.


Recordando que han de ser de cátodo común, cuando decidamos si o no a la ventana, elegiremos su color de fondo, ya que se hablaba de negro por aquello del máximo contraste, pero si decidiéramos utilizar la ventana, tal vez irían mejor con un fondo más claro, gris, blanco, rojizo, etc.

Simulando el software

El software ya está funcionando, por supuesto en el simulador.
Una vez más, estamos utilizando las bondades del VSM (Virtual System Modelling) integradas en el entorno de diseño PROTEUS, fruto del laboratorio Británico
Labcenter Electronics.

Listas las interfaces con el MAX7219 y con la matriz de 8 x 3 en la que estarán dispuestos los 24 leds, el siguiente vídeo es un pequeño extracto de su funcionamiento en el simulador.

Todavía está pendiente la interface más importante, la encargada de "hablar" en el GPS mediante el protocolo que utilizan todos ellos, NMEA-0183. Tengo la esperanza de que alguien se anime a colaborar y desarrolle esta parte.

Disfrutad del viaje, no sólo del destino

Seguro que Luis Alberto lo comprende perfectamente, no estoy tan seguro del resto.

Sí, llevamos dos semanas de retraso, que son justo las dos semanas que se ha retrasado Amidata en la entrega de los pedidos.

El diseño de las PCBs (Printed Circuit Board) ya está terminado, y lo que falta podría terminarse en esta semana para enviarlo el Jueves o Viernes.

Ha aparecido una voz discordante que propone que se lo enviemos para el día de su cumpleaños, al parecer el próximo 9 de Noviembre. Ya veremos los comentarios al respecto.

NMEA-0183

O simplemente NMEA es el protocolo de conexión de instrumentos de navegación marítima definido por la asociación estadounidense sin animó de lucro National Marine Electronics Association. Su primera versión se publicó en Marzo de 1983 y su última revisión (v3) a finales del 2001.

Hoy en día es el standard de intercambio de datos utilizado por la mayoría de sistemas de navegación, incluyendo por supuesto los dispositivos GPS.

El standard NMEA define tanto la capa eléctrica, exactamente la EIA-422A considerándose compatible con la RS-232, como el formato de las tramas de datos.

Las tramas de datos NMEA están formadas por una serie de caracteres ASCII, hasta un máximo de 83. Todas ellas comienzan por el carácter "$" seguidos de dos caracteres que identifican el dispositivo, tres caracteres que identifican la sentencia, los datos a transmitir separados por comas ",", un asterisco "*" seguido por dos caracteres de checksum (un simple XOR desde el ID al último dato), y terminan con los caracteres de control CR y LF (CR: Carriage Retun y LF: Line Feed).

$IDSEN,DATO1,DATO2,...,DATOn*CK\r\n

Ejemplo de tramas NMEA:

$GPGLL,4400.000,N,07143.125,W,020822,A*35
$PGRMZ,584,f,3*12
$PGRMM,WGS 84*06
$GPBOD,347.7,T,004.3,M,MOB,R2NHB*23
$GPRTE,1,1,c,0,TYC,R2NHB,MOB*01
$GPWPL,4119.832,N,07205.454,W,TYC*16
$GPRMC,020824,A,4400.00,N,07143.125,W,00.0,038.6,161201,016.6,W*7C $GPRMB,A,9.99,L,R2NHB,MOB,4437.379,N,07300.351,W,066.9,304.5,,V*66$GPGGA,020824,4400.000,N,07143.125,W,1,00,2.0,177.9,M,-32.2,M,,*7F
$GPGSA,A,3,,,,,,,,,,,,,10.1,2.0,3.0*03$GPGSV,1,1,00,,,,,,,,,,,,,,,,*79
$PGRME,15.0,M,22.5,M,15.0,M*1B

Para nuestro propósito sólo necesitamos obtener del dispositivo GPS (ID=GP), los valores de la sentencia MRC (Recommended minimum specific GPS/Transit data), cuyo formato para la v3 de NMEA es el siguiente:

$GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,x.x,a,m*hh
Field #
01 = UTC time of fix
02 = Data status (A=Valid position, V=navigation receiver warning)
03 = Latitude of fix
04 = N or S of longitude
05 = Longitude of fix
06 = E or W of longitude
07 = Speed over ground in knots
08 = Track made good in degrees True
09 = UTC date of fix
10 = Magnetic variation degrees (Easterly var. subtracts from true course)
11 = E or W of magnetic variation
12 = Mode indicator, (A=Aut., D=Diff., E=Estim., N=Invalid)
13 = Checksum

Las coordenadas geográficas eclípticas, Latitud y Longitud, vienen expresadas en grados y minutos con decimales sexagesimales, junto al hemisferio o lado del ecuador de dirección, por lo que habrá que convertirlas a coordenadas absolutas.

Es decir, en una sentencia como esta:

$GPRMC,154653,V,4428.2011,N,00440.5161,W,000.5,342.8,050407,,,N*7F

Tenemos una latitud de 44 grados con 28.2011 minutos al Norte, y una longitud de 4 grados con 40.5161 minutos al Oeste, que convertidas a valores absolutos serían:

  • Latitud: 44.470018
  • Longitud: -4.675268

Un punto en mitad del mar Cantábrico......

Distancia y Rumbo

Mucho hemos hablado de Latitud y Longitud, pero ciertamente sin explicar con claridad a que nos estamos refiriendo.

Estas dos coordenadas geográficas indican la distancia en grados sexagesimales desde el punto en cuestión hasta las líneas base de referencia; el paralelo cero o Ecuador para la Latitud, y el meridiano cero o meridiano de Greenwich para la Longitud.

Para la Latitud, sabiendo que la circunferencia que corresponde al Ecuador mide 40076 km, 1º equivale a 113.3 km.

Para la Longitud, sabiendo que junto con sus correspondientes antimeridianos se forman circunferencias de 40007 km de longitud, 1º equivale a 111.11 km.

A veces es conveniente usar en diversos problemas el concepto de Colatitud, que es el complemento de la latitud a 90º, es decir es el ángulo que forma la vertical del lugar con el eje Norte-Sur, o bien, dicho de otro modo, el arco de meridiano terrestre comprendido entre el lugar y el polo geográfico más próximo. Es evidente, en definitiva, que para un lugar cualquiera de la superficie terrestre es: Latitud + Colatitud = 90º.

La distancia entre dos puntos, P y P' de la superficie de la Tierra es la longitud del arco de círculo máximo comprendido entre el punto P y el punto P'. Para hacer estos cálculos aproximaremos el elipsoide terrestre por la forma esférica, y calcularemos el arco de círculo máximo entre ambos puntos mediante la fórmula de los cosenos de la trigonometría esférica.

Sean los puntos P y P' dados por sus coordenadas:

  • P -> Latitud: θ Longitud: λ Colatitud: φ = 90º - θ
  • P' -> Latitud: θ' Longitud: λ' Colatitud: φ' = 90º - θ'

Sea ahora el triángulo esférico P-N-P' formado por ambos puntos y el polo Norte. Se conocen los lados PN= φ y P'N= φ' , así como el ángulo diedro PNP'= λ - λ' . Por tanto, aplicando el teorema de los cosenos de la geometría esférica podemos calcular el tercer lado de dicho triángulo a partir del arco de círculo máximo entre ambos puntos:

cos αPP' = cos φ · cos φ' + sen φ · sen φ' · cos (λ - λ')

αPP' = arc cos [cos φ · cos φ' + sen φ · sen φ' · cos (λ - λ')]

Para calcular la distancia d entre los puntos P y P' emplearemos la proporción de 360º a 40000 kilómetros con la del arco αPP' a su longitud dPP'

dPP' = 40000αPP'
360

Se obtiene así la siguiente fórmula aproximada:

dPP' = 40000arc cos [cos φ · cos φ' + sen φ · sen φ' · cos (λ - λ')]
360

El camino más corto para desplazarse desde el punto P al punto P', es el arco de círculo máximo comprendido entre P y P'. La orientación de ese arco con respecto al polo Norte, es decir el ángulo NPP', es el Rumbo que ha de seguir un objeto en navegación desde P a P'.

Dicho de otro modo, el rumbo de navegación desde un punto P a un punto P' es el ángulo que forma el arco de círculo máximo PP' con el meridiano PN, en la dirección del Norte.

El Rumbo a seguir para desplazarse por un arco de círculo máximo desde el punto P al punto P' cumple el teorema de los senos:

sen NPP'=sen (λ - λ')-> NPP' = sen φ' · cos (λ - λ')
sen φ'sen dPP'sen dPP'

Se tiene en definitiva:

rumbo = NPP' = arc sensen φ · sen (λ - λ')
sen dPP'

Expresado en función de las coordenadas de los puntos P y P':

rumbo = arc sen sen φ · sen (λ - λ')
sen [ arc cos [cos φ · cos φ' + sen φ · sen φ' · cos (λ - λ')]]

De esta forma tan sencilla podemos calcular la distancia y el rumbo entre dos puntos cuyas coordenadas geográficas son conocidas.

Últimos detalles

Sólo con unos ligeros cambios sobre la idea original, se han pulido los últimos detalles.
Finalmente hemos optado por utilizar como Bootloader el Tiny Bootloader, modificando los fuentes originales para adaptarlos a nuestro cristal de cuarzo de 4Mhz y bajarle la velocidad de upgrade del firmware a 57600 bps, compilándolos con el MPASM™ macro assembler del entorno de desarrollo de Microchip MPLAB.

La velocidad de funcionamiento final se establece mediante el preescaler en 4.8Mhz, más que suficiente para procesar los datos recibidos por el GPS (una sentencia $GPRMC por segundo a 4800bps), atender la consola serie a 9600bps y hacer la iluminación de los leds intermitente; todo ello de forma simultanea gracias a la utilización de tres rutinas de interrupción (IRQ). Se ha tratado que la velocidad sea la mínima posible, minimizando así el consumo energético, el cual es provisto por 6 pilas AAA de Litio de última generación.

Tambien se han realizado cambios en la forma de medir la distancia y el rumbo, ya que la excesiva complejidad de las formulas inicialmente previstas, junto a la implementación en Radianes de las funciones senoidales del compilador CCS PCWH, introducían un error excesivo, por lo que para el calculo de la distancia se ha utilizado la "distancia ortodrómica" que define la trigonometría esférica, y que calculamos mediante la tan poco conocida como elegante formula Haversine en la cual se toma como referencia el radio de la tierra, 6367.45 Kilómetros.
El calculo del rumbo se ha simplificado a la arco tangente del cociente de las diferencias de latitud y longitud, el cual luego se expresa en función del curso que indica el GPS que se está siguiendo.

Simple, pero funciona con gran exactitud. Y para asegurarnos que funcionará bien en cualquier parte del mundo, lo hemos probado con la ayuda de un simulador de GPS; el resultado es muy bueno, como puede apreciarse....

Entregado

Jueves 11 de Octubre de 2007, con un mes de retraso sobre el plan previsto, hicimos entrega del Latinómetro terminado.


miércoles, 10 de octubre de 2007

2388.5 kilómetros

Menudo chasco, y yo que pensaba que las paradas de La Latina y Opera estaban juntas.

Ha tenido que venir un Asturiano para que nos demos cuenta de que están a 2388 km. Lo tendré en cuenta la próxima vez que coja el metro, y recordaré que no todos tenemos tan fácil ir de Opera a La Latina.....

Al final no hubo detención en la aduana, ni traslado a Guantanamo; Ángel llegó a Oslo sano y salvo junto con todo su equipaje, y nos envía este mensaje:


Hola a todos,

gracias de nuevo por este magnifico recuerdo que nunca podre olvidar, os lo garantizo :)

Perdonadme por la tardanza, pero he estado super liado y he tenido un problema con las pilas ya que ha estado encendido todo el viaje de vuelta, pero al fin lo he probado.

La distancia que nos separa es de 2.388,5 KM. Las fotos que os adjunto son desde el lugar donde trabajo. He dejado el latinometro en mi mesa, al lado del ordenador. Lamentablemente no funciona dentro de edificio. Pero cuando este agobiado, especialmente por la gente tan sosa y rara con la que trabajo ahora (claro que después de estar con vosotros estoy seguro que no voy a encontrar gente igual en ningún otro lugar), puedo salir a la terraza y encender mi latinometro, fumarme un cigarrito de los mios y pensar que estáis a unos 2.388 Km en la dirección que me indique mi querido LATINOMETRO.

Gracias a todos, no solo por este regalo, sino por el regalo que ha sido conoceros, trabajar y hacer cosas juntos. Cada vez que pase por Madrid estad seguros que os avisaré para intentar veros.

Un abrazo a tod@s, TOD@S.

PD: No veáis como hipnotiza mirar la circunferencia de leds mientras busca señal...

Ángel