风筝
发表于: 2019-5-22 10:22:10 | 显示全部楼层

随着物联网、互联汽车、M2M、工业4.0等的出现,LoRa越来越受欢迎。由于其能够以非常低的功率进行长距离通信,因此它非常适合设计人员用于发送/接收来自电池供电的数据。我们已经讨论了LoRa的基础知识以及如何在Arduino中使用LoRa。尽管该技术最初旨在使LoRa节点与LoRa网关通信,但是在许多情况下,LoRa节点必须与另一个LoRa节点通信以长距离交换信息。


因此,在本篇文章中,我们将学习如何使用树莓派Raspberry的LoRa模块SX1278与连接到Arduino微控制器的另一个SX1278进行通信。这种方法在很多地方都可以派上用场,因为Arduino可以作为服务器从传感器获取数据并通过LoRa远程发送到树莓派,然后作为客户端的树莓派可以接收这些信息并将其上传到云平台,因为它可以访问互联网。听起来很有意思吧?那么,让我们开始吧。


所需的材料

●    SX1278 433MHz LoRa模块

●    433MHz LoRa天线

●    Arduino UNO开发板

●    树莓派3

注意:始终使用带有433 MHz天线的SX1278 LoRa模块;否则模块可能会损坏。


连接Raspberry Pi与LoRa

在我们开始编写软件之前,让我们先准备好硬件。 SX1278是一款16引脚Lora模块,可通过SPI进行通信。 Raspberry pi还支持3.3V逻辑电平,并具有内置SPI端口和3.3V稳压器。所以我们可以直接将LoRa模块与Raspberry Pi连接起来。连接表如下所示

树莓派
SX1278模块
3.3V
3.3V
Ground
Ground
GPIO 10
MOSI
GPIO 9
MISO
GPIO 11
SCK
GPIO 8
Nss / Enable
GPIO 4
DIO 0
GPIO 17
DIO 1
GPIO 18
DIO 2
GPIO 27
DIO 3
GPIO 22
RST

您也可以使用下面的电路图作为参考。请注意,电路图是使用RFM9x模块创建的,与SX1278模块非常相似,因此下图中的外观可能不同。

Circuit-Diagram-for-Connecting-Raspberry-Pi-with-LoRa.png


连接非常简单,唯一您可能遇到的问题是SX1278模块不兼容面包板,因此您必须直接使用连接线进行连接或使用两个小型面包板,如下所示。此外,很少有人建议使用单独的3.3V电源为LoRa模块供电,因为树莓派可能无法提供足够的电流。然而,作为低功率模块的Lora应该在Pi的3.3V上工作,我测试了它并发现它没有任何问题。但是,仍然需要一点点注意。树莓派与LoRa模块的实际连接设置如下所示

Circuit-Hardware-for-Connecting-Raspberry-Pi-with-LoRa.png


将Arduino与LoRa连接起来

Arduino模块的连接与我们之前教程中使用的连接一样。唯一的区别是没有使用Sandeep Mistry的库,我们将使用基于Radio head的Rspreal库,我们将在本项目的后面讨论。电路如下

Circuit-Diagram-for-Connecting-Arduino-with-LoRa.png


您可以再次使用Arduino Uno上的3.3V引脚或使用单独的3.3V稳压器。在这个项目中,我使用了板载稳压器。下面给出了引脚连接表,以帮助您轻松建立连接。

LoRa SX1278模块
Arduino UNO开发板
3.3V
3.3V
En/Nss
D10
G0 / DIO0
D2
SCK
D13
MISO
D12
MOSI
D11
RST
D9

由于模块不适合面包板,我直接使用连接线进行连接。连接建立完成后,Arduino LoRa设置将如下所示

Circuit-Hardware-for-Connecting-Arduino-with-LoRa.png


用于Raspberry Pi的pyLoRa

