一板网电子技术论坛

风筝
发表于: 2019-2-20 21:21:13 | 显示全部楼层

预计到2020年,我们将有25亿台设备连接到互联网。换句话说,该数字超过今天地球人口的三倍。随着物联网和工业4.0、物联网汽车和智能城市的概念迅速传播,这种情况最有可能发生。我们已经拥有一些无线协议,如BLE、Wi-Fi、Cellular等,但这些技术并不适合物联网传感器节点,因为它们需要在不使用太多电力的情况下长距离传输信息。这导致了LoRa技术的兴起,它可以以低功耗执行超长距离传输。


随着ESP模块成为Wi-Fi应用的同义词,这种LoRa技术也具备建立像互联网这样庞大网络的能力。我们以前使用ESP8266和Arduino构建了许多基于IoT的项目,在本文中我们将了解LoRa以及如何将其与Arduino开发平台一起使用。


什么是LoRa?

LoRa一词代表(Long Range)长距离。这是一家名为Semtech的公司推出的无线射频技术。这种LoRa技术可用于远距离传输双向信息,而不会消耗太多电力。远程传感器可以使用此属性,只需操作小型电池即可传输数据。


通常情况下,Lora可以达到15-20km的距离(稍后会详细说明)并且可以使用电池多年。请记住,LoRa、LoRaWAN和LPWAN是三种不同的术语,不应相互混淆。我们将在本文后面简要讨论它们。


了解LoRa技术

在为仓库管理或现场监控提供的任何典型物联网解决方案中,将在现场部署数百个传感器节点,这些节点将监控重要参数并将其发送到云平台进行处理。但这些传感器应该是无线的,应该使用小型电池,以便携带。像RF这样的无线解决方案可以将数据发送到远距离,但需要更多的电力才能进行电池操作,而另一方面BLE可以用很少的电力工作但不能长距离发送数据。所以这就是需要LoRa的原因。


在LoRa中,我们可以在不使用大量功率的情况下实现高距离通信,从而克服了Wi-Fi和BLE通信的缺点。但是怎么可能呢?如果是这种情况,为什么BLE和RF仍然存在?


那是因为LoRa有自己的缺点。为了实现高功率LoRa带宽的远距离,它可以在非常低的带宽上运行。 Lora的最大带宽约为5.5 kbps,这意味着您只能通过LoRa发送少量数据。因此,您无法通过此技术发送音频或视频,它仅适用于传输较少的信息,如传感器值。下图显示了LoRa与Wi-Fi、蓝牙和Cellular蜂窝设备相比的位置。

Understanding-LoRa-Technology.png


许多人将LoRa与Wi-Fi或蓝牙进行比较,但这两者并不能在LoRa附近。蓝牙用于在两个蓝牙设备之间传输信息,Wi-Fi用于在接入点(路由器)和站(移动)之间传输信息。但LoRa技术主要不是为了在两个LoRa模块之间传输数据而发明的。


你可以认为LoRa更像是蜂窝通信。来自一个LoRa节点的信号通过LoRa网关到达另一个节点,如下图所示。

Lora-Gateway.png

然后,这些网关将信息传递到互联网,最后通过应用程序界面传递给最终用户。同样,来自用户的数据也将通过网络服务器和网关到达节点。


LoRa节点通常在电池上运行,由无线电模块和微处理器组成。微处理器用于从传感器读取数据并通过无线电模块在空中发送,然后由LoRa网关接收。 LoRa网关还具有无线电模块和微处理器,但通常在交流电源上运行,因为它们需要更多电力。单个LoRa网关可以监听多个LoRa节点,而单个LoRa节点也可以向多个网关发送信息,这样来自节点的信息将被接入网关而不会丢失。当信息id从节点发送到网关时,它被称为上行链路,当它从网关发送到节点时,它被称为下行链路。


LoRa属于LPWAN类别,其中LPWAN代表低功率广域网(Low Power Wide Area Network)。在LPWAN上运行的不仅可以是LoRa,我们还有其他技术,如窄带物联网(NB-IOT)、Sigfox等,它们能够在同一个LPWAN中运行。一旦引入了LoRa技术,它就需要所有制造商遵循某些协议,因此形成了LoRa联盟,然后引入了LoRaWAN。 LoRaWAN是LPWAN的修改形式,它规定了物理层中LoRa应如何用于在节点、网关和互联网之间发送和接收数据的协议。


我可以使用LoRa通信多远?

关于LoRa的官方信息声称它可以达到715公里的视线距离。那是节点和网关之间没有障碍的时候。很少有人甚至实际上在212公里地面与地面之间进行通信,甚至使用气象气球达到702公里。


LoRa SX1278与Arduino

以上足够的理论让我们自己构建它并检查它是如何工作的。还记得我告诉你的两个LoRa模块不能相互通信的部分吗?好吧我说谎了......是的,LoRaWAN协议不允许两个LoRa模块之间的通信,但有一种称为无线电头包方法的技术,它遵循LoRaWAN协议,但允许我们与两个LoRa模块进行通信!因此,让我们使用两个LoRa模块和两个Arduino板从一块板上发送数据,然后在另一块板上接收数据。我们将在发射器端使用Arduino Uno,在接收端使用Arduino Nano。


