Arduino NRF24L01 无线通信笔记(二、代码实战篇)
- 嵌入式开发
- 2025-11-25
- 432热度
- 0评论
Arduino × NRF24L01 无线通信笔记
一、NRF24L01 简介
NRF24L01 是一款基于 2.4GHz 的无线收发芯片,工作在 2.4~2.5GHz 世界通用 ISM 频段的单片无线收发器芯片。特点:
- 体积小,功耗低
- 速度可达 2Mbps
- 点对点、多点通信都可以
- 距离根据模块不同从 几十米 → 几百米(PA+LNA 版本更远)
- SPI 接口,Arduino 驱动简单
NRF24L01 单通道实现通讯很简单,只要收发方地址设置正确,就能正常通讯。

| 名称 | 方向 | 用途 |
|---|---|---|
| VCC | - | 供电电源,必须 2.0~3.6V 之间 |
| GND | - | 地线,连接到电源参考地 |
| CSN | 输入 | 模块片选引脚,用于开始一个 SPI 通信,低电平芯片工作 |
| CE | 输入 | 模块控制引脚在, CSN 为低的情况下,CE 协同NRF24L01 的CONFIG 寄存器共同决定NRF24L01 的状态 |
| MOSI | 输入 | 模块 SPI 数据输入引脚 主输出 从输入 |
| SCK | 输入 | 模块 SPI 总线时钟 |
| IRQ | 输出 | 模块中断信号输出,低电平有效 |
| MISO | 输出 | 模块 SPI 数据输出引脚 主输入 从输出 |
CE(Chip Enable)引脚:NRF24L01 工作时,是否发送/接收数据,取决于 CE 的电平状态。CE引脚用于控制nRF24L01的操作模式,例如进入发送模式或接收模式。正确配置CE引脚对于确保模块按预期工作非常重要。
角色及功能:
-
发送器(Transmitter):
-
- CE引脚必须在发送数据时拉高,以便nRF24L01进入发送模式。发送完成后,可以将CE引脚拉低。
-
接收器(Receiver):
-
- CE引脚必须保持拉高,以便nRF24L01进入接收模式,并能够接收数据包。
注意区分国产(一般为牛屎芯片封装)
常见版本:
- 普通模块(天线 PCB):便宜、适合室内短距离
- PA+LNA 加强版(带大天线):远距离(100m–1km 级别)
二、Arduino 与 NRF24 引脚连接
NRF24L01 使用 SPI 通信,引脚一般为:
| NRF24L01 | Arduino UNO |
|---|---|
| GND | GND |
| VCC (3.3V) | 3.3V(不能接 5V) |
| CE | D7(可修改) |
| CSN/CS | D8(可修改) |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| IRQ | 不接也行,可以悬空 |
注意:NRF24 对供电敏感,推荐加一个 10uF 电容 到 VCC–GND 之间防止掉线。
三、安装 Arduino NRF24L01 库
在 Arduino IDE:
工具 → 管理库 → 搜索 “RF24” → 安装
使用最稳定、最常用的库:TMRh20 / RF24
四、最小通信示例:发射端 & 接收端
1. 发射端(TX)
//发送端
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001"; // 收发双方地址要一样
//const byte address[6] = "node1";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MAX); // MAX 功率最稳(室内够用)
radio.stopListening(); // 发送端关闭监听
Serial.println("发送端已就绪...");
}
void loop() {
const char text[] = "Hello from Uno A!linfeng ilove u";
bool ok = radio.write(&text, sizeof(text));
if (ok) {
Serial.println("发送成功");
} else {
Serial.println("发送失败");
}
delay(1000);
}
2. 接收端(RX)
//接收端
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE 接 7,CSN 接 8
const byte address[6] = "00001"; // 地址必须和发送端完全一样
//const byte address[6] = "node1";
void setup() {
Serial.begin(9600);
radio.begin();
// 下面这几行强烈建议加上,稳定性大幅提升
radio.setDataRate(RF24_1MBPS); // 也可以试 RF24_250KBPS(更远距离)
radio.setPALevel(RF24_PA_MAX); // 最大功率,最稳
radio.setRetries(5, 15); // 重传机制
radio.openReadingPipe(0, address);
radio.startListening(); // 开始监听
Serial.println("接收端已就绪,等数据...");
}
void loop() {
if (radio.available()) {
char text[32] = {0}; // 清空缓冲区
radio.read(&text, sizeof(text));
Serial.print("收到: ");
Serial.println(text);
}
}
五、使用 CE 的关键细节
✔ 1. 接收模式:CE 必须一直保持 HIGH
当 NRF24 在 RX 模式:
- CE 拉高 → 开始接收
- CE 下降 → 停止接收
也就是说:
要持续接收数据,就必须把 CE 一直拉高。
RF24 库内部已经帮你处理好了:
radio.startListening(); // 内部会把 CE 拉高
✔ 2. 发送模式:CE 必须拉高至少 10 微秒
发送一个包的流程:
- 写 TX FIFO 数据
- CE 置高至少 10µs → 开始发射
- CE 可拉低,芯片自动完成发送
RF24 库内部也封装好了:
radio.write(&data, sizeof(data));
内部会自动控制 CE 的脉冲。
六、NRF24 能做什么
- 点对点通信(UNO ↔ UNO)
- 多节点 Star 拓扑(主节点轮询)
- 手柄数据传输(摇杆/按键 → 小车)
- 小车遥控、机器人遥控
- 传感器远程采集(温湿度、土壤等)
如果数据结构复杂,推荐使用:
struct DataPacket {
int x;
int y;
bool pressed;
};
NRF24 可以直接传结构体。