37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百九十三:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
知识点:移远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】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十三:通过串口查询全球导航卫星系统GLL协议的信息
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十三:通过串口查询全球导航卫星系统GLL协议的信息
实验接线:
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 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.getQGNSSRD(NMEA_GLL);
/*
UTC 时间,格式:hhmmss.ss,例如。162436.54 => 16:24:36.54
h - 小时
m - 分钟
s - 秒
*/
Serial.print("UTC 时间: ");
Serial.println(sGLL.UTC_Time());
/*
纬度,格式:ddmm.mmmmm,例如。3150.7820 => 31 度 50.7820 分钟
d - 度
m - 分钟
*/
Serial.print("纬度: ");
Serial.print(sGLL.LatitudeVal());
/*
北纬或南纬
N - 北
S - 北
*/
Serial.print(" ");
Serial.println(sGLL.LatitudeDir());
/*
经度,格式:dddmm.mmmmm,例如。12135.6794 => 121 度 35.6794 分钟
d - 度
m - 分钟
*/
Serial.print("经度: ");
Serial.print(sGLL.LongitudeVal());
Serial.print(" ");
/*
经度标识
E - 东
W - 西
*/
Serial.println(sGLL.LongitudeDir());
/*
数据状态
V - 无效
一个有效的
*/
Serial.print("数据状态: ");
Serial.println(sGLL.DataStatus());
/*
定位方式
N - 没有修复
A - 自主 GPS 定位
D - 差分 GPS 定位
*/
Serial.print("定位模式: ");
Serial.println(sGLL.PositionMode());
Serial.println();
Serial.println();
myBC20.clearGPS();
myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}
实验串口返回情况
NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、MCU等设备。
NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
NMEA通讯协议所规定的通讯语句都已是以ASCII码为基础的,NMEA-0183协议语句的数据格式如下:“ ”为语句起始标志;“,”为域分隔符;“ ∗ ”为校验和识别符,其后面的两位数为校验和,代表了“ ”为语句起始标志;“,”为域分隔符;“ *”为校验和识别符,其后面的两位数为校验和,代表了“ ”为语句起始标志;“,”为域分隔符;“∗”为校验和识别符,其后面的两位数为校验和,代表了“”和“*”之间所有字符的按位异或值(不包括这两个字符)。
NMEA0183标准语句(GPS常用语句)
G
P
G
L
L
例:
GPGLL 例:
GPGLL例:GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段2:纬度N(北纬)或S(南纬)
字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段4:经度E(东经)或W(西经)
字段5:UTC时间,hhmmss.sss格式
字段6:状态,A=定位,V=未定位
字段7:校验值
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十四:通过串口查询全球导航卫星系统GSA协议的信息
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十四:通过串口查询全球导航卫星系统GSA协议的信息
实验接线:
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 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 开启");
Serial.println("查询全球导航卫星系统GSA协议");
myBC20.changeColor(CYAN);
}
void loop() {
myBC20.getQGNSSRD(NMEA_GSA);
Serial.print("模式\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
/*
选择 2D 或 3D 修复
'M'=手动,强制切换2D/3D模式
'A'=允许自动切换2D/3D模式
*/
Serial.print(sGSA.data[i].Mode());
Serial.print("\t\t");
}
Serial.println();
Serial.print("修复状态\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
Serial.print(sGSA.data[i].FixStatus());
Serial.print("\t\t");
}
Serial.println();
Serial.print("系统ID\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
Serial.print(sGSA.data[i].GNSS_SystemID());
Serial.print("\t\t");
}
Serial.println();
//每个频道使用的卫星列表
for (uint8_t i = 0; i < 12; i++) {
Serial.print("CH");
Serial.print(i + 1);
Serial.print("\t\t");
for (uint8_t j = 0; j < sGSA.NUM; j++) {
Serial.print(sGSA.data[j].Statellite_CH(i));
Serial.print("\t\t");
}
Serial.println();
}
//水平精度因子
Serial.print("水平精度因子\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
Serial.print(sGSA.data[i].PDOP());
Serial.print("\t\t");
}
Serial.println();
//垂直精度因子
Serial.print("垂直精度因子\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
Serial.print(sGSA.data[i].HDOP());
Serial.print("\t\t");
}
Serial.println();
Serial.print("VDOP\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
Serial.print(sGSA.data[i].VDOP());
Serial.print("\t\t");
}
Serial.println();
Serial.println();
myBC20.clearGPS();
myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}
实验串口返回情况
NMEA0183标准语句(GPS常用语句)
G
P
G
S
A
例:
GPGSA 例:
GPGSA例:GPGSA,A,3,01,20,19,13,40.4,24.4,32.2*0A
字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息
字段1:定位模式,A=自动2D/3D,M=手动2D/3D
字段2:定位类型,1=未定位,2=2D定位,3=3D定位
字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段15:PDOP综合位置精度因子(0.5 - 99.9)
字段16:HDOP水平精度因子(0.5 - 99.9)
字段17:VDOP垂直精度因子(0.5 - 99.9)
字段18:校验值
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十五:通过串口查询全球导航卫星系统GSV协议的信息
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十五:通过串口查询全球导航卫星系统GSV协议的信息
实验接线:
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_Satellite_Information() {
Serial.print(sSAT.NUM);
Serial.println(" 颗卫星在视图中");
//卫星 PRN 号码
Serial.print("卫星编号\t");
//仰角,单位为度
Serial.print("仰角(度)\t");
//方位角,单位度
Serial.print("方位角(度)\t");
//信噪比,单位 dBHz
Serial.print("信噪比(dBHz)\t");
Serial.println("系统");
for (uint8_t i = 0; i < sSAT.NUM; i++) {
Serial.print(sSAT.data[i].PRN());
Serial.print("\t");
Serial.print(sSAT.data[i].Elev());
Serial.print("\t\t");
Serial.print(sSAT.data[i].Azim());
Serial.print("\t\t");
Serial.print(sSAT.data[i].SNR());
Serial.print("\t\t");
Serial.println(sSAT.data[i].SYS());
}
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.getQGNSSRD(NMEA_GSV);
Display_Satellite_Information();
myBC20.clearGPS();
myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}
实验串口返回情况
NMEA0183标准语句(GPS常用语句)
G
P
G
S
V
例:
GPGSV 例:
GPGSV例:GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,13,32,252,45*70
字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
字段1:本次GSV语句的总数目(1 - 3)
字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)
字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)
字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段5:卫星仰角(00 - 90)度(前导位数不足则补0)
字段6:卫星方位角(00 - 359)度(前导位数不足则补0)
字段7:信噪比(00-99)dbHz
字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段9:卫星仰角(00 - 90)度(前导位数不足则补0)
字段10:卫星方位角(00 - 359)度(前导位数不足则补0)
字段11:信噪比(00-99)dbHz
字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段13:卫星仰角(00 - 90)度(前导位数不足则补0)
字段14:卫星方位角(00 - 359)度(前导位数不足则补0)
字段15:信噪比(00-99)dbHz
字段16:校验值