50200浏览
查看: 50200|回复: 119

[项目] 【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块

[复制链接]
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图2

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

驴友花雕  中级技神
 楼主|

发表于 2021-9-7 21:07:29

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目二十四:通过Easy-IOT平台发布消息(数字0或1),唤醒BC20模块

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  4.   NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  5.   项目二十四:通过Easy-IOT平台发布消息(数字0或1),唤醒BC20模块
  6.   实验接线:
  7.   BC20       UNO
  8.   VIN        5V
  9.   GND        GND
  10.   SCL        A5
  11.   SDA        A4
  12.   ISR        D2
  13. */
  14. #include "DFRobot_BC20_Gravity.h"
  15. //RGB有7种颜色可供选择
  16. #define  RED 0
  17. #define  BLUE 1
  18. #define  GREEN 2
  19. #define  YELLOW 3
  20. #define  PURPLE 4
  21. #define  CYAN 5
  22. #define  WHITE 6
  23. //配置参数休眠模式
  24. #define  SLEEP_INTERVAL 10000
  25. static uint32_t timeStamp = 0;
  26. bool sleepFlag = false;
  27. //配置设备证书信息
  28. char* Iot_id = "wGkCJkIng";
  29. char* Client_ID  = "BC20 NB-IoT";
  30. char* Iot_pwd    = "QMkC1kInRz";
  31. //配置域名和端口号
  32. char* EasyIot_SERVER = "182.254.130.180";
  33. char* PORT = "1883";
  34. //设置需要发布的设备编号
  35. char* pubTopic = "hJmOvRIng";
  36. //IIC通讯
  37. #define USE_IIC
  38. //硬件串口通讯
  39. //#define USE_HSERIAL
  40. //软件串口通讯
  41. //#define USE_SSERIAL
  42. DFRobot_BC20_IIC myBC20(0x33);
  43. /*
  44.    每次模块收到消息时,都会调用此函数。
  45.    它将打印消息和相应的主题。
  46. */
  47. void callback(char * topic, uint8_t * payload, unsigned int len) {
  48.   Serial.print("接收[主题:");
  49.   Serial.print(topic);
  50.   Serial.print("] ");
  51.   for (int i = 0; i < len; i++) {
  52.     Serial.print((char)payload[i]);
  53.   }
  54.   Serial.println();
  55.   timeStamp = millis();
  56.   sleepFlag = true;
  57. }
  58. void ConnectCloud() {
  59.   Serial.print("尝试MQTT连接...");
  60.   while (!myBC20.connected()) {
  61.     Serial.print(".");
  62.     if (myBC20.connect(Client_ID, Iot_id, Iot_pwd)) {
  63.       Serial.println("连接服务器正常");
  64.     } else {
  65.       //用于检测设备与服务器的连接
  66.       if (myBC20.getQMTCONN())
  67.         break;
  68.     }
  69.   }
  70.   
  71.   while (!myBC20.subTopic('0', '1',pubTopic, '0')) {
  72.     Serial.print(".");
  73.   }
  74.   Serial.print("主题:");
  75.   Serial.print(pubTopic);
  76.   Serial.println("已经订阅了!");
  77. }
  78. void setup() {
  79.   Serial.begin(115200);
  80.   myBC20.LED_OFF();
  81.   //启动BC20
  82.   Serial.print("正在启动BC20,请稍等...... ");
  83.   myBC20.changeColor(RED);
  84.   while (!myBC20.powerOn()) {
  85.     Serial.print(".");
  86.     myBC20.LED_ON();
  87.     delay(500);
  88.     myBC20.LED_OFF();
  89.     delay(500);
  90.   }
  91.   Serial.println("BC20 启动成功!");
  92.   //检查 SIM 卡是否插入
  93.   Serial.print("检查SIM卡...");
  94.   myBC20.changeColor(GREEN);
  95.   while (!myBC20.checkNBCard()) {
  96.     Serial.print(".");
  97.     myBC20.LED_ON();
  98.     delay(500);
  99.     myBC20.LED_OFF();
  100.     delay(500);
  101.   }
  102.   Serial.println("OK!");
  103.   /*如果你使用的是大内存主控,你可以开启
  104.    *以下功能可查看SIM卡详情
  105.    *打印IMEI、ICCID和IMSI */
  106.   //  myBC20.getGSN(IMEI);
  107.   //  Serial.print("BC20 IMEI: ");
  108.   //  Serial.println(sGSN.imei);
  109.   //  Serial.print("SIM card ICCID:");
  110.   //  Serial.print(myBC20.getQCCID());
  111.   //  Serial.print("SIM card IMSI: ");
  112.   //  Serial.println((char *)myBC20.getIMI());
  113.   /*
  114.      模块将自动尝试连接到网络(移动站)。
  115.      检查它是否已连接到网络。
  116.   */
  117.   Serial.print("正在连接网络......");
  118.   myBC20.changeColor(BLUE);
  119.   while (myBC20.getGATT() == 0) {
  120.     Serial.print(".");
  121.     myBC20.LED_ON();
  122.     delay(500);
  123.     myBC20.LED_OFF();
  124.     delay(500);
  125.   }
  126.   Serial.println("已连接!");
  127.   //设置回调函数
  128.   myBC20.setCallback(callback);
  129.   Serial.println("连接到DFRobot Easy-IoT");
  130.   //配置物联网服务器
  131.   myBC20.setServer(EasyIot_SERVER, PORT);
  132.   Serial.println("服务器可用!");
  133.   //连接DFRobot Easy-IoT
  134.   ConnectCloud();
  135.   Serial.println("云连接成功!");
  136.   //启用深度睡眠模式
  137.   myBC20.configSleepMode(eSleepMode_DeepSleep);
  138.   //当进入 PSM 时,BC20 将不会收到任何从云端发出的消息。
  139.   //禁用 PSM
  140.   myBC20.setPSMMode(ePSM_OFF);
  141.   //使模块进入睡眠模式。
  142.   if (!myBC20.stmLowpower()) {
  143.     Serial.println("BC20模块进入睡眠模式!");
  144.   }
  145. }
  146. void loop() {
  147.   myBC20.loop();
  148. /*
  149.      笔记:
  150.      1.云端发送的第一条消息是唤醒模块。
  151.      此消息将被丢弃。
  152.      2.第二条消息和后面的消息将被接收并打印
  153.      在模块进入睡眠模块之前。
  154.      3.当模块再次进入睡眠模式时,又一次唤醒信息
  155.      在发送有效消息之前需要。
  156.      4.确定进入每个睡眠模式的时间间隔
  157.      按 SLEEP_INTERVAL。
  158.   */
  159.   if (sleepFlag == true) {
  160.     if (millis() - timeStamp > SLEEP_INTERVAL) {
  161.       sleepFlag = false;
  162.       //使模块进入睡眠模式。
  163.       if (!myBC20.stmLowpower()) {
  164.         Serial.println("BC20模块进入睡眠模式!");
  165.       }
  166.     }
  167.   }
  168. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-7 11:30:02

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目二十:通过Easy-IOT平台发布消息

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  4.   NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  5.   项目二十:通过Easy-IOT平台发布消息
  6.   实验接线:
  7.   BC20       UNO
  8.   VIN        5V
  9.   GND        GND
  10.   SCL        A5
  11.   SDA        A4
  12. */
  13. #include "DFRobot_BC20_Gravity.h"
  14. //RGB有7种颜色可供选择
  15. #define  RED 0
  16. #define  BLUE 1
  17. #define  GREEN 2
  18. #define  YELLOW 3
  19. #define  PURPLE 4
  20. #define  CYAN 5
  21. #define  WHITE 6
  22. //配置设备证书信息
  23. char* Iot_id = "wGkCJkIng";
  24. char* Client_ID  = "BC20 NB-IoT";
  25. char* Iot_pwd    = "QMkC1kInRz";
  26. //配置域名和端口号
  27. char* EasyIot_SERVER = "182.254.130.180";
  28. char* PORT = "1883";
  29. //设置需要发布的设备编号
  30. char* pubTopic = "hJmOvRIng";
  31. //IIC通讯
  32. #define USE_IIC
  33. //硬件串口通讯
  34. //#define USE_HSERIAL
  35. //软件串口通讯
  36. //#define USE_SSERIAL
  37. DFRobot_BC20_IIC myBC20(0x33);
  38. /*
  39.    每次模块收到消息时,都会调用此函数。
  40.    它将打印消息和相应的主题。
  41. */
  42. void callback(char * topic, uint8_t * payload, unsigned int len) {
  43.   Serial.print("接收[主题:");
  44.   Serial.print(topic);
  45.   Serial.print("] ");
  46.   for (int i = 0; i < len; i++) {
  47.     Serial.print((char)payload[i]);
  48.   }
  49.   Serial.println();
  50.   //根据接收到的消息控制板载 RGB LED。
  51.   char* receivedData = (char*)payload;
  52.   if (strcmp(receivedData, "OFF") == 0) {
  53.     myBC20.LED_OFF();
  54.     Serial.println("LED 灯熄灭");
  55.   }
  56.   else if (strcmp(receivedData, "RED") == 0) {
  57.     myBC20.changeColor(RED);
  58.     myBC20.LED_ON();
  59.     Serial.println("LED 是红色的");
  60.   }
  61.   else if (strcmp(receivedData, "GREEN") == 0) {
  62.     myBC20.changeColor(GREEN);
  63.     myBC20.LED_ON();
  64.     Serial.println("LED 为绿色");
  65.   }
  66.   else if (strcmp(receivedData, "BLUE") == 0) {
  67.     myBC20.changeColor(BLUE);
  68.     myBC20.LED_ON();
  69.     Serial.println("LED 为蓝色");
  70.   }
  71.   else if (strcmp(receivedData, "YELLOW") == 0) {
  72.     myBC20.changeColor(YELLOW);
  73.     myBC20.LED_ON();
  74.     Serial.println("LED 是黄色的");
  75.   }
  76.   else if (strcmp(receivedData, "PURPLE") == 0) {
  77.     myBC20.changeColor(PURPLE);
  78.     myBC20.LED_ON();
  79.     Serial.println("LED 是紫色的");
  80.   }
  81.   else if (strcmp(receivedData, "CYAN") == 0) {
  82.     myBC20.changeColor(CYAN);
  83.     myBC20.LED_ON();
  84.     Serial.println("LED 为青色");
  85.   }
  86.   else if (strcmp(receivedData, "WHITE") == 0) {
  87.     myBC20.changeColor(WHITE);
  88.     myBC20.LED_ON();
  89.     Serial.println("LED 是白色的");
  90.   }
  91.   else {
  92.     ;
  93.   }
  94. }
  95. void ConnectCloud() {
  96.   Serial.print("尝试MQTT连接......");
  97.   while (!myBC20.connected()) {
  98.     Serial.print(".");
  99.     if (myBC20.connect(Client_ID, Iot_id, Iot_pwd)) {
  100.       Serial.println("连接服务器正常");
  101.     } else {
  102.       //用于检测设备与服务器的连接
  103.       if (myBC20.getQMTCONN())
  104.         break;
  105.     }
  106.   }
  107.   while (!myBC20.subTopic('0', '1',pubTopic , '0')) {
  108.     Serial.print(".");
  109.   }
  110.   Serial.print("主题:");
  111.   Serial.print(pubTopic);
  112.   Serial.println(" 订阅了!");
  113. }
  114. void setup() {
  115.   Serial.begin(115200);
  116.   myBC20.LED_OFF();
  117.   /*Initialize BC20*/
  118.   Serial.print("正在启动BC20,请稍等...... ");
  119.   myBC20.changeColor(RED);
  120.   while (!myBC20.powerOn()) {
  121.     Serial.print(".");
  122.     myBC20.LED_ON();
  123.     delay(500);
  124.     myBC20.LED_OFF();
  125.     delay(500);
  126.   }
  127.   Serial.println("BC20 启动成功!");
  128.   //检查 SIM 卡是否插入
  129.   Serial.println("正在检查SIM卡……");
  130.   myBC20.changeColor(GREEN);
  131.   while (!myBC20.checkNBCard()) {
  132.     Serial.print(".");
  133.     myBC20.LED_ON();
  134.     delay(500);
  135.     myBC20.LED_OFF();
  136.     delay(500);
  137.   }
  138.   Serial.println("OK!");
  139.   //禁用睡眠模式
  140.   myBC20.configSleepMode(eSleepMode_Disable);
  141.   //禁用 PSM
  142.   myBC20.setPSMMode(ePSM_OFF);
  143.   /*
  144.      模块将自动尝试连接到网络(移动站)。
  145.      检查它是否已连接到网络。
  146.   */
  147.   Serial.print("正在连接网络......");
  148.   myBC20.changeColor(BLUE);
  149.   while (myBC20.getGATT() == 0) {
  150.     Serial.print(".");
  151.     myBC20.LED_ON();
  152.     delay(500);
  153.     myBC20.LED_OFF();
  154.     delay(500);
  155.   }
  156.   Serial.println("已连接!");
  157.   //设置回调函数
  158.   myBC20.setCallback(callback);
  159.   Serial.println("连接到DFRobot Easy-IoT");
  160.   //配置物联网服务器
  161.   myBC20.setServer(EasyIot_SERVER, PORT);
  162.   Serial.println("服务器可用!");
  163.   //连接DFRobot Easy-IoT
  164.   ConnectCloud();
  165. }
  166. void loop() {
  167.   myBC20.loop();
  168. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-6 10:11:22

本帖最后由 驴友花雕 于 2021-9-6 10:15 编辑

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目之九:在串口监视器上看到所有完整的卫星信息
  (说明:由于UNO内存偏小,有可能出错)


  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  4.   NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  5.   项目之九:在串口监视器上看到所有完整的卫星信息
  6.   (说明:由于UNO内存偏小,有可能出错)
  7.   实验接线:
  8.   BC20       UNO
  9.   VIN        5V
  10.   GND        GND
  11.   SCL        A5
  12.   SDA        A4
  13. */
  14. #include "DFRobot_BC20_Gravity.h"
  15. /* 7 colors are available */
  16. #define  RED 0
  17. #define  BLUE 1
  18. #define  GREEN 2
  19. #define  YELLOW 3
  20. #define  PURPLE 4
  21. #define  CYAN 5
  22. #define  WHITE 6
  23. /*Communication by IIC*/
  24. #define USE_IIC
  25. /*Communication by HardwareSerial*/
  26. //#define USE_HSERIAL
  27. /*Communication by SoftwareSerial*/
  28. //#define USE_SSERIAL
  29. DFRobot_BC20_IIC myBC20(0x33);
  30. void Display_Location_Information() {
  31.   //UTC time of the anchor point
  32.   Serial.print("Time:\t\t");
  33.   Serial.print(sCLK.Year);
  34.   Serial.print("/");
  35.   Serial.print(sCLK.Month);
  36.   Serial.print("/");
  37.   Serial.print(sCLK.Day);
  38.   Serial.print("  ");
  39.   Serial.print(sCLK.Hour);
  40.   Serial.print(":");
  41.   Serial.print(sCLK.Minute);
  42.   Serial.print(":");
  43.   Serial.println(sCLK.Second);
  44.   Serial.print("Latitude:\t");
  45.   Serial.print(sGGNS.LatitudeVal, 6);
  46.   Serial.print(" deg ");
  47.   Serial.println(sGGNS.LatitudeDir);
  48.   Serial.print("Longitude:\t");
  49.   Serial.print(sGGNS.LongitudeVal, 6);
  50.   Serial.print(" deg ");
  51.   Serial.println(sGGNS.LongitudeDir);
  52.   Serial.print("Altitude:\t");
  53.   Serial.print(sGGNS.Altitude, 1);
  54.   Serial.println(" m");
  55.   Serial.print("Speed:\t\t");
  56.   Serial.print(sGGNS.Speed);
  57.   Serial.println(" km/h");
  58.   Serial.print("Heading:\t");
  59.   Serial.print(sGGNS.Heading);
  60.   Serial.println(" deg");
  61.   Serial.print("Status:\t\t");
  62.   Serial.println(sGGNS.FixStatus);
  63.   Serial.print("PDOP:\t\t");
  64.   Serial.println(sGGNS.PDOP);
  65.   Serial.print("HDOP:\t\t");
  66.   Serial.println(sGGNS.HDOP);
  67.   Serial.print("VDOP:\t\t");
  68.   Serial.println(sGGNS.VDOP);
  69.   Serial.println();
  70. }
  71. void Display_Satellite_Information() {
  72.   Serial.print(sSAT.NUM);
  73.   Serial.println(" in view.");
  74.   Serial.print(sSAT2.USE);
  75.   Serial.println(" in used.");
  76.   Serial.print("PRN\t");
  77.   Serial.print("Elev(deg)\t");
  78.   Serial.print("Azim(deg)\t");
  79.   Serial.print("SNR(dBHz)\t");
  80.   Serial.print("SYS\t");
  81.   Serial.println("Used");
  82.   for (uint8_t i = 0; i < sSAT.NUM; i++) {
  83.     Serial.print(sSAT2.data[i].PRN);
  84.     Serial.print("\t");
  85.     Serial.print(sSAT2.data[i].Elev);
  86.     Serial.print("\t\t");
  87.     Serial.print(sSAT2.data[i].Azim);
  88.     Serial.print("\t\t");
  89.     Serial.print(sSAT2.data[i].SNR);
  90.     Serial.print("\t\t");
  91.     Serial.print(sSAT2.data[i].SYS);
  92.     Serial.print("\t");
  93.     Serial.println(sSAT2.data[i].Status);
  94.   }
  95.   Serial.println("");
  96. }
  97. void setup() {
  98.   Serial.begin(115200);
  99.   myBC20.LED_OFF();
  100.   /*Initialize BC20*/
  101.   Serial.print("Starting the BC20.Please wait. . . ");
  102.   myBC20.changeColor(RED);
  103.   while (!myBC20.powerOn()) {
  104.     Serial.print(".");
  105.     myBC20.LED_ON();
  106.     delay(500);
  107.     myBC20.LED_OFF();
  108.     delay(500);
  109.   }
  110.   Serial.println("BC20 started successfully!");
  111.   /* Disable sleep mode */
  112.   myBC20.configSleepMode(eSleepMode_Disable);
  113.   /*Power up GNSS*/
  114.   Serial.print("Turning on GNSS ... ");
  115.   myBC20.setQGNSSC(ON);
  116.   myBC20.changeColor(YELLOW);
  117.   if (myBC20.getQGNSSC() == OFF) {
  118.     Serial.print(".");
  119.     myBC20.LED_ON();
  120.     delay(500);
  121.     myBC20.LED_OFF();
  122.     delay(500);
  123.   }
  124.   Serial.println("GNSS is ON.");
  125.   myBC20.changeColor(CYAN);
  126. }
  127. void loop() {
  128.   /**
  129.      Is used to obtain the specified satellite information, and the parameter is used to specify the type of information to be obtained.
  130.      The parameter is selected as follows:
  131.   */
  132.   myBC20.getQGNSSRD();
  133.   Display_Location_Information();
  134.   Display_Satellite_Information();
  135.   myBC20.clearGPS();
  136.   myBC20.LED_ON();
  137.   delay(500);
  138.   myBC20.LED_OFF();
  139. #ifndef ARDUINO_ESP32_DEV  
  140.   delay(500);
  141. #else
  142.   delay(5000);
  143. #endif
  144. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 17:46:05

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

移远BC20
BC20 是一款高性能、低功耗、多频段、支持 GNSS 定位功能的 NB-IoT 无线通信模块。其尺寸仅为 18.7 mm × 16.0 mm× 2.1 mm,能最大限度地满足终端设备对小尺寸模块产品的需求,同时有效帮助客户减小产品尺寸并优化产品成本。

BC20 在设计上兼容移远通信 GSM/GPRS/GNSS 系列 MC20 模块,方便客户快速、灵活的进行产品设计和升级。BC20提供丰富的外部接口和协议栈,同时支持中国移动 OneNET、中国电信 IoT 以及阿里云 IoT 等物联网云平台,为客户的应用提供极大的便利。

基于先进的 GNSS 技术,BC20 可支持 BeiDou 和 GPS 双卫星导航系统解调算法,使其定位更加精准、抗多路径干扰能力更强,比传统的单 GPS 定位模块具有更多优势。另外,BC20 模块内置 LNA 和低功耗算法:前者保证更高的灵敏度,后者保证低功耗模式下更低的耗流。

相较传统的 NB-IoT + GNSS 方案,BC20 的一体化设计使其体积减少 40 %。凭借其紧凑尺寸、超低功耗和超宽工作温度范围,BC20 在各种应用中占具更大优势;其主要应用领域为:自行车和摩托车防盗、宠物追踪、金融财产追踪及行车记录仪等等。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 17:54:38

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图2
【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 17:55:06

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 18:47:34

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图2

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 18:48:32

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-4 18:49:17

本帖最后由 驴友花雕 于 2021-9-4 19:20 编辑

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

模块相关资料  https://www.quectel.com/product/lpwa-bc20/?lang=zh-hans
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 06:46:30

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

GNSS (Global Navigation Satellite System)
也叫全球定位系统,这个不是GPS,但是包含GPS, 还有欧洲的Galileo, 俄罗斯的GLONASS,中国的北斗BeiDou,其中还有一些区域性的卫星系统比如日本的QZSS,印度的(IRNSS)。说白了,就是定位,利用至少4颗卫星去解决位置,时间,速度这三个参数,其中最常用的是位置。 其实这个原理可以复杂也可以简单。 简单的来说就是用三边测量(trilateration):在2维平面,一个固定点用已知的半径长确定一个圆,两个固定点用已知的半径确定两个点,三个固定点可以确定一个点。这个原理映射到3维,两个球相交确定一个圆,三个球相交确定两个点。远离地球的点舍弃,另一个点就是你的位置了。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:00:46

实时动态差分法(Real-time kinematic,RTK)
又称为载波相位差分技术。这是一种新的常用的GPS测量方法。以前的静态、快速静态、动态测量都需要事后进行解算才能获得厘米级的精度,而RTK是能够在野外实时得到厘米级定位精度的测量方法,它能实时提供观测点的三维坐标,并达到厘米级的高精度。RTK技术是建立在实时处理上述基准站与用户站的载波相位基础上的,采用了载波相位动态实时差分方法,是GPS应用的重大里程碑,它的出现为工程放样、地形测图,各种控制测量带来了新曙光,极大地提高了外业作业效率。

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:01:17

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

在网络RTK中,有多个基准站,用户不需要建立自己的基准站,用户与基准站的距离可以扩展到上百公里,网络RTK减少了误差源,尤其是与距离相关的误差。

首先,多个基准站同时采集观测数据并将数据传送到数据处理中心,数据处理中心有1台主控电脑能够通过网络控制所有的基准站。所有从基准站传来的数据先经过粗差剔除,然后主控电脑对这些数据进行联网解算。最后,播发改正信息给用户。

网络RTK至少要有3个基准站才能计算出改正信息。改正信息的可靠性和精度会随基准站数目的增加而得到改善。当存在足够多的基准站时,如果某个基准站出现故障,系统仍然可以正常运行并且提供可靠的改正信息。

相比传统RTK,网络RTK对误差估算得更加准确,通过VRS (Virtual Reference Station)虚拟参考站技术进一步增强基准站和流动站误差的相关性。总的来说,网络RTK的精度和稳定性,要高于传统RTK。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:11:08

▲GNSS卫星定位技术迭代图

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:15:19

从单系统单频段到多系统多频段
GNSS并不特指某个单一的卫星系统,而是多个卫星系统的总称。用户设备通过接收卫星提供的经纬度坐标信息来定位。

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

美国GPS系统是全球第一个卫星导航系统,也是现阶段应用最为广泛、技术最为成熟的卫星定位技术。最初的定位模组只支持GPS系统,属于单系统单频模组。由于单一GPS系统在局部地区、部分时段或信号有遮挡、干扰时会出现可见卫星数过少(<4颗)的情况,导致无法正常定位。随着各国与地区对卫星导航系统的肯定,相继投资建设自己的卫星导航系统,多系统模组随之产生,也被称为多模模组或GNSS模组。在相同的外界环境基础上,多系统模组能够捕获来自不同卫星系统的卫星,使得有效卫星数大幅度提升,从而提高定位的精度和稳定性。随着卫星导航系统的发展,最初的GPS L1C/A信号逐渐无法满足用户的定位导航授时需求,美国宣布对GPS现代化,增加了第二民用信号L2C和第三民用信号L5等。GNSS定位模组也开始接收各卫星系统的不同频段信号。由于定位模组周围环境的影响,使得模组所接收到的卫星信号中还包含有各种反射和折射信号的影响,这就是所谓的多路径效应。多频段技术可以有效抑制城市环境中的多路径效应,削弱大气层误差,提高定位精度。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:18:34

多种定位技术融合,满足差异化高精度定位需求
GNSS技术能够在几米精度范围内知晓任何物体的绝对位置,毫不夸张的说,它为我们解决了很多难题。现在,从智能网联车、自动驾驶到无人机、机器人,导航应用对自动化需求不断提高,这亟需更高精度的定位解决方案。

GNSS & DR组合定位,实现持续导航
DR (Dead Reckoning),航位推测法,指的是在知道当前时刻位置的条件下,通过测量移动的位置和方位,推算下一时刻位置的方法。通过在设备上加装加速度传感器和陀螺仪传感器,DR算法可以自主确定定位信息,具有短时间内实现局部高精度定位的特点。

GNSS定位在遮挡环境、多路径较严重场景下效果较差,此时结合DR算法,就可以推测出下一秒或多秒内的定位结果。另外,GNSS数据更新频率通常为1Hz,不能满足高动态需求,而IMU(Inertial Measurement Unit,惯性测量单元)更新频率可达100Hz,借助组合,可以显著提高结果频率。但是,DR算法精准度随滤波深度增加而变差,所以需要GNSS对其进行实时纠偏,确保以实际数据不断地更新推测出的位置,达到最好的效果。

主要工作模式如下:
·上一点估算位置 + IMU数据→预测下一点位置;
·预测的位置 + GPS定位→更新当前位置;
·循环。

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:34:56

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
NB-IoT
窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络,只消耗大约180kHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)。NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接。据说NB-IoT设备电池寿命可以提高至少10年,同时还能提供非常全面的室内蜂窝数据连接覆盖。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 07:42:44

本帖最后由 驴友花雕 于 2021-9-5 08:09 编辑

NB-IoT特点
1、广覆盖——相比现有的GSM、宽带LTE等网络覆盖增强了20dB,信号的传输覆盖范围更大(GSM基站目前理想状况下能覆盖35km),能覆盖到深层地下GSM网络无法覆盖到的地方。其原理主要依靠:(1)缩小带宽,提升功率谱密度;(2)重复发送,获得时间分集增益。移动网络的信号能够完成传递的范围与基站设置的距离和线路预算存在一定的关联,NB-IoT链路预算与其他形式的线路相比较在预算上具有一定的优势。如果区域内的环境较为开阔那么信号的覆盖面积将会有所提升,如果信号的传递需要穿透墙体那么就会对信号的传递质量造成一定的影响,为了更好的保证信号的传递质量和效果务必要对整个区域内的情况加以准确的判断和权衡。
2、大连接——相比现有无线技术,同一基站下增多了50-100倍的接入数,每小区可以达到50K连接,真是实现万物互联所必须的海量连接。其原理在于:(1)基于时延不敏感的特点,采用话务模型,保存更多接入设备的上下文,在休眠态和激活态之间切换;(2)窄带物联网的上行调度颗粒小,资源利用率更高;(3)减少空口信令交互,提升频谱密度。
3、低功耗——终端在99%的时间内均处在休眠态,并集成多种节电技术,待机时间可达10年。(1)PSM低功耗模式,即在idle空闲态下增加PSM态,相当于关机,由定时器控制呼醒,耗能更低;(2)eDRX扩展的非连续接收省电模式,采用更长的寻呼周期,eDRX是DRX耗电量的1/16。
4、低成本——硬件可剪裁,软件按需简化,确保了NB-IoT的成本低廉,NB-IoT通信单模块成本不足5美元。NB-IoT因其适用的场景,还具有低速率和低移动性的特点。(1)低速率。多点上行速率仅为56kbps,理想下行速率为21.25kbps;(2)低移动性。仅支持终端设备在30km/h的移动速率下实现小区切换,远低于4G支持250km/h的速率(高铁专网可达450km/h)。

NB-IoT不足
1 部署频率是授权的,必须由运营商来部署!想自己搭建一个?在目前看来还是不行。看来想一次性投资,后面不再交钱这条路行不通。
2 模块现在成本还是高(相对于成熟的GPRS模块,wifi模块)这个应该会随着使用量的增大而慢慢降低。

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 08:06:41

本帖最后由 驴友花雕 于 2021-9-5 08:10 编辑

NB-IoT应用场景
1、智能三表
在智能三表领域中所有的具有专业资质的公司和机构需要保证低效率的信息传递。因为三表现如今还是由电池来完成电能的供应的,进而对会对低能耗以及电池的使用时长会更加的关注。

2、智慧农业
传感器是应用物联网技术的较为典型产品,通过低能耗的传感器来对土壤的温湿度、酸碱度等进行持续的动态观测,能够为农业种植过程中的灌溉、施肥提供精准的数据支持,从而降低了农业管理的成本和难度。

3、自动化制造
对工厂而言,全自动化的生产与流水线监控能够有效的降低管理成本,并且能够显著提高管理水平和控制精度,自动化制造的实现就是建立在大量传感器的基础上,这也是物联网工业化应用的重要途径。很多的场景需要保持长时间的高效率的通信才能更好的发挥出服务的作用。

4、智能建筑
针对建筑结构实施二次施工的时候,需要将各种检测设备加以安设,诸如:湿度,温度以及水流庆康的检测设备而,在获得检测信息之后,需要上传到专门的系统之中,为监管管理层级人员提供准确的信息。一般情况下,这些检测设备通信结构往往十分的简单,并且具有良好的服务质量,一般简易的家庭式网关可以为达到实际的需求。

5、物流追踪
当前已经成熟应用的一个场景就是物流订单的动态追踪,通过对物流订单进行动态的定位与信息传输,物流企业可以通过便携式的通信站对物流车与订单进行追踪,进而实现物流信息的动态更新与查看。4物联网的演进

前沿技术不但可以提升网络运行的速度,并且能够将各种智能系统运用到互联网之中,进而有效地提升互联网的运行效率,更好的保证信息传输的效率和质量。NB-IoT是5G商用网络的前身,换句话说5G商用网络是在NB-IoT的基础上演变而来的。进而NB-IoT的发展十分的关键,要确保NB-IoT的基本结构的建设完整,才能确保5G网络的作用彻底的施展出来。

NB-IoT是授权频道,其最为突出的特征就是信息传输的距离与陈旧的网络相比较得到了较大的延长,能够覆盖一个县城的地域。在NB-IoT中可以设计无线终端,并且附属终端的数量十分的巨大,这就充分的说明说明了将NB-IoT切实的加以运用对于地区内所有的部件以及各类系统都能够实现统一管控,有效的提升了公祖的效率。在NB-IoT技术大范围的运用的过程中有效的为互联网领域的健康发展起到的了积极的影响作用。NB-IoT的发展的影响力是十分巨大的,只有保证NB-IoT的完善,才可以保证5G的全面运用。

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 09:02:06

本帖最后由 驴友花雕 于 2021-9-5 10:30 编辑

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
是具有NB-IoT低功耗蜂窝通信和GPS/北斗双星精确定位功能的物联网通信模块。只要设备所在地区在NB-IoT信号覆盖范围内,无论在室内外均可轻松将开发板或设备采集的各类数据上传至云端,用户亦可通过云端发送指令来远程控制设备,实现云端与真实设备的双向通信与控制,实现“物联”,尤其适用于环境监控站、共享单车、车载定位追踪器等户外物联网应用场景。

此外,模块带有GPS/BeiDou双星精确定位功能,只要将定位天线置于室外即可获取精确的地理坐标和授时信息,实时监控设备的物理位置。用户可通过板载RGB指示灯,清晰了解模块的各类工作状态。为了兼容常见的Arduino、micro:bit、掌控和树莓派等各类3.3V/5V开发板,模块还采用了Gravity I2C & UART复合标准接口,并对这些创客用户常用的开发板在软件上作了全面支持。

注意
NB-IoT工作于授权频带下,类似于手机2G/3G/4G SIM卡,需要通过SIM卡额外支付通信套餐费用,产品包装附有一张NB-IoT专用SIM卡,可免费使用一年,无需实名,上电即用(流量详见后续NB-IoT SIM卡资费表)。




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 09:22:39

技术规格
主芯片(通信模组):移远QUECTEL BC20
供电电压(VCC):3.3V ~ 5.5V
通信频段:B5/B8(移动、电信、联通NB-IoT全网通)
传输速率:16.7 kbps(上行),25.5 kbps(下行)
GNSS导航定位系统:GPS/BeiDou(北斗)双星导航定位
通信接口:Gravity I2C & UART 复合接口 (3.3V电平)
休眠与低功耗:支持PSM、DRX/eDRX低功耗模式
支持DFOTA差分固件升级
产品尺寸:47×37 mm

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 09:23:18

模块电原理图

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 09:33:26

模块套件清单
Gravity:I2C & UART BC20 NB-IoT & GNSS通信模块 x1
Gravity 4P传感器连接线     x1
GPS/北斗有源陶瓷天线(IPEX 1代接头)   x1         
GSM全频PCB天线(IPEX 1代接头)     x1
中国联通NB-IoT物联网专用SIM卡       x1  
蓝色导热硅胶片 (带双面3M胶)      x1
六角双通尼龙柱M3*6mm         x4
盘头螺丝M3*8mm          x4
尼龙垫柱M3*2mm          x4
亚克力保护底板(透明) x1

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-9-5 09:39:25

模块接口说明

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图2

【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块图1
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail