Skip to main content

Main_Image700_b79cf852387deef8704309517d9e881af6344e9a.jpg

为现有传感器平台添加低功率、远距离无线通信功能。

随着 LoRaWAN 和物联网的发展,连接设备变得前所未有的轻松,如今通过网关 - LoRaWAN 基站 - 到互联网连接应用程序,从位于远距离的传感器获取数据变得令人难以置信的简单。

在本示例中,我们将带 LoRaWAN、GPS 等功能的 SmartEverything LION (124-8830) Arduino 兼容板与 Ardubat 屏蔽罩相结合,通过超声波检测蝙蝠。不过,通过简单的调整,此配置应该能够使用其他屏蔽罩和连接的传感器。

LoRaWAN

LoRaWAN 最惊艳的特性之一在于,任何人都可以用它构建网络,这些网关相对廉价,配置起来也十分简单。LoRaWAN 后台有各种选项,这可以视为“网络核心”,处理应用程序收发的路由数据和设备启用等。这些选项包括物联网(全球)、物互联(仅英国)和单机/自托管软件解决方案。

大量的物联网 (TTN) 互联网关覆盖着我们所在的区域,这意味着,我们无需拥有基础设施,可以仅实施节点,使用这种公开网络。如果情况并非如此,在 TTN 上建立新网关也相当简单,还能够与社区共享网络,从而扩大覆盖面。

如果您在访问某个网关,想查看附近是否还有,您可以查看地图。如果网关位于视线内,或者可能仅有少数建筑阻碍,那么连上它的可能性会非常高。

这些网络所使用的无线技术 (LoRa) 堪称现代化奇迹。和许多无线遥控钥匙和门铃一样,它们使用的射频频谱是 868MHz(在欧盟和世界其他地区,使用其他频率)。遥控钥匙的无线覆盖范围为 30m,而 LoRa 可以轻松覆盖 3,000m,甚至够到 15,000m - 是的,没说错,15km 的范围是有可能的。

通过利用一些巧妙的物理技巧可以覆盖如此广泛的区域,这些物理技巧一度为人们所知晓,但是直到最近才在商业电子设备中实施。LoRa 波形并非使用和大多数射频通信一样的单频,而是通过将 FM 线性调频调制到固定信号上进行“扩展”。这种技巧被称为线性调频扩频。通过对信号进行正向线性调频,从背景噪声中甚或在带内/带外干扰中拾取信号会变得更加轻松。

此外,数据编码方式也旨在尽可能扩大覆盖范围,凭借这两个因素,令人惊叹的距离变为现实。

WAN 部分怎么样??

LoRaWAN 的广域网 (WAN) 部分是整个拼图的智能 IoT 侧。节点部分与 LoRa 协议一起,由 SmartEverything LION 上的微芯片 RN2483 模块进行处理。网关负责转发 TTN 收发到的数据包,除了将节点连接到此网络中,我们几乎无需做任何事情;它将负责其余的事情 - 重复网络删除、网关管理、数据转发、加密和安全,等等。

蝙蝠检测

大多数蝙蝠检测器的工作原理是,侦听蝙蝠用于回声定位的超声波啁啾声。从这些啁啾声的波长和频率,我们可以确定检测到了哪个品种的蝙蝠。尽管市场上有商用蝙蝠检测器,但是我们没有找到支持 LoRaWAN 的同类产品,因此,我们也许可以开创先河!

与商用蝙蝠检测器相比,Ardubat 检测器有一些局限性。例如,它对高频范围有点迟钝,这表示我们可能无法检测马铁菊头蝠/小菊头蝠 (80-100Khz)。此外,我们不录制声音 - 只是记录脉冲频率和持续时间 - 因此区分一些品种可能会比较困难。

鉴于蝙蝠检测器的特性,我们必须考虑以下因素:

  • 它需要用电池供电,长时间运行
  • 固定设备将位于远离 WiFi 和电力设备的旷野或仓房

我们的设备

