【得捷电子Follow me第1期】第四帖 GPS定位
[复制链接]
Pico W是一款低成本的微控制器开发板,可用于物联网和嵌入式系统开发。要使用Pico W和GPS模块实现定位,我们需要遵循以下步骤:
1. 连接GPS模块:大多数GPS模块都使用UART串口通信协议。因此,我们需要将GPS模块的VCC和GND引脚接到Pico W的相应引脚,将TX和RX引脚接到Pico W的UART引脚,然后使用Micropython库中的UART库打开串口,以从GPS模块接收数据。
2. 解析GPS数据:GPS模块将实时地发送位置、时间和其他信息。首先,我们需要将GPS数据流解析为可读的数据。通常,GPS数据流是NMEA语句,包括GPGGA、GPRMC、GPVTG、GPGSA等语句。我们可以使用Micropython库中的UART库读取串口数据,并使用Python的字符串分析和处理方法来解析每个语句中的位置、时间和卫星信息。
3. 显示位置信息:在解析GPS数据流之后,我们可以使用SSD1306 OLED屏幕显示位置信息。我们可以使用Micropython的GPIO库来控制OLED屏幕,并使用SSD1306库来处理图形和字符。在OLED屏幕上,可以显示当前位置、经度、纬度和其他相关信息。
4. 扩展(待完成):上传位置信息:如果我们想要将定位数据上传到云端或其他设备,我们可以使用HTTP或其他网络协议将数据打包并上传到服务器端。我们可以使用Python的库,如requests、urllib等,来连接Web服务,并将GPS数据上传到服务器端。
GPS调试需要把天线放室外,否则很难定位,我这里是用了一根延长天线放到室外。
具体代码如下:
from machine import UART, Pin
import time
import hashlib
from micropyGPS import MicropyGPS
from machine import Pin
import time
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C
import framebuf
WIDTH = 128
HEIGHT = 64
i2c = I2C(1)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
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:
oled.fill(0)
lat_disp = my_gps.latitude_string()
oled.text(lat_disp,5,10)
lon_disp = my_gps.longitude_string()
oled.text(lon_disp,5,30)
time_disp = my_gps.date_string('s_dmy')
oled.text(time_disp,5,50)
oled.show()
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
最后效果如下图:
|