【得捷电子Follow me第1期】004:GPS定位并显示
[复制链接]
上一帖介绍网络连接和同步时钟。这一贴介绍GPS定位数据获取并把数据显示在OLED上。参考大佬给的文档和代码,我的试验过程如下。
GPS模块简介:Seeed Studio Grove-GPS (Air 530) 是一款高性能、高度集成的多模卫星定位和导航模块。Grove-GPS (Air530) 模块配有GPS (Air530) 板和Grove电缆。该模块支持GPS/北斗/Glonass/Galileo/QZSS/SBAS,因此适合用于GNSS定位应用。Grove-GPS (Air530) 模块能够同时接收6颗以上卫星的信号。在信号不好的情况下仍能够快速准确工作。该模块具有31µA低功耗、兼容其他模块的硬/软接口以及定位误差在10米以内。Grove-GPS (Air530) 模块采用射频基带集成设计,集成了直流/直流、LDO、LNA、射频前端、基带处理和基于RISC的32位芯片。该模块包括Air530 TX指示灯(蓝色LED)、1PPS指示灯(绿色LED)、Air530模块、Grove接口、Air530排针和3V按钮电池。GPS (Air530) 模块的工作电源电压为3.3V/5V,温度范围为-35°C至85°C。典型应用包括GPS跟踪器、GPS导航、距离测量、汽车导航和无人机。
图1、GPS模块
GNSS模组Air530的链接非常简单,只需要将UART接口连接到Grove底板的UART0上即可,分别用到串口的TX=GP0 RX=GP1。
GNSS模组遵循NMEA规范格式进行的报文输出。本着站在巨人肩膀上的偷懒原则,我采用micropyGPS的库进行定位信息的解析,先克隆micropyGPS的库:
借用前人的成果,很容易就调用gps.update函数可以将解析得到的经纬度信息、日期信息等内容通过print输出。
为了将GPS信息显示到OLED屏幕上,我这里又添加一个ufont的字库,实现汉字和特殊字符显示,比如解析完的字符串中“°”这个字符,MicroPython的framebuf默认ascii库中就不包含,只会显示乱码。Ufont库链接如下。
整个程序如下,实现了GPS模块接收数据并解析,在OLED上显示定位的经纬度以及REPL窗口上输出相关的NIMA的报文解析。
from machine import UART, Pin
import time
from micropyGPS import MicropyGPS
from machine import I2C
import ufont
import ssd1306
WIDTH = 128
HEIGHT = 64
# Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=400000) # Grove - OLED Display 0.96" (SSD1315)
oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c)
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
font = ufont.BMFont("unifont-14-12917-16.v3.bmf")
oled.fill(0)
font.text(oled, "经纬度:", 0, 0, show=True)
font.text(oled, "日期:", 0, 16*3, show=True)
time.sleep(0.1)
rxData = bytes()
my_gps = MicropyGPS()
while True:
if uart0.any():
stat = my_gps.update(uart0.read(1).decode("ascii")) # Note the conversion to to chr, UART outputs ints normally
if stat:
lat_disp = my_gps.latitude_string()
lon_disp = my_gps.longitude_string()
time_disp = my_gps.date_string("s_dmy")
oled.rect(8*0,16*1,128,16*2,0,True)
font.text(oled, lon_disp, 0, 16*1, show=False)
font.text(oled, lat_disp, 0, 16*2, show=False)
oled.rect(8*7,16*3,128,16*1,0,True)
font.text(oled,time_disp, 8*7, 16*3, show=True)
print("Latitude:", my_gps.latitude_string())
print("Longitude:", my_gps.longitude_string())
print(
"Speed:",
my_gps.speed_string("kph"),
"or",
my_gps.speed_string("mph"),
"or",
my_gps.speed_string("knot"),
)
print("Date (Long Format):", my_gps.date_string("long"))
print("Date (Short D/M/Y Format):", my_gps.date_string("s_dmy"))
print("timestamp (Short [H,M,S] Format):", my_gps.timestamp)
stat = None
代码1、GPS模块接收
运行代码,结果如下图。这个模块效果很好,在室内距离窗户还有2米,也能精确定位。
图2、GPS模块接收并显示
参考资料:
https://bbs.eeworld.com.cn/thread-1245329-1-1.html
https://bbs.eeworld.com.cn/thread-1240260-1-1.html
|