10579浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:29:25

2、模块引脚
VCC:电源脚输入3.3-5.5V
GND:电源地
RXD:串口接收脚-- 接单片机串口TXD 发送
TXD:串口发送脚-- 接单片机串口RXD 接收

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:31:17

8.6.3. GY-NEO6MV2飞控GPS模块的实验环境
1GY-NEO6MV2飞控GPS模块实验所需硬件清单
TM1637四位数码管X1
0.96寸OLED液晶屏X1
Arduino Uno开发板 X1
杜邦线 若干(备了9条)
高电平触发有源蜂鸣器模块X1
LED发光二极管(绿、蓝色)X2
IIC/I2C 1602 LCD液晶屏模块X1
高电平触发单路5V继电器模块X1
Proto Shield原型扩展板(带mini面包板)X1


【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:32:52

2、传感器模块实验所需软件平台
代码编程 Arduino IDE   (版本1.8.19
仿真编程 Linkboy      (版本V4.6.3
图形编程 Mind+  (版本 V1.7.0 RC2.0
以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino


3、下载并安装GPS模块 所需的库以在 Arduino IDE 中工作
2)打开网页https://github.com/,搜索SoftwareSerialTinyGPS

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:33:59

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:38:46

4、实验接线示意图
【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1
5、模块实验说明
1)位置固定 LED 指示灯
NEO-6M GPS 模块上有一个 LED,用于指示定位状态。它会根据它所处的状态以不同的速率闪烁
不闪烁 ==> 表示正在搜索卫星
1 秒闪烁一次- 表示已找到定位
2)3.3V LDO 稳压器
NEO-6M 芯片的工作电压为 2.7 至 3.6V。但是,该模块配备了MICREL的MIC5205超低压差3V3稳压器。逻辑引脚也可以承受 5 伏电压,因此我们可以轻松地将其连接到 Arduino 或任何 5V 逻辑微控制器,而无需使用任何逻辑电平转换器。
3)电池和 EEPROM
该模块配备一个 HK24C32 两线串行 EEPROM。它大小为4KB,通过I2C连接到NEO-6M芯片。模块还包含一个可充电纽扣电池,用作超级电容器。EEPROM 与电池一起有助于保留电池支持的 RAM (BBR)。BBR 包含时钟数据、最新位置数据(GNSS 或位数据)和模块配置。但它并不意味着永久数据存储。由于电池保留时钟和最后位置,首次定位时间 (TTFF) 显着减少到 1 秒。这允许更快的位置锁定。如果没有电池,GPS 总是冷启动,因此初始 GPS 锁定需要更多时间。通电时电池会自动充电,并且可以在没有电源的情况下保持数据长达两周。



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:41:18

8.6.4. GY-NEO6MV2飞控GPS模块的几个实验
1、程序一:读取GPS的原始数据
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序一:读取GPS的原始数据
  4. */
  5. #include <SoftwareSerial.h>
  6. SoftwareSerial mySerial(9, 8); // (RX,TX of Arduino)
  7. void setup(){
  8.   Serial.begin(9600);// 串口监视器波特率
  9.   mySerial.begin(9600); //GPS端口波特率
  10. }
  11. void loop(){
  12.   while (mySerial.available() > 0){
  13.     byte rawData = mySerial.read();//在 rawData 变量中存储字节
  14.     Serial.write(rawData); //在串口监视器上打印rawData
  15. }
  16. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:44:15

2)实验串口返回情况(放在电脑桌子上,无接收信号)

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:46:33

(3)实验场景图(电脑桌上)

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:48:45

4)实验场景图(放在窗口)

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:50:31

5)实验串口返回情况(放在窗口,接收到信号)

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:52:06

