首页 » 通讯 » 无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个

无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个

乖囧猫 2025-01-20 21:34:54 0

扫一扫用手机浏览

文章目录 [+]

本文翻译自How To Mechantronic文章译者:DIY百事

为理解释无线通信,我们将举两个例子,第一个例子是从一个 Arduino 向另一个发送一个大略的“Hello World”,在第二个例子中,我们将在 Arduino 板之间进行双向通信,个中利用第一个 Arduino 上的操纵杆,我们将掌握第二个 Arduino 上的伺服电机,反之亦然,利用第二个 Arduino 上的按钮,我们将掌握第一个 Arduino 上的 LED

无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个 无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个 通讯

NRF24L01 收发器模块 – 事情事理

无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个 无线控制-nRF24L01 – 工作事理、Arduino 接口、代码、事理图_模块_第二个 通讯
(图片来自网络侵删)

让我们仔细看看 NRF24L01 收发器模块。
它利用 2.4 GHz 频段,可以在 250 kbps 至 2 Mbps 的波特率下运行。
如果在开放空间和较低的波特率下利用,其范围可达 100 米。

该模块可以利用 125 个不同的通道,这使得在一个地方拥有一个由 125 个独立事情的调制解调器组成的网络成为可能。
每个通道最多可以有 6 个地址,或者每个单元最多可以同时与 6 个其他单元通信。

该模块在传输过程中的功耗仅为12mA旁边,乃至低于单个LED。
模块的事情电压为 1.9 到 3.6V,但好处是其他引脚可以承受 5V 逻辑,因此我们可以轻松地将其连接到 Arduino,而无需利用任何逻辑电平转换器。

个中三个引脚用于 SPI 通信,它们须要连接到 Arduino 的 SPI 引脚,但请把稳,每个 Arduino 板都有不同的 SPI 引脚。
引脚 CSN 和 CE 可以连接到 Arduino 板的任何数字引脚,它们用于将模块设置为待机或活动模式,以及在传输或命令模式之间切换。
末了一个引脚是一个不必利用的中断引脚。

NRF24L01 模块有多种变体。
最受欢迎的是带有板载天线的天线。
这使得模块更加紧凑,但另一方面,将传输范围降落到大约 100 米的间隔。

第二个变体,不是板载天线,它有一个 SMA 连接器,我们可以连接一个鸭子天线以得到更好的传输范围。

此处显示的第三种变体,除了鸭子天线外,还有一个 RFX2401C 芯片,个中包括PA(功率放大器)和LNA(低噪声放大器)。
这会放大 NRF24L01 旗子暗记,并在开放空间中实现更远达 1000 米的传输范围。

NRF24L01 模块引脚排列

下面详细先容 NRF24L01 引脚排列以及 NRF24L01+ PA/LNA 模块。

NRF24L01 和 NRF24L01+ PA/LNA 这两个模块具有相同的引脚排列,因此我们可以以相同的办法将它们连接到我们的电路中。

电路图

以下是我们须要如何将 NRF24L01 模块连接到 Arduino 板。

正如我已经提到的,每个 Arduino 板都有不同的 SPI 引脚,因此在将模块连接到 Arduino 板时请记住这一点。

Arduino 和 NRF24L01 代码

一旦我们将 NRF24L01 模块连接到 Arduino 板,我们就可以为发射器和吸收器编写代码。

首先我们须要下载并安装RF24库 ,这可以减少编程的难度。

这是无线通信的两个代码,下面是它们的描述。

发射机代码

/ Arduino无线通信教程 示例 1 - 发射器代码 作者:Dejan Nedelkovski,www.HowToMechatronics.com 库:TMRh20/RF24,https://github.com/tmrh20/RF24//#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>RF24 radio(7, 8); // CE, CSNconst byte address[6] = "00001";void setup() {radio.begin();radio.openWritingPipe(address);radio.setPALevel(RF24_PA_MIN);radio.stopListening();}void loop() {const char text[] = "Hello World";radio.write(&text, sizeof(text));delay(1000);}

吸收器代码

