这个基于ESP32-S3的智能小车控制系统,通过WiFi网页实现了远程操控和实时数据监控。系统采用WebSocket协议进行双向通信,能够实时传输控制指令和传感器数据。相比传统的HTTP轮询方式,WebSocket的实时性优势在这个项目中得到了充分体现。
核心功能包括:
code复制ESP32-S3引脚 → L298N模块
GPIO1 → IN1 (左电机方向1)
GPIO2 → IN2 (左电机方向2)
GPIO3 → ENA (左电机PWM)
GPIO4 → IN3 (右电机方向1)
GPIO5 → IN4 (右电机方向2)
GPIO6 → ENB (右电机PWM)
编码器连接:
左电机A相 → GPIO7
左电机B相 → GPIO8
右电机A相 → GPIO9
右电机B相 → GPIO10
电池电压检测:
电池分压输出 → GPIO11 (ADC输入)
注意:实际接线时务必确认电机极性,错误的接线可能导致电机反转或驱动芯片损坏。建议先单独测试每个电机转向。
初始化阶段:
运行阶段:
cpp复制// 左轮PID计算
eL = target_speed - speedL; // 速度误差
iL += eL; // 积分项
iL = constrain(iL, -200, 200); // 积分限幅
outL = Kp*eL + Ki*iL + Kd*(eL-last_eL); // PID输出
last_eL = eL; // 保存误差
motorL(outL); // 输出到电机
PID参数调节建议:
编码器每转产生44个脉冲(根据电机型号可能不同),通过测量固定时间间隔(50ms)内的脉冲数计算转速:
code复制速度(pulse/50ms) = 当前脉冲数 - 上次脉冲数
线速度(mm/s) = 速度 * (π*轮径)/脉冲数 * (1000/50)
cpp复制// 计算旋转1度需要的总脉冲数
const float PULSE_PER_DEG = (PI * WHEEL_DISTANCE) / 360.0 / DIST_PER_PULSE;
当执行90°转向时,目标脉冲数为:
code复制pulse_angle = 90 * PULSE_PER_DEG;
控制页面主要包含以下功能区域:
javascript复制// 建立WebSocket连接
let ws = new WebSocket("ws://" + location.hostname + ":81");
// 接收数据并更新页面
ws.onmessage = (e) => {
let d = JSON.parse(e.data);
document.getElementById("spL").innerText = d.speedL;
// 更新其他显示项...
};
// 发送控制指令
function go(cmd) { ws.send(cmd); }
// 发送速度设置
function setSpeed(val) {
ws.send("SPEED:" + val);
}
ESP32与网页间通过JSON格式交换数据:
json复制{
"speedL": 45, // 左轮速度(pulse/50ms)
"speedR": 43, // 右轮速度
"dist": 1250.5, // 总行驶距离(mm)
"bat": 7.85 // 电池电压(V)
}
WiFi连接失败:
电机不转或转向错误:
编码器读数异常:
网页无法连接:
中断优化:
通信优化:
电源管理:
添加摄像头模块:
环境传感器集成:
手机APP控制:
运动控制算法:
多机协作:
机器学习应用:
悬挂系统改进:
模块化设计:
能源系统升级:
机器人教学平台:
STEM教育套件:
AGV小车原型:
巡检机器人:
家庭服务机器人:
智能玩具开发:
在实际开发过程中,有几个关键点值得特别注意:
中断处理优化:
编码器中断频率可能很高,中断服务函数必须尽可能精简。最初版本我在中断中做了太多计算,导致系统响应变慢。后来只做简单的脉冲计数,把复杂计算移到主循环,性能明显改善。
WebSocket稳定性:
当网络状况不佳时,WebSocket连接可能意外断开。我添加了自动重连机制,当检测到连接断开时,前端会尝试重新建立连接,同时显示连接状态提示用户。
电机驱动保护:
L298N模块在电机堵转时容易过热烧毁。我增加了电流检测和保护逻辑,当检测到异常大电流时会立即切断电机供电,并在网页显示警告信息。
移动端适配:
最初的网页在手机端操作体验不佳。通过添加触摸事件支持和响应式布局,现在在手机和平板上都能流畅操作。特别是方向控制按钮做了放大处理,便于触摸操作。
PID参数持久化:
调试好的PID参数需要保存到EEPROM,避免每次上电重新调整。我实现了通过网页界面调整并保存参数的功能,大大方便了现场调试。
这个项目最让我满意的是将复杂的控制算法和网络通信封装得足够简单,使用者只需修改几处参数就能适配不同的小车平台。看到小车按照指令精准移动,实时数据在网页上流畅更新,这种成就感是驱动我不断优化改进的最大动力。