有许多python包可以与LoRa一起使用。通常,Raspberry Pi用作LoRaWAN以从多个LoRa节点获取数据。但是,在本文中,我们的目标是在两个Raspberry Pi模块之间或Raspberry Pi和Arduino之间进行点对点通信。所以,我决定使用pyLoRa包。它有一个rpsreal LoRa Arduinorpsreal LoRa Raspberry pi模块,可用于Arduino和Raspberry Pi环境。现在,让我们关注Raspberry Pi环境。


为LoRa模块配置Raspberry Pi

如前所述,LoRa模块使用SPI通信,因此我们必须在树莓派上启用SPI,然后安装pylora软件包。打开Pi的终端窗口后,按照以下步骤执行相同操作。再次,我使用putty连接到树莓派,你可以使用方便的方法。


第1步:使用以下命令进入配置窗口。要获得以下窗口,使用以下指令:

  1. sudo raspi-config
复制代码

Configure-Pi-for-LCD.png


Change-Login-Configuration-in-Pi.png


第2步:导航到接口选项并启用SPI,如下图所示。我们必须启用SPI接口,因为我们讨论过LCD和PI通过SPI协议进行通信

Enabling-SPI-Interface-In-Raspberry-Pi-for-Lora.png


第3步:保存更改并返回终端窗口。确保更新了pip和python,然后使用以下命令安装RPi.GPIO程序包。

  1. pip install RPi.GPIO
复制代码

该封装类将帮助我们控制Pi上的GPIO引脚。如果安装成功,界面将如下所示

Installig-GPIO-Package-in-Pi-for-Lora.png


第4步:类似地继续使用以下命令安装spidev包。 Spidev是Linux的python绑定,可用于在Raspberry Pi上执行SPI通信。

  1. pip install spidev
复制代码

如果安装成功,终端应如下所示。

Installing-SPIDEV-Package-in-Pi-for-Lora.png


第5步:接下来让我们使用以下pip命令安装pyLoRa包。该软件包安装与LoRa关联的Radio模型。

  1. pip install pyLoRa
复制代码

如果安装成功,您将看到以下界面。

Installing-PyLora-Package-in-Pi-for-Lora.png


PyLoRa软件包还支持加密通信,可以无缝地与Arduino和Raspberry Pi一起使用。这将改善您的通信中的数据安全性。但是你必须在这一步之后安装单独的包,我没有这样做,因为加密不在本文的范围内。您可以按照上面的github链接获取更多详细信息。


之后,在此步骤中,您可以将包路径信息添加到pi,并尝试使用最后给出的python程序。但我无法成功添加路径,因此必须手动下载库并直接使用相同的程序。所以我不得不继续以下步骤


第6步:使用以下命令下载并安装python-rpi.gpio包和spidev包。

  1. sudo apt-get install python-rpi.gpio python3-rpi.gpio
  2. sudo apt-get install python-spidev python3-spidev
复制代码

在两次安装之后,终端窗口应该显示类似的内容。

Installed-GPIO-Package-in-Pi-for-Lora.png


Installed-SPIDEV-Package-in-Pi-for-Lora.png


第7步:还要安装git,然后用它来克隆我们的Raspberry Pi的python目录。您可以使用以下命令执行此操作。

  1. sudo apt-get install git
  2. sudo git clone https://github.com/rpsreal/pySX127x
复制代码

Installing-git-in-Pi-for-Lora.png

完成此步骤后,您应在Raspberry Pi主文件夹中找到SX127x子目录。这将包含与库关联的所有必需文件。

跳转到指定楼层
风筝
发表于: 2019-5-22 10:39:52 | 显示全部楼层

编程Raspberry Pi for LoRa

在点对点LoRa通信中,发送信息的模块称为服务器,并且接收该信息的模块被称为客户端。在大多数情况下,Arduino将在现场使用传感器来测量数据,Pi将用于接收这些数据。因此,我决定在文中将Raspberry Pi用作客户端,将Arduino用作服务器。完整的Raspberry Pi客户端程序可以在本页底部找到。在这里,我将尝试解释程序中的重要部分。


小心:确保程序文件与SX127x库文件夹所在的目录相同。如果要移植项目,可以复制此文件夹并在任何地方使用它。


该程序非常简单,我们必须将LoRa模块设置为433Mhz,然后监听传入的数据包。如果我们收到任何东西,我们就可以在控制台上打印它我们一如既往地通过导入所需的python库来开始程序。

  1. from time import sleep
  2. from SX127x.LoRa import *
  3. from SX127x.board_config import BOARD
  4. BOARD.setup()
复制代码

本例中,时间包用于创建延迟,Lora包用于LoRa通信,board_config用于设置板和LoRa参数。我们还使用BOARD.setup()函数设置了电路板。


接下来,我们创建具有三个定义的python LoRa类。由于我们只是缩进使程序作为raspberry客户端工作,因此该类只有三个函数,即init类、start类和on_rx_done类。 init类在433MHz中初始化LoRa模块,带宽为125kHz,如set_pa_config方法中所设置的。然后它还将模块置于睡眠模式以节省功耗。

  1. #  Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm
  2. lora.set_pa_config(pa_select=1)

  3.     def __init__(self, verbose=False):
  4.         super(LoRaRcvCont, self).__init__(verbose)
  5.         self.set_mode(MODE.SLEEP)
  6.         self.set_dio_mapping([0] * 6)
复制代码

start函数是我们将模块配置为接收器并获得类似RSSI(接收信号强度指示器)、状态、工作频率等。我们将模块设置为从睡眠模式工作在连续接收器模式(RXCONT),然后使用while循环读取RSSI和调制解调器状态等值。我们还将串行缓冲区中的数据刷新到终端上。

  1.    def start(self):
  2.         self.reset_ptr_rx()
  3.         self.set_mode(MODE.RXCONT)
  4.         while True:
  5.             sleep(.5)
  6.             rssi_value = self.get_rssi_value()
  7.             status = self.get_modem_status()
  8.             sys.stdout.flush()
复制代码

最后,在读取传入数据包后执行on_rx_done函数。在此函数中,在将接收标志设置为高电平后,将接收到的值移入Rx缓冲区中称为有效负载的变量中。然后用utf-8解码接收的值,以在shell上打印用户可读数据。我们还将模块重新置于睡眠模式,直到收到另一个值。

  1. def on_rx_done(self):
  2.         print("\nReceived: ")
  3.         self.clear_irq_flags(RxDone=1)
  4.         payload = self.read_payload(nocheck=True)
  5.         print(bytes(payload).decode("utf-8",'ignore'))
  6.         self.set_mode(MODE.SLEEP)
  7.         self.reset_ptr_rx()
  8.         self.set_mode(MODE.RXCONT)
复制代码

程序的其余部分只是在控制台上打印接收到的值,并使用键盘中断终止程序。即使在程序终止后我们再次将电路板设置为睡眠模式以节省电量。

  1. try:
  2.     lora.start()
  3. except KeyboardInterrupt:
  4.     sys.stdout.flush()
  5.     print("")
  6.     sys.stderr.write("KeyboardInterrupt\n")
  7. finally:
  8.     sys.stdout.flush()
  9.     print("")
  10.     lora.set_mode(MODE.SLEEP)
  11.     BOARD.teardown()
复制代码

用于与Raspberry Pi通信的LoRa的Arduino代码

正如我之前提到的,rpsreal代码同时支持Arduino和Pi,因此Arduino和Pi之间的通信是可能的。它的工作原理基于AirSpayce的Radiohead库。因此,您必须先将 radio head库安装到​​Arduino IDE中。


为此,请访问Github页面并在ZIP文件夹中下载该库。然后将它放在Arduino IDE的库文件夹中。现在,重新启动Arduino IDE,您将找到Radio head library的示例文件。在这里,我们将编程Arduino作为LoRa服务器来发送测试数据包,如0到9.完成相同的代码可以一如既往地在本页底部找到。在这里,我将解释该计划中的几个重要方面。


