- 认识nRF24L01射频模块
- 将nRF24L01与Arduino接口
- 接收方:Arduino Uno nRF24L01模块连接
- 发射器侧:Arduino Nano nRF24L01模块连接
- 使用nRF24L01 +无线收发器模块
- 为Arduino编程nRF24L01
- 无线使用nRF24L01控制伺服电机
随着物联网(IoT),工业4.0,机器对机器通信等的日益普及,对无线通信的需求已迫在眉睫,越来越多的机器/设备可以在云上相互通信。设计师使用许多无线通信系统,例如低功耗蓝牙(BLE 4.0),Zigbee,ESP43 Wi-Fi模块,433MHz RF模块,Lora,nRF等,媒体的选择取决于所使用的应用程序类型。
其中,用于局域网通信的一种流行的无线介质是nRF24L01。这些模块在2.4GHz(ISM频段)上运行,波特率从250Kbps到2Mbps,在许多国家/地区都是合法的,可用于工业和医疗应用。还要求使用适当的天线,这些模块之间的发射和接收距离可达100米。有趣的权利!?因此,在本教程中,我们将学习有关这些nRF24l01模块以及如何将其与Arduino等微控制器平台接口的更多信息。在使用此模块时,我们还将分享一些针对常见问题的解决方案。
认识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个这些模块而不会互相干扰。
将nRF24L01与Arduino接口
在本教程中,我们将学习如何通过改变另一个Arduino上的电位器来控制与一个Arduino连接的伺服电机,从而将nRF24L01与Arduino相连。为了简单起见,我们使用一个nRF24L01模块作为发送器,另一个作为接收器,但是可以对每个模块进行编程以分别发送和接收数据。
连接nRF24L01模块和Arduino的电路图如下所示。为了多样性,我在接收器端使用了UNO,在发射器端使用了Nano。但是连接的逻辑对于其他Arduino板(如mini,mega)也相同。
接收方:Arduino Uno nRF24L01模块连接
如前所述,nRF24L01在SPI协议的帮助下进行通信。在Arduino Nano和UNO上,引脚11、12和13用于SPI通信。因此,我们将nRF的MOSI,MISO和SCK引脚分别连接到引脚11、12和13。CE和CS引脚是用户可配置的,我在这里使用了引脚7和8,但是您可以通过更改程序来使用任何引脚。nRF模块由Arduino上的3.3V引脚供电,在大多数情况下都可以使用。如果没有,可以尝试使用单独的电源。除了连接nRF外,我还将伺服电机连接到了引脚7,并通过Arduino上的5V引脚为其供电。类似地,发射器电路如下所示。
发射器侧:Arduino Nano nRF24L01模块连接
发送器的连接也相同,此外,我还使用了一个电位计,该电位计跨接在Arduino的5V ad接地引脚上。将在0-5V之间变化的输出模拟电压连接到Nano的A7引脚。这两块板均通过USB端口供电。
使用nRF24L01 +无线收发器模块
但是,为了使nRF24L01不受噪声影响,我们可能需要考虑以下事项。我已经在nRF24L01 +上进行了很长时间的研究,并了解了 以下几点 可以帮助您避免被撞在墙上。当模块无法正常运行时,您可以尝试这些。
1.市场上大多数nRF24L01 +模块都是假的。我们在Ebay和Amazon上可以找到的最便宜的是最差的(不用担心,只需进行一些微调即可使它们工作)
2.主要问题是电源,而不是您的代码。大部分在线代码都可以正常运行,我自己有一个经过我亲自测试的工作代码,请告诉我您是否需要它们。
3.注意,因为打印为NRF24L01 +的模块实际上是Si24Ri(是中国产品)。
4.克隆和伪造模块将消耗更多功率,因此不要开发基于nRF24L01 +数据表的电源电路,因为Si24Ri的电流消耗约为250mA。
5.当心电压纹波和电流浪涌,这些模块非常敏感,很容易烧毁。(;-(到目前为止炸了2个模块)
6.在模块的Vcc和Gnd两端增加一个耦合电容器(10uF和0.1uF)有助于使您的电源纯净,这适用于大多数模块。
不过,如果您在评论部分有问题报告或阅读了此书,或者在我们的论坛上提出了问题。
还要检查我们以前使用nRF24L01创建聊天室的项目。
为Arduino编程nRF24L01
由于GitHub上maniacbug创建了易于使用的库,因此将这些模块与Arduino一起使用非常容易。单击链接将库下载为ZIP文件夹,然后通过使用 Sketch-> Include Library-> Add.ZIP library 选项将其添加到Arduino IDE 。添加库后,我们可以开始为项目编程。我们必须编写两个程序,一个用于发送方,另一个用于接收方。但是,正如我之前所讲的,每个模块都可以充当发送器和接收器。这两个程序都在此页的末尾给出,在发送器代码中,接收器选项将被注释掉,而在接收器程序中,发送器代码将被注释掉。如果您正在尝试一个模块必须同时工作的项目,则可以使用它。该程序的工作方式在下面说明。
像所有程序一样,我们从包含头文件开始。由于nRF使用SPI协议,因此我们包含了SPI标头以及刚刚下载的库。伺服库用于控制伺服电机。
#包括
下一行是重要的行,我们在其中指示库有关CE和CS引脚的信息。在电路图中,我们将CE连接到引脚7,将CS连接到引脚8,因此我们将线路设置为
RF24 myRadio(7,8);
与RF库关联的所有变量都应声明为复合变量结构。在此程序中,变量 msg 用于发送和接收来自RF模块的数据。
struct package { int msg; }; typedef struct package封装; 包装数据;
每个RF模块都有一个唯一的地址,通过它可以将数据发送到相应的设备。由于此处只有一对,因此在发送器和接收器中都将地址设置为零,但是如果您有多个模块,则可以将ID设置为任何唯一的6位数字字符串。
字节地址= {“ 0”};
接下来,在 void setup 函数中,我们初始化RF模块并设置为在115频段工作,该频段没有噪声,并且还将模块设置为以250Kbps的最小速度在最小功耗模式下工作。
void setup() { Serial.begin(9600); myRadio.begin(); myRadio.setChannel(115); // WIFI上方的115频段发出 myRadio.setPALevel(RF24_PA_MIN); // MIN低功耗 myRadio.setDataRate(RF24_250KBPS); //最低速度 myservo.attach(6); Serial.print(“ Setup Initialized”); 延迟(500); }
void WriteData() 函数写入传递给它的数据。如前所述,nRF有6个不同的管道可以读取或写入数据,此处我们使用0xF0F0F0F066作为写入数据的地址。在接收方,我们必须在 ReadData() 函数上使用相同的地址来接收写入的数据。
void WriteData() { myRadio.stopListening(); //停止接收并开始发送 myRadio.openWritingPipe(0xF0F0F0F066); //在此40位地址上发送数据 myRadio.write(&data,sizeof(data)); 延迟(300); }
void WriteData() 函数读取数据并将其放入变量中。同样,在6个不同的管道中,我们可以使用这些管道读取或写入数据,我们使用0xF0F0F0F0AA作为读取数据的地址。这意味着另一个模块的发送器已在该地址上写了一些内容,因此我们正在从该地址读取它。
void ReadData() { myRadio.openReadingPipe(1,0xF0F0F0F0AA); //读取哪个管道,40位地址 myRadio.startListening(); // 如果(myRadio.available()) { while(myRadio.available()) { myRadio.read(&data,sizeof(data)); } Serial.println(data.text); } }
除这些行外,程序中的其他行还用于读取POT并使用映射功能将其转换为0到180,然后将其发送到Receiver模块,在此我们相应地控制伺服系统。我没有逐行解释它们,因为我们已经在我们的“伺服接口”教程中了解到了。
无线使用nRF24L01控制伺服电机
准备好程序后,将发射器和接收器代码(如下所示)上传到相应的Arduino板上,并通过USB端口为它们供电。您还可以启动两个板的串行监视器,以检查正在传输的值和已接收的值。如果旋转发射器侧的POT旋钮时一切正常,则另一侧的伺服也应相应旋转。
下面的视频演示了该项目的完整工作。第一次尝试使这些模块不工作是很正常的。如果遇到任何问题,请检查代码并重新接线,然后尝试上述给定的故障排除准则。如果没有任何效果,请将您的问题发布在论坛或评论部分中,我将尝试解决它们。