编程Raspberry Pi for LoRa 在点对点LoRa通信中,发送信息的模块称为服务器,并且接收该信息的模块被称为客户端。在大多数情况下,Arduino将在现场使用传感器来测量数据,Pi将用于接收这些数据。因此,我决定在文中将Raspberry Pi用作客户端,将Arduino用作服务器。完整的Raspberry Pi客户端程序可以在本页底部找到。在这里,我将尝试解释程序中的重要部分。
小心:确保程序文件与SX127x库文件夹所在的目录相同。如果要移植项目,可以复制此文件夹并在任何地方使用它。
该程序非常简单,我们必须将LoRa模块设置为433Mhz,然后监听传入的数据包。如果我们收到任何东西,我们就可以在控制台上打印它我们一如既往地通过导入所需的python库来开始程序。 - from time import sleep
- from SX127x.LoRa import *
- from SX127x.board_config import BOARD
- BOARD.setup()
复制代码
本例中,时间包用于创建延迟,Lora包用于LoRa通信,board_config用于设置板和LoRa参数。我们还使用BOARD.setup()函数设置了电路板。
接下来,我们创建具有三个定义的python LoRa类。由于我们只是缩进使程序作为raspberry客户端工作,因此该类只有三个函数,即init类、start类和on_rx_done类。 init类在433MHz中初始化LoRa模块,带宽为125kHz,如set_pa_config方法中所设置的。然后它还将模块置于睡眠模式以节省功耗。 - # Medium Range Defaults after init are 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):
- super(LoRaRcvCont, self).__init__(verbose)
- self.set_mode(MODE.SLEEP)
- self.set_dio_mapping([0] * 6)
复制代码
start函数是我们将模块配置为接收器并获得类似RSSI(接收信号强度指示器)、状态、工作频率等。我们将模块设置为从睡眠模式工作在连续接收器模式(RXCONT),然后使用while循环读取RSSI和调制解调器状态等值。我们还将串行缓冲区中的数据刷新到终端上。 - def start(self):
- self.reset_ptr_rx()
- self.set_mode(MODE.RXCONT)
- while True:
- sleep(.5)
- rssi_value = self.get_rssi_value()
- status = self.get_modem_status()
- sys.stdout.flush()
复制代码
最后,在读取传入数据包后执行on_rx_done函数。在此函数中,在将接收标志设置为高电平后,将接收到的值移入Rx缓冲区中称为有效负载的变量中。然后用utf-8解码接收的值,以在shell上打印用户可读数据。我们还将模块重新置于睡眠模式,直到收到另一个值。 - def on_rx_done(self):
- print("\nReceived: ")
- self.clear_irq_flags(RxDone=1)
- payload = 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)
复制代码
程序的其余部分只是在控制台上打印接收到的值,并使用键盘中断终止程序。即使在程序终止后我们再次将电路板设置为睡眠模式以节省电量。 - try:
- lora.start()
- except KeyboardInterrupt:
- sys.stdout.flush()
- print("")
- sys.stderr.write("KeyboardInterrupt\n")
- finally:
- sys.stdout.flush()
- print("")
- lora.set_mode(MODE.SLEEP)
- 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模块。 - #include <SPI.h> //Import SPI librarey
- #include <RH_RF95.h> // RF95 from RadioHead Librarey
- #define RFM95_CS 10 //CS if Lora connected to pin 10
- #define RFM95_RST 9 //RST of Lora connected to pin 9
- #define RFM95_INT 2 //INT of Lora connected to pin 2
- // Change to 434.0 or other frequency, must match RX's freq!
- #define RF95_FREQ 434.0
- // Singleton instance of the radio driver
- RH_RF95 rf95(RFM95_CS, RFM95_INT);
复制代码
在setup函数内部,我们将通过将其复位引脚拉低至10毫秒来重新启动LoRa模块。然后我们使用我们之前使用Radio head库创建的模块初始化它。然后,我们设置LoRa服务器的频率和传输功率。传输距离越高,数据包传输距离越远,但功耗越大。 - void setup()
- {
- //Initialize Serial Monitor
- Serial.begin(9600);
- // Reset LoRa Module
- pinMode(RFM95_RST, OUTPUT);
- digitalWrite(RFM95_RST, LOW);
- delay(10);
- digitalWrite(RFM95_RST, HIGH);
- delay(10);
- //Initialize LoRa Module
- while (!rf95.init()) {
- Serial.println("LoRa radio init failed");
- while (1);
- }
- //Set the default frequency 434.0MHz
- if (!rf95.setFrequency(RF95_FREQ)) {
- Serial.println("setFrequency failed");
- while (1);
- }
- rf95.setTxPower(18); //Transmission power of the Lora Module
- }
复制代码
在loop函数内部,我们只需通过LoRa模块发送数据包。该数据可以是用户命令的传感器值。但为了简单起见,我们将每1秒间隔发送char值0到9,然后在达到9后将值初始化为0.注意,值只能以char数组格式发送,数据类型应为unit8_t一次是1个字节。执行相同操作的代码如下所示 - void loop()
- {
- Serial.print("Send: ");
- char radiopacket[1] = char(value)};
- rf95.send((uint8_t *)radiopacket, 1);
- delay(1000);
- value++;
- if (value > '9')
- value = 48;
- }
复制代码
测试Raspberry Pi和Arduino之间的LoRa通信 现在,我们已经准备好了硬件和程序,我们只需要将Arduino代码上传到UNO开发板,并且应该在pi上启动python草图。我连接硬件的测试设置如下所示
一旦在Pi上启动python客户端草图(仅使用python 3),如果一切正常,你应该看到通过shell窗口在pi中收到的Arduino数据包。你应该注意到“Received: 0”到9,如下图所示。
您现在可以移动Arduino服务器并检查模块的范围;如果需要,还可以在shell上显示RSSI值。现在,我们知道如何在Arduino和Raspberry pi之间建立长距离低功耗LoRa通信,我们可以继续在Pi端的Arduino侧和云平台上添加传感器,以制作完整的物联网包。
希望您了解该项目并享受搭建过程。如果您在使用它时遇到问题,请在本帖下面进行回复。
代码 本文使用的完整代码如下:
Raspberry-pi-lora-code.zip
(50.56 KB, 下载次数: 58)
main.rar
(1.35 KB, 下载次数: 43)
|