目录
最近很多朋友问我如何选购合适的NB-IoT模组,于是本篇博文给各位朋友安利一款DF创客社区最新出品的NB-IoT 开发板:TinkerNode NB-IoT 物联网开发板,性价比挺高,调测使用后感觉挺不错,非常适合零基础初学者和快速搭建项目的小伙伴。

1、模组简介
TinkerNode NB-IoT物联网开发板是ESP32平台具有NB-IoT广域低功耗通信和GPS/BeiDou双星精确定位功能的四模低功耗物联网开发硬件平台,在不到一半手掌大的面积上集成了ESP32主控模组、NB-IoT/GNSS通信模组、RGB指示灯、按钮、电源管理系统等功能,并通过过孔焊盘引出如IIC、SPI、UART等所有常用的IO、通信接口和电源管脚,性能强悍,扩展性极强。

该模块在开发板集成了专用的太阳能电源管理芯片和多电源管理电路,可直接使用5V太阳能板给3.7V锂电池充电和系统供电,同时支持MPPT(最大功率追踪,MPPT控制器能够实时侦测太阳能板的发电电压,并追踪最高电压电流值(VI),使系统以最大功率输出对蓄电池充电,应用于太阳能光伏系统中,协调太阳能电池板、蓄电池、负载的工作,是光伏系统的大脑),最大化太阳能板的输出效率,实现系统在户外应用场景的不间断供电,免去定期充电维护的麻烦。

对于之前已经使用过ESP32平台(如:FireBeetle、掌控、乐鑫官方开发板等)的用户,可以方便地将之前的Arduino程序移植到这块新主控板,尽享ESP32主控模组所有的强大功能和低功耗能力,快速掌握与实现户外物联网项目的搭建。

2、模组特性
主控制器:乐鑫ESPRESSIF ESP32,技术参数如下所示:
- 处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
- 主频:240MHz
- SRAM:520KB
- Flash:16MB
- Wi-Fi标准:FCC/CE/TELEC/KCC
- Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps)
- 频率范围:2.4~2.5 GHz
- 蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
- 蓝牙音频:CVSD和SBC音频低功耗:10uA
- 频率范围:2.4~2.5GHz
- 深度休眠功耗:<10uA @ RTC定时器+RTC存储器工作(仅ESP32芯片)
NB-IoT通信模组:移远QUECTEL BC20,和NB-IoT实战中是同一款模组,技术参数如下所示:
- 通信频段:B5/B8(移动、电信、联通NB-IoT全网通)
- 传输速率:16.7 kbps(上行),25.5 kbps(下行)
- GNSS导航定位系统:GPS/BeiDou(北斗)双星导航定位
- 支持DFOTA差分固件升级
- 深度休眠功耗:<5uA @ Modem处于PSM,CPU处于深度休眠,GNSS关闭
电源管理多样化设计,技术参数如下所示:
- USB:5V,供电数据二合一
- 电池(BAT):3.7V锂电池
- 太阳能(SOLAR IN):5V太阳能板
- 外部供电(VIN):6V - 24V
- 最大充电电流:500mA
- 集成3.7V锂电池充电功能,USB、太阳能、外部供电任一接口均可充电
- 太阳能支持MPPT,最大化太阳能板利用率
IO接口,技术参数如下所示:
- 通用数字I/O:5个
- 模拟输入(12位ADC):2个
- SPI:1个
- I2C:1个
- UART(兼容3.3V/5V):1个
其它功能与特性,技术参数如下所示:
- 开发环境:支持Win7,Win10
- 开发工具与语言:支持Arduino IDE,C/C++
- RGB全彩状态指示灯
- 电池、太阳能板、外部供电防反接(带反接指示LED)
- 充电指示LED、自定义指示LED
- 系统复位RST和设置SET按键
- 自弹式防反插micro SIM卡座
- u.FL外接天线接口:2个(NB-IoT外接PCB天线,GPS/BeiDou外接有源陶瓷天线)
- 尺寸:65.0×31.0 mm
- 重量:14g(仅主板)
- 工作温度:-40℃~+85℃
模组系统原理框图如下所示:

产品更详细描述可参见官网网址。
3、环境搭建
第1步:安装环境,项目实践依托于Arduino IDE,各位请自行安装下载合适版本。

第2步:打开Arduino IDE,首先需要添加开发板驱动的下载地址。菜单栏中选择文件->首选项(或使用快捷键“Ctrl+ ,”)。

