LoRenz开发板评测-基于SX1278模块与Arduino实现的Lora通信
发布时间:2019-12-06
分享到:
LoRenz开发板评测-基于SX1278模块与Arduino实现的Lora通信
发布时间:2019-12-06
分享到:

您有没有想过如何让Arduino实现几百米的无线通信距离?有没有想过要创建一个小型物联网设备,但是后来因为远程通信需要较大功率而放弃?或者是否想过构建一个能够在外面探索世界的机器人,而您则坐在椅子上悠然自得地遥控?别急,现在有解决方案了!在本文中,我将向您介绍“LoRenz-Arduino开发板”,不仅能完成所有这些任务,而且还能给您带来更多功能。此外,更重要的是,LoRenz软件和硬件都是完全开源的!

硬件

  • 2块 Arduino UNO/Mega
  • 2套 LoRenz Rev. B 开发板和模块分组板
  • 2个 SX1278 模块

该开发板到底能做什么?它与Arduino UNO和Arduino ega兼容,能够提供数百米的通信距离,同时传输时的功率成本低至80mA。这仅相当于5个普通LED的功耗。除此之外,我还构建了一个库,这使得整套系统非常容易使用,即使对于初学者也是如此。真的!您想发送消息吗?输入一个命令!好了,发送成功!

法律免责声明

我们开始之前,我必须声明:虽然LoRa技术的通信频率为免许可频段,比如433MHz或868MHz等(通常叫做ISM – 工业、科学 医疗),但是您居住的地区仍然可能会受到法律限制。限制可能包括功率输出限制、带宽限制,甚至传输和接收的数据类型都受限。我不知道读者住在哪个州或哪个国家,因此我只能给您最一般的建议:

请始终遵守您所在地区的现行法律规定!

使用LoRenz开发板或LoRaLib时,作者和DevicePwww.mer-corp.com都不对您的操作承担任何责任。

现在,如果大家遵守相关法律,那么我们就从开发板的核心功能——LoRa调制——开始讲起。

LoRa 调制

LoRa –– Long Range 的简写——是一种巧妙的电磁信号调制方式。信号调制就是将更多信息通过编码载入无线信号中,这种方式本身非常聪明。调制的历史比较悠久,事实上,它们可以追溯到19世纪末期和无线电发明期间。事实上,由于收音机的存在,大多数人都熟悉“调制”这个术语:大家总听说过AM(幅度调制)或FM(频率调制)吧?幅度调制时,信息通过载波幅度的变化进行编码。类似地,频率调制时,载波的频率会发生变化。使用调制的主要原因是我们可以将低频信息(比如语音或音乐)“拟合”到高频载波中。

那么,LoRa是哪一种调制?两者都不是。LoRa是一种不同类型的调制,尽管它与FM有一些相似之处。LoRa实际上是CSS调制——啁啾扩频调制。该技术本身是专有技术,并具有专利,但是基本原则是利用啁啾对信息进行编码——载波频率随时间逐渐增加或减少。

这种调制抗噪声甚至是多普勒效应能力很强,因此在低功率长距离通信时非常有用。幸运的是,采用这种技术的模块非常便宜且易于使用。最流行的当属Semtech制造的SX1278芯片,搭载这种芯片的模块价格可低至7美元。请用Google搜索“SX1278模块”,您会看到很多出售该产品的商店。

现在我们已经了解了LoRa是什么以及如何获得,那么我们来看一下开发板本身——首先,如何获得这种开发板呢?

LoRenz 开发板

不幸的是,您无法从商店购买这种开发板,因为没有人生产。该开发板完全是定制的,所以必须从我的 GitHub 下载Eagle文件,购买所有元件、找个地方加工PCB板,然后将所有元件焊接在一起。板上元件的总价应该在20美元左右,所以该开发板并不昂贵。事实上,在我开发这个产品时,最昂贵的部分实际上是PCB的运费。但即使包括运费,每块开发板的价格也不应超过30美元——当然,这取决于您居住的地区。

