LoRaWAN是由LoRa联盟推出的一个低功耗广域网规范,这一技术可以为电池供电的无线设备提供区域、国家甚至全球的网络。
它瞄准了物联网中的一些核心需求,比如安全的双向通讯、移动化和本地服务。该技术无需复杂配置,即可以让智能设备实现无缝的互操作,给物联网领域的用户、开发者和企业自由操作权限。
使用合理的LoRa天线,你可以通过网关将电池供电的传感器连到互联网,信号覆盖半径大约15公里。缺点是可用带宽将以字节为单位,而不是以兆字节甚至千字节为单位。
一个Adafruit RFM95W LoRa无线电装置连接到树莓派Pico
Arduino LoRa库的作者Sandeep Mistry为树莓派Pico搞定了LoRa和以太网支持。
目前他的库能让Semtech SX1276无线电模块更好的工作在Pico和其它RP2040芯片的开发板上。
当然,这意味着像Adafruit的RFM95W、LoRa FeatherWing这样的模块,也可以获得很好的支持。
LoRaWAN覆盖情况
要使用LoRaWAN启用的Pico,你(的设备)需要在LoRa网关覆盖的范围内。幸运的是,有一个名叫“The Things Network”的LoRaWAN网络,它几乎覆盖全球。
关于The Things Network的视频:
https://mp.weixin.qq.com/s/GIPuEb6qQMOmHcPDRXmF9A
这取决于你当前所处的地理位置,很可能你已经在覆盖范围内了。比如英国境内的LoRa网络情况(如图)。
一个LoRaWAN基站的成本在几千美元的日子已经一去不复返了。现在你可以花75英镑买个LoRa网关。
注:The Things Network 是 LoRaWAN 行业里著名的 Network Server 提供方,许多国外的厂家,都是默认连接 TTN 的平台。
作为 LoRa 联盟董事会成员,TTN 现在已经在全球90多个国家和地区部署了3000多个基站,这个数字还在飞速增长中。TTN一直秉承的 “Let’s build this thing together”的开放文化也吸引了超过3万名开发者加入 TTN 社区。
获取源码
如果你已经设置并可以使用树莓派Pico工具链,请确保你的 pico-sdk
是最新的。如果没有,你应该首先设置C/C++ SDK,然后再从GitHub中获取项目。
$ git clone --recurse-submodules https://github.com/sandeepmistry/pico-lorawan.git
$ cd pico_lorawan
PICO_SDK_PATH 在继续操作之前,请确保做好设置。举例来说,如果你要在一个树莓派上构建相关应用,你要先运行 pico_setup.sh 脚本,或者按照我们的指示入门指南。
先设置好环境变量。
$ export PICO_SDK_PATH = /home/pi/pico/pico-sdk
之后,你可以准备构建库和示例应用程序。但是在执行此操作之前,我们需要做另外两件事:在要存储数据的云基础架构上进行配置,并将LoRa无线电模块连接到Raspberry Pi Pico。
设置一个应用程序
The Things Network 目前正在从V2迁移到V3堆栈。由于我的家庭网关是几年前设置的,因此我仍在使用V2软件,尚未迁移。
因此,我将构建一个V2风格的应用程序。但如果你用公共网关或自己构建网关,则可构建V3样式的应用程序。
同理,你可以根据下面的内容逐步完成操作。请注意,对于新的V3堆栈,有一个单独的网络控制台,外观可能有所不同。
地址:https://account.thethingsnetwork.org/users/authorize?client_id=ttn-console&redirect_uri=https:%2F%2Fconsole.thethingsnetwork.org%2Foauth%2Fcallback&response_type=code&state=_wyzCpGx9A
当新网关覆盖范围内的任何LoRa设备将其数据包接收和发送到上游的“The Things Network”时,除非数据包有其它地方可去,否则数据包将被丢弃。换句话说,“The Things Network”需要知道网关接收的数据包路由到哪里。
为了提供此信息,我们首先需要在The Things Network Console中 创建一个应用程序 。
然后你需要做的就是输入唯一的Application ID字符串(可以是任何内容)。控制台将生成一个Application EUI和一个默认的Access Key,我们将通过它们,将设备注册到我们的应用程序中。
一旦我们注册了应用程序,我们要做的就是将单个设备(以后可能有多个设备)注册到该应用程序,以便后端知道从该设备路由数据包的位置。
注册设备
可以从控制台的应用程序页面注册我们的设备。
设备ID是易于识别的字符串,用于标识我们的远程设备。
由于Adafruit的RFM9W功能板在包装袋中有像无线入网号那种唯一标识符的贴纸,因此我们可以使用它在字符串后附加以唯一地标识我们的树莓派Pico,因此最终得到类似pico-xy-xy-xy-xy-xy-xy的设备ID名称。
我们还需要生成一个Device EUI 2 ,这是一个64位的唯一标识符。这里我们同样可以使用标签上的唯一标识符,只不过这次我们可以用两个前导零 0000xyxyxyxyxyxyxy填充它,以便生成我们的Device EUI。你也可以使用pico_get_unique_board_id()来生成Device EUI。
相关链接:https://github.com/sandeepmistry/pico-lorawan/blob/main/examples/default_dev_eui/main.c
如果你要在注册后查看“设备”页面,则需要设置Application EUI 2 和Application Key 2 来让开发板与LoRa网络通信。准确地说,是让网络正确地将数据包从你的开发板路由到你的应用程序。
在面包板上接线
现在我们已经设置了云后端,接下来需要做的是将Pico连接到LoRa扩展板。不幸的是,RFM95W breakout 与面包板的连接并不友好 —— 比如这个项目,需要访问电路板两侧的无线电引脚。在这种情况下,板子的分接头宽度有点太大了(对于标准面包板而言)。
幸运的是,这并不是什么大问题,但是你需要准备一束公对母跳线 以及面包板。继续接通RFM95W模块和Raspberry Pi Pico。接线板上的引脚和你的Pico之间的映射应该如下所示:
Pico RP2040 1 SX1276 Module RFM95W Breakout 3V3 (OUT) — VCC VIN GND GND GND GND Pin 10 GP7 DIO0 G0 Pin 11 GP8 NSS CS Pin 12 GP9 RESET RST Pin 14 GP10 DIO1 G1 Pin 21 GP16 (SPI0 RX) MISO MISO Pin 24 GP18 (SPI0 SCK) SCK SCK Pin 25 GP19 (SPI0 TX) MOSI MOSI
物理引脚,RP2040引脚,SX1276模块和RFM95W扩展板之间的映射 注:这些引脚是库的默认引脚,可以在软件中更改。
构建和部署软件
现在,我们已经在云上建立了后端,并且我们已经物理上“构建”了无线电,我们可以构建和部署LoRaWAN应用程序。该库提供的示例应用程序之一将从RP2040微控制器上的传感器读取温度,并通过LoRaWAN无线电将其定期发送到你的Things Network应用程序。
void internal_temperature_init() {
adc_init();
adc_select_input(4);
adc_set_temp_sensor_enabled(true);
}
float internal_temperature_get() {
float adc_voltage = adc_read() * 3.3f / 4096;
float adc_temperature = 27 - (adc_voltage - 0.706f) / 0.001721f;
return adc_temperature;
}
继续,进入签出的otaa_temperature_led示例应用程序目录。这个例子用到了OTAA,所以我们需要Device EUI,Application EUI和Application Key。
$ cd examples/otaa_temperature_led/
打开config.h文件,在你喜欢的编辑和更改REGION,DEVICE_EUI,APP_EUI,并APP_KEY在网络控制台中显示的值。该代码期望使用(默认)字符串格式,十六进制数字之间没有空格,而不是字节数组表示形式。
在你喜欢的编辑器中打开config.h文件,并将REGION、DEVICE_EUI、APP_EUI和APP_KEY更改为网络控制台中显示的值。该字符串默认是中间没有空格的十六进制数字,而不是字节数组。
#define LORAWAN_REGION LORAMAC_REGION_EU868
#define LORAWAN_DEVICE_EUI "Insert your Device EUI"
#define LORAWAN_APP_EUI "Insert your Application EUI"
#define LORAWAN_APP_KEY "Insert your App Key"
#define LORAWAN_CHANNEL_MASK NULL
我当前位于英国,LoRa广播频率为868MHz。
因此我要将区域设置为LORAMAC_REGION_EU868。
如果你在美国,则使用915MHz,因此需要将区域设置为LORAMAC_REGION_US915。
编辑config.h文件之后,就可以继续构建示例应用程序了。
$ cd ../..
$ mkdir build
$ cd build
$ cmake ..
$ make
如果一切顺利的话,你应该有一个UF2文件在build/examples/otaa_temperature_led/
的目录,名字是pico_lorawan_otaa_temperature_led.uf2
。
现在,你可以按照常规方式将此UF2文件加载到树莓派Pico上。
先接好你的Raspberry Pi Pico开发板和Micro USB电缆,然后再将电缆的另一头插入有集成开发环境的电脑,按住Pico上的BOOTSEL按钮。插入后,松开按钮。
桌面上将会弹出一个名为RPI-RP2的磁盘。
双击将其打开,然后将UF2文件拖放到里面。如果遇到问题,请参阅《入门指南》 第4章以 获取 更多信息。
Pico现在将运行LoRaWAN应用程序,如果需要,可以通过打开与Pico的USB串行连接来查看一些调试信息。打开终端窗口并启动 minicom
。
$ minicom -D /dev/ttyACM0
传送资料
但是,你需要转向Network控制台来查看真实的信息。你应该能看到一个初始连接消息,后面跟着一些帧。每一帧代表一个温度测量值通过LoRaWAN网关,从你的Pico发送到The Things Network网络应用。
有效负载值是Raspberry Pi Pico内部温度传感器以十六进制形式测得的温度。
这有点超出本文的讨论范围,但是你现在可以添加一个解码器和集成功能 ,使你可以将数据从十六进制解码为人类可读的数据,然后将其保存到数据库中。
为了说明你可以在此处执行的操作的强大功能,请转到应用程序的“有效载荷格式”标签,然后在“解码器”框中输入以下Javascript,然后向下滚动并点击绿色的“保存有效载荷功能”按钮。
function Decoder(bytes, port) {
var decoded = {};
decoded.temp = bytes[0];
return decoded;
}
返回“数据”选项卡,你应该看到现在以十六进制表示的有效负载已经以摄氏温度为后缀。我们的简单解码器已将有效负载提取并将其转换回Javascript对象。
发送命令
除了发送温度数据之外,该示例应用程序还让你可以直接从The Things Network控制台切换Raspberry Pi Pico上的LED。
进入网络控制台的设备页面,在Downlink Payload框中输入“01”,并点击“发送”按钮。然后切换到Data选项卡。你应该会看到一个“Download scheduled ”行,如果继续观察,你应该会看到下行的字节。
当这种情况发生时,你树莓派Pico上的LED应该会亮起!返回网络控制台并在有效载荷箱中输入“00”将(最终)关闭Pico的LED。
请记住,LoRaWAN是远程的,但带宽很低。你不要期望下行命令能即时响应。
接下来还有什么 ?
OTAA示例应用程序是一个非常好的框架,你可以在此基础上构建它,它允许你获取数据并通过LoRa将其发送到云端,还可以从云端向支持LoRa的Pico发送命令。
地址:https://github.com/sandeepmistry/pico-lorawan/tree/main/examples/otaa_temperature_led
小结
可以在树莓派论坛上找到对Pico开发的支持。还有一个(非官方的)Discord频道,很多活跃在社区的人似乎都在那里玩。
地址:https://discord.com/invite/avzEvd6Euv
关于文档的反馈应该作为一个问题发布到GitHub上的pico-feedback仓库,或者直接发布到它关注的相关仓库。
所有的文档,以及其他帮助和链接,都可以在入门页面上找到。
如果你不知道未来它在哪里,你总是可以从你的Pico找到它。如果你要访问相关页面,只需按住你Pico上的BOOTSEL按钮,把它插到你的笔记本电脑或树莓派上,然后释放按钮。最后打开RPI-RP2盘符,单击INDEX.HTM文件。
它将把你带到入门页。