GPS传感器 - 从零开始认识各种传感器【三十期完结篇】

GPS传感器|从零开始认识各种传感器

GPS作为传感器系列的最后一期,往期的科普可以点此查看

1、什么是GPS传感器 

GPS,全称全球定位系统,Global Positioning System,GPS传感器是一种利用卫星信号进行定位和导航的设备,广泛应用于交通运输、地理信息系统等各个领域。

当前存在多种不同的全球卫星定位系统,除了规模最大的美国 GPS,还有俄罗斯的全球导航卫星系统GLONASS,中国的北斗卫星导航系统BDS,欧盟的伽利略定位系统。它们其实都属于全球导航卫星系统GNSS概念。

通常我们使用或者看到的全球导航卫星定位系统标志可能都是沿用最早部署的GPS,其实更为准确的名词应该是GNSS。

2、GPS传感器是如何工作的?

任何一个GPS卫星/GNSS卫星定位系统都由数十颗时刻围绕地球旋转的卫星组成。

图片

卫星的数量保证了在地球上任何一点的任何时刻,都能接收到天空中至少4颗卫星的信号。每颗GPS卫星都在不间断的发送信号,该信号内包含了卫星的位置及时间信息。由于电磁波传播速度是已知并恒定的(约为3x108 m/s)那么由从卫星发出的电波到达测量点经过的时间差,便可以推算出每颗卫星与测量点的距离。

图片

原则上,要确定被测量点的XYZ座标,也就是方位和高度信息,只要接收三个卫星讯号,因为三个卫星当前所处的空间位置是系统已知的,通过三点定位就可以确定测量点位置。但是考虑到测量点传感器的时间信息和卫星的时间信息的依据不同,例如测量点可能使用的是手机上的时间,GPS卫星使用的是非常精确的原子钟计量的时间。如果这两者存在小小的差异,即使是百万分之一秒的误差,由于电磁波传播的高速特性,就会带来300米的定位误差。所以系统中需要第四个卫星的数据来消除这个时间误差,因此,GPS定位要至少接收四个卫星的信号才可以显示准确的位置。

3、常见的GPS传感器的种类以及性能对比 

除了前面提到的几个主要的全球卫星定位系统,印度和日本也开发了各自的区域性导航定位系统RNSS和QZSS,以上是它们的对比表格。表格中的MEO代表中高轨道卫星,卫星离地面距离为1万到2万公里之间;GEO代表高轨道卫星,处于地球同步轨道3.5万公里高度。大部分全球定位系统都采用多颗MEO中高轨道卫星,其绕地球旋转周期为12小时,轨迹覆盖全球范围,按照计算,只要大于24颗MEO轨道卫星,就能保证地球上任何一点在任何时刻天空中都有4颗可用的卫星用于定位。而区域性的定位系统采用GEO高轨道卫星,也叫做地球静止轨道卫星,其卫星旋转相对于地球同步,其位置不变,适合单一国家区域的卫星定位导航。

4、GPS传感器实验演示 

我们来演示使用 MCU 读取显示GPS传感器的数据。这是一款ADAfruit出品的 GPS 模块PA1616S。测试环境是在实验室窗口附近,以确保传感器对卫星信号的接收。可以看到,目前传感器准确给出了当前的定位信息。

图片

主控板卡:基于RP2040的带屏调试助手

以下是完整的主程序代码:

from machine import UART,Pin,Timer,PWM,SPI,time_pulse_us, I2C,freq
import _thread
from time import sleep_us,ticks_us,sleep
import uos
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import  math,array
import struct
import framebuf
freq(150_000_000)
st7789_res = 0
st7789_dc  = 1
disp_width = 240
disp_height = 240
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=60_000_000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,
                          reset=machine.Pin(st7789_res, machine.Pin.OUT),
                          dc=machine.Pin(st7789_dc, machine.Pin.OUT),
                          xstart=0, ystart=0, rotation=0)
display.fill(st7789.WHITE)

f_list = [open("/bin/{}.bin".format(i), "rb") for i in range(18)]

uart1 = UART(1, baudrate=9600, tx=Pin(20), rx=Pin(21))

class GPS():
    buff = bytearray(270)
    def __init__(self):
        
        self.a = 0
        self.b = 0
        self.flag = 0
        self.array1 = '$GPGGA,'
        self.array2 = ''
    def read_and_process(self):
        
            buff = uart1.read(1)
            if buff == None:
#                 print(1)
                self.b = 0
            else:
                if buff == b'\n':
                    self.a = 1
#                     print(buff)
                if self.a == 1:
                    
                    buff = uart1.read(270)
#                     print(buff)
                    self.array2 = buff[0:6]
#                     print(self.array2)
                    if self.array2 == b'GPGGA,':
                        self.array2 = buff[7:44]
                        if self.array2[24]==b'A' or self.array2[25]==b'A' :
                            display.text(font2, 'N:'+str(self.array2[14:15], 'utf-8')+'*'+str(self.array2[16:17], 'utf-8')+'\''+str(self.array2[19:20], 'utf-8'),10, 30)
                            display.text(font2, 'E:'+str(self.array2[24:26], 'utf-8')+'*'+str(self.array2[27:28], 'utf-8')+'\''+str(self.array2[30:31], 'utf-8'), 10, 80)
                        else :
                            display.text(font2, 'N:serching...',10, 30)
                            display.text(font2, 'E:serching...', 10, 80)
                       
                        self.a = 0
                        
gps = GPS()

while True :
    for f in f_list: 
        f.seek(0)
        for row in range(100):
            buffer = f.read(200)
            display.blit_buffer(buffer, 120, row+120, 100, 1)
        gps.read_and_process()

其余代码请点这里

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值