我在这里使用的LoRa模块是SX1278 Ra-02,工作频率为433MHz。这里的免许可频率范围从865MHz到867MHz,因此我不允许在法律上长时间使用433MHz频率模块而不是用于教育目的。同样,检查您所在国家/地区允许的范围,并确保您可以使用特定的频率范围。 LoRa模块有不同的频率范围,最常见的是433MHz、915MHz和868MHz。模块后面将提到模块工作的频率。您也可以购买LoRa作为模块或只购买芯片。如果你计划只获得芯片,那么确保你的焊接技术是好的,因为它是一个很好的工作,焊接到LoRa芯片。以下是模块和芯片焊接线的版本,如下所示。

Lora-SX1278-Ra-02_0.jpg

您的LoRa模块的下一个重要事项是您的天线。请记住,必须使用天线操作LoRa模块,否则输出发射功率将损坏模块。我使用的是433Mhz Lora模块,因此我的天线的额定频率为433MHz,您必须相应地选择天线。我的LoRa模块和天线如下所示。

Lora-Module-with-Antenna.jpg


发送端 - 连接LoRa SX1278与Arduino UNO

对于发送端,我们将使用Arduino UNO和我们的LoRa模块。将Arduino UNO与LoRa连接的电路图如下所示

Transmitting-Side-Connecting-LoRa-SX1278-with-Arduino-UNO.png

LoRa模块由16个引脚组成,每侧有8个引脚。在这16个引脚中,有6个由GPIO引脚使用,范围从DIO0到DIO5,其中4个由接地引脚使用。该模块工作在3.3V,因此LoRa上的3.3V引脚连接到Arduino UNO板上的3.3V引脚。然后我们将LoRa上的SPI引脚连接到Arduino Board上的SPI引脚,如上所示。


我使用连接线在Arduino UNO和LoRa Module之间建立连接。设置如下所示。整个设置可以由移动电源供电,使其可移动以测试范围。

Circuit-Hardware-for-Transmitting-Side-Connecting-LoRa-SX1278-with-Arduino-UNO.jpg


接收端 - 连接LoRa SX1278与Arduino Nano

对于接收端,我们将使用LoRa模块和Arduino Nano。您可以使用任何用于发射器和接收器的Arduino板,但请确保相应地连接它们。将Arduino Nano与LoRa连接的电路图如下所示

Circuit-Diagram-for-Interfacing-SX1278-LoRa-Module-with-Arduino.png

除了一个微小的变化之外,连接几乎保持不变。 LoRa模块的3.3V引脚不是由Arduino Nano供电,而是由外部3.3V稳压器供电。这是因为Arduino Nano上的板载稳压器无法为LoRa模块提供足够的电流来运行。除此之外,连接保持不变。


我在面包板上建立连接并使用我们之前建造的可信赖的旧面包板电源。 另请注意,我使用的LoRa模块不是很适合面包板,因此我使用了两个小面包板来进行连接,如下所示。

Circuit-Hardware-for-Interfacing-SX1278-LoRa-Module-with-Arduino.jpg

跳转到指定楼层
风筝
发表于: 2019-2-20 21:37:49 | 显示全部楼层

为LoRa无线通信准备Arduino ID

硬件准备就绪后,我们可以继续使用Arduino IDE。为了在Arduino开发板上使用LoRa模块,我们已经有Sandeep Mistry的精心构建的LoRa库。在本文中,我们将把库包含到Arduino IDE中,并使用示例草图稍作修改,以使我们的LoRa模块在它们之间进行通信。


要添加库,请打开Arduino IDE,转到Sketch  - > Include Library  - > Manage Libraries。然后搜索“LoRa Radio”,并查找由Sandeep Mistry制作的库,然后单击“Install”。等待安装完成,你最后应该看到这样的东西

Arduino-IDE-for-LoRa-Wireless-Communication.png


现在重新启动Arduino IDE,使用File  - > Example  - > LoRa打开LoRa Example程序,然后打开LoRa Receiver和LoRa Sender Program,如下所示。

Lora-Sending-Example-with-Arduino-IDE-LoRa-Wireless-Communication.png


这两个程序也在本文末尾给出,供您参考。完整的程序带有注释。发送程序每隔5秒发送一个“hello”,计数器的值递增。接收器然后接收它并在具有RSSI值的串行监视器上打印。


您必须进行更改的一个重要方面是LoRa.begin()函数。默认情况下,程序使用“LoRa.begin(915E6)”,这意味着它将LoRa模块设置为915MHz。如果你的模块实际上是915MHz,那也没关系,但是我这里的工作频率是433MHz,正如我之前所说,所以你必须改变它,如下图所示

  1. LoRa.begin(433E6)
复制代码

您可以访问库文档以了解库中的每个函数的含义以及如何更改它。


同样,必须在接收器程序上更改频率。程序准备就绪后,确保连接正确并且天线连接到LoRa模块后,将程序上传到相应的开发板上。


