Obtener coordenadas GPS con el módulo SIM7100A.
Buenas a todos, hoy les traigo una guía para poder obtener coordenadas GPS a través del módulo SIM7100A, comencemos.
Los materiales que utilizaremos son un arduino (en cualquiera de sus versiones), un módulo GPRS/GPS SIM7100A y una fuente de alimentación para alimentar el circuito, si es la primera vez que vas a utilizar el módulo SIM7100A, te recomiendo que leas esta guía; si ya tienes el conocimiento de las conexiones y configuraciones básicas entonces comencemos!.
Primeramente realizamos la conexión física de nuestros dispositivos, que es como sigue:
Una vez realizado las conexiones, cargamos el siguiente código para poder realizar las pruebas manuales, y luego escribiremos un código que automatizará todo el proceso.
Una vez subido el código empezaremos a probar manualmente los comandos AT para utilizar la geolocalización (Hasta este punto supongo que su módulo ya estableció comunicación, y ya está configurado a la velocidad de 4800 baudios, si no es así eche un vistazo aquí), los comandos son los siguientes:
La documentación del módulo a partir de la página 489 contiene la explicación detallada de cada uno de los comandos aquí utilizados.
Activar el modo independiente de rastreo: AT+CGPS=1,1
El GPS tiene varios modos de funcionamiento, pero en este caso solo utilizaremos el modo independiente, el cual utiliza solo los satélites de geolocalización para obtener la ubicación.
Desactivar el modo rastreo: AT+CGPS=0
Este comando desactiva el GPS.
Setear la precisión del GPS: AT+CGPSHOR=50
Este comando configura la precisión mínima del GPS, es decir una vez encendemos el GPS este comenzará a calcular la posición y una vez tenga el error menor al seteado en este comando entonces en ese momento estará disponible para utilizarlo, mientras el error sea mayor el módulo no nos retornará la posición; en este caso se configuró la precisión a 50 metros, ajústelo de acuerda a sus necesidades.
Solicitar posición GPS: AT+CGPSINFO
Este comando lo que hace es retornar una cadena de información con datos como latitud, longitud, velocidad, altitud y otras informaciones; la información retornada es similar a lo siguiente:
- +CGPSINFO: 3113.393766,N,12121.176625,E,061108,075358.0,19.5,0
La información contenida está separada por “,” cada posición entre las comas representa un dato en específico, como sigue es el orden de la información
+CGPSINFO: [latitud],[N/S],[longitud],[E/O],[fecha],[UTC time],[altitud],[velocidad],[curso]
Comandos utilizados en algunos casos especiales.
El módulo SIM7100A tiene la capacidad de trabajar con 2 tipos de antenas.
Las antenas pasivas: Son antenas que funcionan como receptoras de señal sin necesidad de alimentación externa, es decir las conectas a la entrada de señal y listo, por otro lado estas antenas ofrecen menos rendimiento en locales que no son abiertos debido a su incapacidad de amplificar la señal y cuando pierden visión directa con los satélites pierden la señal.
Las antenas activas: Estas antenas cuentan con un circuito electrónico que amplifica la señal recibida lo que le permite funcionar en locales sin visión directa a los satélites, como dentro de una casa por ejemplo (esto es relativo a la cantidad de obstáculos que haya en el camino de la señal), o en terrenos accidentados donde una antena activa perdería fácilmente la señal. Todos estos beneficios de rendimiento implica tener que alimentar el circuito electrónico amplificador de la antena, y hay dos casos respecto a esto, una es que el propio modulo ya tenga implementado la alimentación a la antena, es decir, existe un circuito de conexión de la antena al módulo que en la documentación página 47 se muestra de la siguiente forma:
En la imagen se observa una fuente de energía llamada VDD el cual puede provenir de dos lugares, la primera es que esté conectado directamente con el pin VBAT el cual como sabemos recibe los 3.7v de alimentación, y en consecuencia este estaría alimentado a la antena, el otro caso es que provenga de un pin del SIM7100A el cual se debe activar manualmente para que alimente la antena, esta segunda opción se utiliza en antenas que se alimentan con voltajes menores a 3.7 v, ya que este pin permite regular el nivel de tensión deseado, cosa que no ocurre con el modo directo a la batería el cual está sujeto al nivel de tensión de la batería, para nuestra suerte la antena con la que contamos soporta niveles de tensión desde 2.7v hasta 5v, y el módulo viene adaptado con la alimentación directa de la batería, es decir no es necesario activar el pin de alimentación porque ya trae alimentación implementada en el hardware. Ahora veremos cómo activar el pin de alimentación caso este no sea su caso.
Comando para setear el nivel de tensión deseado: AT+CVAUXV=3050
Este comando configura el nivel de tensión deseado, en este caso 3v, la tensión esta expresada en mili voltios (mV).
Comando para activar o desactivar pin de alimentación: AT+CVAUXS=1
Una vez seteado el nivel de tensión deseado, activamos el pin para que nos provea de alimentación con este comando, caso queramos desactivarlo usamos el comando AT+CVAUXS=0.
Hora de probar!
Ya que tenemos definido toda la teoría, probemos.
Primero abrimos nuestra terminal putty y encendemos nuestro modulo.
Primero: Encendemos el GPS con el comando AT+CGPS=1,1.
Segundo: Fijamos la precisión a 50 metros con el comando AT+CGPSHOR=50.
Con esto ya está las configuraciones para poder leer los datos del GPS, aquí esperamos un rato
Tercero: Solicitamos los datos del GPS con el comando AT+CGPSINFO.
Los datos devueltos son datos de ubicación y es similar a lo siguiente:
+CGPSINFO: 2x24.944169,S,05x36.992602,W,130319,174505.0,236.5,0.0,12.4
El orden de la información devuelta esta explicada más arriba, si procesamos esto los datos seria lo siguiente.
- Latitud: -2x.4157
- Longitud: -5x.6616
Como podemos observar, los valores de latitud y longitud decodificados correctamente, a continuación vamos a explicar parte por parte el código
En esta primera parte realizamos todas las configuraciones iniciales, en la línea 3 inicializamos el constructor con los parámetros de los pines donde irá conectado nuestro modulo, como vemos son el pin 7 y 8 que corresponde a Rx y Tx respectivamente. Seguidamente creamos las variables globales que vamos a utilizar en todo el código, luego ingresamos al void setup() donde configuramos nuestra velocidad de comunicación a 4800 baudios, seguidamente desactivamos el eco de comandos con el comando ATE0, esto debido a que por defecto el modulo al enviarle una comando él nos devuelve el comando que le enviamos junto con la respuesta de ese comando y nosotros solo necesitamos la respuesta ya que el comando que enviamos no nos es útil y al desactivarlo solo nos enviara la información útil, luego encendemos el GPS con el comando AT+CGPS=1,1 y luego fijamos la precisión a 50 metros; esperamos 30 segundos hasta que el GPS tenga señal para pasar al hilo de ejecución principal.
Este trozo de código realiza lo siguiente, envía un comando que le pasamos como parámetro, lee la respuesta, la procesa y nos devuelve la respuesta.
Esta función lo que realiza es decodificar la cadena de información devuelta por el GPS, los separa en campos para poder usarlos independientemente, ya que como sabemos las información viene separada por comas y cada espacio entre comas es un campo de información, en total son 13 campos de información.
Esta función lo que realiza es la corrección de la información dependiendo de en qué hemisferio se encuentre el GPS, imaginemos que la tierra es un enorme plano cartesiano y está dividido entre el meridiano de Greenwich que es la ordenada y meridiano del Ecuador que es la abscisa y dependiendo de en qué cuadrante se encuentre se determina si la latitud o longitud es negativa o no.
Esta función lo que hace es limpiar la entrada del buffer para que este esté limpio al momento de leer la información y no haya información basura que corrompa nuestros datos.
Todo el código fuente del proyecto puede encontrarlo en mi repositorio. Hasta la próxima!.