驴友花雕
发表于 2022-5-23 09:29:25
2、模块引脚VCC:电源脚输入3.3-5.5VGND:电源地RXD:串口接收脚-- 接单片机串口TXD 发送TXD:串口发送脚-- 接单片机串口RXD 接收
驴友花雕
发表于 2022-5-23 09:31:17
8.6.3. GY-NEO6MV2飞控GPS模块的实验环境1、GY-NEO6MV2飞控GPS模块实验所需硬件清单 TM1637四位数码管X1 0.96寸OLED液晶屏X1Arduino Uno开发板 X1杜邦线 若干(备了9条)高电平触发有源蜂鸣器模块X1LED发光二极管(绿、蓝色)X2IIC/I2C 1602 LCD液晶屏模块X1高电平触发单路5V继电器模块X1Proto Shield原型扩展板(带mini面包板)X1
驴友花雕
发表于 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 中工作(1)SoftwareSerial 库和TinyGPS 库(2)打开网页https://github.com/,搜索SoftwareSerial和TinyGPS
驴友花雕
发表于 2022-5-23 09:33:59
驴友花雕
发表于 2022-5-23 09:38:46
4、实验接线示意图 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的原始数据(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序一:读取GPS的原始数据
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(9, 8); // (RX,TX of Arduino)
void setup(){
Serial.begin(9600);// 串口监视器波特率
mySerial.begin(9600); //GPS端口波特率
}
void loop(){
while (mySerial.available() > 0){
byte rawData = mySerial.read();//在 rawData 变量中存储字节
Serial.write(rawData); //在串口监视器上打印rawData
}
}
驴友花雕
发表于 2022-5-23 09:44:15
(2)实验串口返回情况(放在电脑桌子上,无接收信号)
驴友花雕
发表于 2022-5-23 09:46:33
(3)实验场景图(电脑桌上)
驴友花雕
发表于 2022-5-23 09:48:45
(4)实验场景图(放在窗口)
驴友花雕
发表于 2022-5-23 09:50:31
(5)实验串口返回情况(放在窗口,接收到信号)
驴友花雕
发表于 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 ——$GPGSTUTC Time——024603.00——UTC time of associated GGA fixRMS deviation——3.2——Total RMS standard deviation of ranges inputs to the navigation solutionSemi-major deviation——6.6——Standard deviation (meters) of semi-major axis of error ellipseSemi-minor deviation——4.7——Standard deviation (meters) of semi-minor axis of error ellipseSemi-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 errorLongitude error deviation——5.6——Standard deviation (meters) of longitude errorAltitude error deviation——22.0——Standard deviation (meters) of latitude errorChecksum—— *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、坐标系统WGS84WGS-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+、编玩边学)与实验串口返回情况
驴友花雕
发表于 2022-5-25 12:45:23
程序三:使用TinyGPS库解码GPS数据(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序三:使用TinyGPS库解码GPS数据
*/
#include <SoftwareSerial.h>//导入驱动库
#include <TinyGPS.h>
TinyGPS gps;//初始化
SoftwareSerial ss(9, 8);//设置软串口为D9\D8
void setup() {
Serial.begin(9600);
ss.begin(9600);
Serial.print("简单的 TinyGPS 库 v. ");
Serial.println(TinyGPS::library_version());
Serial.println("NEO-6M准备就绪!");
Serial.println();
}
void loop() {
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
// 一秒钟我们解析 GPS 数据并报告一些关键值
for (unsigned long start = millis(); millis() - start < 1000;){
while (ss.available()){
char c = ss.read();
// Serial.write(c); // 如果您想查看 GPS 数据流,请取消注释此行
if (gps.encode(c)) // 新的有效数据进来了吗?
newData = true;
}
}
if (newData){
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
Serial.print("经度=");
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(" 纬度=");
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(" 卫星数=");
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(" 接收=");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
}
gps.stats(&chars, &sentences, &failed);
Serial.print(" 字符=");
Serial.print(chars);
Serial.print(" 句子=");
Serial.print(sentences);
Serial.print(" 失败=");
Serial.println(failed);
if (chars == 0)
Serial.println("** 没有从 GPS 接收到数据:检查接线 **");
}
驴友花雕
发表于 2022-5-25 12:48:03
(2)实验串口返回情况
驴友花雕
发表于 2022-5-25 12:52:42
程序四:使用TinyGPS库解码GPS数据之二(1)Arduino参考开源代码 /*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序四:使用TinyGPS库解码GPS数据之二
*/
#include <SoftwareSerial.h>//导入驱动库
#include <TinyGPS.h>
TinyGPS gps;//初始化
SoftwareSerial ss(9, 8);//设置软串口为D9\D8
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
void setup() {
Serial.begin(9600);
Serial.print("简单的 TinyGPS 库 v. ");
Serial.println(TinyGPS::library_version());
Serial.println("NEO-6M准备就绪!");
Serial.println();
Serial.println("Sats HDOP LatitudeLongitudeFixDate Time Date Alt Course Speed CardDistance Course CardChars Sentences Checksum");
Serial.println(" (deg) (deg) Age Age(m) --- from GPS -------- to London----RX RX Fail");
Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");
ss.begin(9600);
}
void loop() {
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;//静态常量
print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
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);
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
gps.stats(&chars, &sentences, &failed);
print_int(chars, 0xFFFFFFFF, 6);
print_int(sentences, 0xFFFFFFFF, 10);
print_int(failed, 0xFFFFFFFF, 9);
Serial.println();
smartdelay(1000);
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
static void print_float(float val, float invalid, int len, int prec)
{
if (val == invalid)
{
while (len-- > 1)
Serial.print('*');
Serial.print(' ');
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . 和 -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i = flen; i < len; ++i)
Serial.print(' ');
}
smartdelay(0);
}
static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz;
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz = 0;
for (int i = strlen(sz); i < len; ++i)
sz = ' ';
if (len > 0)
sz = ' ';
Serial.print(sz);
smartdelay(0);
}
static void print_date(TinyGPS &gps)
{
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print("********** ******** ");
else
{
char sz;
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
month, day, year, hour, minute, second);
Serial.print(sz);//月、日、年、时、分、秒
}
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
smartdelay(0);
}
static void print_str(const char *str, int len)
{
int slen = strlen(str);
for (int i = 0; i < len; ++i)
Serial.print(i < slen ? str : ' ');
smartdelay(0);
}
驴友花雕
发表于 2022-5-25 12:54:44
(2)实验串口返回情况
驴友花雕
发表于 2022-5-25 12:56:47
程序五:使用TinyGPS++库测量经纬度和卫星数量(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序五:使用TinyGPS++库测量经纬度和卫星数量
*/
#include <TinyGPS++.h>//导入驱动库
#include <SoftwareSerial.h>
static const int RXPin = 9, TXPin = 8; //设置软串口为D9\D8
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps; //TinyGPS 对象
// 与 GPS 设备的串行连接
SoftwareSerial mySerial(RXPin, TXPin);
void setup() {
Serial.begin(9600);
mySerial.begin(GPSBaud);
}
void loop() {
while (mySerial.available() > 0)
{
gps.encode(mySerial.read());
if (gps.location.isUpdated())
{
Serial.print("纬度= ");
Serial.print(gps.location.lat(), 6); //获取纬度
Serial.print(" 经度= ");
Serial.println(gps.location.lng(), 6); //获取经度
// 正在使用的卫星数量
Serial.print("正在使用的 os 卫星数 = ");
Serial.println(gps.satellites.value());
}
}
}