2025-10-23 05:25:19 [显示全部楼层]
17浏览
查看: 17|回复: 0

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

[复制链接]
本帖最后由 豆爸 于 2025-10-23 06:02 编辑

一、项目概述

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

二、硬件组成与介绍

(一)硬件组成

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


(二)硬件介绍

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

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

2.IO扩展板
基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器图2

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

3. NRF24L01 模块

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


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

4. 模拟摇杆

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


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

5. 4P 拨码开关
基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器图3

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

6. 两段扭子开关(5-6 通道)
基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器图5

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

7. 有源蜂鸣器
基于 Firebeetle 2 ESP32-C5 的6通道2.4G 遥控器图4

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

三、硬件接线图

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

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


(二)其他外设连接


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


四、软件安装与库配置

(一)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

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



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

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


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

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


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


五、核心代码及说明

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


  1. #include <SPI.h>
  2. #include <nRF24L01.h>
  3. #include <RF24.h>
  4. // 无线通信基础配置
  5. const uint64_t pipeOut = 0x123456789;  // 与接收端匹配的通信地址,确保数据定向传输
  6. const int deadzone = 5;                // 摇杆死区阈值,过滤中位机械抖动
  7. // NRF24L01模块初始化(指定CE和CSN引脚)
  8. RF24 radio(9, 10);                     
  9. // 发送重试策略配置
  10. const int maxRetries = 3;       // 最大软件重试次数,平衡可靠性与实时性
  11. const int retryDelay = 10;      // 重试间隔(毫秒),避免通信拥堵
复制代码



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


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

1. 控制信号结构体


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



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


2. 通道数据初始化函数


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


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


(三)核心工具函数


1. 死区处理函数


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


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


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


  1. bool sendData(const void* data, size_t dataSize) {
  2.   for (int retryCount = 0; retryCount < maxRetries; retryCount++) {
  3.     if (radio.write(data, dataSize)) {
  4.       // 发送成功,输出重试次数(0表示首次发送成功)
  5.       Serial.print("发送成功,重试次数:");
  6.       Serial.println(retryCount);
  7.       return true;
  8.     }
  9.     delay(retryDelay); // 发送失败,延时后重试
  10.   }
  11.   // 达到最大重试次数仍失败,输出错误信息
  12.   Serial.println("发送失败,已达到最大重试次数");
  13.   return false;
  14. }
复制代码


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


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


  1. void setup() {
  2.   // NRF24L01模块配置
  3.   radio.begin();
  4.   radio.openWritingPipe(pipeOut);  // 配置发送通道地址
  5.   radio.stopListening();           // 切换为发射模式
  6.   // 优化传输参数:低速率提升抗干扰,高功率延长距离,硬件重试增强可靠性
  7.   radio.setDataRate(RF24_250KBPS);
  8.   radio.setPALevel(RF24_PA_HIGH);  
  9.   radio.setRetries(5, 10);        
  10.   ResetData();                     // 初始化通道数据
  11.   Serial.begin(115200);            // 启动串口调试(波特率115200)
  12.   analogReadResolution(10);        // 设置ADC为10位分辨率(采集范围0~1023)
  13.   // 配置引脚模式(启用内部上拉电阻,避免引脚悬空导致信号不稳定)
  14.   pinMode(15, INPUT_PULLUP);   // 1通道方向拨码开关
  15.   pinMode(26, INPUT_PULLUP);   // 2通道方向拨码开关
  16.   pinMode(27, INPUT_PULLUP);   // 3通道方向拨码开关
  17.   pinMode(28, INPUT_PULLUP);   // 4通道方向拨码开关
  18.   pinMode(7, INPUT_PULLUP);    // 5通道扭子开关
  19.   pinMode(8, INPUT_PULLUP);    // 6通道扭子开关
  20.   pinMode(12, OUTPUT);         // 有源蜂鸣器控制引脚
  21.   // 系统启动提示(有源蜂鸣器3次短鸣)
  22.   for(int i=0; i<3; i++){
  23.     digitalWrite(12, HIGH);
  24.     delay(100);
  25.     digitalWrite(12, LOW);
  26.     delay(100);
  27.   }
  28. }
复制代码


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


(五)主循环函数(loop)


  1. void loop() {
  2.   // 1. 采集1-4通道摇杆模拟信号并映射至目标范围(-512~512)
  3.   int raw_ele = map(analogRead(2), 2, 840, -512, 512);  // 升降舵原始值
  4.   int raw_ail = map(analogRead(3), 2, 838, -512, 512);  // 副翼原始值
  5.   int raw_thr = map(analogRead(4), 0, 839, -512, 512);  // 油门原始值
  6.   int raw_rud = map(analogRead(5), 2, 838, -512, 512);  // 方向舵原始值
  7.   
  8.   // 2. 应用死区处理,过滤摇杆抖动
  9.   data.ele = applyDeadzone(raw_ele, deadzone, 0);
  10.   data.ail = applyDeadzone(raw_ail, deadzone, 0);
  11.   data.rud = applyDeadzone(raw_rud, deadzone, 0);
  12.   data.thr = applyDeadzone(raw_thr, deadzone, 0);
  13.   
  14.   // 3. 采集5-6通道扭子开关信号并映射(ON=512,OFF=-512)
  15.   data.aux1 = digitalRead(7) ? 512 : -512;
  16.   data.aux2 = digitalRead(8) ? 512 : -512;
  17.   
  18.   // 4. 通道正反向切换(拨码开关ON时反向,ON状态对应LOW电平)
  19.   data.ele = digitalRead(15) ? data.ele : -data.ele;
  20.   data.ail = digitalRead(26) ? data.ail : -data.ail;
  21.   data.thr = digitalRead(27) ? data.thr : -data.thr;
  22.   data.rud = digitalRead(28) ? data.rud : -data.rud;
  23.   
  24.   // 5. 带重试机制的无线数据发送
  25.   sendData(&data, sizeof(Signal));
  26.   
  27.   // 6. 串口调试输出,实时监控通道数据
  28.   Serial.print("ele:"); Serial.print(data.ele);
  29.   Serial.print(" ail:"); Serial.print(data.ail);
  30.   Serial.print(" thr:"); Serial.print(data.thr);
  31.   Serial.print(" rud:"); Serial.print(data.rud);
  32.   Serial.print(" aux1:"); Serial.print(data.aux1);
  33.   Serial.print(" aux2:"); Serial.println(data.aux2);
  34.   
  35.   delay(20);  // 控制发送频率为50Hz,平衡实时性与系统功耗
  36. }
复制代码


核心流程:循环执行信号采集、死区过滤、方向切换、数据发送与调试输出操作。通过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 模块),提升便携性。


附件:

下载附件ESP32TX_6CH.zip




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail