【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6

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

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

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第1张图片
【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第2张图片
知识点:移远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 在各种应用中占具更大优势;其主要应用领域为:自行车和摩托车防盗、宠物追踪、金融财产追踪及行车记录仪等等。

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第3张图片
【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第4张图片
【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第5张图片
【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第6张图片
【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第7张图片
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之七:获取物理位置精简版(在串口监视器上看到部分卫星信息)

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目之七:获取物理位置精简版(在串口监视器上看到部分卫星信息)
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#define  RED 0
#define  BLUE 1
#define  GREEN 2
#define  YELLOW 3
#define  PURPLE 4
#define  CYAN 5
#define  WHITE 6

//IIC通讯
#define USE_IIC

//硬件串口通讯
//#define USE_HSERIAL

//软件串口通讯
//#define USE_SSERIAL

DFRobot_BC20_IIC myBC20(0x33);

void Display_Location_Information() {

  //锚点的UTC时间
  Serial.print("时间:  ");
  Serial.print(sCLK.Hour);
  Serial.print(":");
  Serial.print(sCLK.Minute);
  Serial.print(":");
  Serial.println(sCLK.Second);

  Serial.print("纬度:  ");
  Serial.print(sGGNS2.LatitudeVal, 6);
  Serial.print(" ° ");
  Serial.println(sGGNS2.LatitudeDir());
  Serial.print("经度:  ");
  Serial.print(sGGNS2.LongitudeVal, 6);
  Serial.print(" ° ");
  Serial.println(sGGNS2.LongitudeDir());
  Serial.print("海拔:  ");
  Serial.print(sGGNS2.Altitude);
  Serial.println("米");
  Serial.print("修复状态: ");
  Serial.println(sGGNS2.Status());
  Serial.print("状态编号: ");
  Serial.print(sGGNS2.StatelliteNum);
  Serial.println(" “在使用中");
  Serial.print("HDOP: ");
  Serial.println(sGGNS2.HDOP);
  Serial.println("");
}

void setup() {
  Serial.begin(115200);
  myBC20.LED_OFF();

  //初始化 BC20
  Serial.print("正在启动BC20,请稍等......  ");
  myBC20.changeColor(RED);
  while (!myBC20.powerOn()) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("BC20 启动成功!");

  //禁用睡眠模式
  myBC20.configSleepMode(eSleepMode_Disable);

  //启动 GNSS
  Serial.print("打开全球导航卫星系统... ");
  myBC20.setQGNSSC(ON);
  myBC20.changeColor(YELLOW);
  if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("GNSS 开启。");
  myBC20.changeColor(CYAN);
}

void loop() {
  myBC20.getQGNSSRD2();
  Display_Location_Information();
  myBC20.clearGPS();

  myBC20.LED_ON();
  delay(500);
  myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
  delay(500);
#else
  delay(5000);
#endif
}

实验串口返回情况

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第8张图片

GNSS定位需要一定时间进行寻星,首次上电通常需要30s以上才能获取有效的定位信息(建议通电3分钟)。

程序通过串口打印GNSS定位的关键信息:
时间(Time): 0:20:38表示当地时间为8时20分38秒(北京时间)**。需要注意的是,这里7时是指格林尼治时间GMT+0,北京时间为GMT+8,需要用户额外加上8小时才能得到北京时间,也可以自行根据经纬度计算出当地时区,从而自动换算出当地时间。
纬度坐标(Latitude):26.088882° N 表示北纬26.088882°,精确到小数点后6位。南纬用S表示。
经度坐标(Longitude):119.323715° E 表示东经119.323715°,精确到小数点后6位。西经用W表示。
海拔高度(Altitude):单位m。WGS84 椭球面为基准。
定位状态(Fix Status):为DGPS或者GNSS时,代表成功定位。
水平精度因子(HDOP):水平分量的相对误差,为纬度和经度等误差平方和的开根号值。数值越小,代表经纬坐标精度越高,一般小于3比较理想。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之八:在串口监视器上看到部分卫星信息

实验开源图形编程(Mind+、Mixly、编玩边学)

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第9张图片

实验串口返回情况

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第10张图片
实验注意事项
1、GPS适用于室外使用,在室内效果很差,窗户边有时也可以使用(实际效果打点折扣)。
2、GPS刚通电时,需要短暂时间用以寻星,刚开始不能准确定位,属于正常。
3、物联网卡在使用时,插入SIM卡时,要注意大小,不需要剪卡,直接扣下来的卡片大小就是合适的。
4、物联网SIM卡不能用于手机、平板、2G/3G/4G模组等非NB-IoT设备,否则会导致SIM卡停机。已机卡绑定的SIM卡不能插入其它设备内进行通信,否则会导致SIM卡停机。物联网SIM卡仅能数据传输,无语音通信和短信功能。
5、注意你使用的板子的内存大小。

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

