- 所需材料
- 将Raspberry Pi与LoRa连接
- 将Arduino与LoRa连接
- Raspberry Pi的pyLoRa
- 配置Raspberry Pi for LoRa模块
- 为LoRa编程Raspberry Pi
- 用于LoRa的Arduino代码与Raspberry Pi进行通信
- 测试Raspberry Pi与Arduino之间的LoRa通信
随着物联网,互联汽车,M2M,工业4.0等的出现,LoRa越来越受欢迎。由于LoRa能够以非常少的功率与长距离通信,因此设计人员最好使用它从电池供电的Thing发送/接收数据。我们已经讨论了LoRa的基础知识以及如何在Arduino中使用LoRa。尽管该技术最初旨在用于LoRa节点与LoRa网关进行通信,但是在许多情况下,LoRa节点必须与另一个LoRa节点进行通信才能长距离交换信息。因此,在本教程中,我们将学习 如何将LoRa模块SX1278与Raspberry pi一起使用与另一个SX1278通讯,该SX1278连接到Arduino之类的微控制器。这种方法可以在许多地方派上用场,因为Arduino可以充当服务器来从传感器中获取数据,并通过LoRa远距离发送给Pi,然后充当客户端的Pi可以接收这些信息并将其上传到可以,因为它可以访问互联网。听起来很有趣吧?因此,让我们开始吧。
所需材料
- SX1278 433MHz LoRa模块– 2个
- 433MHz LoRa天线– 2个
- Arduino UNO-或其他版本
- 树莓派3
假定您的Raspberry Pi已经使用操作系统进行了刷新,并且能够连接到Internet。如果不是这样,请在继续之前遵循Raspberry Pi入门教程。在这里,我们使用的是 Rasbian Jessie安装的Raspberry Pi 3。
警告:始终将SX1278 LoRa模块与433 MHz天线一起使用;否则可能会损坏模块。
将Raspberry Pi与LoRa连接
在进入软件包之前,让我们准备好硬件。该 SX1278是16引脚 劳拉模块,使用于3.3V逻辑SPI连通。Raspberry pi也以3.3V逻辑电平运行,还具有内置SPI端口和3.3V稳压器。因此,我们可以直接将LoRa模块与Raspberry Pi连接。连接表如下所示树莓派 | Lora – SX1278模块 |
3.3伏 | 3.3伏 |
地面 | 地面 |
GPIO 10 | 摩西 |
GPIO 9 | 味噌 |
GPIO 11 | SCK |
GPIO 8 | Nss /启用 |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
您也可以使用下面的电路图作为参考。请注意,电路图是使用与SX1278模块非常相似的RFM9x模块创建的,因此下图中的外观可能有所不同。
连接非常简单,您可能要面对的唯一问题是SX1278不兼容面包板,因此您必须直接使用连接线进行连接或使用两个小面包板,如下所示。也很少有人建议使用单独的3.3V电源轨为LoRa模块供电,因为Pi可能无法提供足够的电流。但是,作为低功耗模块的Lora应该可以在Pi的3.3V电源轨上工作,我对其进行了测试,发现它可以正常工作。但是,还是要带一点盐。我的LoRa与Raspberry pi的连接设置如下所示
将Arduino与LoRa连接
Arduino模块的连接与我们先前教程中使用的连接相同。唯一的不同是,我们将使用基于Radio头的Rspreal库,而不是使用Sandeep Mistry的库,我们将在本项目的后面部分讨论。电路如下
同样,您可以使用Arduino Uno上的3.3V引脚或使用单独的3.3V稳压器。在这个项目中,我使用了板载稳压器。下面提供了引脚连接表,以帮助您轻松进行连接。
LoRa SX1278模块 | Arduino UNO板 |
3.3伏 | 3.3伏 |
nd | nd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
味噌 | D12 |
摩西 | D11 |
RST | D9 |
由于模块不适合面包板,因此我直接使用了连接线进行连接。建立连接后,Arduino LoRa设置如下所示
Raspberry Pi的pyLoRa
LoRa可使用许多python软件包。通常,Raspberry Pi也用作LoRaWAN,以从多个LoRa节点获取数据。但是,在此项目中,我们的目标是在两个Raspberry Pi模块之间或Raspberry Pi与Arduino之间进行点对点通信。因此,我决定使用pyLoRa包。它具有rpsreal LoRa Arduino和rpsreal LoRa Raspberry pi模块,可在Arduino和Raspberry Pi环境中使用。现在,让我们关注Raspberry Pi环境。
配置Raspberry Pi for LoRa模块
如前所述,LoRa模块可用于SPI通信,因此我们必须在Pi上启用SPI,然后安装 pylora 软件包。打开Pi的终端窗口后,请按照以下步骤进行操作。同样,我使用腻子连接到我的Pi,您可以使用方便的方法。
步骤1:使用以下命令 进入配置窗口。获取下面的窗口
须藤raspi-config
步骤2: 导航至接口选项并启用SPI,如下图所示。我们必须启用SPI接口,因为如前所述,LCD和PI通过SPI协议进行通信
步骤3:保存更改并返回到终端窗口。确保更新了pip和python,然后使用以下命令安装 RPi.GPIO 软件包。
pip安装RPi.GPIO
此类封装将帮助我们控制Pi上的GPIO引脚。如果安装成功,您的屏幕将如下所示
步骤4:同样,使用以下命令继续安装 spidev 软件包。Spidev是Linux的python绑定,可用于在Raspberry Pi上执行SPI通信。
点安装spidev
如果安装成功,则终端应如下所示。
步骤5:接下来,让我们使用以下pip命令安装pyLoRa软件包。该软件包将安装与LoRa相关的Radio模型。
点安装pyLoRa
如果安装成功,您将看到以下屏幕。
PyLoRa软件包还支持可与Arduino和Raspberry Pi无缝使用的加密通信。这样可以提高通信中的数据安全性。但是您必须在此步骤之后安装单独的软件包,因为加密不在本教程的范围之内,所以我不这样做。您可以按照上面的github链接获取更多详细信息。
之后,此步骤可以将包路径信息添加到pi,并尝试使用最后给出的python程序。但是我无法成功添加路径,因此不得不手动下载库并将其直接用于我的程序。所以我必须继续以下步骤
步骤6:使用以下命令下载并安装python-rpi.gpio软件包和spidev软件包。
sudo apt-get安装python-rpi.gpio python3-rpi.gpio sudo apt-get安装python-spidev python3-spidev
两次安装后,终端窗口应显示如下内容。
步骤7:还要安装git,然后用它来为Raspberry Pi克隆python目录。您可以使用以下命令进行操作。
sudo apt-get安装git sudo git clone
完成此步骤后,您应该在Raspberry Pi主文件夹中找到SX127x子目录。这将具有与库关联的所有必需文件。
为LoRa编程Raspberry Pi
在对等LoRa通信中,将传输信息的模块称为服务器,将接收信息的模块称为客户端。在大多数情况下,Arduino将在现场与传感器一起使用以测量数据,而Pi将用于接收这些数据。因此,在本教程中,我决定将Raspberry Pi用作客户端,并将Arduino用作服务器。在完整的树莓派客户端程序可以在这个页面的底部找到。在这里,我将尝试解释程序中的重要内容。
警告:请确保程序文件位于SX127x库文件夹所在的目录中。如果您要移植项目,则可以复制此文件夹并在任何地方使用它。
该程序非常简单,我们必须将LoRa模块设置为在433Mhz中工作,然后侦听传入的数据包。如果我们收到任何信息,我们可以简单地在控制台上打印它们。和往常一样,我们通过导入所需的python库开始程序。
从时间开始 从SX127x.LoRa 导入睡眠*从SX127x.board_config导入BOARD BOARD.setup()
在这种情况下,时间包用于创建延迟,Lora包用于LoRa通信,而 board_config 用于设置board和LoRa参数。我们还使用 BOARD.setup() 函数设置了评估板。
接下来,我们创建具有三个定义的python LoRa类。由于我们仅缩进以使程序作为树莓客户端工作,因此该类仅具有三个函数,即init类,start类和 on_rx_done 类。init类使用 set_pa_config 方法中设置的125kHz带宽以433MHz初始化LoRa模块。然后还将模块置于睡眠模式以节省功耗。
#初始化后的中等范围默认值为434.0MHz,Bw = 125 kHz,Cr = 4/5,Sf = 128chips / symbol,CRC on 13 dBm lora.set_pa_config(pa_select = 1) def __init __(self,verbose = False): 超级(LoRaRcvCont,self).__ init __(详细) self.set_mode(MODE.SLEEP) self.set_dio_mapping(* 6)
启动功能是我们将模块配置为接收器并获得RSSI(接收信号强度指示器),状态,工作频率等功能。我们将模块设置为从睡眠模式以连续接收器模式(RXCONT)工作,然后使用while循环读取诸如RSSI和调制解调器状态之类的值。我们还将串行缓冲区中的数据刷新到终端上。
def start(self): self.reset_ptr_rx() self.set_mode(MODE.RXCONT) 而True: sleep(.5) rssi_value = self.get_rssi_value() status = self.get_modem_status() sys.stdout.flush()
最后,在读取传入的数据包之后,将执行 on_rx_done 函数。在此功能中,将接收标志设置为高后,将接收到的值从Rx缓冲区移入称为有效负载的变量。然后,使用utf-8对接收到的值进行解码,以在外壳上打印用户可读数据。我们还将模块重新置于睡眠模式,直到收到另一个值。
def on_rx_done(self): print(“ \ nReceived:”) self.clear_irq_flags(RxDone = 1) 有效载荷= self.read_payload(nocheck = True) print(bytes(payload).decode(“ utf-8”,'ignore' )) self.set_mode(MODE.SLEEP) self.reset_ptr_rx() self.set_mode(MODE.RXCONT)
程序的其余部分只是在控制台上打印接收到的值,并使用键盘中断来终止程序。即使程序终止后,我们仍将板子设置为睡眠模式,以节省功耗。
试试:lora.start(),除了KeyboardInterrupt:sys.stdout.flush()print(“”)sys.stderr.write(“ KeyboardInterrupt \ n”)最后:sys.stdout.flush()print(“”)lora。 set_mode(MODE.SLEEP)BOARD.teardown()
用于LoRa的Arduino代码与Raspberry Pi进行通信
如前所述, rpsreal 代码同时支持Arduino和Pi,因此Arduino和Pi之间的通信是可能的。它基于AirSpayce的Radiohead库工作。因此,您必须首先将无线电头库安装到Arduino IDE。
为此,请访问Github页面并下载ZIP文件夹中的库。然后将其放在Arduino IDE的库文件夹中。现在,重新启动Arduino IDE,您将找到Radio head库的示例文件。在这里,我们将Arduino编程为充当LoRa服务器,以发送0到9之类的测试数据包。可以像通常一样在此页面的底部找到完成此操作的完整代码。在这里,我将解释程序中的一些重要内容。
我们首先通过导入SPI库(默认情况下已安装)以使用SPI协议,然后从Radio head导入RH_RF95库以执行LoRa通信来开始程序。然后,我们定义将LoRa的芯片选择(CS),复位(RST)和中断(INT)引脚与Arduino连接到Arduino的哪个引脚。最后,我们还定义了该模块应在434MHz频率下工作并初始化LoRa模块。
#包括
在 设置 功能内,我们将LoRa模块的复位引脚拉至低电平10毫秒,以重新启动,从而复位LoRa模块。然后,使用我们之前使用Radio head库创建的模块将其初始化。然后,我们为LoRa服务器设置频率和传输功率。传输距离越高,您的数据包将传播的距离越远,但会消耗更多的功率。
void setup() { //初始化串行监视器 Serial.begin(9600); //重置LoRa模块 pinMode(RFM95_RST,OUTPUT); digitalWrite(RFM95_RST,LOW); 延迟(10); digitalWrite(RFM95_RST,HIGH); 延迟(10); // 在(!rf95.init()){ Serial.println(“ LoRa无线电初始化失败”)时 初始化LoRa模块。而(1); } // 如果(!rf95.setFrequency(RF95_FREQ)){ Serial.println(“ setFrequency failed”); 设置默认频率为434.0MHz 。而(1); } rf95.setTxPower(18); // Lora模块的传输功率 }
在无限 循环 功能内部,我们只需要通过LoRa模块发送数据包。该数据可以是任何用户命令的传感器值。但是为简单起见,我们将每隔1秒发送一次char值0到9,然后在达到9后将其初始化为0。请注意,这些值只能以char数组格式发送,数据类型应为unit8_t一次为1个字节。相同的代码如下所示
void loop() { Serial.print(“ Send:”); char radiopacket = char(value)}; rf95.send(((uint8_t *)radiopacket,1); 延迟(1000); 价值++; 如果(值>'9') 值= 48; }
测试Raspberry Pi与Arduino之间的LoRa通信
现在,我们已经准备好硬件和程序,我们只需要将Arduino代码上传到UNO板上,并且应该在pi上启动python草图。连接了两个硬件的测试设置如下所示
在Pi上启动python客户端素描后(仅使用python 3),如果一切正常,您应该会通过shell窗口看到在pi中收到的Arduino数据包。您应注意“ Received:0”到9,如下图所示。
可以从此处下载完整的Raspberry pi代码以及所有必需的库。
您现在可以移动Arduino服务器并检查模块范围;如果需要,也可以在外壳上显示RSSI值。您可以在下面的视频中找到该项目的完整工作。现在,我们知道了如何在Arduino和Raspberry pi之间建立长距离低功耗LoRa通信,我们可以继续在Arduino一侧添加传感器,在Pi一侧添加云平台以制作完整的IoT程序包。
希望您理解该项目并喜欢构建它。如果您无法正常使用,请使用下面的评论部分或其他技术需求的论坛。