快捷搜索:  汽车  科技

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)NRF24L01 模块有多种变体。最受欢迎的是带有板载天线的天线。这使得模块更加紧凑,但另一方面,将传输范围降低到大约 100 米的距离。其中三个引脚用于 SPI 通信,它们需要连接到 Arduino 的 SPI 引脚,但请注意,每个 Arduino 板都有不同的 SPI 引脚。引脚 CSN 和 CE 可以连接到 Arduino 板的任何数字引脚,它们用于将模块设置为待机或活动模式,以及在传输或命令模式之间切换。最后一个引脚是一个不必使用的中断引脚。让我们仔细看看 NRF24L01 收发器模块。它使用 2.4 GHz 频段,可以在 250 kbps 至 2 Mbps 的波特率下运行。如果在开放空间和较低的波特率下使用,其范围可达 100 米。该模块可以使用 125 个不同的通道,这使得在一个地方拥有一个由 125 个独立工作的调制解调器组成的网络成为可能。每个通道最多可以有 6 个地址,或

在本 Arduino 教程中,我们将学习如何使用 NRF24L01 收发器模块在两个 Arduino 板之间进行无线通信。

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

为了解释无线通信,我们将举两个例子,第一个例子是从一个 Arduino 向另一个发送一个简单的“Hello World”消息,在第二个例子中,我们将在 Arduino 板之间进行双向通信,其中使用第一个 Arduino 上的操纵杆,我们将控制第二个 Arduino 上的伺服电机,反之亦然,使用第二个 Arduino 上的按钮,我们将控制第一个 Arduino 上的 LED

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(1)

NRF24L01 收发器模块 – 工作原理

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(2)

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(3)

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(4)

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

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(5)

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

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

NRF24L01 模块引脚排列

下面详细介绍 NRF24L01 引脚排列以及 NRF24L01 PA/LNA 模块。

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(6)

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

电路图

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(7)

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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(8)

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 CSN const 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 CSN const 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 Transmitter radio.stopListening(); // at the Receiver radio.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怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(9)

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

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


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

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(10)

源代码


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

发射机代码

/* * 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 12 RF24 radio(7 8); // CE CSN const byte addresses[][6] = {"00001" "00002"}; boolean buttonState = 0; void setup() { pinMode(12 OUTPUT); radio.begin(); radio.openWritingPipe(addresses[1]); // 00002 radio.openReadingPipe(1 addresses[0]); // 00001 radio.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 4 RF24 radio(7 8); // CE CSN const byte addresses[][6] = {"00001" "00002"}; Servo myServo; boolean buttonState = 0; void setup() { pinMode(button INPUT); myServo.attach(5); radio.begin(); radio.openWritingPipe(addresses[0]); // 00001 radio.openReadingPipe(1 addresses[1]); // 00002 radio.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 Transmitter radio.openWritingPipe(addresses[1]); // 00001 radio.openReadingPipe(1 addresses[0]); // 00002 // at the Receiver radio.openWritingPipe(addresses[0]); // 00002 radio.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 模块,包括电路图、改进的代码实现以实现更好的通信等。

arduino怎么使wifi模块灯一闪一闪(无线控制-nRF24L01)(11)

猜您喜欢: