CHAPTER 15 / FIELD GUIDE
项目二:两轮机器人
完成有限、可停止的运动。
先明确这个版本的边界
本章成品是桌面调试的两轮小车:按键启动、缓慢增加输出、最多前进 2 秒,再自动停;运行中再按一次立即撤销输出。不包含自动导航或无人值守能力。先架空,之后在地面空旷区域低速测试。
差速转向
两轮同向且速度接近时前进;左慢右快向左转,反之向右转。左右轮反向可原地转动。用有符号命令表达方向:正数前进、负数后退、0 停止。它是电机输出命令,不是实际速度。
实验工程 · 10_robot
使用第 14 章两路接线。上电默认停止;正向指令每 10 ms 增加 10,最高 350/1023。
打开 main.c · 查看公共驱动 lab.c · 下载全部工程
#include "lab.h"
#include "esp_log.h"
// Wheels raised for initial tests. Button starts/stops a bounded forward movement.
// Physical motor-power switch remains the independent emergency stop.
void app_main(void) {
button_init();
motor_init();
motor_set(0,0);
bool running=false;
int duty=0;
int64_t stop_at=0;
TickType_t next=xTaskGetTickCount();
for(;; ) {
if(button_pressed()) {
running=!running;
stop_at=now_ms()+2000;
}
if(now_ms()>=stop_at)running=false;
if(running) {
duty+=10;
if(duty>350)duty=350;
}
else duty=0;
motor_set(duty,duty);
vTaskDelayUntil(&next,pdMS_TO_TICKS(10));
}
}装车前校准方向
- 架空轮子,先用 09_motor 检查左侧的正向。
- 断电后核对右侧接线;在单轮工程中用 motor_set(0,300) 检查右侧。
- 由于左右镜像安装,同样电机接线不一定得到同样车体方向。断电后交换某侧两根电机线,或明确在软件中反号。
- 运行 10_robot,确认两侧都朝车体前方转动。
- 地面低速测试;如果偏航,记录偏向,下一章用编码器解释原因。
未来接遥控时的停车规则
网络命令必须经过控制任务。控制任务保存最后一次有效命令的时间,超过例如 300 ms 未收到心跳就把目标设为 0;拒绝过期、格式错误和越界命令。网络回调只更新消息,不直接写 PWM。超时值要按网络质量和停车距离验证。
// 设计示意:只有控制任务写电机,不能直接替代本章工程
if (fault || now_ms() - last_valid_command_ms > 300) {
target_left = 0;
target_right = 0;
}
// 然后限幅、限制变化率,再输出。方向切换前先停稳。软件超时不是独立急停。如果控制任务卡死或系统崩溃,硬件 PWM 可能继续输出。因此物理电源开关必须保留;更高要求需要独立硬件看门狗 / 驱动使能设计。
停下来想一想
左右轮都给 350,车为什么仍然走不直?
查看推导与答案
同样 PWM 不等于同样轮速。电机差异、摩擦、负载、轮径和供电都会影响实际速度。要更稳定,需要测量轮速并反馈调节。
本章验收
本章一手资料
卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。