BN-220/BN-880 GPS Module: Difference between revisions
Using Micropython to capture the serial output of a BN-220 or BN-880 GPS module |
(No difference)
|
Revision as of 21:53, 2021 December 16
The BN-220 and BN-880 both talk via UART. The BN-880 is almost the same as the BN-220 except for its physical size and it has two additional pins for I2C communications for a compass module that is not present in the BN-220.
Both use the NMEA GPS protocol but defaults to 9600bps instead of the NMEA standard 4800bps.
The BN-220/880 GPS modules can use GPS, GLONASS, Galileo, BeiDou, and SBAS signals. When powered on, the module repeatedly sends comma-delimited output phrases one line at a time. Each line starts with a $ and ends with \r\n. The signal used and type of data is identified by a five character string, for example GPGGA. The first two characters define the system being used to get position (Talker ID): (GP=GPS, GA=Galileo, GB=BeiDou, GL=GLONASS, GN=GPS+GLONASS). The last three identify the kind of signal (GGA=GPS fix data, GLL=position data, GRS=GPS range residuals, GSA=GPS DOP and active satellites, GST=GPS PRN, GSV=GPS satellites in view, GGK=Time/position/position type/DOP, as well as some others)
If power is lost and there is a backup battery with enough charge, the module will use its onboard RTC to keep track of time until power is restored and a signal is received.
The following is a simple Micropython program that reads a BN-220/880 connected to UART0 on a Raspberry Pi Pico RP2040, and prints the GNGGA data (GPS+GLONASS position fix)
from machine import Pin, UART
import time
import gc
uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))
rxData = bytes()
rxDataFull = bytearray()
rxDataConv = ""
rxDataString = ""
rxDataList = []
while True:
while uart.any() > 0:
rxData = uart.read(1)
if(rxData == b'$'):
rxDataFull = ([])
if(rxData == b'\r'):
dataStringCount = len(rxDataFull)
for i in range(0, dataStringCount, 1):
rxDataString = rxDataString + chr(rxDataFull[i])
if((rxDataString[0:6]) == "$GNGGA"):
rxDataList = rxDataString.split(',')
# For GNGGA, time is in element 1, Lat: 2&3, Long: 4&5, Alt: 9&10
try:
print("Time: {}:{}:{}".format((str(rxDataList[1])[0:2]), (str(rxDataList[1])[2:4]), (str(rxDataList[1])[4:6])))
print("Lat: {}d {}m {}".format((str(rxDataList[2])[0:2]), (str(rxDataList[2])[2:10]), rxDataList[3]))
print("Long: {}d {}m {}".format((str(rxDataList[4])[0:3]), (str(rxDataList[4])[3:11]), rxDataList[5]))
print("Altitude: {}{}".format(rxDataList[9], rxDataList[10]))
except IndexError:
print("NO DATA")
print("**********")
gc.collect()
print("Free heap: ",gc.mem_free())
print("**********")
rxDataString = ""
rxDataList = []
time.sleep(0.05)
else:
rxDataFull += rxData