/ Arduino Wireless Communication Tutorial Example 1 - Receiver Code by Dejan Nedelkovski, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24//#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>RF24 radio(7, 8); // CE, CSNconst byte address[6] = "00001";void setup() {Serial.begin(9600);radio.begin();radio.openReadingPipe(0, address);radio.setPALevel(RF24_PA_MIN);radio.startListening();}void loop() {if (radio.available()) {char text[32] = "";radio.read(&text, sizeof(text));Serial.println(text);}}

描述:

以是我们须要包含基本的 SPI 和新安装的 RF24 库并创建一个 RF24 工具。
这里的两个参数是 CSN 和 CE 引脚。

RF24 radio(7, 8); // CE, CSN

接下来,我们须要创建一个字节数组来表示地址,或者两个模块将通过它进行通信的所谓管道。

const byte address[6] = "00001";

我们可以将此地址的值变动为任何 5 个字母的字符串,这样就可以选择我们将与哪个吸收器通话,因此在我们的情形下,我们将在吸收器和发送器上拥有相同的地址。

在设置部分,我们须要初始化无线电工具,并利用 radio.openWritingPipe() 函数设置我们将向其发送数据的吸收器地址,即我们之前设置的 5 个字母的字符串。

radio.openWritingPipe(address);

另一方面,在吸收方,我们利用 radio.setReadingPipe() 函数设置相同的地址,这样我们就可以启用两个模块之间的通信。

radio.openReadingPipe(0, address);

然后利用 radio.setPALevel() 函数设置功率放大器电平,在我们的例子中,我将它设置为最小值,由于我的模块彼此非常靠近。

radio.setPALevel(RF24_PA_MIN);

请把稳,如果利用更高等别,建议在模块的 GND 和 3.3V 之间利用旁路电容,以便它们在运行时具有更稳定的电压。

接下来,我们有 radio.stopListening() 函数,它将模块设置为发射器,另一方面,我们有 radio.startListening() 函数,它将模块设置为吸收器。

// at the Transmitterradio.stopListening();// at the Receiverradio.startListening();

在循环部分,在发送器处,我们创建了一个字符数组,我们将“Hello World”分配给它。
利用 radio.write() 函数,我们将把这条发送给吸收者。
这里的第一个参数是我们想要发送的变量。

void loop() {const char text[] = "Hello World";radio.write(&text, sizeof(text));delay(1000);}

通过在变量名之前利用“&”,我们实际上设置了一个指示存储我们想要发送的数据的指针变量,利用第二个参数我们设置了我们想要从该变量中获取的字节数。
在这种情形下,sizeof() 函数获取字符串“text”的所有字节。
在程序结束时,我们将添加 1 秒延迟。

另一方面,在吸收端,在循环部分利用 radio.available() 函数检讨是否有数据要吸收。
如果这是真的,首先我们创建一个包含 32 个元素的数组,称为“文本”,我们将在个中保存传入的数据。

void loop() { if (radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); Serial.println(text); }}

利用 radion.read() 函数,我们读取数据并将其存储到“text”变量中。
末了,我们只是在串口监视器上打印文本。
因此,一旦我们上传了两个程序,我们就可以在吸收器上运行串口监视器,我们会把稳到每秒都会打印“Hello World”。

故障打消

值得把稳的是,电源噪声是人们在考试测验与 NRF24L01 模块成功通信时碰着的最常见问题之一。
常日,RF 电路或射频旗子暗记对电源噪声很敏感。
因此,在电源线上包含一个去耦电容器始终是一个好主张。
电容器可以是从 10uF 到 100uF 的任何值。

另一个常见问题是 Arduino 板的 3.3V 引脚不能为 NRF24L01 模块供应足够的电源。
因此,利用外部电源为模块供电也是一个好主张。

Arduino 无线双向通信与两个 NRF24L01 模块

让我们看第二个例子,两个 Arduino 板之间的双向无线通信。
下面是电路事理图:

源代码

这是两个代码,下面是它们的描述。

发射机代码

