1225|2

282

帖子

7

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子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

最新回复

MicroPython的framebuf竟然不包含ascii库,这个不方便   详情 回复 发表于 2023-6-3 10:48
点赞 关注
 
 

回复
举报

6822

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

MicroPython的framebuf竟然不包含ascii库,这个不方便

点评

包涵ascii库,但是ascii库不包含‘°’这个字符,所以显示不出来  详情 回复 发表于 2023-6-3 19:14
 
 
 

回复

282

帖子

7

TA的资源

一粒金砂(高级)

板凳
 
Jacktang 发表于 2023-6-3 10:48 MicroPython的framebuf竟然不包含ascii库,这个不方便

包涵ascii库,但是ascii库不包含‘°’这个字符,所以显示不出来

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表