(7)了解NMEA语句
●  110617 - 表示固定地点的时间,UTC时间11:06:17
●    41XX.XXXXX,N - 北纬41度XX.XXXXX'N
●    00831.54761,W - 经度008度31.54761'W
●    1 - 固定质量(0 =无效; 1 = GPS修正; 2 = DGPS修正; 3 = PPS修正; 4 =实时运动学; 5 =浮动RTK; 6 =估计(航位推测); 7 =手动输入模式; 8 =模拟模式)
●    05 - 正在跟踪的卫星数量
●    2.68 - 水平位置因子
●    129.0,M - 海拔高度,以米为单位
●    50.1,M - 大于WGS84椭球体的大地水准面(平均海平面)的高度
●    空字段  - 自上次DGPS更新以来的秒数
●    空字段 - DGPS台站ID号
●    * 42 - 校验和,数据总是以*开头
其他NMEA句子提供了其他的信息:
●    $ GPGSA - GPS DOP和主动卫星
●    $ GPGSV - 详细的GPS卫星信息
●    $ GPGLL - 地理纬度和经度
●    $ GPRMC - 基本的GPS pvt(位置、速度、时间)数据
●    $ GPVTG - 速度很好
GPS数据遵循NMEA-0183协议,该数据标准是由NMEA(National Marine Electronics Association,美国国家海事电子协会)于1983年制定的。统一标准格式NMEA-0183输出采用ASCII 码,其串行通信的参数为:波特率=4800bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。数据传输以“语句”的方式进行,每个语句均以“$”开头,然后是两个字母的“识别符”和三个字母的“语句名”,接着就是以逗号分割的数据体,语句末尾为校验和,整条语句以回车换行符结束。

NMEA-0183的数据信息有十几种,这些信息的作用分别是:$GPGGA:输出GPS的定位信息;$GPGLL:输出大地坐标信息;$GPZDA:输出UTC时间信息;$GPGSV:输出可见的卫星信息;$GPGST:输出定位标准差信息;$GPGSA:输出卫星DOP值信息;$GPALM:输出卫星星历信息;$GPRMC:输出GPS推荐的最短数据信息等。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:54:11

7)附录:
A、 输出语句说明:
1)$GPRMC语句
Recommended Minimum Specific GPS/TRANSIT Data-RMC,推荐定位信息1次/1秒)。对于一般的GPS动态定位应用,GPRMC语句完全满足要求。该语句中包括经纬度、速度、时间和磁偏角等字段,这些数据为导航定位应用提供了充分的信息。下表详细说明GPRMC语句中的各个字段:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,,<12>
字段 $GPRMC语句意义——取值范围
<1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 状态,有效性 ——A表示有效;V表示无效
<3> 纬度格式:ddmm.mmmm——0000.00000~8959.9999 (标准的度分格式)
<4> 南北半球——N北纬;S南纬
<5> 经度格式:dddmm.mmmm——00000.0000~17959.9999(标准的度分格式)
<6> 东西半球——E表示东经;W表示西经
<7> 地面速度——000.00~999.999
<8> 速度方向——000.00~359.99
<9> 日期格式,月日年——010100~123199
<10> 磁偏角,单位:度——00.00~99.99
磁偏角方向——E表示东;W表示西
<12> 模式指示及校验和—— A=自主定位,D=差分,E=估算,N=数据无效
例如:
$GPRMC,074529.82,A,2429.6717,N,11804.6973,E,12.623,32.122,010806,,W,A*08


2)$GPGGA语句
Global Positioning System Fix Data-GGA,GPS定位信息, 输出1次/1秒)。GPS定位主要数据,该语句中包括经纬度、质量因子、HDOP、高程、基准站号等字段。下表详细说明GPGGA语句中的各个字段:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,,<12>,,<14>
字段 $GPGGA语句意义——取值范围
<1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 纬度,格式:ddmm.mmmm ——0000.00000~8959.9999(标准的度分格式)
<3> 南北半球——N北纬;S南纬
<4> 经度格式:dddmm.mmmm ——00000.0000~17959.9999(标准的度分格式)
<5> 东西半球——E表示东经;W表示西经
<6> 质量因子——0=未定位,1=GPS单点定位固定解,2=差分定位,3=PPS解;4=RTK固定解;5=RTK浮点解;6=估计值;7=手工输入模式;8=模拟模式;
<7> 应用解算位置的卫星数——00~12
<8> HDOP,水平图形强度因子——0.500~99.000 ;大于6不可用
<9> 天线高程(海平面)——-9999.9~99999.9
<10> 线线高程单位(m) ——m
大地水准面起伏——地球椭球面相对大地水准面的高度
<12> 大地水准面起伏单位(m) ——m
<13> 差分GPS数据期——差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空),不使用DGPS时为空
<14> 基准站号——0000~1023;不使用DGPS时为空
$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,M,,M,,*76

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:55:46