我们通过导入SPI库(默认安装)来启动程序,以使用SPI协议,然后通过Radio head的RH_RF95库来执行LoRa通信。然后我们定义了Arduino的哪个引脚,我们已经将LoRa的片选(CS)、复位(RST)和中断(INT)引脚与Arduino相连。最后,我们还定义模块应在434MHz频率下工作并初始化LoRa模块。

  1. #include <SPI.h> //Import SPI librarey
  2. #include <RH_RF95.h> // RF95 from RadioHead Librarey

  3. #define RFM95_CS 10 //CS if Lora connected to pin 10
  4. #define RFM95_RST 9 //RST of Lora connected to pin 9
  5. #define RFM95_INT 2 //INT of Lora connected to pin 2

  6. // Change to 434.0 or other frequency, must match RX's freq!
  7. #define RF95_FREQ 434.0

  8. // Singleton instance of the radio driver
  9. RH_RF95 rf95(RFM95_CS, RFM95_INT);
复制代码

在setup函数内部,我们将通过将其复位引脚拉低至10毫秒来重新启动LoRa模块。然后我们使用我们之前使用Radio head库创建的模块初始化它。然后,我们设置LoRa服务器的频率和传输功率。传输距离越高,数据包传输距离越远,但功耗越大。

  1. void setup()
  2. {
  3. //Initialize Serial Monitor
  4.   Serial.begin(9600);

  5. // Reset LoRa Module
  6.   pinMode(RFM95_RST, OUTPUT);
  7.   digitalWrite(RFM95_RST, LOW);
  8.   delay(10);
  9.   digitalWrite(RFM95_RST, HIGH);
  10.   delay(10);

  11. //Initialize LoRa Module
  12.   while (!rf95.init()) {
  13.     Serial.println("LoRa radio init failed");
  14.     while (1);
  15.   }


  16. //Set the default frequency 434.0MHz

  17.   if (!rf95.setFrequency(RF95_FREQ)) {
  18.     Serial.println("setFrequency failed");
  19.     while (1);
  20.   }
  21.   rf95.setTxPower(18); //Transmission power of the Lora Module
  22. }
复制代码

在loop函数内部,我们只需通过LoRa模块发送数据包。该数据可以是用户命令的传感器值。但为了简单起见,我们将每1秒间隔发送char值0到9,然后在达到9后将值初始化为0.注意,值只能以char数组格式发送,数据类型应为unit8_t一次是1个字节。执行相同操作的代码如下所示

  1. void loop()
  2. {
  3.   Serial.print("Send: ");
  4.   char radiopacket[1] = char(value)};
  5.   rf95.send((uint8_t *)radiopacket, 1);

  6.   delay(1000);
  7.   value++;
  8.   if (value > '9')
  9.   value = 48;
  10. }
复制代码

测试Raspberry Pi和Arduino之间的LoRa通信

现在,我们已经准备好了硬件和程序,我们只需要将Arduino代码上传到UNO开发板,并且应该在pi上启动python草图。我连接硬件的测试设置如下所示

Testing-LoRa-Communication-between-Raspberry-Pi-and-Arduino.jpg

一旦在Pi上启动python客户端草图(仅使用python 3),如果一切正常,你应该看到通过shell窗口在pi中收到的Arduino数据包。你应该注意到“Received: 0”到9,如下图所示。

LoRa-Communication-between-Raspberry-Pi-and-Arduino.jpg


您现在可以移动Arduino服务器并检查模块的范围;如果需要,还可以在shell上显示RSSI值。现在,我们知道如何在Arduino和Raspberry pi之间建立长距离低功耗LoRa通信,我们可以继续在Pi端的Arduino侧和云平台上添加传感器,以制作完整的物联网包。


希望您了解该项目并享受搭建过程。如果您在使用它时遇到问题,请在本帖下面进行回复。


代码

本文使用的完整代码如下: Raspberry-pi-lora-code.zip (50.56 KB, 下载次数: 60)

main.rar (1.35 KB, 下载次数: 45)

回复

使用道具 举报

INZHAGY
发表于: 2019-11-14 13:10:41 | 显示全部楼层

DIO0 到DIO3一定都要接到树莓派上吗
回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-18 13:04 , Processed in 0.150070 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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