Arduino NRF24L01 无线通信笔记(二、代码实战篇)

Arduino × NRF24L01 无线通信笔记

一、NRF24L01 简介

NRF24L01 是一款基于 2.4GHz 的无线收发芯片,工作在 2.4~2.5GHz 世界通用 ISM 频段的单片无线收发器芯片。特点:

  • 体积小,功耗低
  • 速度可达 2Mbps
  • 点对点、多点通信都可以
  • 距离根据模块不同从 几十米 → 几百米(PA+LNA 版本更远)
  • SPI 接口,Arduino 驱动简单

NRF24L01 单通道实现通讯很简单,只要收发方地址设置正确,就能正常通讯。

image-20251124231230044

名称 方向 用途
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进入接收模式,并能够接收数据包。

注意区分国产(一般为牛屎芯片封装)

常见版本:

  1. 普通模块(天线 PCB):便宜、适合室内短距离
  2. 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 微秒

发送一个包的流程:

  1. 写 TX FIFO 数据
  2. CE 置高至少 10µs → 开始发射
  3. CE 可拉低,芯片自动完成发送

RF24 库内部也封装好了:

radio.write(&data, sizeof(data));

内部会自动控制 CE 的脉冲。


六、NRF24 能做什么

  • 点对点通信(UNO ↔ UNO)
  • 多节点 Star 拓扑(主节点轮询)
  • 手柄数据传输(摇杆/按键 → 小车)
  • 小车遥控、机器人遥控
  • 传感器远程采集(温湿度、土壤等)

如果数据结构复杂,推荐使用:

struct DataPacket {
  int x;
  int y;
  bool pressed;
};

NRF24 可以直接传结构体。