3)$GPGSV语句
GPS Satellites in View-GSV,可见卫星信息,1次/5秒)
GPS可见星的方位角、俯仰角、信噪比等每条语句最多包括四颗卫星的信息,每颗卫星的信息有四个数据项,即:(4)-卫星号,(5)-仰角,(6)-方位角,(7)-信噪比
$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17>,<18>,<19>
字段 $GPGSV语句意义——取值范围
<1> 总的GSV语句电文数——0~12
<2> 当前GSV语句号
<3> 可视卫星总数——0~32
<4> 卫星号——1~32
<5> 仰角——00~90
<6> 方位角——000~359
<7> 信噪比——00~99dB无表未接收到讯号
<8> 卫星号——1~32
<9> 仰角——00~90
<10> 方位角——000~359
信噪比——00~99dB无表未接收到讯号
<12> 卫星号——1~32
<13> 仰角——00~90
<14> 方位角——000~359
<15> 信噪比——00~99dB 无表示未接收到讯号
<16> 卫星号——1~32
<17> 仰角——00~90
<18> 方位角——000~359
<19> 效验和,格式:*效验和——检查位
$GPGSV,3,1,11,1,83,54,32,3,19,192,28,6,26,57,36,7,51,140,37*7D
$GPGSV,3,2,11,14,40,136,34,16,64,266,36,20,21,293,,22,2,168,*4C
$GPGSV,3,3,11,23,10,321,,25,53,7,40,30,2,46,*48


4)$GPVTG语句
(Track Made Good and Ground Speed-VTG,地面速度信息)
格式:$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
字段 $GPVTG语句意义——取值范围
<1> 以真北为参考基准的地面航向——000.000~359.999
<2> 以磁北为参考基准的地面航向——000.000~359.999
<3> 地面速率——000.000~999.999节
<4> 地面速率——0000.0~1851.8公里/小时
<5> 模式指示——A=自主定位,D=差分,E=估算,N=数据无效(仅NMEA0183 3.00版本输出)
<6> hh 校检位
$GPVTG,257.314,T,257.314,M,10.739,N,19.888,K,A*2F

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:57:45

5)$GPGSA语句
GPS DOP and Active Satellites-GSA,当前卫星信息,1次/1秒)
GSA : GNSS 的当前卫星和精度因子,包括可见卫星PRN号,以及PDOP、HDOP、VDOP。如:
<1> 模式 ——M = 手动, A = 自动。
<2> 定位类型——1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3> PRN 数字——01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
<4> PDOP位置精度因子——0.5~99.9
<5> HDOP水平精度因子——0.5~99.9
<6> VDOP垂直精度因子——0.5~99.9
<7> Checksum.(检查位).
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7>
$GPGSA,A,3,19,11,03,23,27,13,16,,,,,,3.43,1.67,2.99*0E


6)$GPGLL语句
(输出大地坐标信息)
$GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*61
字段 $GPGLL语句意义——取值范围
<1> 纬度:ddmm.mmmmm——0000.00000~8959.9999
<2> 南纬或北纬——北纬N,S南纬
<3> 经度:dddmm.mmmmm——0000.00000~17959.99999
<4> 东、西经 ——东经E,西经W
<5> UTC时间——hh:mm:ss
<6> 数据状态——A有效,V无效
$GPGLL,2431.25310,N,11806.15429,E,081401.00,A,A*61


7)$GPZDA 语句
(输出UTC时间和日期信息)
$GPZDA, <1>,<2>,<3>,<4>,<5>*hh
字段 $GPZDA语句意义——取值范围
<1> 时间:hhmmss.ss——0000000.00~235959.99
<2> 日——00~31
<3> 月——00~12
<4> 年——0000~9999
<5> 地方时与世界时之差
<6> 检校位 *hh——*
$GPZDA,081401.00,14,09,2006,00,00*62

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 09:59:24

8)$GPGST 语句
GPS 伪距噪声统计,包括了三维坐标的标准偏差信息)
字段——示例——说明
Sentence ID ——$GPGST
UTC Time——024603.00——UTC time of associated GGA fix
RMS deviation——3.2——Total RMS standard deviation of ranges inputs to the navigation solution
Semi-major deviation——6.6——Standard deviation (meters) of semi-major axis of error ellipse
Semi-minor deviation——4.7——Standard deviation (meters) of semi-minor axis of error ellipse
Semi-major orientation——47.3——Orientation of semi-major axis of error ellipse (true north degrees)
Latitude error deviation——5.8——Standard deviation (meters) of latitude error
Longitude error deviation——5.6——Standard deviation (meters) of longitude error
Altitude error deviation——22.0——Standard deviation (meters) of latitude error
Checksum—— *58
$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58