LoRa与Arduino的无线通信

上传程序后,打开两个Arduino开发板的串行监视器。发送器的串行监视器应显示接收器将在其串行监视器上显示时发送的值。屏幕看起来应该是这样的。

LoRa-Wireless-Communication-with-Arduino.png


您还应该注意LoRa模块收到的每条消息的RSSI值。术语RSSI代表接收信号强度指示器。值总是负数,在我们的例子中它是-68左右。该值越接近零,信号强度越强。例如,如果我将两个设备分开很远,信号强度就会下降。


通过这种设置,我能够接收到大约500米的信号,中间有障碍物。对于视距通信和更好的天线,该值应该是高的。希望你理解这个项目,并喜欢用它来制作一些东西,如果你有任何问题需要在工作中留下你的问题,我会尽力回答它们。


以下是本文使用的代码

  1. LORA code for Transmitting Side

  2. #include <SPI.h>
  3. #include <LoRa.h>

  4. int counter = 0;

  5. void setup() {
  6.   Serial.begin(9600);
  7.   while (!Serial);

  8.   Serial.println("LoRa Sender");

  9.   if (!LoRa.begin(433E6)) {
  10.     Serial.println("Starting LoRa failed!");
  11.     while (1);
  12.   }

  13.   LoRa.setTxPower(20);
  14.   
  15. }

  16. void loop() {
  17.   Serial.print("Sending packet: ");
  18.   Serial.println(counter);

  19.   // send packet
  20.   LoRa.beginPacket();
  21.   LoRa.print("hello ");
  22.   LoRa.print(counter);
  23.   LoRa.endPacket();

  24.   counter++;

  25.   delay(5000);
  26. }



  27. LORA code for Receiver Side

  28. #include <SPI.h>
  29. #include <LoRa.h>

  30. void setup() {
  31.   Serial.begin(9600);
  32.   while (!Serial);

  33.   Serial.println("LoRa Receiver");

  34.   if (!LoRa.begin(433E6)) {
  35.     Serial.println("Starting LoRa failed!");
  36.     while (1);
  37.   }
  38. }

  39. void loop() {
  40.   // try to parse packet
  41.   int packetSize = LoRa.parsePacket();
  42.   if (packetSize) {
  43.     // received a packet
  44.     Serial.print("Received packet '");

  45.     // read packet
  46.     while (LoRa.available()) {
  47.       Serial.print((char)LoRa.read());
  48.     }

  49.     // print RSSI of packet
  50.     Serial.print("' with RSSI ");
  51.     Serial.println(LoRa.packetRssi());
  52.   }
  53. }
复制代码

回复

使用道具 举报

SOLO1
发表于: 2021-9-13 14:57:43 | 显示全部楼层

请问按照文章所示连线后,lora.begin函数初始化失败是什么原因
回复

使用道具 举报

风筝
发表于: 2021-9-13 16:23:05 | 显示全部楼层

SOLO1 发表于 2021-9-13 14:57
请问按照文章所示连线后,lora.begin函数初始化失败是什么原因

可以看下是否连接正确,以及设置的工作频率
回复

使用道具 举报

风筝
发表于: 2021-9-13 16:32:15 | 显示全部楼层

Begin
Initialize the library with the specified frequency.

LoRa.begin(frequency);
frequency - frequency in Hz (433E6, 868E6, 915E6)
Returns 1 on success, 0 on failure.

  // check version
  uint8_t version = readRegister(REG_VERSION);
  if (version != 0x12) {
    return 0;
  }
回复

使用道具 举报

SOLO1
发表于: 2021-9-15 10:58:37 | 显示全部楼层

好的,已经解决,我在LoRa.begin函数之前,先使用了LoRa.setFrequency函数设定了工作频率,谢谢!
回复

使用道具 举报

SOLO1
发表于: 2021-9-16 14:24:26 | 显示全部楼层

风筝 发表于 2021-9-13 16:23
可以看下是否连接正确,以及设置的工作频率

您好,再次打扰了,接线和工作频率均设置正确,我使用的是arduino uno,是否可能是arduino提供的3,3v电压不稳定,需要给LoRa模块外接一个电压转换电路呢
回复

使用道具 举报

风筝
发表于: 2021-9-16 14:58:41 | 显示全部楼层

SOLO1 发表于 2021-9-16 14:24
您好,再次打扰了,接线和工作频率均设置正确,我使用的是arduino uno,是否可能是arduino提供的3,3v电压 ...

一般Arduino提供的工作电流是足够的。可以使用外接电源测试,共地连接。
回复

使用道具 举报

SOLO1
发表于: 2021-9-17 09:39:01 | 显示全部楼层

好的,谢谢
回复

使用道具 举报

SOLO1
发表于: 7 天前 | 显示全部楼层

您好,这个问题一直没有解决,是否可以留个联系方式,以便交流
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 574 | 回复: 1152



手机版|

GMT+8, 2021-9-26 13:48 , Processed in 0.026479 second(s), 4 queries , MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2021 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表