Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】168种传感器模块系列实验(75)--- 6MV2飞控GPS模块

[复制链接]
 楼主| 发表于 2022-5-29 13:42 | 显示全部楼层
2)实验串口返回情况

8.6-36-.jpg

 楼主| 发表于 2022-5-29 13:44 | 显示全部楼层
程序九:测试 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:45 | 显示全部楼层
2)实验串口返回情况

8.6-37.jpg

 楼主| 发表于 2022-5-29 17:59 | 显示全部楼层
程序十:使用 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 | 显示全部楼层
2)实验串口返回情况

8.6-38.jpg

 楼主| 发表于 2022-5-31 21:09 | 显示全部楼层
程序十一:使用 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 | 显示全部楼层
2)实验串口返回情况

8.6-39.jpg

 楼主| 发表于 2022-6-2 07:44 | 显示全部楼层
程序十二:使用 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 | 显示全部楼层
2)实验串口返回情况

8.6-40.jpg

 楼主| 发表于 2022-6-2 07:48 | 显示全部楼层
(3)实验场景图

8.6-41.jpg

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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-11-29 23:50 , Processed in 0.074320 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表