风筝
发表于: 2018-10-10 11:23:58 | 显示全部楼层

尽管物联网(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模块的引脚分布如下所示

nRF24L01-RF-Module.png


该模块的工作电压为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模块连接

Circuit-Diagram-of-Receiver-Part-for-Interfacing-NRF24L01-with-Arduino.png

Receiver-part-for-Interfacing-NRF24L01-with-Arduino.jpg


如前所述,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模块连接

Circuit-Diagram-of-Transmitter-Part-for-Interfacing-NRF24L01-with-Arduino.png

Transmitter-part-for-Interfacing-NRF24L01-with-Arduino.jpg


发射器的连接也是一样的,另外我使用了一个电位器连接在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头以及我们刚刚下载的库。伺服库用于控制伺服电机。

  1. #include <SPI.h>
  2. #include "RF24.h"
  3. #include <Servo.h>
复制代码

下面的代码是我们向库指示CE和CS引脚的重要部分。在我们的电路图中,我们将CE连接到引脚7,CS连接到引脚8,因此我们将代码设置为

  1. RF24 myRadio (7, 8);
复制代码

与RF库关联的所有变量都应声明为复合变量结构。在该程序中,变量msg用于从RF模块发送和接收数据。

  1. struct package
  2. {
  3.   int msg;
  4. };
  5. typedef struct package Package;
  6. Package data;
复制代码

每个RF模块都有一个唯一的地址,使用该地址可以将数据发送到相应的设备。由于我们这里只有一对,我们在发送器和接收器中将地址设置为零,但如果您有多个模块,则可以将ID设置为任何唯一的6位数字串。

  1. byte addresses[][6] = {"0"};
复制代码

接下来在void setup()函数内部,我们初始化RF模块,并设置为115波段,无噪声,并设置模块在最低功耗模式下工作,最低速度为250Kbps。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   myRadio.begin();
  5.   myRadio.setChannel(115);  //115 band above WIFI signals
  6.   myRadio.setPALevel(RF24_PA_MIN); //MIN power low rage
  7.   myRadio.setDataRate( RF24_250KBPS ) ;  //Minimum speed
  8.   myservo.attach(6);

  9.   Serial.print("Setup Initialized");
  10.   delay(500);
  11. }
复制代码

void WriteData()函数写入传递给它的数据。如前所述,nRF有6个不同的管道,我们可以读取或写入数据,这里我们使用0xF0F0F0F066作为写入数据的地址。在接收器端,我们必须在ReadData()函数上使用相同的地址来接收写入的数据。

  1. void WriteData()
  2. {
  3.   myRadio.stopListening(); //Stop Receiving and start transminitng
  4.   myRadio.openWritingPipe(0xF0F0F0F066);//Sends data on this 40-bit address
  5.   myRadio.write(&data, sizeof(data));
  6.   delay(300);
  7. }
复制代码

void WriteData()函数读取数据并将其放入变量中。在我们可以读取或写入数据的6个不同管道中,我们使用0xF0F0F0F0AA作为地址来读取数据。这意味着另一个模块的发送器已经在该地址上写了一些内容,因此我们正在从中读取它。

  1. void ReadData()
  2. {
  3. myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //Which pipe to read, 40 bit Address
  4.   myRadio.startListening(); //Stop Transminting and start Reveicing
  5.   if ( myRadio.available())
  6.   {
  7.     while (myRadio.available())
  8.     {
  9.       myRadio.read( &data, sizeof(data) );
  10.     }
  11.     Serial.println(data.text);
  12.   }
  13. }
复制代码

除了这些行之外,程序中的其他行用于读取POT并使用map函数将其转换为0到180,并将其发送到Receiver模块,我们相应地控制伺服。我没有逐行解释,因为我们已经在我们的Servo接口教程中了解到了这一点。


无线使用nRF24L01控制伺服电机

NRF24L01-with-Arduino-in-action.jpg


一旦准备好程序,就可以在各自的Arduino开发板上上传发送器和接收器代码(如下所示),并通过USB端口为其供电。您还可以启动两个板的串行监视器,以检查正在传输的值和接收的值。如果在发射器侧转动POT旋钮时一切正常,则另一侧的伺服也应相应转动。

Interfacing-NRF24L01-with-Arduino.jpg


在第一次尝试时这些模块工作可能不会工作是很正常的。如果您遇到任何问题,请再次检查代码和接线并尝试上面给出的故障排除指南。如果有问题可以在本帖下面进行回复。


代码

本篇文章使用的完整代码如下所示: main.rar (1.09 KB, 下载次数: 258)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-24 04:14 , Processed in 0.037703 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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