18931浏览
楼主: 驴友花雕

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

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 12:59:43

(2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-27 13:05:57

程序六:静态解码NMEA数据流的示例
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序六:静态解码NMEA数据流的示例
  4. */
  5. #include <TinyGPS++.h>//导入驱动库
  6. #include <TinyGPSPlus.h>
  7. // 一个示例 NMEA 流。
  8. const char *gpsStream =
  9.   "$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n"
  10.   "$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n"
  11.   "$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n"
  12.   "$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000*6C\r\n"
  13.   "$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A*7D\r\n"
  14.   "$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000*6F\r\n";
  15. // TinyGPSPlus 对象
  16. TinyGPSPlus gps;
  17. void setup(){
  18.   Serial.begin(115200);
  19.   Serial.println(F("BasicExample.ino"));
  20.   Serial.println(F("TinyGPSPlus 的基本演示(无需设备)"));
  21.   Serial.print(F("测试 TinyGPSPlus 库 v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  22.   Serial.println(F("准备就绪"));
  23.   Serial.println();
  24.   while (*gpsStream)
  25.     if (gps.encode(*gpsStream++))
  26.       displayInfo();
  27.   Serial.println();
  28.   Serial.println(F("完成"));
  29. }
  30. void loop(){
  31. }
  32. void displayInfo()
  33. {
  34.   Serial.print(F("Location: "));
  35.   if (gps.location.isValid())
  36.   {
  37.     Serial.print(gps.location.lat(), 6);
  38.     Serial.print(F(","));
  39.     Serial.print(gps.location.lng(), 6);
  40.   }
  41.   else
  42.   {
  43.     Serial.print(F("INVALID"));
  44.   }
  45.   Serial.print(F("  Date/Time: "));
  46.   if (gps.date.isValid())
  47.   {
  48.     Serial.print(gps.date.month());
  49.     Serial.print(F("/"));
  50.     Serial.print(gps.date.day());
  51.     Serial.print(F("/"));
  52.     Serial.print(gps.date.year());
  53.   }
  54.   else
  55.   {
  56.     Serial.print(F("INVALID"));
  57.   }
  58.   Serial.print(F(" "));
  59.   if (gps.time.isValid())
  60.   {
  61.     if (gps.time.hour() < 10) Serial.print(F("0"));
  62.     Serial.print(gps.time.hour());
  63.     Serial.print(F(":"));
  64.     if (gps.time.minute() < 10) Serial.print(F("0"));
  65.     Serial.print(gps.time.minute());
  66.     Serial.print(F(":"));
  67.     if (gps.time.second() < 10) Serial.print(F("0"));
  68.     Serial.print(gps.time.second());
  69.     Serial.print(F("."));
  70.     if (gps.time.centisecond() < 10) Serial.print(F("0"));
  71.     Serial.print(gps.time.centisecond());
  72.   }
  73.   else
  74.   {
  75.     Serial.print(F("INVALID"));
  76.   }
  77.   Serial.println();
  78. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-27 13:08:57

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-27 13:10:43

7、程序七:TinyGPSPlus 对象的常规使用
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序七:TinyGPSPlus 对象的常规使用
  4. */
  5. #include <TinyGPSPlus.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  8. static const uint32_t GPSBaud = 9600;
  9. // TinyGPSPlus 对象
  10. TinyGPSPlus gps;
  11. //与 GPS 设备的串行连接
  12. SoftwareSerial ss(RXPin, TXPin);
  13. void setup(){
  14.   Serial.begin(9600);//初始化串口
  15.   ss.begin(GPSBaud);
  16.   Serial.println(F("DeviceExample.ino"));
  17.   Serial.println(F("一个简单的 TinyGPSPlus 演示,带有 GPS 模块"));
  18.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  19.   Serial.println(TinyGPSPlus::libraryVersion());
  20.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  21.   Serial.println();
  22. }
  23. void loop(){
  24.   //每次正确编码新数据时,此程序都会显示信息。
  25.   while (ss.available() > 0)
  26.     if (gps.encode(ss.read()))
  27.       displayInfo();
  28.   if (millis() > 5000 && gps.charsProcessed() < 10)
  29.   {
  30.     Serial.println(F("未检测到 GPS:检查接线。"));
  31.     while (true);
  32.   }
  33. }
  34. void displayInfo(){
  35.   Serial.print(F("位置: "));
  36.   if (gps.location.isValid())
  37.   {
  38.     Serial.print(gps.location.lat(), 6);
  39.     Serial.print(F(","));
  40.     Serial.print(gps.location.lng(), 6);
  41.   }
  42.   else
  43.   {
  44.     Serial.print(F("无效"));
  45.   }
  46.   Serial.print(F("  日期/时间:"));
  47.   if (gps.date.isValid())
  48.   {
  49.     Serial.print(gps.date.month());
  50.     Serial.print(F("/"));
  51.     Serial.print(gps.date.day());
  52.     Serial.print(F("/"));
  53.     Serial.print(gps.date.year());
  54.   }
  55.   else
  56.   {
  57.     Serial.print(F("无效"));
  58.   }
  59.   Serial.print(F(" "));
  60.   if (gps.time.isValid())
  61.   {
  62.     if (gps.time.hour() < 10) Serial.print(F("0"));
  63.     Serial.print(gps.time.hour());
  64.     Serial.print(F(":"));
  65.     if (gps.time.minute() < 10) Serial.print(F("0"));
  66.     Serial.print(gps.time.minute());
  67.     Serial.print(F(":"));
  68.     if (gps.time.second() < 10) Serial.print(F("0"));
  69.     Serial.print(gps.time.second());
  70.     Serial.print(F("."));
  71.     if (gps.time.centisecond() < 10) Serial.print(F("0"));
  72.     Serial.print(gps.time.centisecond());
  73.   }
  74.   else
  75.   {
  76.     Serial.print(F("无效"));
  77.   }
  78.   Serial.println();
  79. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-27 13:12:48

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 13:37:54

程序八:TinyGPSPlus 很多有趣功能的综合测试
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序八:TinyGPSPlus 很多有趣功能的综合测试
  4. */
  5. #include <TinyGPSPlus.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  8. static const uint32_t GPSBaud = 9600;
  9. // TinyGPSPlus 对象
  10. TinyGPSPlus gps;
  11. //与 GPS 设备的串行连接
  12. SoftwareSerial ss(RXPin, TXPin);
  13. void setup() {
  14.   Serial.begin(9600);
  15.   ss.begin(GPSBaud);
  16.   Serial.println(F("FullExample.ino"));
  17.   Serial.println(F("TinyGPSPlus 很多有趣功能的综合测试"));
  18.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  19.   Serial.println(TinyGPSPlus::libraryVersion());
  20.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  21.   Serial.println();
  22.   Serial.println(F("Sats HDOP  Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum"));
  23.   Serial.println(F("           (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail"));
  24.   Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
  25. }
  26. void loop() {
  27.   static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  28.   printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  29.   printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
  30.   printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  31.   printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  32.   printInt(gps.location.age(), gps.location.isValid(), 5);
  33.   printDateTime(gps.date, gps.time);
  34.   printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  35.   printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
  36.   printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
  37.   printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);
  38.   unsigned long distanceKmToLondon =
  39.     (unsigned long)TinyGPSPlus::distanceBetween(
  40.       gps.location.lat(),
  41.       gps.location.lng(),
  42.       LONDON_LAT,
  43.       LONDON_LON) / 1000;
  44.   printInt(distanceKmToLondon, gps.location.isValid(), 9);
  45.   double courseToLondon =
  46.     TinyGPSPlus::courseTo(
  47.       gps.location.lat(),
  48.       gps.location.lng(),
  49.       LONDON_LAT,
  50.       LONDON_LON);
  51.   printFloat(courseToLondon, gps.location.isValid(), 7, 2);
  52.   const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);
  53.   printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);
  54.   printInt(gps.charsProcessed(), true, 6);
  55.   printInt(gps.sentencesWithFix(), true, 10);
  56.   printInt(gps.failedChecksum(), true, 9);
  57.   Serial.println();
  58.   smartDelay(1000);
  59.   if (millis() > 5000 && gps.charsProcessed() < 10)
  60.     Serial.println(F("没有接收到 GPS 数据:检查接线"));
  61. }
  62. //这个自定义版本的 delay() 确保 gps 对象
  63. //正在被“喂”有效的数据。
  64. static void smartDelay(unsigned long ms)
  65. {
  66.   unsigned long start = millis();
  67.   do
  68.   {
  69.     while (ss.available())
  70.       gps.encode(ss.read());
  71.   } while (millis() - start < ms);
  72. }
  73. static void printFloat(float val, bool valid, int len, int prec)
  74. {
  75.   if (!valid)
  76.   {
  77.     while (len-- > 1)
  78.       Serial.print('*');
  79.     Serial.print(' ');
  80.   }
  81.   else
  82.   {
  83.     Serial.print(val, prec);
  84.     int vi = abs((int)val);
  85.     int flen = prec + (val < 0.0 ? 2 : 1); // . and -
  86.     flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
  87.     for (int i = flen; i < len; ++i)
  88.       Serial.print(' ');
  89.   }
  90.   smartDelay(0);
  91. }
  92. static void printInt(unsigned long val, bool valid, int len)
  93. {
  94.   char sz[32] = "*****************";
  95.   if (valid)
  96.     sprintf(sz, "%ld", val);
  97.   sz[len] = 0;
  98.   for (int i = strlen(sz); i < len; ++i)
  99.     sz[i] = ' ';
  100.   if (len > 0)
  101.     sz[len - 1] = ' ';
  102.   Serial.print(sz);
  103.   smartDelay(0);
  104. }
  105. static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
  106. {
  107.   if (!d.isValid())
  108.   {
  109.     Serial.print(F("********** "));
  110.   }
  111.   else
  112.   {
  113.     char sz[32];
  114.     sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
  115.     Serial.print(sz);
  116.   }
  117.   if (!t.isValid())
  118.   {
  119.     Serial.print(F("******** "));
  120.   }
  121.   else
  122.   {
  123.     char sz[32];
  124.     sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
  125.     Serial.print(sz);
  126.   }
  127.   printInt(d.age(), d.isValid(), 5);
  128.   smartDelay(0);
  129. }
  130. static void printStr(const char *str, int len)
  131. {
  132.   int slen = strlen(str);
  133.   for (int i = 0; i < len; ++i)
  134.     Serial.print(i < slen ? str[i] : ' ');
  135.   smartDelay(0);
  136. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 13:42:37

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 13:44:59

程序九:测试 TinyGPSPlus 的几乎所有功能
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序九:测试 TinyGPSPlus 的几乎所有功能
  4. */
  5. #include <TinyGPSPlus.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  8. static const uint32_t GPSBaud = 9600;
  9. // TinyGPSPlus 对象
  10. TinyGPSPlus gps;
  11. //与 GPS 设备的串行连接
  12. SoftwareSerial ss(RXPin, TXPin);
  13. // 对于每 5 秒发生一次的统计数据
  14. unsigned long last = 0UL;
  15. void setup() {
  16.   Serial.begin(9600);
  17.   ss.begin(GPSBaud);
  18.   Serial.println(F("KitchenSink.ino"));
  19.   Serial.println(F("测试 TinyGPSPlus 的几乎所有功能"));
  20.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  21.   Serial.println(TinyGPSPlus::libraryVersion());
  22.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  23.   Serial.println();
  24. }
  25. void loop(){
  26.   // 调度传入的字符
  27.   while (ss.available() > 0)
  28.     gps.encode(ss.read());
  29.   if (gps.location.isUpdated())
  30.   {
  31.     Serial.print(F("LOCATION   Fix Age="));
  32.     Serial.print(gps.location.age());
  33.     Serial.print(F("ms Raw Lat="));
  34.     Serial.print(gps.location.rawLat().negative ? "-" : "+");
  35.     Serial.print(gps.location.rawLat().deg);
  36.     Serial.print("[+");
  37.     Serial.print(gps.location.rawLat().billionths);
  38.     Serial.print(F(" billionths],  Raw Long="));
  39.     Serial.print(gps.location.rawLng().negative ? "-" : "+");
  40.     Serial.print(gps.location.rawLng().deg);
  41.     Serial.print("[+");
  42.     Serial.print(gps.location.rawLng().billionths);
  43.     Serial.print(F(" billionths],  Lat="));
  44.     Serial.print(gps.location.lat(), 6);
  45.     Serial.print(F(" Long="));
  46.     Serial.println(gps.location.lng(), 6);
  47.   }
  48.   else if (gps.date.isUpdated())
  49.   {
  50.     Serial.print(F("DATE       Fix Age="));
  51.     Serial.print(gps.date.age());
  52.     Serial.print(F("ms Raw="));
  53.     Serial.print(gps.date.value());
  54.     Serial.print(F(" Year="));
  55.     Serial.print(gps.date.year());
  56.     Serial.print(F(" Month="));
  57.     Serial.print(gps.date.month());
  58.     Serial.print(F(" Day="));
  59.     Serial.println(gps.date.day());
  60.   }
  61.   else if (gps.time.isUpdated())
  62.   {
  63.     Serial.print(F("TIME       Fix Age="));
  64.     Serial.print(gps.time.age());
  65.     Serial.print(F("ms Raw="));
  66.     Serial.print(gps.time.value());
  67.     Serial.print(F(" Hour="));
  68.     Serial.print(gps.time.hour());
  69.     Serial.print(F(" Minute="));
  70.     Serial.print(gps.time.minute());
  71.     Serial.print(F(" Second="));
  72.     Serial.print(gps.time.second());
  73.     Serial.print(F(" Hundredths="));
  74.     Serial.println(gps.time.centisecond());
  75.   }
  76.   else if (gps.speed.isUpdated())
  77.   {
  78.     Serial.print(F("SPEED      Fix Age="));
  79.     Serial.print(gps.speed.age());
  80.     Serial.print(F("ms Raw="));
  81.     Serial.print(gps.speed.value());
  82.     Serial.print(F(" Knots="));
  83.     Serial.print(gps.speed.knots());
  84.     Serial.print(F(" MPH="));
  85.     Serial.print(gps.speed.mph());
  86.     Serial.print(F(" m/s="));
  87.     Serial.print(gps.speed.mps());
  88.     Serial.print(F(" km/h="));
  89.     Serial.println(gps.speed.kmph());
  90.   }
  91.   else if (gps.course.isUpdated())
  92.   {
  93.     Serial.print(F("COURSE     Fix Age="));
  94.     Serial.print(gps.course.age());
  95.     Serial.print(F("ms Raw="));
  96.     Serial.print(gps.course.value());
  97.     Serial.print(F(" Deg="));
  98.     Serial.println(gps.course.deg());
  99.   }
  100.   else if (gps.altitude.isUpdated())
  101.   {
  102.     Serial.print(F("ALTITUDE   Fix Age="));
  103.     Serial.print(gps.altitude.age());
  104.     Serial.print(F("ms Raw="));
  105.     Serial.print(gps.altitude.value());
  106.     Serial.print(F(" Meters="));
  107.     Serial.print(gps.altitude.meters());
  108.     Serial.print(F(" Miles="));
  109.     Serial.print(gps.altitude.miles());
  110.     Serial.print(F(" KM="));
  111.     Serial.print(gps.altitude.kilometers());
  112.     Serial.print(F(" Feet="));
  113.     Serial.println(gps.altitude.feet());
  114.   }
  115.   else if (gps.satellites.isUpdated())
  116.   {
  117.     Serial.print(F("SATELLITES Fix Age="));
  118.     Serial.print(gps.satellites.age());
  119.     Serial.print(F("ms Value="));
  120.     Serial.println(gps.satellites.value());
  121.   }
  122.   else if (gps.hdop.isUpdated())
  123.   {
  124.     Serial.print(F("HDOP       Fix Age="));
  125.     Serial.print(gps.hdop.age());
  126.     Serial.print(F("ms raw="));
  127.     Serial.print(gps.hdop.value());
  128.     Serial.print(F(" hdop="));
  129.     Serial.println(gps.hdop.hdop());
  130.   }
  131.   else if (millis() - last > 5000)
  132.   {
  133.     Serial.println();
  134.     if (gps.location.isValid())
  135.     {
  136.       static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  137.       double distanceToLondon =
  138.         TinyGPSPlus::distanceBetween(
  139.           gps.location.lat(),
  140.           gps.location.lng(),
  141.           LONDON_LAT,
  142.           LONDON_LON);
  143.       double courseToLondon =
  144.         TinyGPSPlus::courseTo(
  145.           gps.location.lat(),
  146.           gps.location.lng(),
  147.           LONDON_LAT,
  148.           LONDON_LON);
  149.       Serial.print(F("伦敦       距离="));
  150.       Serial.print(distanceToLondon / 1000, 6);
  151.       Serial.print(F(" km Course-to="));
  152.       Serial.print(courseToLondon, 6);
  153.       Serial.print(F(" degrees ["));
  154.       Serial.print(TinyGPSPlus::cardinal(courseToLondon));
  155.       Serial.println(F("]"));
  156.     }
  157.     Serial.print(F("DIAGS      Chars="));
  158.     Serial.print(gps.charsProcessed());
  159.     Serial.print(F(" Sentences-with-Fix="));
  160.     Serial.print(gps.sentencesWithFix());
  161.     Serial.print(F(" Failed-checksum="));
  162.     Serial.print(gps.failedChecksum());
  163.     Serial.print(F(" Passed-checksum="));
  164.     Serial.println(gps.passedChecksum());
  165.     if (gps.charsProcessed() < 10)
  166.       Serial.println(F("警告:没有 GPS 数据,检查接线。"));
  167.     last = millis();
  168.     Serial.println();
  169.   }
  170. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 13:46:23

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 17:59:46

程序十:使用 TinyGPSCustom 对象跟踪卫星高度
1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十:使用 TinyGPSCustom 对象跟踪卫星高度
  4. */
  5.        
  6. #include <TinyGPSPlus.h>//导入驱动库
  7. #include <SoftwareSerial.h>
  8. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  9. static const uint32_t GPSBaud = 9600;
  10. static const int MAX_SATELLITES = 40;
  11. static const int PAGE_LENGTH = 40;
  12. // TinyGPSPlus 对象
  13. TinyGPSPlus gps;
  14. //与 GPS 设备的串行连接
  15. SoftwareSerial ss(RXPin, TXPin);
  16. TinyGPSCustom totalGPGSVMessages(gps, "GPGSV", 1); // $GPGSV 句子,第一个元素
  17. TinyGPSCustom messageNumber(gps, "GPGSV", 2);      // $GPGSV 句子,第二个元素
  18. TinyGPSCustom satNumber[4]; // 稍后初始化
  19. TinyGPSCustom elevation[4];
  20. bool anyChanges = false;
  21. unsigned long linecount = 0;
  22. struct
  23. {
  24.   int elevation;
  25.   bool active;
  26. } sats[MAX_SATELLITES];
  27. void setup(){
  28.   Serial.begin(9600);
  29.   ss.begin(GPSBaud);
  30.   Serial.println(F("SatElevTracker.ino"));
  31.   Serial.println(F("显示 GPS 卫星高度变化"));
  32.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  33.   Serial.println(TinyGPSPlus::libraryVersion());
  34.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  35.   Serial.println();
  36.   
  37.   // 初始化所有未初始化的 TinyGPSCustom 对象
  38.   for (int i=0; i<4; ++i)
  39.   {
  40.     satNumber[i].begin(gps, "GPGSV", 4 + 4 * i); // offsets 4, 8, 12, 16
  41.     elevation[i].begin(gps, "GPGSV", 5 + 4 * i); // offsets 5, 9, 13, 17
  42.   }
  43. }
  44. void loop(){
  45.   // 调度传入的字符
  46.   if (ss.available() > 0)
  47.   {
  48.     gps.encode(ss.read());
  49.    
  50.     if (totalGPGSVMessages.isUpdated())
  51.     {
  52.       for (int i=0; i<4; ++i)
  53.       {
  54.         int no = atoi(satNumber[i].value());
  55.         if (no >= 1 && no <= MAX_SATELLITES)
  56.         {
  57.           int elev = atoi(elevation[i].value());
  58.           sats[no-1].active = true;
  59.           if (sats[no-1].elevation != elev)
  60.           {
  61.             sats[no-1].elevation = elev;
  62.             anyChanges = true;
  63.           }
  64.         }
  65.       }
  66.       
  67.       int totalMessages = atoi(totalGPGSVMessages.value());
  68.       int currentMessage = atoi(messageNumber.value());
  69.       if (totalMessages == currentMessage && anyChanges)
  70.       {
  71.         if (linecount++ % PAGE_LENGTH == 0)
  72.           printHeader();
  73.         TimePrint();
  74.         for (int i=0; i<MAX_SATELLITES; ++i)
  75.         {
  76.           Serial.print(F(" "));
  77.           if (sats[i].active)
  78.             IntPrint(sats[i].elevation, 2);
  79.           else
  80.             Serial.print(F("   "));
  81.           sats[i].active = false;
  82.         }
  83.         Serial.println();
  84.         anyChanges = false;
  85.       }
  86.     }
  87.   }
  88. }
  89. void IntPrint(int n, int len){
  90.   int digs = n < 0 ? 2 : 1;
  91.   for (int i=10; i<=abs(n); i*=10)
  92.     ++digs;
  93.   while (digs++ < len)
  94.     Serial.print(F(" "));
  95.   Serial.print(n);
  96.   Serial.print(F(" "));
  97. }
  98. void TimePrint(){
  99.   if (gps.time.isValid())
  100.   {
  101.     if (gps.time.hour() < 10)
  102.       Serial.print(F("0"));
  103.     Serial.print(gps.time.hour());
  104.     Serial.print(F(":"));
  105.     if (gps.time.minute() < 10)
  106.       Serial.print(F("0"));
  107.     Serial.print(gps.time.minute());
  108.     Serial.print(F(":"));
  109.     if (gps.time.second() < 10)
  110.       Serial.print(F("0"));
  111.     Serial.print(gps.time.second());
  112.     Serial.print(F(" "));
  113.   }
  114.   else
  115.   {
  116.     Serial.print(F("(未知的)"));
  117.   }
  118. }
  119. void printHeader(){
  120.   Serial.println();
  121.   Serial.print(F("时间     "));
  122.   for (int i=0; i<MAX_SATELLITES; ++i)
  123.   {
  124.     Serial.print(F(" "));
  125.     IntPrint(i+1, 2);
  126.   }
  127.   Serial.println();
  128.   Serial.print(F("---------"));
  129.   for (int i=0; i<MAX_SATELLITES; ++i)
  130.     Serial.print(F("----"));
  131.   Serial.println();
  132. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-29 18:01:29

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-31 21:09:11

程序十一:使用 TinyGPSCustom 对象数组监视所有可见的卫星
1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十一:使用 TinyGPSCustom 对象数组监视所有可见的卫星
  4. */
  5. #include <TinyGPSPlus.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  8. static const uint32_t GPSBaud = 9600;
  9. // TinyGPSPlus 对象
  10. TinyGPSPlus gps;
  11. //与 GPS 设备的串行连接
  12. SoftwareSerial ss(RXPin, TXPin);
  13. /*
  14.   来自 http://aprs.gids.nl/nmea/:
  15.    
  16.   $GPGSV
  17.   
  18.   视野中的 GPS 卫星
  19.   
  20.   例如:
  21. $GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74   $GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
  22. $GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D
  23.   1 = 此周期中此类消息的总数
  24.   2 = 消息编号
  25.   3 = 视图中的 SV 总数
  26.   4 = SV PRN 号码
  27.   5 = 以度为单位的仰角,最大 90
  28.   6 = 方位角,从真北的度数,000 到 359
  29.   7 = SNR,00-99 dB(不跟踪时为空)
  30.   8-11 = 关于第二个 SV 的信息,与字段 4-7 相同
  31.   12-15=关于第三个 SV 的信息,与字段 4-7 相同
  32.   16-19= 关于第四个 SV 的信息,与字段 4-7 相同
  33. */
  34. static const int MAX_SATELLITES = 40;
  35. TinyGPSCustom totalGPGSVMessages(gps, "GPGSV", 1); // $GPGSV 句子,第一个元素
  36. TinyGPSCustom messageNumber(gps, "GPGSV", 2);      // $GPGSV 句子,第二个元素
  37. TinyGPSCustom satsInView(gps, "GPGSV", 3);         // $GPGSV 句子,第三个元素
  38. TinyGPSCustom satNumber[4]; // 稍后初始化
  39. TinyGPSCustom elevation[4];
  40. TinyGPSCustom azimuth[4];
  41. TinyGPSCustom snr[4];
  42. struct{
  43.   bool active;
  44.   int elevation;
  45.   int azimuth;
  46.   int snr;
  47. } sats[MAX_SATELLITES];
  48. void setup(){
  49.   Serial.begin(9600);
  50.   ss.begin(GPSBaud);
  51.   Serial.println(F("SatelliteTracker.ino"));
  52.   Serial.println(F("使用 TinyGPSCustom 监控卫星位置和信号强度"));
  53.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  54.   Serial.println(TinyGPSPlus::libraryVersion());
  55.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  56.   Serial.println();
  57.   
  58.   // 初始化所有未初始化的 TinyGPSCustom 对象
  59.   for (int i=0; i<4; ++i)
  60.   {
  61.     satNumber[i].begin(gps, "GPGSV", 4 + 4 * i); // offsets 4, 8, 12, 16
  62.     elevation[i].begin(gps, "GPGSV", 5 + 4 * i); // offsets 5, 9, 13, 17
  63.     azimuth[i].begin(  gps, "GPGSV", 6 + 4 * i); // offsets 6, 10, 14, 18
  64.     snr[i].begin(      gps, "GPGSV", 7 + 4 * i); // offsets 7, 11, 15, 19
  65.   }
  66. }
  67. void loop(){
  68.   // 初始化所有未初始化的 TinyGPSCustom 对象
  69.   if (ss.available() > 0)
  70.   {
  71.     gps.encode(ss.read());
  72.     if (totalGPGSVMessages.isUpdated())
  73.     {
  74.       for (int i=0; i<4; ++i)
  75.       {
  76.         int no = atoi(satNumber[i].value());
  77.         // Serial.print(F("SatNumber is ")); Serial.println(no);
  78.         if (no >= 1 && no <= MAX_SATELLITES)
  79.         {
  80.           sats[no-1].elevation = atoi(elevation[i].value());
  81.           sats[no-1].azimuth = atoi(azimuth[i].value());
  82.           sats[no-1].snr = atoi(snr[i].value());
  83.           sats[no-1].active = true;
  84.         }
  85.       }
  86.       
  87.       int totalMessages = atoi(totalGPGSVMessages.value());
  88.       int currentMessage = atoi(messageNumber.value());
  89.       if (totalMessages == currentMessage)
  90.       {
  91.         Serial.print(F("Sats="));
  92.         Serial.print(gps.satellites.value());
  93.         Serial.print(F(" Nums="));
  94.         for (int i=0; i<MAX_SATELLITES; ++i)
  95.           if (sats[i].active)
  96.           {
  97.             Serial.print(i+1);
  98.             Serial.print(F(" "));
  99.           }
  100.         Serial.print(F(" 海拔="));//海拔
  101.         for (int i=0; i<MAX_SATELLITES; ++i)
  102.           if (sats[i].active)
  103.           {
  104.             Serial.print(sats[i].elevation);
  105.             Serial.print(F(" "));
  106.           }
  107.         Serial.print(F(" 方位角="));//方位角
  108.         for (int i=0; i<MAX_SATELLITES; ++i)
  109.           if (sats[i].active)
  110.           {
  111.             Serial.print(sats[i].azimuth);
  112.             Serial.print(F(" "));
  113.           }
  114.         
  115.         Serial.print(F(" 信噪比="));//信噪比
  116.         for (int i=0; i<MAX_SATELLITES; ++i)
  117.           if (sats[i].active)
  118.           {
  119.             Serial.print(sats[i].snr);
  120.             Serial.print(F(" "));
  121.           }
  122.         Serial.println();
  123.         for (int i=0; i<MAX_SATELLITES; ++i)
  124.           sats[i].active = false;
  125.       }
  126.     }
  127.   }
  128. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-31 21:10:46

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-2 07:44:47

程序十二:使用 TinyGPSCustom 提取任何 NMEA 字段
1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十二:使用 TinyGPSCustom 提取任何 NMEA 字段
  4. */
  5. #include <TinyGPSPlus.h>//导入驱动库
  6. #include <SoftwareSerial.h>
  7. static const int RXPin = 9, TXPin = 8;//定义软串口接脚
  8. static const uint32_t GPSBaud = 9600;
  9. // TinyGPSPlus 对象
  10. TinyGPSPlus gps;
  11. //与 GPS 设备的串行连接
  12. SoftwareSerial ss(RXPin, TXPin);
  13. /*
  14.    通过像这样声明 TinyGPSCustom 对象,我们宣布我们
  15.    对 $GPGSA 中的第 15、16 和 17 字段感兴趣
  16.    句子,分别是PDOP(F(“位置精度的稀释”)),
  17.    HDOP (F("horizo​​ntal...")) 和 VDOP (F("vertical..."))。
  18.    (计数从紧跟句子名称的字段开始,
  19.    即 $GPGSA。有关 NMEA 语句的更多信息,请咨询您的
  20.    GPS 模块的文档和/或 http://aprs.gids.nl/nmea/。)
  21.    如果你的 GPS 模块不支持 $GPGSA 语句,那么你
  22.    不会从此程序获得任何输出。
  23. */
  24. TinyGPSCustom pdop(gps, "GPGSA", 15); // $GPGSA 句子,第 15 个元素
  25. TinyGPSCustom hdop(gps, "GPGSA", 16); // $GPGSA 句子,第 16 个元素
  26. TinyGPSCustom vdop(gps, "GPGSA", 17); // $GPGSA 句子,第 17 个元素
  27. void setup() {
  28.   Serial.begin(9600);
  29.   ss.begin(GPSBaud);
  30.   Serial.println(F("UsingCustomFields.ino"));
  31.   Serial.println(F("使用 TinyGPSCustom 提取任何 NMEA 字段"));
  32.   Serial.print(F("测试 TinyGPSPlus 库 v."));
  33.   Serial.println(TinyGPSPlus::libraryVersion());
  34.   Serial.println(F("GY-NEO6MV2模块准备就绪"));
  35.   Serial.println();
  36. }
  37. void loop() {
  38.   // 每次更新任何内容时,打印所有内容。
  39.   if (gps.altitude.isUpdated() || gps.satellites.isUpdated() ||
  40.       pdop.isUpdated() || hdop.isUpdated() || vdop.isUpdated())
  41.   {
  42.     Serial.print(F("ALT="));   Serial.print(gps.altitude.meters());
  43.     Serial.print(F(" PDOP=")); Serial.print(pdop.value());
  44.     Serial.print(F(" HDOP=")); Serial.print(hdop.value());
  45.     Serial.print(F(" VDOP=")); Serial.print(vdop.value());
  46.     Serial.print(F(" SATS=")); Serial.println(gps.satellites.value());
  47.   }
  48.   while (ss.available() > 0)
  49.     gps.encode(ss.read());
  50. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-2 07:46:51

2)实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-2 07:48:43

(3)实验场景图


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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-4 08:47:07

程序十三:在OLED上显示日期、时间、纬度和经度
1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十三:在OLED上显示日期、时间、纬度和经度
  4. */
  5. #include <TimeLib.h>//导入驱动库
  6. #include <TinyGPS++.h>
  7. #include <SoftwareSerial.h>
  8. #include <U8glib.h>
  9. //用于连接GY-NEO6MV2模块的引脚D9/D8
  10. static const int RXPin = 9, TXPin = 8;
  11. // TinyGPS++ 对象
  12. TinyGPSPlus gps;
  13. // GPS模块的串口连接
  14. SoftwareSerial Serial_GPS(RXPin, TXPin);
  15. //OLED显示设置
  16. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST);
  17. void draw() {
  18.   //设置时间/时区
  19.   GPS_Timezone_Adjust();
  20.   //显示的图形命令必须放在这里aqui
  21.   u8g.setFont(u8g_font_8x13B);
  22.   u8g.drawRFrame(0, 0, 128, 64, 4);
  23.   //日期线
  24.   u8g.drawStr(10, 14, "D:        ");
  25.   u8g.setPrintPos(34, 14);
  26.   //显示日期
  27.   if (day() < 10)
  28.   {
  29.     u8g.print("0");
  30.   }
  31.   u8g.print(day());
  32.   u8g.drawStr(51, 14, "/");
  33.   u8g.setPrintPos(60, 14);
  34.   //显示月份
  35.   if (month() < 10)
  36.   {
  37.     u8g.print("0");
  38.   }
  39.   u8g.print(month());
  40.   u8g.drawStr(76, 14, "/");
  41.   u8g.setPrintPos(85, 14);
  42.   //显示年份
  43.   u8g.print(year());
  44.   // 时间线
  45.   u8g.drawStr(10, 29, "H:        ");
  46.   u8g.setPrintPos(45, 29);
  47.   //开始时间
  48.   if (hour() < 10)
  49.   {
  50.     u8g.print("0");
  51.   }
  52.   u8g.print(hour());
  53.   u8g.drawStr(61, 28, ":");
  54.   u8g.setPrintPos(70, 29);
  55.   //显示分钟
  56.   if (minute() < 10)
  57.   {
  58.     u8g.print("0");
  59.   }
  60.   u8g.print(minute());
  61.   u8g.drawStr(86, 28, ":");
  62.   u8g.setPrintPos(95, 29);
  63.   //显示秒数
  64.   if (second() < 10)
  65.   {
  66.     u8g.print("0");
  67.   }
  68.   u8g.print(second());
  69.   //纬度
  70.   u8g.drawStr(10, 44, "Lat:         ");
  71.   u8g.setPrintPos(45, 44);
  72.   u8g.print(gps.location.lat(), 5);
  73.   //经度
  74.   u8g.drawStr(10, 59, "Lon:         ");
  75.   u8g.setPrintPos(45, 59);
  76.   u8g.print(gps.location.lng(), 5);
  77. }
  78. //根据地区调整时区
  79. const int UTC_offset = -3;
  80. void setup() {
  81.   // Arduino 波特率
  82.   Serial.begin(9600);
  83.   //波特率GPS模块
  84.   Serial_GPS.begin(9600);
  85.   //在串口监视器上显示初始信息
  86.   Serial.println(F("日期、时间、纬度和经度"));
  87.   Serial.println(F("GPS 模块 GY-NEO6MV2"));
  88.   Serial.print(F("TinyGPS++ 驱动库 v."));
  89.   Serial.println(TinyGPSPlus::libraryVersion());
  90.   Serial.println();
  91.   //OLED显示设置
  92.   if ( u8g.getMode() == U8G_MODE_R3G3B2 )
  93.   {
  94.     u8g.setColorIndex(255);     // 白色的
  95.   }
  96.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
  97.     u8g.setColorIndex(3);         // 最大强度
  98.   }
  99.   else if ( u8g.getMode() == U8G_MODE_BW ) {
  100.     u8g.setColorIndex(1);         //像素开启
  101.   }
  102.   else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
  103.     u8g.setHiColorByRGB(255, 255, 255);
  104.   }
  105. }
  106. void loop() {
  107.   //与GPS模块连接
  108.   while (Serial_GPS.available() > 0)
  109.     if (gps.encode(Serial_GPS.read()))
  110.       displayInfo();
  111.   if (millis() > 5000 && gps.charsProcessed() < 10)
  112.   {
  113.     Serial.println(F("未检测到 GPS:检查接线。"));
  114.     while (true);
  115.   }
  116.   //调用屏幕上的绘图例程
  117.   u8g.firstPage();
  118.   do
  119.   {
  120.     draw();
  121.   }
  122.   while ( u8g.nextPage() );
  123.   delay(1000);
  124. }
  125. void displayInfo() {
  126.   //在串口监视器中显示信息
  127.   Serial.print(F("位置:"));
  128.   if (gps.location.isValid())
  129.   {
  130.     Serial.print(gps.location.lat(), 6); //latitude
  131.     Serial.print(F(","));
  132.     Serial.print(gps.location.lng(), 6); //longitude
  133.   }
  134.   else
  135.   {
  136.     Serial.print(F("无效"));
  137.   }
  138.   Serial.print(F("  日期/时间: "));
  139.   if (gps.date.isValid())
  140.   {
  141.     Serial.print(gps.date.day()); //天
  142.     Serial.print(F("/"));
  143.     Serial.print(gps.date.month()); //月
  144.     Serial.print(F("/"));
  145.     Serial.print(gps.date.year());//年
  146.   }
  147.   else
  148.   {
  149.     Serial.print(F("无效"));
  150.   }
  151.   Serial.print(F(" "));
  152.   if (gps.time.isValid())
  153.   {
  154.     if (gps.time.hour() < 10) Serial.print(F("0"));
  155.     Serial.print(gps.time.hour()); //小时
  156.     Serial.print(F(":"));
  157.     if (gps.time.minute() < 10) Serial.print(F("0"));
  158.     Serial.print(gps.time.minute()); //分钟
  159.     Serial.print(F(":"));
  160.     if (gps.time.second() < 10) Serial.print(F("0"));
  161.     Serial.print(gps.time.second()); //第二
  162.     Serial.print(F("."));
  163.     if (gps.time.centisecond() < 10) Serial.print(F("0"));
  164.     Serial.print(gps.time.centisecond());
  165.   }
  166.   else
  167.   {
  168.     Serial.print(F("无效"));
  169.   }
  170.   Serial.println();
  171. }
  172. void GPS_Timezone_Adjust() {
  173.   while (Serial_GPS.available())
  174.   {
  175.     if (gps.encode(Serial_GPS.read()))
  176.     {
  177.       int Year = gps.date.year();
  178.       byte Month = gps.date.month();
  179.       byte Day = gps.date.day();
  180.       byte Hour = gps.time.hour();
  181.       byte Minute = gps.time.minute();
  182.       byte Second = gps.time.second();
  183.       //根据GPS数据调整日期和时间
  184.       setTime(Hour, Minute, Second, Day, Month, Year);
  185.       //应用偏移来设置日期和时间
  186.       //根据时区
  187.       adjustTime(UTC_offset * SECS_PER_HOUR);
  188.     }
  189.   }
  190. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-4 08:48:55

(2)实验串口返回情况(放在电脑桌上,没有GPS信号)

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-4 08:54:08

3)实验场景图 (放在电脑桌上,没有GPS信号)

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-4 08:55:34

4)实验串口返回情况(模块放在窗口,接收到GPS信号)

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-4 08:57:34

5)实验场景图(模块放在窗口,接收到GPS信号)

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

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail