ESP32连接Elrs接收机,解析CRSF文件包并输出

        因为玩FPV的缘故手里有一个jumperT20遥控,总是想着怎么利用起来,前两天突发奇想买了个接收机,打算做遥控车。

        前期准备:ESP-Wroom-32(其他esp一样的,包含arduino的开发板也是一样的用法)、带有VScode或者Ardunio的电脑、Elrs接收机(我这里用的是915MHz的)、Elrs协议(包含接收机协议与频段的)的遥控器、杜邦线若干、数据线。

        第一步:接线,将Elrs接收机接到Esp32上,(Rx,Tx反接都懂,我这里使用软件串口,接到两个支持软件串口的引脚上,例如GPIO19,GPIO21)

        第二步:通电,检查Elrs版本,确保接收机和遥控器处于同一个版本中。如果同协议,同频率无法连接大概率是版本问题,小破站搜搜如何升级遥控器固件,这里有TOP大佬的T20的ELRS升级教程:BV1cm4y1Y71z

        接收机常亮一般是连接成功。

        第三步:写代码

代码如下,用了AlfredoCRSF库来解析CRSF信息,输出出来的数据还可以进行一定的处理,我懒得搞了,后面用区间匹配即可:

#include <AlfredoCRSF.h>
#include <HardwareSerial.h>

#define PIN_RX 19
#define PIN_TX 21

// Set up a new Serial object
HardwareSerial crsfSerial(1);
AlfredoCRSF crsf;

//Use crsf.getChannel(x) to get us channel values (1-16).
void printChannels()
{

//---------------------------全部输出--------------------------------//
  for (int ChannelNum = 1; ChannelNum <= 8; ChannelNum++)
  {
    Serial.print(crsf.getChannel(ChannelNum));

    Serial.print(", ");
  }
  Serial.println(" ");
  

 //--------------------------单独一个频道输出-------------------------//
/* Serial.print(crsf.getChannel(1));                     //单独一个频道1
 Serial.println(" ");
 */

}

void setup()
{
  Serial.begin(115200);
  Serial.println("COM Serial initialized");
  
  crsfSerial.begin(CRSF_BAUDRATE, SERIAL_8N1, PIN_RX, PIN_TX);
  if (!crsfSerial) while (1) Serial.println("Invalid crsfSerial configuration");

  crsf.begin(crsfSerial);
}

void loop()
{
    // Must call crsf.update() in loop() to process data
    crsf.update();
    printChannels();
}

根据个人使用适当修改后烧录到开发板,打开串口可以看到如下

移动右摇杆向左(CH1),观察变化:

可以看到减小了500,总行程是1000,得到数据后进一步处理,转换成PWM或者驱动指令即可实现对电机的控制。

