Archivo de la etiqueta: tarea

Datalogger GPS con exportación a Excel y Google Maps

¿Has pensado alguna vez en registrar las rutas que realizas en bicicleta, andando, corriendo, con tu coche o en moto?

Existen multitud de dispositivos en el mercado para registrar tus tracks (trayectos) tanto para deporte como para temas de seguridad o seguimiento de flotas de vehículos, pero… ¿por qué no hacelo tú mismo?

Con ArduinoBlocks vamos a construir y programar un datalogger (registrador de datos) de nuestros trayectos de una forma muy sencilla, además vamos a poder volcar esos datos registrados en formato CSV para tratarlos en programas como Excel o poder visualizar los datos sobre un mapa tipo Google Maps….

Material necesario:

Esquema de conexión:

SD MOSI -> Pin 11

SD MISO -> Pin 12

SD SCK -> Pin 13

SD CS -> Pin 4

GPS RX -> Pin 2

GPS TX -> Pin 3

Led (a través de resistencia 220 Ω a GND) -> Pin 5 (PWM)

Programa:

Inicialización de los módulos:

Bucle principal del programa:

El led está encendido a muy poca intensidad durante el funcionamiento del programa, por un lado se comprueba contínuamente si hay algún dato pendiente de procesar recibido por el puerto serie (desde la consola), por otro lado cada 5 segundos se comprueba si el GPS tiene datos válidos y en ese caso se guarda un registro en la tarjeta SD.

Procesar comando (un número recibido desde la consola serie):

Si recibimos un “1” volcamos todo el contenido del archivo de registro a través del puerto serie (para visualizarlo en la consola)

Si recibimos un “2” borramos el archivo de registro, para hacer un reset y empezar un nuevo registro vacío.

Registrar fecha/hora y posición en una línea en el archivo de registro:

El formato es CSV separado por “;”

Formato de línea guardado:   d/m/y h:m:s ; latitud ; longitud ; altitud

Resultado del funcionamiento:

Probamos a realizar un recorrido con el GPS datalogger, cuando el receptor GPS obtiene una posición correcta vemos como cada 5s se ilumina intensamiente el led indicando que se realiza el registro de datos.

Para mover el datalogger más fácilmente, se adapta a una versión “portátil” del montaje… el tupperware nunca falla! 😉

Desde la consola enviando el valor “1” podemos recibir todos los datos almacenados:

Copiamos y pegamos todas las líneas de log en un editor de textos (bloc de notas o similar) y lo guardamos con extensión “.csv”

(Otra opción sería desconectar el datalogger, extraear la tarjeta y copiar el archivo “gps.csv” al PC)

Con doble click podemos abrirlo en Excel o LibreOffice Calc para analizar y procesar la información. Añadiremos los nombres de las columnas para poder procesar la información automáticamente con otra aplicación. Guardamos en formato Excel (.xls)

En la siguiente web podemos subir el archivo Excel generado y obtener el archivo KML compatible con Google Earth:

https://www.earthpoint.us/ExcelToKml.aspx

Una vez generado podemos abrir y visualizar todos los puntos sobre el mapa (al usar la altitud los puntos se muestran según la elevación si no se quiere simplemente eliminamos la columna de la altitud del excel).

Posibles mejoras y funcionalidades del proyecto:

  • Añadir un pulsador o botón para iniciar y parar la recogida de datos cuando queramos.
  • Modificar el tiempo de registro (cuanto menor tiempo entre toma de registros tendremos más precisión pero también ocuparán más los datos)
  • Añadir más campos al archivo de registro (por ejemplo la velocidad).
  • No recoger datos cuando no hemos recorrido una distancia mínima desde el último punto recogido o cuando la velocidad actual es muy baja (por ejemplo menor que 2 km/h) y así no registrar datos mientras no nos movemos.
  • Añadir una pantalla LCD para mostrar información básica.

Enlace al proyecto compartido:

http://arduinoblocks.com/web/project/869

Y recuerda… si quieres ver más proyectos resueltos y un manual completo del entorno ArduinoBlock tienes en Amazon disponible el libro oficial…

https://www.amazon.es/ArduinoBlocks-Programaci%C3%B3n-visual-bloques-Arduino/dp/1535513284/

Compartir

Multitarea sin bloqueo 2.0

Si algo se puede hacer más fácil… ¿por qué no hacerlo?

