豆爸 发表于 3 天前

基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器

本帖最后由 豆爸 于 2025-10-23 17:03 编辑

一、项目概述

本项目基于 Firebeetle 2 ESP32-C5 开发板设计一款 6 通道 2.4G 遥控器,通过 NRF24L01 模块实现无线控制。1-4 通道采用模拟摇杆输入(对应升降舵、副翼、油门、方向舵),5-6 通道采用两段扭子开关(对应辅助功能切换),4P 拨码开关用于独立控制 1-4 通道的正反向,集成有源蜂鸣器实现低电压报警,适用于遥控车、无人机等小型设备的精准控制。

二、硬件组成与介绍

(一)硬件组成



(二)硬件介绍

1. Firebeetle 2 ESP32-C5

FireBeetle 2 ESP32-C5 是一款搭载乐鑫 ESP32-C5 模组的低功耗 IoT 开发板,面向智能家居和广泛物联网场景,集高性能计算、多协议支持与智能电源管理于一体,为各种部署需求提供高可靠性、高灵活性与长续航的解决方案。

2.IO扩展板

Firebeetle 2 ESP32-C5开发板推出专属的IO扩展板,其IO引脚全部引出,并且精心做了功能分区,方便直接快速连接各种传感器外设,真正让开发板做到了到手即用,无需焊接。

3. NRF24L01 模块



2.4GHz 无线收发模块,支持 SPI 通信,传输速率 2Mbps,通信距离 10-30 米(无遮挡),适合短距离无线控制。

4. 模拟摇杆



输出 0-3.3V 模拟电压信号,对应摇杆物理位置(如上下 / 左右摆动),通过 ESP32-C5 的 ADC 接口采集并转换为 0-255 的控制量,分别对应 1-4 通道(升降舵、副翼、油门、方向舵)。

5. 4P 拨码开关

集成 4 路独立单刀单掷开关的模块,每路对应 1-4 通道的正反向切换:拨至 “ON” 时通道信号反向,“OFF” 时保持正向(需启用 ESP32 内部上拉电阻,确保未拨动时为高电平)。

6. 两段扭子开关(5-6 通道)

具有两个稳定档位(ON/OFF)的机械开关,切换时输出高低电平(0/1),分别作为 5 通道和 6 通道的控制信号(如模式切换、功能启停等)。

7. 有源蜂鸣器

内部集成振荡电路,通直流电(3.3V/5V)即可持续发声,无需方波驱动,控制简单,用于低电压报警提示。

三、硬件接线图

(一)NRF24L01 与 Firebeetle 2 ESP32-C5 连接



(二)其他外设连接




四、PCB绘制与打样

(一)PCB绘制





(二)PCB 2D图预览





(三)PCB 3D图预览


(四)生产PCB制版文件Gerber




(五)一键PCB下单




四、软件安装与库配置

(一)Arduino IDE 安装

从Arduino 官网下载并安装适合操作系统的 Arduino IDE。

(二)ESP32 核心库安装

添加开发板管理器 URL打开 Arduino IDE,依次点击「文件 > 首选项」,在 “附加开发板管理器网址” 中输入国内镜像链接:
https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_dev_index_cn.json




安装核心库点击「工具 > 开发板 > 开发板管理器」,搜索 “ESP32”,选择 “esp32 by Espressif Systems”(版本≥3.3.0-alpha1),点击 “安装”,重启 IDE。
选择开发板依次点击「工具 > 开发板 > ESP32 Arduino > Firebeetle 2 ESP32-C5」。



(三)NRF24L01 通信库(RF24 库)安装

点击「Sketch > 包含库 > 管理库」,搜索 “RF24”,安装 “TMRh20” 维护的库。




五、核心代码及说明

(一)头文件与宏定义配置


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

// 无线通信基础配置
const uint64_t pipeOut = 0x123456789;// 与接收端匹配的通信地址,确保数据定向传输
const int deadzone = 5;                // 摇杆死区阈值,过滤中位机械抖动

// NRF24L01模块初始化(指定CE和CSN引脚)
RF24 radio(9, 10);                     