/ Arduino无线通信教程 示例 2 - 发射器代码 作者:Dejan Nedelkovski,www.HowToMechatronics.com 库:TMRh20/RF24,https://github.com/tmrh20/RF24//#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>#define led 12RF24 radio(7, 8); // CE, CSNconst byte addresses[][6] = {"00001", "00002"};boolean buttonState = 0;void setup() {pinMode(12, OUTPUT);radio.begin();radio.openWritingPipe(addresses[1]); // 00002radio.openReadingPipe(1, addresses[0]); // 00001radio.setPALevel(RF24_PA_MIN);}void loop() {delay(5);radio.stopListening();int potValue = analogRead(A0);int angleValue = map(potValue, 0, 1023, 0, 180);radio.write(&angleValue, sizeof(angleValue));delay(5);radio.startListening();while (!radio.available());radio.read(&buttonState, sizeof(buttonState));if (buttonState == HIGH) {digitalWrite(led, HIGH);}else {digitalWrite(led, LOW);}}

吸收器代码

/ Arduino Wireless Communication Tutorial Example 2 - Receiver Code by Dejan Nedelkovski, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24//#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>#include <Servo.h>#define button 4RF24 radio(7, 8); // CE, CSNconst byte addresses[][6] = {"00001", "00002"};Servo myServo;boolean buttonState = 0;void setup() {pinMode(button, INPUT);myServo.attach(5);radio.begin();radio.openWritingPipe(addresses[0]); // 00001radio.openReadingPipe(1, addresses[1]); // 00002radio.setPALevel(RF24_PA_MIN);}void loop() {delay(5);radio.startListening();if ( radio.available()) {while (radio.available()) {int angleV = 0;radio.read(&angleV, sizeof(angleV));myServo.write(angleV);}delay(5);radio.stopListening();buttonState = digitalRead(button);radio.write(&buttonState, sizeof(buttonState));}}

这里与前面的示例不同的是,我们须要为双向通信创建两个管道或地址。

const byte addresses[][6] = {"00001", "00002"};

在setup部分我们须要定义两个pipe,把稳第一个Arduino的写地址须要是第二个Arduino的读地址,反之亦然,第一个Arduino的读地址须要是写地址第二个Arduino。

// at the Transmitterradio.openWritingPipe(addresses[1]); // 00001radio.openReadingPipe(1, addresses[0]); // 00002// at the Receiverradio.openWritingPipe(addresses[0]); // 00002radio.openReadingPipe(1, addresses[1]); // 00001

在loop中利用 radio.stopListening() 函数,我们将第一个 Arduino 设置为发射器,读取并映射操纵杆的值从 0 到 180,并利用 radio.write() 函数将数据发送到吸收器。

radio.stopListening();int potValue = analogRead(A0);int angleValue = map(potValue, 0, 1023, 0, 180);radio.write(&angleValue, sizeof(angleValue));

另一方面,我们利用 radio.startListening() 函数将第二个 Arduino 设置为吸收器,并检讨是否有可用数据。
当有可用数据时,我们将读取它,将其保存到“angleV”变量中,然后利用该值来旋转伺服电机。

radio.startListening();if ( radio.available()) {while (radio.available()) {int angleV = 0;radio.read(&angleV, sizeof(angleV));myServo.write(angleV);}

接下来,在发射器处,我们将第一个 Arduino 设置为吸收器,并利用空的“while”循环等待第二个 Arduino 发送数据,这是按钮状态的数据,无论是否按下。
如果按下按钮,LED 将亮起。
以是这些过程不断重复,两个 Arduino 板都在不断地发送和吸收数据。

更多 NRF24L01 和 Arduino 示例

NRF24L01 模块是任何 Arduino 爱好者的必备品。
我已经在我的许多Arduino 项目中利用了 NRF24L01 模块。
在这里,我将列出我利用过这些模块的所有项目。

· 利用 HC-05 蓝牙、NRF24L01 和 HC-12 收发器模块的 Arduino 机器人汽车无线掌握

· Arduino无线气候站项目

· DIY Arduino RC 发射器

· Arduino蚂蚁六足机器人

· 基于 Arduino 的 DIY RC 气垫船

· Arduino麦克纳姆轮机器人

· 用于 RC 模型和 Arduino 项目的 DIY Arduino RC 吸收器

· Arduino 遥控飞机 | 100% DIY

这些项目/教程中的每一个都详细阐明了如何利用 NRF24L01 模块,包括电路图、改进的代码实现以实现更好的通信等。

标签:

相关文章