点击附加开发板管理器网址右边的小图标。

在弹出窗口的最后一行,如图复制开发板驱动的地址:
http://download.dfrobot.top/TinkerNode-NB-IoT/package_TinkerNode-NB-IoT_index.json
最后保存设置。
第3步: 安装开发板的板卡驱动包,点击工具->开发板->开发板管理。

弹出开发板管理器,管理器会自动更新板卡信息。

等待更新完成后,选择TinkerNode_NB-IoT,选择最新版本的开发板驱动,单击Install安装驱动。

第4步: 安装串口驱动,目前仅支持Windows系统(Win7、Win10)。

第5步: 安装成功后切换到TinkerNode NB-IoT (CH)开发板,此时可向开发板烧录程序或查看串口打印的数据。

4、小试牛刀
开发板所有的相关样例代码,可在菜单栏中选择文件->示例->TinkerNode NB-IoT (CH)的例子,其中DFRobot_NBIoT目录中为开发板专用的样例代码:NB-IoT、GNSS、MQTT低功耗收发、RGB灯光控制、数据记录仪datalogger等功能的样例代码均在此,其它目录为ESP32的通用样例代码,用户可通过这些通用样例学习掌握ESP32的各类基本功能与应用开发。

TinkerNode NB-IoT物联网开发板有:WiFi、蓝牙、NB-IoT和GNSS定位四种无线通信方式,接下来依托于样例代码,让我们进行简单调测。
4.1、 扫描附近WiFi网络
使用开发板中的WiFi通信,实现对附近WiFi无线信号的扫描,效果如下所示:

示例代码如下所示:
-
/*
-
* 如何扫描WiFi网络
-
*/
-
#include "WiFi.h"
-
-
void setup()
-
{
-
Serial.begin(
115200);
-
-
// 将WiFi设置为站模式,如果AP之前已经连接,则断开连接
-
WiFi.mode(WIFI_STA);
-
WiFi.disconnect();
-
delay(
100);
-
-
Serial.println(
"设置完成");
-
}
-
-
void loop()
-
{
-
Serial.println(
"扫描开始");
-
-
//扫描网络将返回找到的网络数量
-
int n = WiFi.scanNetworks();
-
Serial.println(
"扫描完成");
-
if (n ==
0) {
-
Serial.println(
"无网络");
-
}
else {
-
Serial.print(
"WiFi数量:");
-
Serial.println(n);
-
Serial.println(
"网络列表如下:");
-
for (
int i =
0; i < n; ++i) {
-
//打印每个网络SSID和RSSI
-
Serial.print(i +
1);
-
Serial.print(
": ");
-
Serial.print(WiFi.SSID(i));
-
Serial.print(
" (");
-
Serial.print(WiFi.RSSI(i));
-
Serial.print(
")");
-
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?
" ":
"*");
-
delay(
10);
-
}
-
}
-
Serial.println(
"");
-
-
//稍等片刻再重新扫描
-
delay(
5000);
-
}
4.2、 蓝牙通信
使用开发板中的蓝牙通信,实现与手机蓝牙调测助手进行通信,调测助手建立连接如下所示:

手机蓝牙调测助手发送数据到开发板,效果如下所示:


开发板发送数据到手机蓝牙调测助手,效果如下所示:


示例代码如下所示:
-
#include "DFRobot_BLESerial.h"
-
DFRobot_BLESerial SerialBLE;
-
void setup() {
-
// put your setup code here, to run once:
-
Serial.begin(
115200);
-
SerialBLE.begin(
"TinkerNode_BLE");
-
Serial.println(
"The device started, now you can pair it with ble");
-
}
-
-
void loop() {
-
if (Serial.available()) {
-
SerialBLE.write(Serial.read());
-
}
-
if (SerialBLE.available()) {
-
Serial.write(SerialBLE.read());
-
}
-
delay(
20);
-
}
这款蓝牙调测助手比较不错,可建立RSSI的可视化分析图,方便使用者查看。

4.3、查看NB-IoT配置信息
可以通过USB串行将AT命令发送到BC20模块,查看NB-IoT模组的基本信息,示例效果如下所示,更多指令可查阅BC20模块说明文档。