// 发送重试策略配置
const int maxRetries = 3;       // 最大软件重试次数,平衡可靠性与实时性
const int retryDelay = 10;      // 重试间隔(毫秒),避免通信拥堵


核心作用:引入无线通信与 SPI 协议依赖库,定义通信地址、死区参数、重试规则等基础配置,初始化 NRF24L01 模块对象,为系统运行提供参数支撑。


(二)数据结构与初始化函数

1. 控制信号结构体


struct Signal {
int ele;   // 1通道:升降舵(-512~512)
int ail;   // 2通道:副翼(-512~512)
int thr;   // 3通道:油门(-512~512)
int rud;   // 4通道:方向舵(-512~512)
byte aux1; // 5通道:两段扭子开关(映射为-512/512)
byte aux2; // 6通道:两段扭子开关(映射为-512/512)
};
Signal data;// 控制信号实例,存储实时采集的通道数据


设计说明:采用int类型存储 1-4 通道摇杆数据,支持正负范围以表示双向操作;byte类型存储 5-6 通道扭子开关状态,通过映射实现与摇杆通道一致的数值范围,便于接收端统一解析。


2. 通道数据初始化函数


void ResetData() {
data.ele = 0;   // 升降舵中位(死区中心)
data.ail = 0;   // 副翼中位
data.thr = 0;   // 油门中位
data.rud = 0;   // 方向舵中位
data.aux1 = -512; // 5通道默认状态(OFF映射值)
data.aux2 = -512; // 6通道默认状态(OFF映射值)
}

功能:系统启动时初始化各通道至安全状态,避免设备因初始值异常导致误操作,同时统一通道初始基准。


(三)核心工具函数


1. 死区处理函数


int applyDeadzone(int value, int deadzone, int center) {
if (abs(value - center) <= deadzone) {
    return center; // 落入死区范围,强制设为中心值,过滤抖动
}
return value;    // 超出死区,保留原始采集值
}

作用:针对摇杆中位附近的机械抖动,通过阈值判断过滤微小信号变化,确保摇杆静止时输出稳定的中心值,提升控制精度。


2. 带重试机制的发送函数


bool sendData(const void* data, size_t dataSize) {
for (int retryCount = 0; retryCount < maxRetries; retryCount++) {
    if (radio.write(data, dataSize)) {
      // 发送成功,输出重试次数(0表示首次发送成功)
      Serial.print("发送成功,重试次数:");
      Serial.println(retryCount);
      return true;
    }
    delay(retryDelay); // 发送失败,延时后重试
}
// 达到最大重试次数仍失败,输出错误信息
Serial.println("发送失败,已达到最大重试次数");
return false;
}

核心优势:通过软件重试机制解决无线传输中的临时干扰问题,配合串口输出的状态信息,便于调试通信故障;重试次数和间隔可根据实际场景灵活调整。


(四)系统初始化函数(setup)


void setup() {
// NRF24L01模块配置
radio.begin();
radio.openWritingPipe(pipeOut);// 配置发送通道地址
radio.stopListening();         // 切换为发射模式
// 优化传输参数:低速率提升抗干扰,高功率延长距离,硬件重试增强可靠性
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_HIGH);
radio.setRetries(5, 10);      

ResetData();                     // 初始化通道数据
Serial.begin(115200);            // 启动串口调试(波特率115200)
analogReadResolution(10);      // 设置ADC为10位分辨率(采集范围0~1023)

// 配置引脚模式(启用内部上拉电阻,避免引脚悬空导致信号不稳定)
pinMode(15, INPUT_PULLUP);   // 1通道方向拨码开关
pinMode(26, INPUT_PULLUP);   // 2通道方向拨码开关
pinMode(27, INPUT_PULLUP);   // 3通道方向拨码开关
pinMode(28, INPUT_PULLUP);   // 4通道方向拨码开关
pinMode(7, INPUT_PULLUP);    // 5通道扭子开关
pinMode(8, INPUT_PULLUP);    // 6通道扭子开关
pinMode(12, OUTPUT);         // 有源蜂鸣器控制引脚