接下来我们看一下开发板上的所有元件及其功能:

  • 3.3 V 电源稳压器 由于Arduino板载电源只能提供150 mA的电流,因此我决定添加一个单独的1117稳压器——能够提供至少800 mA的电流。这比理论上的功率要大得多,然而,留些余地总是更好一些。
  • 螺丝接线端 通过该端子您可以用几乎任何类型的电池为开发板供电!允许的电压范围是6-20V,但是该电源同样也为Arduino供电,所以我建议使用7到12V之间的电池。
  • UNO/Mega 排针 SX1278模块通过SPI总线与Arduino进行通信。该总线在Arduino UNO上用的是10-13引脚,但是在Mega上却是50-52引脚。我想让开发板尽可能通用,因此我添加了这个排针接头。使用Arduino UNO时,只需保留所有三对短接跳线。使用Mega时,请移除短路跳线并根据下图连接相应引脚即可。

  • 从器件选择排针 这可能有点矫枉过正,但是如果万一您想在单个Arduino上使用多个LoRenz开发板呢?凭借这个排针,您最多可以使用四块(!)开发板!只需短接不同位置即可。
  • SX1278 模块插槽 您可以用此插槽将任何类型的SX1278模块连至开发板,只需确保电源为3.3V。我建议使用精密插槽接头,保持开发板整体高度越小越好。
  • 逻辑电平转换器 据我所知,目前市场上的所有SX1278模块都使用3.3V逻辑。要连接Arduino——用的是5V逻辑,我们需要进行某种逻辑电平转换。这就是这两个IC的作用。其中一个将Arduino输出从5 V转换为3.3 V,另一个将SX1278输出从3.3 V转换为5 V。这样,即使电池电量较低,系统也非常稳定。

  • LED指示灯 为了指示SX1278的活动状态,我在开发板上设置了一个LED指示灯。要启用LED,您必须用焊锡短接EN焊盘。如果之后不想用LED指示灯了,只需把EN焊盘的焊锡去掉,LED就不会再消耗宝贵的电流。
  • 实验区域 我在开发板上的空余地方设计了一个实验区域,方便大家添加额外的设计。该区域自带3.3V、5V和GND连接!

您还需要一块扩展板。由于市场上有几种不同类型的SX1278模块,我们需要某种“适配器”,以便将所有模块都能连至LoRenz开发板。这就是这块小板子的作用。我们将SX1278模块焊接在扩展板上,然后整体将其插入开发板的插槽中即可。这些扩展板还配有一个同轴电缆接头,可以连接外部天线以获得更长的通信距离!

这些部件看起来还不错,对吧?但是,现在我们还缺少一个非常重要的部分。硬件需要软件才能工作。

为了控制 Arduino长距离通信教程–LoRenz 开发板中构建的LoRenz开发板,我开发了LoRaLib——用于SX1278芯片的开源Arduino库。这个库从零开始设计,目的只有一个:制作易于使用的API,即使是初学者也可以实现LoRa通信。该库的目标是使远程通信与串行通信一样简单。

软件

  • Arduino IDE
  • LoRaLib Arduino 库 (可在 GitHub 上获得)

LoRaLib 库

SX1278有多种不同设置,允许用户完全自定义范围、数据速率和功耗,但是最重要的三个设置如下所示:

  • 带宽 SX1278允许的带宽设置为7.8 kHz至500 kHz。带宽值越高,数据传输越快。然而,这是以降低总灵敏度为代价的,因此降低了最大范围。
  • 扩频因子 在LoRa调制中,每个信息位由多个啁啾表示。扩频因子是指每位数据有多少啁啾。SX1278支持7种不同的设置,扩频因子越高,数据传输越慢,范围越大。
  • 编码速率 为了提高传输的稳定性,SX1278可以执行错误检查功能。此错误检查的度量称为编码速率,可以设定四个值。编码速率设为最低的4/5时,传输不太稳定,速度稍快。编码速率设为最高的4/8时,链路更可靠,但代价是数据传输速率较慢。

库的默认设置为:带宽为500 kHz、编码速率为4/5和扩频因子为12。这些设置是范围、稳定性和数据速率之间的合理平衡。当然,这些设置可以通过函数随时更改。

该库内置数据包类和寻址系统。地址长度为8字节,那么最大的寻址数量就是1.8千亿亿(1.8 × 10^19)。这个数值大的离谱。相比之下,NASA估计我们银河系中的恒星数量仅为“4亿”(4×10^11)。每个数据包由源地址、目标地址和最多240字节的有效负载组成。当然,该库还提供了几种读取和写入分组数据的方法。