En una entrada anterior del blog se explicaba un sencillo sistema para simular un sistema multitarea donde cada tarea se ejecuta en un intervalo de tiempo según su necesidad. El único requisito era no interferir en este sistema de gestión multitarea con bloques del tipo “Esperar” que bloquean el programa Arduino totalmente durante su ejecución o con bucles que se repiten por tiempo indefinido.

Los microprocesadores de un único núcleo como el de Arduino “sólo” saben ejecutar una cosa detrás de otra, son los sistemas operativos los que se encargan de “partir” en trocitos los programas e ir ejecutando un poquito de cada uno para simular la multitarea… pero Arduino no da tanto como para instalarle un sistema operativo por lo que ese trabajo de dividir las tareas la hacemos nosotros.

Entrada anterior del blog respecto a este tema (leer antes si no se ha leído):

Multitarea sin bloqueo

Entender el capítulo anterior es fundamental… pero y si lo podemos simplificar aún más.. ¿por qué no?

Pues con este nuevo bloque de ArduinoBlocks implementamos automáticamente todo el funcionamiento explicado anteriormente.

2016-12-05-18_19_35-arduinoblocks

El código introducido dentro de este bloque se “intentará” ejecutar cada 1000 milisegundos (o los que indiquemos). Y digo “intentará” pues esto dependerá del resto del programa de que no bloquee el funcionamiento y de tiempo a que la tarea se ejecute periódicamente con esta frecuencia.

Si han pasado menos de 1000 ms (o los que se indiquen) desde la última ejecución, el contenido del bloque se ignorará y se continuará con la ejecución pero si no (si han pasado 1000 ms o más, por si alguna otra tarea ha retrasado) se ejecutará y se volverá a empezar a contar el tiempo desde entonces para la próxima ejecución.

Mejor con un ejemplo:

2016-12-05-18_23_26-arduinoblocks

http://arduinoblocks.com/web/project/590

Si añadimos bloques que “bloqueen” el funcionamiento del programa sin dejar avanzar (tipo bloques “Esperar” o un bucle que se quede esperando una condición que no llega) el sistema ya no realizará las tareas en los intervalos correctamente.

Además si alguna tarea tarda más de la cuenta en ejecutarse y pasar a la siguiente retrasará al resto (normalmente las operaciones dentro de las tareas se ejecutan muy rápido y no hay ese problema)

Ejemplo con funciones, dividiendo por prioridad de las tareas:

2016-12-05-18_28_02-arduinoblocks

Tareas críticas:  por ejemplo detectar una pulsación de entrada, leer un sensor, actuar según una condición, leer conexión serie / bluetooth,….

Tareas cada 1s: por ejemplo realizar cálculos con los datos de entrada y otros procesamiento,…

Tareas cada 5s: por ejemplo actualizar una pantalla, enviar información por serie o bluetooth, etc…

 

Y recuerda para dominar ArduinoBlocks ya está disponible el libro oficial en Amazon:

portada_delante_small

Compartir

Multitarea sin bloqueo

Muchas veces queremos realizar diferentes tareas dentro de nuestro programa. El problema de utilizar bloques de “espera” es que bloquean el funcionamiento de todo el programa hasta superar el tiempo de espera indicado.

Aquí muestro como realizar fácilmente un sistema de tareas que permite la ejecución de cada una de ellas cada cierto tiempo. En el ejemplo se realizan 2 tareas cada 3s y 5s respectivamente y a parte una tarea principal que se ejecutaría en cada ciclo del bucle principal. (podrían ser el número de tareas que queramos).

Lo más importante es que ninguna tarea debe bloquear la ejecución, es decir, no debemos realizar tareas que usen los bloques de esperar ni con  bucles que se queden esperando una condición por ejemplo.

captura-de-pantalla-de-2016-12-01-11-45-21

 

Por ejemplo, siguiendo el ejemplo anterior vamos a ver como realizar que la tarea 1 (cada 3s) enciende y apaga el led (3 segundos encendido/ 3 segundos apagado) y la tarea 2 muestra el estado de un pulsador.

captura-de-pantalla-de-2016-12-01-11-59-34

http://arduinoblocks.com/web/project/556

Todo esto y muchos más ejemplo e información en el libro oficial ArduinoBlocks:

https://www.amazon.es/ArduinoBlocks-Programación-visual-bloques-Arduino/dp/153551328

Compartir