实验开源代码

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

#include "DFRobot_BC20_Gravity.h"

/* 7 colors are available */
#define  RED 0
#define  BLUE 1
#define  GREEN 2
#define  YELLOW 3
#define  PURPLE 4
#define  CYAN 5
#define  WHITE 6

/*Communication by IIC*/
#define USE_IIC

/*Communication by HardwareSerial*/
//#define USE_HSERIAL

/*Communication by SoftwareSerial*/
//#define USE_SSERIAL

DFRobot_BC20_IIC myBC20(0x33);


void Display_Location_Information() {
  //UTC time of the anchor point
  Serial.print("Time:\t\t");
  Serial.print(sCLK.Year);
  Serial.print("/");
  Serial.print(sCLK.Month);
  Serial.print("/");
  Serial.print(sCLK.Day);
  Serial.print("  ");
  Serial.print(sCLK.Hour);
  Serial.print(":");
  Serial.print(sCLK.Minute);
  Serial.print(":");
  Serial.println(sCLK.Second);

  Serial.print("Latitude:\t");
  Serial.print(sGGNS.LatitudeVal, 6);
  Serial.print(" deg ");
  Serial.println(sGGNS.LatitudeDir);
  Serial.print("Longitude:\t");
  Serial.print(sGGNS.LongitudeVal, 6);
  Serial.print(" deg ");
  Serial.println(sGGNS.LongitudeDir);
  Serial.print("Altitude:\t");
  Serial.print(sGGNS.Altitude, 1);
  Serial.println(" m");
  Serial.print("Speed:\t\t");
  Serial.print(sGGNS.Speed);
  Serial.println(" km/h");
  Serial.print("Heading:\t");
  Serial.print(sGGNS.Heading);
  Serial.println(" deg");
  Serial.print("Status:\t\t");
  Serial.println(sGGNS.FixStatus);
  Serial.print("PDOP:\t\t");
  Serial.println(sGGNS.PDOP);
  Serial.print("HDOP:\t\t");
  Serial.println(sGGNS.HDOP);
  Serial.print("VDOP:\t\t");
  Serial.println(sGGNS.VDOP);
  Serial.println();
}

void Display_Satellite_Information() {
  Serial.print(sSAT.NUM);
  Serial.println(" in view.");
  Serial.print(sSAT2.USE);
  Serial.println(" in used.");
  Serial.print("PRN\t");
  Serial.print("Elev(deg)\t");
  Serial.print("Azim(deg)\t");
  Serial.print("SNR(dBHz)\t");
  Serial.print("SYS\t");
  Serial.println("Used");
  for (uint8_t i = 0; i < sSAT.NUM; i++) {
    Serial.print(sSAT2.data[i].PRN);
    Serial.print("\t");
    Serial.print(sSAT2.data[i].Elev);
    Serial.print("\t\t");
    Serial.print(sSAT2.data[i].Azim);
    Serial.print("\t\t");
    Serial.print(sSAT2.data[i].SNR);
    Serial.print("\t\t");
    Serial.print(sSAT2.data[i].SYS);
    Serial.print("\t");
    Serial.println(sSAT2.data[i].Status);
  }
  Serial.println("");
}

void setup() {
  Serial.begin(115200);
  myBC20.LED_OFF();

  /*Initialize BC20*/
  Serial.print("Starting the BC20.Please wait. . . ");
  myBC20.changeColor(RED);
  while (!myBC20.powerOn()) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("BC20 started successfully!");

  /* Disable sleep mode */
  myBC20.configSleepMode(eSleepMode_Disable);

  /*Power up GNSS*/
  Serial.print("Turning on GNSS ... ");
  myBC20.setQGNSSC(ON);
  myBC20.changeColor(YELLOW);
  if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("GNSS is ON.");
  myBC20.changeColor(CYAN);
}

void loop() {

  /**
     Is used to obtain the specified satellite information, and the parameter is used to specify the type of information to be obtained.
     The parameter is selected as follows:
  */
  myBC20.getQGNSSRD();
  Display_Location_Information();
  Display_Satellite_Information();
  myBC20.clearGPS();

  myBC20.LED_ON();
  delay(500);
  myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV  
  delay(500);
#else 
  delay(5000);
#endif
}

实验串口返回情况(实际测试运行超过10分钟,BC20模块仍未能启动)

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第11张图片
程序占用了80%存储空间,使用了89%的动态内存,实测一直不工作,看来UNO无法查看完整的卫星信息。

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块6_第12张图片

你可能感兴趣的:(单片机,嵌入式硬件,c++,Arduino,物联网,移远BC20NB+GNSS模块)