9)$GPCN0语句
各颗用于解算的卫星信噪比:
$GPCN0,30,40,35,26,24,36,31,38


B、 输出时间说明:
 GPGGA(1次/1秒)
 GPGSA(1次/1秒)
 GPGSV(1次/5秒)
 GPRMC(1次/1秒)
 另可选用GLL,VTG或SiRF二进制格式.


C、坐标系统WGS84
WGS-84坐标系(World Geodetic System)是一种国际上采用的地心坐标系。坐标原点为地球质心,其地心空间直角坐标系的Z轴指向国际时间局(BIH)1984.0定义的协议地极(CTP)方向,X轴指向BIH1984.0的协议子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系,称为1984年世界大地坐标系。这是一个国际协议地球参考系统(ITRS),是目前国际上统一采用的大地坐标系。GPS广播星历是以WGS-84坐标系为根据的。
WGS84坐标系,长轴6378137.000m,短轴6356752.314,扁率1/298.257223563。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-23 10:00:38

2、程序二:读取GPS的原始数据之二
实验开源图形编程(Mind+、编玩边学)与实验串口返回情况

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:45:23

程序三:使用TinyGPS库解码GPS数据
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序三:使用TinyGPS库解码GPS数据
  4. */
  5. #include <SoftwareSerial.h>//导入驱动库
  6. #include <TinyGPS.h>
  7. TinyGPS gps;//初始化
  8. SoftwareSerial ss(9, 8);//设置软串口为D9\D8
  9. void setup() {
  10.   Serial.begin(9600);
  11.   ss.begin(9600);
  12.   Serial.print("简单的 TinyGPS 库 v. ");
  13.   Serial.println(TinyGPS::library_version());
  14.   Serial.println("NEO-6M准备就绪!");
  15.   Serial.println();
  16. }
  17. void loop() {
  18.   bool newData = false;
  19.   unsigned long chars;
  20.   unsigned short sentences, failed;
  21.   // 一秒钟我们解析 GPS 数据并报告一些关键值
  22.   for (unsigned long start = millis(); millis() - start < 1000;){
  23.     while (ss.available()){
  24.       char c = ss.read();
  25.       // Serial.write(c); // 如果您想查看 GPS 数据流,请取消注释此行
  26.       if (gps.encode(c)) // 新的有效数据进来了吗?
  27.         newData = true;
  28.     }
  29.   }
  30.   if (newData){
  31.     float flat, flon;
  32.     unsigned long age;
  33.     gps.f_get_position(&flat, &flon, &age);
  34.     Serial.print("经度=");
  35.     Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
  36.     Serial.print(" 纬度=");
  37.     Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
  38.     Serial.print(" 卫星数=");
  39.     Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
  40.     Serial.print(" 接收=");
  41.     Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  42.   }
  43.   gps.stats(&chars, &sentences, &failed);
  44.   Serial.print(" 字符=");
  45.   Serial.print(chars);
  46.   Serial.print(" 句子=");
  47.   Serial.print(sentences);
  48.   Serial.print(" 失败=");
  49.   Serial.println(failed);
  50.   if (chars == 0)
  51.     Serial.println("** 没有从 GPS 接收到数据:检查接线 **");
  52. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:48:03

2)实验串口返回情况

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:52:42

