来自Arduino的小巧的LoRa开发板——MKR WAN 1300开发板评测
LoRa的优势在于低功耗和远距离,理论上来说,相比于BLE和WiFi更具优势。不过在可穿戴领域,依旧是BLE一枝独秀;而WiFi则一直独霸着局域网无线通信领域。相对来说,LoRa在工业应用方面正逐渐显露自己独特的优势。市面上LoRa产品不少,大多以模块的方式提供给用户,借助三方MCU来实现自己的远程通信功能。
LoRa的优势在于低功耗和远距离,理论上来说,相比于BLE和WiFi更具优势。不过在可穿戴领域,依旧是BLE一枝独秀;而WiFi则一直独霸着局域网无线通信领域。相对来说,LoRa在工业应用方面正逐渐显露自己独特的优势。市面上LoRa产品不少,大多以模块的方式提供给用户,借助三方MCU来实现自己的远程通信功能。
MKR WAN 1300是一款功能强大的主板,结合了MKR Zero和LoRa连接的功能。对于希望设计物联网项目的制造商而言,它是理想的解决方案,而且在具有低功耗方面具备自己独特的优势,使用Arduino来开发和测试,也减少了对专业人员的技术需求。
MKR1300使用两节1.5V AA/AAA电池或外部5V为电路板供电,从一个源切换到另一个源是自动完成的。良好的32位计算能力,类似于MKR ZERO板,丰富的GPIO接口,低功耗LoRa通信以及用于代码开发和编程的Arduino软件的易用性等特性,使得该主板成为紧凑外形的新兴物联网电池供电项目的首选。另外 USB端口可用于为电路板供电,ArduinoMKR WAN 1300能够在连接或不连接电池的情况下运行,具备很低的功耗。
虽然说包装好坏不影响产品使用体验,不过有了极富科技感的外包装,格调还是要高一点的。
包装盒背面有个laser标签,从不同的角度看,可以看到很漂亮的Arduino logo,赞!
开发板上两个主要器件:一个是Atmel SAMD21,另一个是Murata CMWX1ZZABZ LoRa模块。前者让我们体验Arduino,后者让我们体验LoRa,二者合起来,就是MKR1300的极致方便和简单易用了。
Arduino Zero兼容引脚使用过孔排针来引出,正反两面都可以连接外设,同时也非常方便和其它扩展板来进行连接以扩展功能。
ATSAMD21G18是一款低功耗,高性能的基于ARM®Cortex®-M0 +的闪存微控制器,是各种家庭自动化,消费,计量和工业应用的理想选择。
它的特点主要包括:
• 256KB闪存和32KB SRAM
• 工作频率高达48MHz
• 六个串行通信模块(SERCOM)可配置为UART / USART,SPI或I2C,三个16位定时器/计数器,32位实时时钟和日历,20个PWM通道,一个14通道12位ADC,一个10位DAC
• 全速USB设备和嵌入式主机
• 支持多达120个触摸通道
• 1.62V至3.63V电源
• 易于将引脚迁移到SAMD21G和SAMD21J器件
• 由Atmel Studio,ASF和SAM D21 Xplained Pro套件提供支持
CMWX1ZZABZ是一种新型,紧凑,低成本,低功耗的广域网(LPWAN)无线模块,支持LoRaWAN远程无线协议。这款新型独立模块尺寸仅为12.5 x 11.6 x 1.76 mm,采用金属屏蔽封装,包括Semtech SX1276超远程扩频无线收发器和STMicro STM32L0系列ARM Cortex-M0 + 32位微控制器(MCU)。集成的TCXO具有强大的低漂移热特性,可为RF收发器提供精确的时钟源。 可以通过UART,SPI或I2C外设接口实现与模块的通信。ADC和多达18个GPIO为连接传感器,开关和状态LED提供了充分的灵活性,该模块由2.2至3.6 VDC电源供电。Murata CMWX1ZZABZ模块具有预认证的无线电监管认证,适用于世界上大多数地理区域的868和915 MHz工业,科学和医疗(ISM)频谱。
正常输出功率为+14 dBm,但可以选择PA增强功能,以便在远距离应用或终端设备位于室内信号较差的位置时将RF输出增加至+ 20dBm。MCU包括192 kB闪存和20 kB RAM,并具有足够的内存来嵌入客户应用程序和托管其他调制堆栈。此外,可选的STSAFE安全元件可以集成到MCU中,以增强网络安全功能。
该模块的典型应用包括智能计量,可穿戴设备,跟踪,M2M和物联网(IoT)边缘节点。该模块可适应各种温度,工作温度范围为-40至+ 85°C。
MKR1300支持使用Arduino来进行开发,使用之前先要添加硬件平台的支持,在Arduino的开发板管理器里添加MKR1300支持
安装过程中也会添加对该板的驱动支持。
除了添加硬件平台外,还要添加MKRWAN库,该库封装了LoRa的底层驱动支持,在Arduino里直接调用相关的API就可以实现通信功能,无需关心LoRa的具体细节,只需要指定通信参数即可。
这样开发环境就准备得差不多了。
不过要使用LoRa来通信,我们一般还需要一个LoRa网关,如果所在地区已有LoRa网关覆盖,就可以跳过这一步,如果没有,自己准备一个吧!这里使用的是Pilot RK831网关来实现信号的转发。
一个典型的LoRa通信网络如下
通信包括结点、网关及网络服务器(含应用程序),这里使用TTN(The Thingsnetwork)来做为服务器,首先得在TTN上建立一个应用程序,以配合网关来处理数据。
这里是专门为了本次测试而建立的一个应用程序,应用程序一般包括APP EUI及APP KEY两个要素,用来区别不同的应用程序。
建立好应用程序之后,要为该应用程序绑定一个或多个设备,也就是将MKR1300和应用程序对应起来,方便接收及处理数据。
图中可以看到,注册设备时一般要提供设备的EUI信息,EUI可以理解为网络设备中的MAC地址,在设备出厂时就已固化在设备内部,每个设备的Device EUI都是不同的。
如何获取设备的EUI呢,一般情况下,例如网卡及WiFi设备都会使用不干胶贴纸写出并贴在设备上。而对于MKR1300来说,要获取设备的EUI,需要运行配套程序提供的代码,通过Arduino的串口监视器来获取,如下
这里看到的Your device EUI is: a8610xxx就是设备的EUI。
支持库里的FirstConfiguration程序还可以用来测试与TTN的连接情况,不过需要指定几个参数:激活方式,使用OTTA还是使用ABP;应用程序EUI,区分不同的应用程序;APP KEY,该值类似一些REST API中的授权机制,以免数据被滥用。
这是指定连接(激活)方式后再指定APP EUI及APP KEY后连接成功的情况。
配套的库文件还提供了一个发送及接收数据的示例LoRaSendAndReceive.ino文件,演示了如何通过LoRa来发送及接收数据的例子,关键代码如下
LoRaModem modem;
...
int err;
modem.beginPacket();
modem.print(msg);
err = modem.endPacket(true);
if (err > 0) {
Serial.println("Message sent correctly!");
} else {
Serial.println("Error sending message :(");
Serial.println("(you may send a limited amount of messages per minute, depending on the signal strength");
Serial.println("it may vary from 1 message every couple of seconds to 1 message every minute)");
}
delay(1000);
if (!modem.available()) {
Serial.println("No downlink message received at this time.");
return;
}
String rcv;
rcv.reserve(64);
while (modem.available()) {
rcv += (char)modem.read();
}
Serial.print("Received: " + rcv + " - ");
for (unsigned int i = 0; i < rcv.length(); i++) {
Serial.print(rcv[i] >> 4, HEX);
Serial.print(rcv[i] & 0xF, HEX);
Serial.print(" ");
}
通过modem.print()来发送数据,通过modem.read()来读取数据。
其实我们都知道,LoRa通信中一般需要指定具体的能数,如使用868MHz还是使用915MHz来进行通信,另外还有SF、CR等参数的设置,这些都可以通过moderm实例来进行设置。
另外还要提一下的是还需要在代码中指定APP EUI及APP KEY两个值,否则通信是不会成功的。
将修改后的代码编译并上传到MKR1300开发板,找开串口监视器
从串口监视中可以看到,我们发送了字符串"Hello, MKR1300!",同时看到信息发送成功的提示。
在TTN的控制台上,我们也可以看到类似的信息
注意Payload字段的值,与我们在Arduino串口监视器上看到的信息是一致的,只不过只里只显示了二进制的表示形式。
另外我们也可以看到通信的具体参数设置,例如频段为867.7,调制方式为LORA,data_rate的值为SF12BW125,还有CR的值为4/5等,其它的一些信息则是网关传递过来的信息,如timestamp等信息,别忘了,这些信息都是通过网关转发过来的!
除了上行信息,也可以控制下发信息,不过目前TTN还只提供了简单的机制来实现信息的下发,参考下图
这里我们指定下发的信息为三个字节:65 66 67,这个下发的动作是自动触发的,一旦收到数据,自动下发指定的三个字节!
再次运行客户端程序,重新发送一次一次数据,得到如下的结果
这里我们看到了接收到的三个字节:65 66 67,对应的ASCII字符为efg。
如果我们要在粒度控制上获取更好的控制效果应该怎么办呢?TTN提供了数据的编、解码机制和Integration来增强其功能,详情请参考TTN的相关文档。
总的来说,MKR1300集Arduino Zero与LoRa通信功能于一身,体积小巧但是功能强大,结合Arduino的简单易用,确实是LoRa入门者首选开发板!
最后有个疑问,据Arduino官方文档介绍,该开发板支持LoRa 433/868/915通信频段,但是从ABZ官方的文档中得知,该模块只支持868/915通信频段,本次测试只测试了868频段的通信,其它两个频段都没有测试,留下了一个小困惑!