|
尽管物联网(IoT)、工业4.0、机器到机器通信(M2M)等越来越受欢迎,但无线通信的需求已成为现实,越来越多的机器/设备在云上相互通信。设计人员使用更多的无线通信系统,如蓝牙低功耗(BLE 4.0)、Zigbee、ESP43 Wi-Fi模块、433MHz射频模块、Lora、nRF等,媒介的选择取决于其使用的应用类型。
其中,一种用于本地网络通信的流行无线媒介是nRF24L01。这些模块工作在2.4GHz(ISM频段),波特率从250Kbps到2Mbps,这在许多国家是合法的,并且可用于工业和医疗应用。它还声称,通过适当的天线,这些模块可以发送和接收最远100米的相互距离。是不是很有趣!!?因此,在本篇文章中,我们将详细了解有关这些nRF24l01模块的信息,以及如何将其与Arduino等微控制器平台进行连接。我们还将在使用此模块时分享一些常见问题的解决方案。
了解nRF24L01射频模块 nRF24L01模块是收发器模块,这表示每个模块都可以发送和接收数据,但由于它们是半双工的,因此它们可以在一个时间内发送或接收数据。该模块使用北欧半导体Nordic公司的通用芯片nRF24L01,负责数据的传输和接收。 该芯片使用SPI协议进行通信,因此可以轻松与任何微控制器连接。可以轻松实现与Arduino开发板的链接,因为这些库很容易获得。标准nRF24L01模块的引脚分布如下所示
该模块的工作电压为1.9V至3.6V(通常为3.3V),在正常工作期间仅消耗12mA的电流,这使其具有电池效率,因此甚至可以在纽扣电池上运行。即使工作电压为3.3V,大多数引脚都容忍5V,因此可以直接与Arduino等5V微控制器连接。使用这些模块的另一个优点是,每个模块有6个管道。意思是,每个模块可以与其他6个模块通信以传输或接收数据。这使得该模块适用于在物联网应用中创建星形或网状网络。它们还具有125个唯一ID的广泛地址范围,因此在封闭区域中我们可以使用这些模块中的125个而不会相互干扰。
将nRF24L01与Arduino连接 在本篇文章中,我们将学习如何通过改变Arduino开发板上的电位器来控制另一个Arduino连接的伺服电机,从而将nRF24L01与Arduino连接。为简单起见,我们使用了一个nRF24L01模块作为发送器,另一个是接收器,但每个模块都可以编程为单独发送和接收数据。
将nRF24L01模块与Arduino连接的电路图如下所示。为了有所变化,我使用UNO作为接收器侧,Nano使用Nano作为发送器侧。但是连接的逻辑对于其他Arduino开发板也是一样的,例如mini、mega。
接收端:Arduino Uno nRF24L01模块连接
如前所述,nRF24L01使用SPI协议进行通信。在Arduino Nano和UNO上,引脚11、12和13用于SPI通信。因此,我们将MOSI、MISO和SCK引脚分别从nRF连接到引脚11、12和13。引脚CE和CS是用户可配置的,我在这里使用了引脚7和8,但你可以通过改变程序来使用任何引脚。 nRF模块由Arduino上的3.3V引脚供电,在大多数情况下都可以工作。如果没有,可以尝试单独的电源。除了连接nRF之外,我还将伺服电机连接到引脚7,并通过Arduino上的5V引脚供电。类似地,发射器电路如下所示。
发射器端:Arduino Nano nRF24L01模块连接
发射器的连接也是一样的,另外我使用了一个电位器连接在Arduino的5V和接地引脚之间。输出模拟电压从0-5V变化,连接到Nano的A7引脚。两块开发板都通过USB端口供电。
使用nRF24L01+无线收发器模块 然而,为了使我们的nRF24L01无噪音工作,我们可能需要考虑以下事项。我已经在这个nRF24L01+上工作了很长时间,并学到了以下几点,可以帮助你误入其中。当模块不能正常工作时,您可以尝试这些。
1. 市场上的大多数nRF24L01 +模块都是假的。我们在Ebay和亚马逊上找到的廉价产品是最糟糕的(别担心,我们可以通过几点调整使它们工作) 2. 主要问题是电源,而不是你的代码。大多数网上代码都能正常工作。 3. 请注意,因为印字为NRF24L01 +的模块实际上是Si24Ri(是中国产品)。 4. 克隆和假的模块将消耗更多功耗,因此不会开发基于nRF24L01 +数据表的电源电路,因为Si24Ri将具有大约250mA的大电流消耗。 5. 小心电压波动和电流浪涌,这些模块非常敏感,可能很容易燃烧。 6. 在模块的Vcc和Gnd上添加一对电容器(10uF和0.1uF)有助于使您的电源保持纯净,这适用于大多数模块。
为Arduino编程nRF24L01 由于Manitbug在GitHub上创建了易于使用的库,因此使用Arduino这些模块非常容易。单击链接将库下载为ZIP文件夹,然后使用草图 - >包含库 - >添加.ZIP库选项将其添加到Arduino IDE。添加库后,我们可以开始为项目编程。我们必须编写两个程序,一个用于发送器端,另一个用于接收器端。然而正如我之前所说,每个模块都可以作为发射器和接收器工作。这两个程序都在本页末尾给出,在发送器代码中,接收器选项将被注释掉,在接收器程序中,发送器代码将被注释掉。如果您正在尝试一个模块必须同时工作的项目,则可以使用它。该程序的工作原理注释如下。
像我们开始的所有程序一样,包括头文件。由于nRF使用SPI协议,因此我们已经包含了SPI头以及我们刚刚下载的库。伺服库用于控制伺服电机。 - #include <SPI.h>
- #include "RF24.h"
- #include <Servo.h>
复制代码
下面的代码是我们向库指示CE和CS引脚的重要部分。在我们的电路图中,我们将CE连接到引脚7,CS连接到引脚8,因此我们将代码设置为
与RF库关联的所有变量都应声明为复合变量结构。在该程序中,变量msg用于从RF模块发送和接收数据。 - struct package
- {
- int msg;
- };
- typedef struct package Package;
- Package data;
复制代码
每个RF模块都有一个唯一的地址,使用该地址可以将数据发送到相应的设备。由于我们这里只有一对,我们在发送器和接收器中将地址设置为零,但如果您有多个模块,则可以将ID设置为任何唯一的6位数字串。 - byte addresses[][6] = {"0"};
复制代码
接下来在void setup()函数内部,我们初始化RF模块,并设置为115波段,无噪声,并设置模块在最低功耗模式下工作,最低速度为250Kbps。 - void setup()
- {
- Serial.begin(9600);
- myRadio.begin();
- myRadio.setChannel(115); //115 band above WIFI signals
- myRadio.setPALevel(RF24_PA_MIN); //MIN power low rage
- myRadio.setDataRate( RF24_250KBPS ) ; //Minimum speed
- myservo.attach(6);
- Serial.print("Setup Initialized");
- delay(500);
- }
复制代码
void WriteData()函数写入传递给它的数据。如前所述,nRF有6个不同的管道,我们可以读取或写入数据,这里我们使用0xF0F0F0F066作为写入数据的地址。在接收器端,我们必须在ReadData()函数上使用相同的地址来接收写入的数据。 - void WriteData()
- {
- myRadio.stopListening(); //Stop Receiving and start transminitng
- myRadio.openWritingPipe(0xF0F0F0F066);//Sends data on this 40-bit address
- myRadio.write(&data, sizeof(data));
- delay(300);
- }
复制代码
void WriteData()函数读取数据并将其放入变量中。在我们可以读取或写入数据的6个不同管道中,我们使用0xF0F0F0F0AA作为地址来读取数据。这意味着另一个模块的发送器已经在该地址上写了一些内容,因此我们正在从中读取它。 - void ReadData()
- {
- myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //Which pipe to read, 40 bit Address
- myRadio.startListening(); //Stop Transminting and start Reveicing
- if ( myRadio.available())
- {
- while (myRadio.available())
- {
- myRadio.read( &data, sizeof(data) );
- }
- Serial.println(data.text);
- }
- }
复制代码
除了这些行之外,程序中的其他行用于读取POT并使用map函数将其转换为0到180,并将其发送到Receiver模块,我们相应地控制伺服。我没有逐行解释,因为我们已经在我们的Servo接口教程中了解到了这一点。
无线使用nRF24L01控制伺服电机
一旦准备好程序,就可以在各自的Arduino开发板上上传发送器和接收器代码(如下所示),并通过USB端口为其供电。您还可以启动两个板的串行监视器,以检查正在传输的值和接收的值。如果在发射器侧转动POT旋钮时一切正常,则另一侧的伺服也应相应转动。
在第一次尝试时这些模块工作可能不会工作是很正常的。如果您遇到任何问题,请再次检查代码和接线并尝试上面给出的故障排除指南。如果有问题可以在本帖下面进行回复。
代码 本篇文章使用的完整代码如下所示:
main.rar
(1.09 KB, 下载次数: 269)
|