Arrow SmartEverything LION 开发平台为兼容 Arduino 的 LoRaWAN 设备/完整 IoT 开发套件,位于一个简洁的封装中。

使用此设备的第一件事情(和使用任意 LoRaWAN 设备一样)就是从它那里获得 HWEUI。这是一个用于网络访问的唯一标识符。之前大多数人遇到过的、最接近的类似概念是 MAC 地址。

因设备的不同,获取此标识符的方法也各不相同,对于 LION,有几个选项,但是最简单的方法是加载代码示例“getChipInformation”,这会将此标识符输出到串口上。另一个选项就是在主应用程序中添加以下代码,这允许直接访问 RN2483 模块,我们可以通过命令“sys get hweui”对此进行查询。

 if (Serial.available()) 
 {
  c = Serial.read(); 
  Serial.write(c); 
  buff[i++] = c;
  if (c == '\n') 
  {
   Serial.print(lora.sendRawCmdAndAnswer(buff));
   i = 0;
   memset(buff, 0, sizeof(buff));
  }
 }

物联网设置

在物联网上设置账户非常简单,按照熟悉的帐户设置操作,几分钟内就可以完成注册,获得网络访问权限。接下来我们要进入 TTN 控制台设置我们的节点。

转至“应用程序”选项卡,我们可以先添加新应用程序:

Add_device_86ded499d57933c16a561e1e710d2c43bf2d8c77.jpg

此后,我们需要注册设备,设备概述类似下面的样子:

Device_overview3_6e5a2e37ea06b641bb3ba6de5d9e84d828891938.jpg

完成这部分后,就配置好了 LoRaWAN 设备,一旦实施了 Arduino 代码,此设备就可以连接至物联网。

由于我们已体验过 SmartEverything LION,因此我们跳过了该步骤,但是在此处,从示例“sendDataOTA_console”入手,测试您的设置和网络连接,这是一个不错的开始。在此示例中唯一需要更改的代码如下所示,这些信息可以在 TTN 应用程序的设备概述选项卡中找到。

App_eui2_1f9b91c9a3a2273c361ae036534762223b532479.jpg

 

err = lora.macSetAppEUICmd("0000000000000001");

APP_key1_5af9b84e84252f1f10566b29f9d4cb79cc356dc7.jpg

lora.macSetAppKeyCmd("ffffffffffffffffffffffffffff0000");

网络局限性

使用 LoRaWAN 时应注意的一个关键点是,数据带宽较低,非常低!

允许的限值为每个信道约 1%,但是各不相同。这可能是模块-在我们的情形中为 RN2483-强制执行的硬限制。这也是网关必须遵照的限值(在这以后会更多)。

此外,TTN 具有公平的节点访问策略,广播时间限制为每 24 小时上行链路 30 秒,每天 10 条下行链路信息。由于网关必须遵照这些传输限值,因此不保证会从网关得到回应,尤其是如果有人违反了网关上的公平使用策略,则更是如此。

LoRaWAN 有两种供应方法:空中启动 (OTAA) 和个性化启动 (ABP)。简单来讲,ABP 使用一个设定的密钥,并且此密钥永不更改。这可能会变成一个安全问题,因为加密密钥永不更改,长期来讲安全性可能会越来越弱。

每次连接时,OTAA 都会分配新的加密密钥,因此这可以通过重新引导设备和强制重新连接来更新密钥。第二个方法操作起来有点烦琐,并且依赖于网关的响应。这表示如果网关处于忙碌状态或者已用完其传输配额,可能要花一些时间才能实现成功连接。

调整示例

先前已针对其他应用对此示例进行调整,我们发现了一些局限性:

  • 主循环对定时的控制效果不佳,并且可能向无线模块发送垃圾信息
  • 由于上述调节定时的原因,添加代码可能会成为一个问题
  • 这会导致 RN2483 拒绝传输请求,从而出现连接问题