示例代码如下所示:
-
#include "DFRobot_BC20.h"
-
-
DFRobot_BC20 myBC20;
-
-
void setup(){
-
Serial.begin(
115200);
-
Serial.print(
"启动BC20,请稍等. . . ");
-
while(!myBC20.powerOn()){
-
delay(
1000);
-
Serial.print(
".");
-
}
-
Serial.println(
"BC20启动成功!");
-
// Deep Sleep Mode is automatically enable every time upon power up.
-
// When this mode is entered, BC20 will not respond any AT commands from ESP32
-
myBC20.ConfigSleepMode(eSleepMode_Disable);
-
//Each AT command should begin with "AT" or "at" and end with "Carriage return".
-
//The commands can be upper-case or lower-case. ex. "AT+CSQ" or "at+csq".
-
Serial.println(
"Enter AT commands:");
-
}
-
-
void loop(){
-
if(Serial.available()){
-
BC20Serial.write((
char)Serial.read());
-
}
-
if(BC20Serial.available()){
-
Serial.write((
char)BC20Serial.read());
-
}
-
}
4.4、 GNSS定位
GNSS(全球导航卫星系统定位)能在地球表面或近地空间的任何地点为用户提供全天候的3维坐标和速度以及时间信息的空基无线电导航定位系统,静态物体定位主要用到经纬度坐标,动态物体则可分析实时速度、高度等因素。
需要注意测试时GNSS定位在室内是基本上无信号的,尽可能在室外使用,否则无法获取有效的定位信息,使用模组获取我此时的GNSS定位信息,效果如下所示:

使用百度坐标拾取系统进行验证,由于我在室内测试的存在一些偏差,效果如下所示:

示例代码如下所示:
-
#include "DFRobot_BC20.h"
-
DFRobot_BC20 myBC20;
-
-
void Display_Location_Information(){
-
-
//UTC time of the anchor point
-
Serial.print(
"Time:\t\t");
-
Serial.print(sCLK.Year);
-
Serial.print(
"/");
-
Serial.
printf(
"%02d",sCLK.Month);
-
Serial.print(
"/");
-
Serial.
printf(
"%02d ",sCLK.Day);
-
Serial.
printf(
" %02d",sCLK.Hour);
-
Serial.
printf(
":%02d",sCLK.Minute);
-
Serial.
printf(
":%02d\r\n",sCLK.Second);
-
-
Serial.print(
"Latitude:\t");
-
Serial.print(sGGNS.LatitudeVal,
6);
-
Serial.print(
" deg ");
-
Serial.println(sRMC.LatitudeDir);
-
Serial.print(
"Longitude:\t");
-
Serial.print(sGGNS.LongitudeVal,
6);
-
Serial.print(
" deg ");
-
Serial.println(sRMC.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(sSAT.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(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.print(sSAT.data[i].SYS);
-
Serial.print(
"\t");
-
Serial.println(sSAT.data[i].Status);
-
}
-
}
-
-
void setup(){
-
Serial.begin(
115200);
-
Serial.print(
"Starting the BC20.Please wait. . . ");
-
while(!myBC20.powerOn()){
-
delay(
1000);
-
Serial.print(
".");
-
}
-
Serial.println(
"BC20 started successfully !");
-
Serial.println(
"check OK");
-
if(myBC20.getQGNSSC() == OFF){
-
Serial.println(
"open QGNSSC");
-
myBC20.setQGNSSC(ON);
-
}
-
}
-
-
void loop(){
-
delay(
5000);
-
myBC20.getQGNSSRD();
-
Display_Location_Information();
-
Display_Satellite_Information();
-
}
5、 注意事项
- 根据国家工业和信息化部等六部门要求,为有效防范和打击通讯信息诈骗,所有NB-IoT物联网专用SIM卡均具有机卡绑定功能,不可取消;
- SIM卡插入设备,首次上电(与基站)成功通信即视为激活且与通信模组绑定(机卡绑定),开始年度计费周期(360天);
- 2G/3G/4G手机SIM卡或大流量物联网卡无法代替用于NB-IoT设备;
- 物联网SIM卡不能用于手机、平板、2G/3G/4G模组等非NB-IoT设备,否则会导致SIM卡停机;
- 已机卡绑定的SIM卡若被插入其它设备内进行通信会导致SIM卡停机;
- 物联网SIM卡仅能数据传输,无语音通信和短信功能。

转载:https://blog.csdn.net/m0_38106923/article/details/104441017