<think>好的,用户需要一个基于ESP32 Wroom的完整代码框架,控制小车的各种硬件组件。首先,我需要考虑如何组织代码结构,使其模块化,便于调试和维护。用户提到的功能包括控制无刷电机、舵机、陀螺仪传感器、解析CRSF信号、USBHost读取方向盘信号以及串口测试模式。这些功能需要拆分成独立的子程序模块,每个模块对应一个头文件和源文件。 首先,主程序应该负责初始化和主循环调度。需要包含各个模块的头文件,在setup()中调用各个模块的初始化函数。主循环中,按顺序处理传感器数据、解析输入信号、执行控制逻辑,然后更新执行器。同时,可能需要处理串口调试信息。 接下来是各个模块的设计。电机控制部分,需要用到PWM信号控制无刷电机的速度和方向。ESP32的LEDC库可以用于生成PWM信号。每个电机可能需要单独的通道和引脚配置,所以应该在头文件中定义引脚和通道的宏。同样,舵机控制也使用PWM,但频率和分辨率可能不同,需要单独配置。 MPU6050模块需要使用I2C通信,可能需要Adafruit的MPU6050库或者类似的库来读取传感器数据。需要初始化传感器,定期读取数据,进行校准和滤波处理,比如互补滤波或卡尔曼滤波,以获取稳定的姿态数据。 CRSF信号解析涉及到串口通信,ESP32有多个硬件串口,可以选择一个合适的UART端口来接收CRSF数据。需要解析协议格式,提取通道数据,映射到控制指令。这部分可能需要参考CRSF协议文档,确保数据解析正确。 USBHost功能需要支持读取方向盘控制器的输入,可能需要使用USB Host Shield库或者其他兼容ESP32的USB库。需要识别方向盘设备,读取轴和按钮数据,转换为与CRSF信号相同的控制指令格式,以便统一处理。 串口测试模式需要监听串口输入,根据特定指令模拟控制信号,便于调试各个执行器。这部分可以通过串口通信实现,接收字符命令执行对应的动作,比如调整电机速度或舵机角度。 在代码结构上,每个模块应有对应的.h和.cpp文件,例如motor_control.h、servo_control.h等。主程序包含这些头文件,调用初始化函数和控制函数。需要确保全局变量和函数的作用域正确,避免命名冲突。 还需要考虑多任务处理,比如使用FreeRTOS的任务和队列来处理传感器数据读取和控制信号解析,但用户可能希望保持代码简单,所以暂时用主循环轮询的方式处理。如果实时性要求高,可能需要任务优先级和中断处理。 另外,代码中需要详细注释,每个函数的功能、参数、返回值都要说明清楚。头文件中定义宏、结构体和函数声明,源文件实现具体功能。例如,在motor_control.h中定义电机引脚、PWM参数,声明初始化函数和控制函数;在motor_control.cpp中实现这些函数,使用LEDC库配置PWM。 最后,测试和调试部分需要考虑如何验证每个模块的功能。可能需要逐步测试每个硬件组件,确保PWM输出正确,传感器数据准确,信号解析无误。串口调试模式可以方便地发送测试指令,观察小车的反应。 可能遇到的问题包括硬件兼容性、库的版本差异、中断冲突等。需要确保所有使用的库与ESP32兼容,且正确配置引脚和通信接口。例如,I2C的引脚可能需要上拉电阻,PWM频率和分辨率需要根据电机和舵机的要求设置。 总结来说,代码框架需要模块化设计,合理分配功能到各个子程序,使用适当的库和硬件接口,详细注释,考虑测试和调试的便捷性。接下来需要将这些思考转化为具体的代码结构,确保所有功能都能正确集成和编译运行。</think>根据您的需求,我为您构建了一个模块化的ESP32代码框架。以下是基于Arduino IDE的分层实现方案: ```cpp /* main.ino - 主控制程序 */ #include "motor_control.h" #include "servo_control.h" #include "mpu6050.h" #include "crsf_parser.h" #include "usb_host.h" #include "debug_mode.h" void setup() { Serial.begin(115200); init_motors(); // 初始化无刷电机PWM通道 init_servos(); // 初始化舵机控制 init_mpu6050(); // 初始化陀螺仪传感器 init_crsf(); // 初始化CRSF接收机 init_usb_host(); // 初始化USB Host init_debug_mode(); // 初始化调试模式 } void loop() { read_mpu6050(); // 读取姿态数据 parse_crsf(); // 解析遥控信号 read_usb_host(); // 读取方向盘输入 process_control(); // 综合控制逻辑 update_motors(); // 更新电机输出 update_servos(); // 更新舵机角度 handle_debug_mode(); // 处理调试指令 } ``` 各模块实现示例(建议每个.h/.cpp文件单独存放): ```cpp /* motor_control.h */ #pragma once #define MOTOR_FL_PIN 12 #define MOTOR_FR_PIN 13 #define MOTOR_RL_PIN 14 #define MOTOR_RR_PIN 15 #define PWM_FREQ 20000 #define PWM_RES 8 void init_motors(); void update_motors(); void set_motor_speed(uint8_t motor_id, float speed); ``` ```cpp /* motor_control.cpp */ #include <Arduino.h> #include "motor_control.h" void init_motors() { ledcSetup(0, PWM_FREQ, PWM_RES); // 前左电机 ledcAttachPin(MOTOR_FL_PIN, 0); // 类似配置其他三个电机... } void set_motor_speed(uint8_t motor_id, float speed) { speed = constrain(speed, 0, 1); uint32_t duty = speed * (1 << PWM_RES); switch(motor_id) { case 0: ledcWrite(0, duty); break; // 其他电机处理... } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值