// 系统启动提示(有源蜂鸣器3次短鸣)
for(int i=0; i<3; i++){
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
    delay(100);
}
}

初始化流程:完成 NRF24L01 模块参数配置、通道数据初始化、串口与 ADC 配置、引脚模式设置,最后通过蜂鸣器反馈启动状态,确保系统启动后处于稳定就绪状态。


(五)主循环函数(loop)


void loop() {
// 1. 采集1-4通道摇杆模拟信号并映射至目标范围(-512~512)
int raw_ele = map(analogRead(2), 2, 840, -512, 512);// 升降舵原始值
int raw_ail = map(analogRead(3), 2, 838, -512, 512);// 副翼原始值
int raw_thr = map(analogRead(4), 0, 839, -512, 512);// 油门原始值
int raw_rud = map(analogRead(5), 2, 838, -512, 512);// 方向舵原始值

// 2. 应用死区处理,过滤摇杆抖动
data.ele = applyDeadzone(raw_ele, deadzone, 0);
data.ail = applyDeadzone(raw_ail, deadzone, 0);
data.rud = applyDeadzone(raw_rud, deadzone, 0);
data.thr = applyDeadzone(raw_thr, deadzone, 0);

// 3. 采集5-6通道扭子开关信号并映射(ON=512,OFF=-512)
data.aux1 = digitalRead(7) ? 512 : -512;
data.aux2 = digitalRead(8) ? 512 : -512;

// 4. 通道正反向切换(拨码开关ON时反向,ON状态对应LOW电平)
data.ele = digitalRead(15) ? data.ele : -data.ele;
data.ail = digitalRead(26) ? data.ail : -data.ail;
data.thr = digitalRead(27) ? data.thr : -data.thr;
data.rud = digitalRead(28) ? data.rud : -data.rud;

// 5. 带重试机制的无线数据发送
sendData(&data, sizeof(Signal));

// 6. 串口调试输出,实时监控通道数据
Serial.print("ele:"); Serial.print(data.ele);
Serial.print(" ail:"); Serial.print(data.ail);
Serial.print(" thr:"); Serial.print(data.thr);
Serial.print(" rud:"); Serial.print(data.rud);
Serial.print(" aux1:"); Serial.print(data.aux1);
Serial.print(" aux2:"); Serial.println(data.aux2);

delay(20);// 控制发送频率为50Hz,平衡实时性与系统功耗
}

核心流程:循环执行信号采集、死区过滤、方向切换、数据发送与调试输出操作。通过map函数将 ADC 原始采集值转换为标准化控制范围,配合拨码开关实现通道方向自定义,最终通过带重试的发送函数将数据稳定传输至接收端。


六、功能测试

(一)1-4 通道测试(摇杆测试)

操作摇杆,通过串口打印验证数据在 0-255 范围线性变化,符合物理操作方向。

(二)正反向测试(4P拨码开关测试)


拨动拨码开关各档位,1-4 通道值反向(如 0→255、127→128),切换逻辑正确。

(三)5-6 通道测试(扭子开关测试)


切换扭子开关,数据在 0/1 间稳定切换,无抖动。

(四)无线传输与报警测试


接收端稳定接收 6 通道数据,低电压时蜂鸣器 3 次报警,正常时 1 次提示。

七、总结与改进

(一)总结

本项目通过模拟摇杆(1-4 通道)、两段扭子开关(5-6 通道)和 4P 拨码开关(方向控制)的组合,实现了功能完整的 6 通道 2.4G 遥控器,硬件布局清晰,软件逻辑简洁,可满足小型设备的基础控制需求。

(二)改进方向

1.加入 1-4 通道校准功能。
2.增加数据校验(如 CRC),提升无线传输抗干扰能力。
3.集成 OLED 屏显示各通道值与电源电压,直观监控状态。
4.支持锂电池供电与充电管理(TP4056 模块),提升便携性。

附件:








页: [1]
查看完整版本: 基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器