让我们来看一下使用这个库是多么容易。假设我们有两个带有SX1278模块的LoRenz开发板。它们相距几百米,所以我们可以使用默认设置。首先,我们必须包含库头文件。然后,我们用默认设置创建 LoRa 类的一个实例,用目标地址和消息创建 packet 类的一个实例。源地址由库自动生成并写入Arduino EEPROM。要检查所有内容是否已正确保存,我们会读取数据包信息并将其打印到串行端口。接下来,我们只需调用 tx() 函数即可。一会儿之后……完成!只需一个命令,我们的数据包就传送成功了!

当然,我们需要第二套配有LoRenz 开发板的Arduino来接收该数据包。 系统设置不变,只是这次我们调用 rx() 函数,然后打印接收到的数据包。此函数将等待数据包,如果数据没有在某个时间内到达,该函数将超时,以便您的代码不会完全挂起。该库甚至还会检查传输的数据包是否已损坏,如果是,则将其丢弃。

当然,这只是最基本的例子。库本身可以做更多事情,而且我还在继续开发更多的功能。有关该库和所有其他功能的更深入信息,请参阅我的 GitHub 以及那里托管的文档。

Arduino 加密

本文结束之前,我还想讨论一下Arduino的加密。我在上一篇文章中提到了这个问题。现在,我们发送的所有数据都是未加密的。这意味着拥有相同配置、使用相同模块和相同设置的任何人都能拦截和阅读我们的消息。攻击者甚至可以发送自己的消息,而我们却无法分辨。显然,这并不安全。

最简单的解决方案就是使用某种加密。具体地,我决定使用 Rijndael 密码。没听说过吧?这是因为这个名字是荷兰语,因此不好记忆和发音。密码本身实际上非常普遍,但名称更加引人注目:AES。它是一种对称密码,可在加密速度和安全性之间提供出色的平衡。此外,Arduino还提供了几个AES库!本项目使用的库是Davy Landman开发的AESLib(可从 GitHub 上获得)。

如上所述,AES是一种对称密码 – 这意味着它使用相同的密钥来加密和解密消息。现在,我们只有两个设备,因此将密钥硬编码到Arduino中非常容易。当然,如果我们想要动态添加更多设备并创建某种无线网络,我们必须以某种方式实现安全密钥交换,例如使用Diffie-Hellman交换。但是我们现在不会深入这个领域,我们只需将密钥硬编码到我们的Arduino程序中即可。

那么我们应该如何修改上一章的代码呢?修改并不多,说实话,我们只需添加密钥以及一个加密或解密数据包中的数据。这是发射机部分,加密通过 aes128_enc_single() 函数完成。

接收机部分如下所示,解密通过相同密钥和函数 aes128_dec_single() 完成。

使用了密钥之后,我们的消息现在是安全的。如果有人偷听我们的谈话,他无法看到除地址之外的任何内容,每个数据包中都是240字节的乱码。同样,如果攻击者试图传输他自己的消息,我们会立即知道,因为他传输的消息不会加密。

在Arduino上用AES加密非常简单,所以我推荐使用该加密方法。这不仅仅是一个很好的编程实践。您永远不知道谁以及为什么可能会偷听您看似无辜的对话。

结论

现在,Arduino远程无线通信的短暂旅途就要结束了。如果您开发自己的LoRenz开发板并将其应用于一些很酷的Arduino项目,请告诉我!如果您有改进LoRenz开发板和LoRaLib库的想法,请在GitHub上与我分享。

我对开发板进行了测试,当带宽为500kHz、扩展因子为12、编码率为4/8时,在无障碍环境中我能够实现超过500米的可靠传输;在茂密的森林中传输距离则超过200米。所有这一切都只是通过一根10cm天线实现的,而且发射器电源也只是廉价的9V电池而已(接收器从USB端口接电,最终通过Arduino板载稳压器供电)。这个距离还可以更长(通过降低带宽),但是这会导致传输速度显著降低,在上述设置不变的情况下传输速度大约为1 kbps。

然而,对于我将来的项目,这些距离绰绰有余。请在社交媒体上关注DevicePlus,这样您就不会错过任何有趣的内容!

加入微信技术交流群

技术交流,职业进阶

关注电路设计技能公众号

了解最新技术方案

讨论