设计人员使用许多无线通信系统,例如低功耗蓝牙(BLE 4.0),Zigbee,ESP8266 Wi-Fi模块,433MHz RF模块,Lora,nRF等。介质的选择取决于其使用的应用程序类型。总而言之,nRF24L01是一种用于局域网通信的流行无线介质。这些模块在2.4GHz(ISM频段)上运行,波特率从250Kbps到2Mbps,在许多国家/地区都是合法的,可用于工业和医疗应用。还要求使用适当的天线,这些模块之间可以发送和接收长达100米的信号。我们之前使用nRF24L01和Arduino来控制伺服电机并创建聊天室。
在这里,我们将使用带有Arduino UNO和Raspberry Pi的nRF24L01 – 2.4GHz RF收发器模块在它们之间建立无线通信。Raspberry pi将充当发送器,而Arduino Uno将收听Raspberry Pi,并在16x2 LCD上使用nRF24L01打印Raspberry Pi发送的消息。nRF24L01还具有内置的BLE功能,它也可以使用BLE无线通信。
本教程分为两个部分。第一部分将包括nRF24L01与Arduino的接口以充当接收器,第二部分将包括nRF24L01与Raspberry Pi的接口以充当发送器。本教程末尾均附有包含工作视频的本节的完整代码。
nRF24L01射频模块
的 nRF24L01的模块 是 收发器模块,这意味着每个模块可以同时发送和接收数据,但由于它们是半双工它们可以发送或同时接收数据。该模块具有来自北欧半导体的通用nRF24L01 IC,负责数据的发送和接收。该IC使用SPI协议进行通信,因此可以轻松地与任何微控制器接口。由于库很容易获得,因此使用Arduino变得容易得多。标准nRF24L01模块的 引脚排列 如下所示
该模块的工作电压范围为1.9V至3.6V(通常为3.3V),在正常操作期间仅消耗12mA的电流,这使其具有电池效率,因此甚至可以在纽扣电池上运行。即使工作电压为3.3V,大多数引脚还是可以承受5V电压,因此可以直接与Arduino等5V微控制器接口。使用这些模块的另一个优点是,每个模块都有6条管道。这意味着,每个模块可以与其他6个模块通信以发送或接收数据。这使该模块适合在IoT应用程序中创建星形或网状网络。而且它们具有125个唯一ID的宽地址范围,因此在封闭区域中,我们可以使用125个这些模块而不会互相干扰。
电路原理图
带有Arduino的nRF24L01:
用于将nRF24L01与Arduino连接的电路图很简单,并且没有太多的组件。该NRF24L01将由SPI接口连接和16×2 LCD被接口与仅使用两根导线I2C协议。
具有Raspberry Pi的nRF24L01:
将nRF24L01与Raspberry Pi连接的电路图也非常简单,仅使用SPI接口连接Raspberry Pi和nRF24l01。
编程Raspberry Pi使用nRF24l01发送消息
Raspberry Pi的编程将使用Python3完成。您也可以将C / C ++用作Arduino。但是已经有一个可用于python中的nRF24l01的库,可以从github页面下载。请注意,python程序和库应位于同一文件夹中,否则python程序将无法找到该库。下载库后,只需解压缩并创建一个文件夹,即可存储所有程序和库文件。库安装完成后,只需开始编写程序。该程序从包含库开始,这些库将在代码中使用,例如导入GPIO库,用于访问Raspberry Pi GPIO和 导入时间 用于访问与时间相关的功能。如果您不熟悉Raspberry Pi,则可以回过头来学习Raspberry pi。
进口RPi.GPIO作为GPIO 进口时间 进口spidev 从lib_nrf24进口NRF24
在“ Broadcom SOC通道”中 设置GPIO模式 。 这意味着您通过“ Broadcom SOC通道”编号指代引脚,这些是“ GPIO”之后的编号(例如GPIO01,GPIO02…)。这些不是委员会编号。
GPIO.setmode(GPIO.BCM)
接下来,我们将其设置为管道地址。为了与Arduino接收器通信,此地址很重要。地址将在十六进制代码中。
管道=,]
使用GPIO08作为CE和GPIO25作为CSN引脚开始无线电。
radio.begin(0,25)
将有效负载大小设置为32位,通道地址设置为76,数据速率为1 mbps,功率电平为最小值。
radio.setPayloadSize(32) radio.setChannel(0x76) radio.setDataRate(NRF24.BR_1MBPS) radio.setPALevel(NRF24.PA_MIN)
打开管道以开始写入数据并打印nRF24l01的基本详细信息。
radio.openWritingPipe(管道) radio.printDetails()
准备字符串形式的消息。该消息将发送到Arduino UNO。
sendMessage = list(“ Hi..Arduino UNO”), 而len(sendMessage)<32: sendMessage.append(0)
开始写入收音机,并继续写入完整的字符串,直到收音机可用为止。随它一起,记下时间并打印消息传递的调试语句。
而True: start = time.time() radio.write(sendMessage) print(“发送消息:{}”。format(sendMessage)) 发送 radio.startListening()
如果字符串已完成并且管道已关闭,则打印一条调试消息,提示超时。
同时不radio.available(0): time.sleep(1/100) 如果了time.time() -开始> 2: 打印( “超时”。)#打印错误消息,如果无线电断开连接或不能正常工作了 破
停止收听广播并关闭通讯,并在3秒钟后重新开始通讯以发送另一条消息。
radio.stopListening()#关闭广播time.sleep( 3)#延迟3秒
如果您了解python的基础知识,那么Raspberry程序很容易理解。本教程末尾提供了完整的Python程序。
在Raspberry Pi中执行Python程序:
执行以下步骤后,很容易执行程序:
- 将Python程序和库文件保存在同一文件夹中。
- 我的Sender程序文件名为 nrfsend.py ,而且每个文件都位于同一文件夹中
- 转到Raspberry Pi的命令终端。然后使用“ cd”命令找到python程序文件。
- 然后打开文件夹并编写命令“ sudo python3 your_program.py ”,然后按Enter。您将能够看到nRf24的基本详细信息,并且收音机将每隔3秒开始发送消息。发送完所有字符后,将显示调试消息。
现在,我们将在Arduino UNO中看到与接收器相同的程序。
编程Arduino UNO以使用nRF24l01接收消息
对Arduino UNO进行编程类似于对Raspberry Pi进行编程。我们将遵循类似的方法,但是使用不同的编程语言和步骤。这些步骤将包括nRF24l01的读取部分。可以从github页面下载Arduino的nRF24l01库。首先包括必要的库。我们使用的是使用I2C Shield的16x2 LCD,因此包含 Wire.h 库,并且nRF24l01与SPI接口,因此包含SPI库。
#包括
包括RF24和LCD库,用于访问RF24和LCD功能。
#包括
I2C的LCD地址是27,它是16x2 LCD,因此请将其写入函数中。
LiquidCrystal_I2C lcd(0x27,16,2);
RF24与标准SPI引脚以及引脚9的CE和引脚10的CSN连接。
RF24收音机(9,10);
启动无线电,将功率级别设置为76,然后将管道地址设置为与Raspberry Pi相同,然后打开管道进行读取。
radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.setChannel(0x76); const uint64_t pipe = 0xE0E0F1F1E0LL; radio.openReadingPipe(1,管道);
开始I2C通讯并初始化LCD显示屏。
Wire.begin(); lcd.begin(); lcd.home(); lcd.print(“准备接收”);
开始收听广播中的传入消息,并将消息长度设置为32字节。
radio.startListening(); char receiveMessage = {0}
如果连接了收音机,则开始阅读信息并保存。将消息打印到串行监视器,然后打印到显示器,直到下一条消息到达为止。间隔一段时间后,停止收音机收听并重试。这是10微秒。
如果(radio.available()){ radio.read(receivedMessage,sizeof(receivedMessage)); Serial.println(receivedMessage); Serial.println(“关闭无线电。”); radio.stopListening(); 字符串stringMessage(receivedMessage); lcd.clear(); 延迟(1000); lcd.print(stringMessage); }
将最后给出的完整代码上传到Arduino UNO,并等待消息被接收。
至此,完成了使用Raspberry Pi和nRf24l01发送消息并使用Arduino UNO和nRF24l01接收消息的完整教程。该消息将被打印到16x2 LCD上。管道地址在Arduino UNO和Raspberry Pi中都非常重要。如果您在执行此项目时遇到任何困难,请在下面发表评论或访问论坛进行更详细的讨论。
另请查看下面的演示视频。