En el tutorial anterior , aprendimos cómo conectar un módem GSM-GPRS SIM900 con Raspberry Pi (RPi) y una computadora de escritorio. Empleamos comunicación serie UART para "hablar" con el módem SIM900. Al utilizar la comunicación de datos bidireccional con el módem a través de una interfaz UART estándar , pudimos realizar/recibir llamadas y enviar/recibir mensajes SMS en el RPi y una computadora de escritorio.
Utilizando la misma interfaz y protocolo UART en este tutorial, conectaremos un módulo del sistema de posicionamiento global (GSP) con RPi.
Usamos el módulo GPS, NEO-6MV2. Este es un receptor GPS de bajo costo que se usa comúnmente en dispositivos integrados y proyectos robóticos (hay otros de varios proveedores diferentes). Un receptor GPS proporciona su ubicación conectándose a los satélites GPS disponibles.
Se puede utilizar un receptor GPS para rastrear una ubicación. Por ejemplo, conectando un receptor GPS (como el NEO-6) y un módem GSM (como el SIM900) a un controlador a bordo o a una computadora, podemos diseñar un sistema de seguimiento de vehículos. En este sistema, el receptor GPS obtiene la ubicación actual del vehículo y el módem GSM-GPRS comunica esta ubicación a un servidor remoto a través de una red móvil.
Del mismo modo, podemos utilizar un receptor GPS en un dron para rastrear su ubicación y gestionar un vuelo guiado por GPS. Los mismos receptores GPS se utilizan en teléfonos inteligentes, tabletas y sistemas de navegación GPS.
Ahora, aprendamos cómo conectar un receptor GPS con una computadora integrada como la Raspberry Pi.
El módulo GPS NEO-6MV2
El NEO-6MV2 es un receptor GPS independiente que se utiliza para la navegación. El receptor GPS se conecta a satélites GPS para obtener su propia ubicación. Luego genera la latitud y longitud de su posición como datos en serie.
El módulo NEO-6 se basa en un motor de posicionamiento Ublox-6 de 50 canales que tiene un tiempo de primera fijación (TTFF) de un segundo. Este motor GPS tiene dos millones de correlacionadores y es capaz de realizar búsquedas masivas paralelas de tiempo/frecuencia en el espacio. Esto le permite encontrar satélites al instante. El módulo también tiene un factor de forma pequeño que lo hace ideal para dispositivos móviles que funcionan con baterías.
El módem GPS NEO-6M funciona con una tensión de alimentación de 2,7 a 3,6 V. Comunica datos GPS según el protocolo NMEA o UBX. Si bien NMEA es un protocolo ASCII estándar, UBX es el protocolo binario propietario de u-blox.
El chipset receptor tiene interfaces UART, USB, SPI y DDC (compatible con I2C) para comunicar estos datos. El chipset tiene tres pines de configuración. Uno de estos pines de configuración, CFG-GPS0, se utiliza para habilitar la configuración de arranque en modo de energía.
Los otros dos pines de configuración, CFG_COM0 y CFG_COM1, se utilizan para decidir si los datos del GPS se comunican mediante el protocolo NMEA o el protocolo UBX.
El módem NEO-6 tiene esta asignación de pines:
En el módulo utilizado aquí, el módem NEO-6 está preconfigurado para enviar datos utilizando la interfaz serie (UART) y codificar datos GPS al protocolo NMEA.
Los pines de configuración CFG_COM0 y CFG_COM1 están configurados en ALTO y, como resultado, los datos del GPS se comunican a través del protocolo NMEA a una velocidad de baudios de 9600 bps. Como puede ver en la tabla anterior, con esta configuración, los datos NMEA incluyen mensajes GSV, RMC, GSA, GGA, GLL y VTG.
El módulo expone solo cuatro canales como se muestra en este diagrama de pines:
El módulo tiene la siguiente asignación de pines:
La velocidad máxima de actualización de navegación del módulo es de 5 Hz. Por lo tanto, un controlador a bordo o una computadora pueden leer datos de GPS del módem en al menos 0,2 segundos.
Cuando el módem está encendido, se necesitan 32 segundos para un arranque en frío, 23 segundos para un arranque en caliente o un segundo para un arranque en caliente. Debido a que el módulo está configurado para arranque en frío, inicialmente se necesitan 32 segundos para obtener la lectura del GPS por primera vez.
El módulo también viene con una antena externa con una sensibilidad de -160dBm. El módulo tiene una EEPROM y RTC integrados con batería de respaldo. El módem NEO-6M puede funcionar a temperaturas entre -40˚ y 85˚ C.
Interfaz con el módulo GPS NEO-6MV2
El módulo tiene todas las conexiones de hardware integradas con el módem NEO-6M, que ya está preconfigurado. Según la configuración del hardware, el módulo expone solo cuatro canales de módem:
1. El VCC (pin 23 del módem)
2. El receptor UART (pin 21 del módem)
3. El transmisor UART (pin 20 del módem)
4. Tierra (que puede ser el pin 10, 12, 13 o 24 del módem)
El módulo GPS NEO-6MV2 puede interactuar fácilmente con el puerto serie TTL de un controlador/computadora. Sin embargo, el pin VCC debe alimentarse con un voltaje máximo de 3,6 V CC y el pin de tierra debe estar conectado a una tierra común. El pin TX del módulo debe estar conectado al Rxd del puerto serie TTL del controlador/computadora.
Para conectar el módulo a computadoras de escritorio, se puede utilizar la placa serie USB. Recuerde que el módulo GPS tiene un voltaje máximo de funcionamiento de 3,6V. Por lo tanto, cuando se conecta a un controlador (como Arduino) o a una computadora integrada (como RPi), el módem debe recibir alimentación con VCC desde un pin de salida de energía 3V3.
Cuando se conecta a computadoras de escritorio a través de una tarjeta serie USB, esta tarjeta primero debe configurarse para usar niveles de voltaje TTL 3V3 colocando el puente en el conector de 3,3 V.
protocolo NMEA
NMEA es un acrónimo de Asociación Nacional de Electrónica Marina. En el contexto de un GPS, NMEA es un formato de datos estándar compatible con todos los fabricantes de GPS. Es un protocolo para datos GPS utilizado por receptores GPS y software asociado.
Los datos GPS con formato NMEA se pueden transmitir a través de una variedad de estándares de comunicación de datos, incluidos UART, SPI, I2C, USB, Wi-Fi, UHF y Bluetooth.
En el protocolo NMEA, los datos GPS se comunican como secuencias de mensajes NMEA. También existen receptores GPS con diferentes capacidades. Dependiendo de sus capacidades, normalmente comunican un subconjunto de cadenas de mensajes NMEA. Todos los mensajes NMEA comienzan con el carácter $, seguido del ID del mensaje y varios campos de datos separados por comas. El mensaje termina con un asterisco.
, seguido del carácter de suma de comprobación. Por último, un retorno de carro y un avance de línea sirven como caracteres finales.
El módulo GPS utilizado aquí comunica mensajes GSV, RMC, GSA, GGA, GLL y VTG NMEA. Examinemos las secuencias de mensajes NMEA una por una. GPRMC –
Indica posición, velocidad y tiempo. Tiene este formato:
$GPRMC,hhmmss:ss,Estado,Latitud,N,Longitud,E,SOG,COG,ddmmaa,MV,MVE,Modo*CS
Los campos de datos del mensaje GPRMC NMEA se describen en esta tabla: GPVTG –
Indica que la pista está en buen estado y velocidad en relación al suelo. Tiene este formato:
$GPVTG,cogt,T,cogm,M,sog,N,kph,K,modo*cs
Los campos de datos del mensaje GPVTG NMEA se describen en esta tabla: GPGA –
Indica la hora, posición y datos relacionados con la corrección. Tiene este formato:
$GPGGA,hhmmss:ss,Latitud,N,Longitud,E,FS,NoSV,HDOP,msl,m,Altref,m,DiffAge,DiffStation*cs
Los campos de datos del mensaje GPGGA NMEA se describen en esta tabla: GPGSA –
indica GPS DOP y satélites activos. Tiene este formato:
$GPGSA,Smodo,FS{,sv},PDOP,HDOP,VDOP*cs
Los campos de datos del mensaje GPGSA NMEA se describen en esta tabla: GPGSV –
indica el número de SV a la vista, números PRN, elevaciones, acimutes y valores SNR. Tiene este formato:
$GPGSV,SinMensajes,Número de mensaje,NoSV,PRN,Elevación,Acimut,SNR,
Los campos de datos del mensaje GPGSV NMEA se describen en esta tabla: GPGLL –
Indica los datos de posición, como la posición fija, el tiempo de la posición fija y su estado. Tiene este formato:
$GPGLL,Latitud,DirLat,Longitud,DirLongitud,hhmmss:ss,A,cs
Los campos de datos del mensaje GPGLL NMEA se describen en esta tabla:
Interfaz GPS NEO-6MV2 con RPi
Para interconectar el módulo GPS NEO-6MV2 con Raspberry Pi, encienda el módulo VCC desde el pin de 3,3 V del RPi (pin de la placa 1 o 17), luego conecte a tierra desde cualquiera de los pines de tierra del RPi (pin de la placa 6, 9, 14, 20, 25, 30, 34 o 39).
Luego, conecte el TX del módulo al UART Rxd de Raspberry Pi (pin 10 en la placa). No es necesario enviar ningún dato en serie al módem NEO-6, lo que significa que no es necesario conectarse al RX del módulo.
Comprobando si el módulo GPS NEO-6MV2 está funcionando
Cuando el módulo GPS recibe energía, inicialmente tarda algún tiempo en estar listo. Esto dependerá de la configuración del módulo, ya sea que esté configurado para arranque en frío, en caliente o en caliente.
Después de despertarse, si los satélites GPS son visibles para el receptor y comienza a apuntar a su ubicación, un LED de estado en el módulo comenzará a parpadear.
Si este LED no parpadea, el módulo no funciona correctamente o el satélite no está claro. En este caso, puede intentar obtener datos GPS sin procesar del módulo. Si puede obtener al menos cierta información (como la hora UTC) pero no puede obtener datos de ubicación, significa que el módulo está bien, pero no hay ningún satélite visible para el receptor GPS.
Espere un tiempo (digamos unos minutos o media hora) e intente obtener datos GPS sin procesar nuevamente. Si el módulo funciona correctamente, puede obtener los datos de ubicación después de un tiempo.
Obtener datos sin procesar de GPS NEO-6MV2 usando Python Los datos sin procesar de GPS se pueden leer desde el módulo GPS NEO-6M usando los métodos serial.read o serial.readline de Phyton
.
- Ver cómo:
- Importe las bibliotecas serial, time y sys.
- Abra el puerto serial TTL donde el módulo GPS interactúa usando el método serial.Serial.
- El nombre de este puerto será /dev/serial0. Alternativamente, se puede usar /dev/ttyAMA0 o /dev/ttyS0 como nombre de puerto, dependiendo del UART principal en el modelo Raspberry Pi respectivo.
- Lea los datos seriales del módulo GPS línea por línea usando el método serial.readline. O utilice el número específico de caracteres de los datos de serie del módulo GPS utilizando el método serial.read.
Continúe leyendo los datos hasta que las secuencias de mensajes NMEA comiencen a repetirse.
A continuación se muestra un script de Python de ejemplo que lee los datos GPS sin procesar del módulo GPS NEO-6M:
serie de importación
del tiempo importa dormir
sistema de importación
ser = serial.Serial (“/dev/ttyS0”)
intentar:
mientras que Verdadero:
datos_recibidos = (cadena)(ser.readline) #leer la cadena NMEA recibida
imprimir(datos_recibidos, “\n”)
excepto interrupción del teclado:
salida del sistema (0)
Al ejecutar el script anterior en Raspberry Pi, recibimos los siguientes datos de GPS en la consola IDLE:
Obtener la posición GPS del GPS NEO-6MV2 usando Python
Los datos GPS sin procesar contienen cadenas de mensajes RMS, VTG, GGA, GSA, GSV y GLL NMEA. Hay un total de nueve secuencias de mensajes de datos GPS sin procesar a la vez.
Para obtener la ubicación GPS, podemos extraer las cadenas de mensajes $GPGGA o $GPGLL. Ambas cadenas contienen la información de ubicación. Aquí extraemos la ubicación GPS de la cadena de mensaje $GPGGA.
Los datos GPS sin procesar se pueden almacenar en una variable de cadena. Usando funciones de manipulación de cadenas como find, podemos buscar $GPGGA o $GPGLL en la cadena recibida.
Si los datos GPS recibidos contienen una de estas cadenas, divida la cadena del mensaje después de $GPGGA o $GPGLL usando la función de división. Luego divida los campos de datos del mensaje NMEA recibido en una matriz usando la coma como delimitador en la función de división.
Ahora tiene los campos de datos $GPGGA o la cadena de mensaje NMEA $GPGLL en una matriz. Puede extraer la hora UTC, la latitud y la longitud accediendo a un índice diferente de la matriz resultante. La latitud y la longitud se pueden convertir a grados mediante operaciones matemáticas simples y formateando los valores recibidos. Los valores convertidos de latitud y longitud también se pueden imprimir en la consola o transferir a una variable.
El siguiente es un ejemplo de un script de Python que extrae la ubicación GPS de los datos GPS sin procesar del módulo GPS NEO-6M:
serie de importación
del tiempo importa dormir
sistema de importación
ser = serial.Serial (“/dev/ttyS0”)
gpgga_info = "$GPGGA",
GPGGA_búfer = 0
NMEA_buff = 0
def convertir_a_grados(ravo_value):
valor_decimal = valor_bruto/100.00
grados = int(valor_decimal)
mm_mmmm = (valor_decimal – int(valor_decimal))/0.6
posición = grados + mm_mmmm
posición = “%.4f” %(posición)
posición de retorno
intentar:
mientras que Verdadero:
datos_recibidos = (cadena)(ser.readline) #leer la cadena NMEA recibida
GPGGA_data_available=received_data.find(gpgga_info) #comprueba la cadena GPGGA NMEA
si (GPGGA_data_available>0):
GPGGA_buffer =ceived_data.split(“$GPGGA”,1)(1) #almacena los datos que vienen después de “$GPGGA”, cadena
NMEA_buff = (GPGGA_buffer.split(','))
nmea_time=
nmea_latitud=
nmea_longitude=
nmea_time = NMEA_buff(0) #extraer tiempo de la cadena GPGGA
nmea_latitude = NMEA_buff(1) #extraer latitud de la cadena GPGGA
nmea_longitude = NMEA_buff(3) #extraer longitud de la cadena GPGGA
print(“Hora NMEA: “, nmea_time,'\n')
lat = (flotante)(nmea_latitude)
latitud = convertir_a_grados(latitud)
largo = (flotante)(nmea_longitude)
longi = convertir_a_grados(longi)
print (“Latitud NMEA:”, lat,”Longitud NMEA:”, longi,'\n')
excepto interrupción del teclado:
salida del sistema (0)
Al ejecutar el script anterior en el RPi, recibimos la siguiente ubicación GPS en la consola IDLE:
Posición GPS en Google Maps usando Python
Para mostrar la posición GPS en Google Maps, se puede utilizar la biblioteca del navegador Python. Puede utilizar el método abierto de esta biblioteca para abrir un enlace de Google Maps con la latitud y longitud obtenidas en el ejemplo anterior.
Aquí hay un script de Python de ejemplo que muestra la ubicación GPS del módulo GPS NEO-6M en Google Maps:
serie de importación
del tiempo importa dormir
sistema de importación
importar navegador web
ser = serial.Serial (“/dev/ttyS0”)
gpgga_info = "$GPGGA",
GPGGA_búfer = 0
NMEA_buff = 0
GPGGA_data_disponible = “”
def convertir_a_grados(ravo_value):
valor_decimal = valor_bruto/100.00
grados = int(valor_decimal)
mm_mmmm = (valor_decimal – int(valor_decimal))/0.6
posición = grados + mm_mmmm
posición = “%.4f” %(posición)
posición de retorno
datos_recibidos = (str)(ser.read(200)) #leer la cadena NMEA recibida
GPGGA_data_available=received_data.find(gpgga_info) #comprueba la cadena GPGGA NMEA
si (GPGGA_data_available>0):
GPGGA_buffer =ceived_data.split(“$GPGGA”,1)(1) #almacena los datos que vienen después de “$GPGGA”, cadena
NMEA_buff = (GPGGA_buffer.split(','))
nmea_time=
nmea_latitud=
nmea_longitude=
nmea_time = NMEA_buff(0) #extraer tiempo de la cadena GPGGA
nmea_latitude = NMEA_buff(1) #extraer latitud de la cadena GPGGA
nmea_longitude = NMEA_buff(3)
print(“Hora NMEA: “, nmea_time,'\n')
lat = (flotante)(nmea_latitude)
latitud = convertir_a_grados(latitud)
largo = (flotante)(nmea_longitude)
longi = convertir_a_grados(longi)
print (“Latitud NMEA:”, lat,”Longitud NMEA:”, longi,'\n')
map_link = '+ lat + ',' + longi
navegador web.open(mapa_enlace)
salida del sistema (0)
Al ejecutar el script anterior en el RPi, recibimos la siguiente ubicación GPS en Google Maps:
En el próximo tutorial, cubriremos la comunicación en serie usando I2C en Raspberry Pi.