这个问题的解决方案是,实施更准确的定时循环,并且将传输事件限制为数十分钟一件。我们在最终应用中使用 60 分钟。按照 SF7BW125 的最低扩频因子(最小范围),2 字节有效负载每次通信将消耗大约 45 毫秒广播时间。每天提供 1 秒广播时间的总传输。如果增加至 SF12(最长范围),我们将有 27.6 秒钟,这使我们的节点有相当多可用的总广播时间,而且未打破公平使用策略。

考虑扩频因子的这种差异,并且不去想当然认为任何传输都使用 SF7,这在 LoRaWAN 中至关重要,因为很有可能使用的是 SF12。考虑到这一点,我们将示例中的大量代码移到称为“LoRa_TX”的函数中,用我们自己的字符串替换发送的数据,并且为确认的传输添加条件检查,因此我们可以决定周期性地使用它。

if (MAC_JOINED(state)) 
{
  if (!joined) 
  {
   Serial.println("\nOTA Network JOINED! ");

   joined = true;
  }
   
  tx_cnt++;

  if(Confirmtx==true)
  {
   Serial.println("Sending Confirmed String and clearing count...");
    
   returned = lora.macTxCmd(String(s), 1, TX_ACK); // Confirmed tx check received ok so we can clear the count
   if(Serialdebuglevel <=1)
   {
    Serial.println(returned);
   }
   if(returned == "RN_OK")
   {
      
    BatsDetected =0; // clear bat count
   }
    Confirmtx=false;
  }
  else
  {
    Serial.println("Sending UnConfirmed String ...");
    lora.macTxCmd(String(s), 1); // Unconfirmed tx buffer if required
  }
     
} 
else 
{ 
  joined=false;// Network is not joined so try to join
  Serial.println("\nNot Joined Tying to Join");
  lora.macJoinCmd(OTAA); // wait a while after joining
  delay(4000);
} 

我们有一个看起来相当稀疏的主循环:

void loop() 
{
 static bool joined = false;
 
 LoRa_management(); // in here we relay commands to the RN2483 and deal with RX.
 bat_detection_loop(); // bat related items get done here
 checktime(); // this keeps track of time (must be entered a few times per second to avoid loss of time)
 Time_to_tx(); // check the set the flag Go_Tx when we are ready to tx.
 
 if (Go_Tx) 
 { 
  Serial.println("\nTry to TX:\n");
  LoRa_TX(String(BatsDetected)); // this sends the Bat string
  Go_Tx=false;
 }
}

添加了可自由使用的必要的全局变量和设置。是的,这是一种不好的做法,但是出于便利性原因,这里这么做正合适。该应用程序会开启并连接至物联网。

Payload2_911c439e2c37c85577574772d5008ae36d3d1f19.jpg

改进

如今代码会保留累计的蝙蝠计数,并每 60 分钟传输此未确认值。然后每 12 小时按照确认的上行链路对此值进行重置(仅在成功的情况下,才会重置计数)。

可能的改进:

  • 理想情况下,这应该由网络应用程序控制,并且可以发送下行链路,以执行此计数重置功能。
  • 这种蝙蝠检测不太智能,并且根据接收脉冲的频率和持续时间应该“丢弃”。这只是编码和实验的问题。
  • 记录应该存储到 SD 卡中
  • 系统使用相当大的功率,并且可能会处理硬件定时和睡眠例程,所以它对于电池应用而言更加实用。
  • 最后也是最重要的,我们的数据有点“臃肿”,因为我们使用了 ASCII 编码字符串。理想情况下,我们需要处理程序来压缩和删除冗余数据并且仅发送二进制代码。

结语

向任意传感器添加 LoRaWAN 功能是一件相对琐碎的事情。但是凡事都有改进的空间,轻松实现核心功能也不是不可能。

此技术允许实现极低功率射频通信,非常适合长期记录应用。它具有一些局限性,但是了解这些局限性,并且相应地实施我们的代码,就可以为几乎所有传感器创建一个可靠的低成本系统。

Karl Woodward

Karl is a design engineer with over a decade of experience in high speed digital design and technical project leadership in the commercial electronics sector.