程序四:使用TinyGPS库解码GPS数据之二
1Arduino参考开源代码
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序四:使用TinyGPS库解码GPS数据之二
  4. */
  5. #include <SoftwareSerial.h>//导入驱动库
  6. #include <TinyGPS.h>
  7. TinyGPS gps;//初始化
  8. SoftwareSerial ss(9, 8);//设置软串口为D9\D8
  9. static void smartdelay(unsigned long ms);
  10. static void print_float(float val, float invalid, int len, int prec);
  11. static void print_int(unsigned long val, unsigned long invalid, int len);
  12. static void print_date(TinyGPS &gps);
  13. static void print_str(const char *str, int len);
  14. void setup() {
  15.   Serial.begin(9600);
  16.   Serial.print("简单的 TinyGPS 库 v. ");
  17.   Serial.println(TinyGPS::library_version());
  18.   Serial.println("NEO-6M准备就绪!");
  19.   Serial.println();
  20.   Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  21.   Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  22.   Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");
  23.   ss.begin(9600);
  24. }
  25. void loop() {
  26.   float flat, flon;
  27.   unsigned long age, date, time, chars = 0;
  28.   unsigned short sentences = 0, failed = 0;
  29.   static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;//静态常量
  30.   print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  31.   print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  32.   gps.f_get_position(&flat, &flon, &age);
  33.   print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  34.   print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  35.   print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  36.   print_date(gps);
  37.   print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  38.   print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  39.   print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  40.   print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  41.   print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  42.   print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  43.   print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
  44.   gps.stats(&chars, &sentences, &failed);
  45.   print_int(chars, 0xFFFFFFFF, 6);
  46.   print_int(sentences, 0xFFFFFFFF, 10);
  47.   print_int(failed, 0xFFFFFFFF, 9);
  48.   Serial.println();
  49.   smartdelay(1000);
  50. }
  51. static void smartdelay(unsigned long ms)
  52. {
  53.   unsigned long start = millis();
  54.   do
  55.   {
  56.     while (ss.available())
  57.       gps.encode(ss.read());
  58.   } while (millis() - start < ms);
  59. }
  60. static void print_float(float val, float invalid, int len, int prec)
  61. {
  62.   if (val == invalid)
  63.   {
  64.     while (len-- > 1)
  65.       Serial.print('*');
  66.     Serial.print(' ');
  67.   }
  68.   else
  69.   {
  70.     Serial.print(val, prec);
  71.     int vi = abs((int)val);
  72.     int flen = prec + (val < 0.0 ? 2 : 1); // . 和 -
  73.     flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
  74.     for (int i = flen; i < len; ++i)
  75.       Serial.print(' ');
  76.   }
  77.   smartdelay(0);
  78. }
  79. static void print_int(unsigned long val, unsigned long invalid, int len)
  80. {
  81.   char sz[32];
  82.   if (val == invalid)
  83.     strcpy(sz, "*******");
  84.   else
  85.     sprintf(sz, "%ld", val);
  86.   sz[len] = 0;
  87.   for (int i = strlen(sz); i < len; ++i)
  88.     sz[i] = ' ';
  89.   if (len > 0)
  90.     sz[len - 1] = ' ';
  91.   Serial.print(sz);
  92.   smartdelay(0);
  93. }
  94. static void print_date(TinyGPS &gps)
  95. {
  96.   int year;
  97.   byte month, day, hour, minute, second, hundredths;
  98.   unsigned long age;
  99.   gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  100.   if (age == TinyGPS::GPS_INVALID_AGE)
  101.     Serial.print("********** ******** ");
  102.   else
  103.   {
  104.     char sz[32];
  105.     sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
  106.             month, day, year, hour, minute, second);
  107.     Serial.print(sz);//月、日、年、时、分、秒
  108.   }
  109.   print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  110.   smartdelay(0);
  111. }
  112. static void print_str(const char *str, int len)
  113. {
  114.   int slen = strlen(str);
  115.   for (int i = 0; i < len; ++i)
  116.     Serial.print(i < slen ? str[i] : ' ');
  117.   smartdelay(0);
  118. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:54:44

2)实验串口返回情况

【Arduino】168种传感器模块系列实验(75)-- NEO6MV2飞控GPS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:56:47

程序五:使用TinyGPS++库测量经纬度和卫星数量
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序五:使用TinyGPS++库测量经纬度和卫星数量
  4. */
  5. #include <TinyGPS++.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8; //设置软串口为D9\D8
  8. static const uint32_t GPSBaud = 9600;
  9. TinyGPSPlus gps; //TinyGPS 对象
  10. // 与 GPS 设备的串行连接
  11. SoftwareSerial mySerial(RXPin, TXPin);
  12. void setup() {
  13.   Serial.begin(9600);
  14.   mySerial.begin(GPSBaud);
  15. }
  16. void loop() {
  17.   while (mySerial.available() > 0)
  18.   {
  19.     gps.encode(mySerial.read());
  20.     if (gps.location.isUpdated())
  21.     {
  22.       Serial.print("纬度= ");
  23.       Serial.print(gps.location.lat(), 6); //获取纬度
  24.       Serial.print(" 经度= ");
  25.       Serial.println(gps.location.lng(), 6); //获取经度
  26.       // 正在使用的卫星数量
  27.       Serial.print("正在使用的 os 卫星数 = ");
  28.       Serial.println(gps.satellites.value());
  29.     }
  30.   }
  31. }
复制代码


回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail