GPS全称为Global Positioning System,是一种基于卫星系统的全球定位技术。它由一组卫星和地面接收设备组成,用于准确确定地球上的位置、速度和时间信息。GPS系统通过将地球上的卫星信号与接收设备之间的距离计算来确定位置。接收设备通过接收来自多颗卫星的信号,并使用三角定位原理计算自身的准确位置。GPS系统由美国政府的国防部负责维护和运营,目前由全球共有约30颗工作卫星,其中至少有4颗卫星同时可见任何地方。GPS接收设备可以是专用的GPS导航器、手机、智能手表、车载导航系统等,这些设备接收卫星信号,并提供定位和导航功能。
GPS模块是一种在手机或者机器的主板上结合的无线芯片模块,可以和GPS联络,从而实现定位和导航。
GPS内有原子钟用来计时,它以原子共振频率标准来计算时间。原子钟是目前世界上最准确的衡量时间和频率的标准,广泛用于控制广播频率和卫星信号。
GPS定位原理: 当我们需要定位时,我们可以从GPS卫星上接受一些信息,就是卫星的星历,星历里有卫星自己的空间坐标x1,y1,z1,卫星有原子钟,所以可以获得一个准取得时间t1,卫星会把这些信息发送给我们的设备上的GPS模块。通过坐标和时间都可以算出GPS模块和卫星之间的距离。 已知:卫星的空间坐标x1,y1,z1,时间t1 未知:设备的空间坐标x2,y2,z2,时间t2
四个未知数,所以需要4个这样的方程,所以需要4个卫星,这样就可以解出x2,y2,z2,t2 实际上,卫星定位的误差还是较大,因为信号在大气中传输速度会有损耗,一般会使用差分GPS技术来减小误差。
差分GPS技术: 在地面上建立位置已知的GPS基站,当定位时,基站也可以接收到为我们提供位置信息的4颗卫星的信号,根据位置信号测出坐标值,与已知坐标比较,得出偏差量,将偏差量或者实时测得的载波相位,通过数传链路或者移动通信网络发送给终端设备,然后终端设备根据这个信息进行修正位置,得出比较精准的位置信息。
GPS可以在多个领域和应用中使用,下面是一些常见的应用GPS的示例:
- Garmin
Garmin是一家总部位于美国的跨国科技公司,成立于1989年。该公司专注于设计、制造和销售各种全球定位系统(GPS)产品,包括手持式导航设备、智能手表、运动追踪器、航空设备和汽车导航系统等。 Garmin的产品广泛应用于航空、航海、汽车、户外运动和健身等领域。公司的产品以其高精度、可靠性和创新性而闻名,被广泛使用于个人消费者、专业人士和军事领域。
- UBlox
UBlox是一家瑞士的全球领先的无线通信和定位技术提供商。该公司成立于1997年,总部位于瑞士的蒙特勒。UBlox专注于提供高精度、高可靠性的定位和导航解决方案,包括全球卫星导航系统(GNSS)接收器、芯片组和软件。 UBlox的产品广泛应用于汽车导航、智能交通系统、物联网、航空航天、农业、测绘、无人机等领域。公司的产品包括GNSS接收器、GNSS芯片组、GNSS模块、GNSS天线、数据链路模块、无线通信模块等。
- NXP
NXP公司全称为恩智浦半导体公司,它成立于2006年,其前身是荷兰飞利浦公司于1953年成立的半导体事业部。恩智浦总部位于荷兰埃因霍温,并在全球30个国家和地区设有办事处,员工人数超过30000人。 恩智浦提供低成本、便携式GPS设备完整解决方案,包括软件和硬件方面。通过swGPS Personal软件实现GPS计算,从而取代了一个GPS基带处理器,降低了材料清单成本并支持现场升级。
- SiRF
SiRF公司是一家全球领先的定位芯片供应商,成立于1995年,总部位于美国加州的圣荷西市。SiRF专注于研发、制造和销售GPS芯片和软件产品,其GPS芯片和软件产品广泛应用于移动设备、汽车、个人电脑、服务器和其他嵌入式设备中。SiRF公司在全球拥有众多客户和合作伙伴,包括GPS模块厂商、移动设备制造商、汽车制造商等。
下面是一项使用RP2040作为主控芯片,驱动中科微电子的ATGM336H型号的传感器的参考案例,通过UART进行传感器与主控之间的数据通信,当有数据回传回来时,将数据按照指定的流程分割好,找到其中的GPS坐标,并且通过ssd1306芯片驱动的OLED屏幕打印出来,主控芯片与OLED屏幕通过SPI协议进行数据通信。
代码如下
from machine import UART,Pin,SPI import time import uasyncio from ssd1306 import SSD1306_SPI import framebuf from utime import sleep_ms spi1_mosi = 11 spi1_sck = 10 spi1_dc = 9 spi1_rstn = 8 spi1_cs = 16 spi = SPI(1, 100000, mosi=Pin(spi1_mosi), sck=Pin(spi1_sck)) oled = SSD1306_SPI(128, 64, spi, Pin(spi1_dc),Pin(spi1_rstn), Pin(spi1_cs)) uart1 = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5)) flag = 0 class GPS(): buff = bytearray(270) def __init__(self): self.a = 0 self.b = 0 self.array2 = “” def read_and_process(self): buff = uart1.read(1) if buff == None: self.b = 0 else: if buff == b'\n': self.a = 1 if self.a == 1: buff = uart1.read(270) if buff != None: self.array2 = buff[0:6] if self.array2 == b'GNGGA,': self.array2 = buff[7:44] if self.array2[-1] == 44: ##ascii value ',' flag = 1 print(flag) oled.fill(0) oled.show() oled.text(self.array2[10:22],0,0) oled.text(self.array2[23:-1],0,32) oled.show() gps = GPS() while 1: gps.read_and_process()