【花雕】小龙虾 MimiClaw 二次开发:控制四电机全向运动

2026-04-191433
AI 快速预览详细 收起
本文介绍了如何将迷你小龙虾 MimiClaw 项目的双电机差速小车升级为四电机麦克纳姆轮小车,实现全向移动功能。所有代码均经过实战验证,支持飞书关键词远程控制。通过本文教程,你可以轻松实现前进、后退、左横移、右横移、原地左转、原地右转的全向移动功能。
本文基于已成功部署的迷你小龙虾 MimiClaw 项目,手把手教你将双电机差速小车升级为四电机麦克纳姆轮小车,实现前进、后退、左横移、右横移、原地左转、原地右转全向移动功能。所有代码均经过实战验证,支持飞书关键词远程控制,可直接复用,完美适配MimiClaw项目原有架构。

【花雕】小龙虾 MimiClaw 二次开发:控制四电机全向运动图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(9)
驴友花雕
驴友花雕
作者
## 七、关键注意事项(适配MimiClaw项目稳定性)
1. 电源安全四电机同时启动峰值电流超3A,必须使用5V/3A及以上独立电源,建议在电源端并联1000μF滤波电容,防止电压波动导致开发板重启,避免影响MimiClaw项目其他模块正常运行。
2. 麦克纳姆轮安装规范左前+右后轮滚轮方向为/,右前+左后轮滚轮方向为\,安装错误会导致横移方向异常;若方向相反,可交换电机IN1/IN2接线,或修改代码中电机dir值,确保适配MimiClaw小车机械结构。
3. 引脚冲突规避严格避开GPIO19/20(USB串口专用);GPIO6-9为默认空闲引脚,若开发板有其他外设占用,可自行修改引脚定义,避免与MimiClaw原有外设引脚冲突。
4. 电机方向校准单个电机转向错误时,无需重新接线,直接交换该电机对应的IN1/IN2引脚电平逻辑即可,确保与MimiClaw控制指令一致。
## 总结
1. 本次升级完全兼容MimiClaw项目原有双电机差速代码,无需删除旧功能,可无缝切换控制模式,不影响项目原有部署;
2. 核心是麦克纳姆轮对角电机组合控制逻辑,实现全向移动,适配MimiClaw项目扩展需求;
3. 硬件核心注意共地和大功率独立供电,软件直接复制代码即可运行,适配MimiClaw项目代码规范;
4. 支持飞书关键词+串口CLI双控制方式,调试和使用更便捷,完美适配MimiClaw项目的控制场景。
驴友花雕
驴友花雕
作者
视频记录
【【花雕动手做】小龙虾 MimiClaw 二次开发:控制四电机实现全向运动 #单片机diy #迷你小龙虾 #嵌入式mimiclaw #二次开发动手做 #机器人】
https://www.bilibili.com/video/BV1D3ddBmE9o/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1D3ddBmE9o/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
驴友花雕
驴友花雕
作者
## 六、实验场景图与视频记录




驴友花雕
驴友花雕
作者
## 五、测试指令(适配MimiClaw控制方式)
1. 飞书文字控制(直接发送,适配MimiClaw飞书Bot指令)
[code]- 前进 → 小车直线前进
- 后退 → 小车直线后退
- 左横移 → 小车水平向左平移
- 右横移 → 小车水平向右平移
- 原地左转 → 小车原地逆时针旋转
- 原地右转 → 小车原地顺时针旋转[/code]
2. 串口CLI指令测试(JSON格式,适配MimiClaw CLI调试规范)
[code]car_mecanum {"action":"left"} // 左横移
car_mecanum {"action":"right"} // 右横移
car_mecanum {"action":"stop"} // 停止[/code]
驴友花雕
驴友花雕
作者
## 四、工具注册配置(tool_registry.c,适配MimiClaw工具注册规范)
新增麦克纳姆轮小车控制工具,支持飞书/CLI调用,适配MimiClaw项目工具注册流程:
[code]// 定义麦克纳姆轮控制工具(适配MimiClaw工具定义规范)
mimi_tool_t car_mecanum = {
.name = "car_mecanum",
.description = "麦克纳姆轮小车控制,支持:forward/backward/left/right/stop/left_spin/right_spin,适配MimiClaw项目",
.input_schema_json = "{\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\"}},\"required\":[\"action\"]}",
.execute = tool_car_mecanum_execute,
};
// 注册工具,加入MimiClaw工具列表
register_tool(&car_mecanum);[/code]
驴友花雕
驴友花雕
作者
## 三、飞书关键词控制扩展(适配MimiClaw飞书Bot)
在feishu_bot.c的handle_message_event函数中,新增麦克纳姆轮关键词匹配代码,适配MimiClaw飞书Bot原有消息处理逻辑:
[code]// 新增:麦克纳姆轮小车全向控制(适配MimiClaw飞书Bot指令规范)
if (strstr(cleaned, "左横移") != NULL) {
car_mecanum_control(3);
feishu_send_message(chat_id, "小车执行左横移");
cJSON_Delete(content_obj);
return;
}
if (strstr(cleaned, "右横移") != NULL) {
car_mecanum_control(4);
feishu_send_message(chat_id, "小车执行右横移");
cJSON_Delete(content_obj);
return;
}
if (strstr(cleaned, "原地左转") != NULL || strstr(cleaned, "自旋左") != NULL) {
car_mecanum_control(5);
feishu_send_message(chat_id, "小车执行原地左转");
cJSON_Delete(content_obj);
return;
}
if (strstr(cleaned, "原地右转") != NULL || strstr(cleaned, "自旋右") != NULL) {
car_mecanum_control(6);
feishu_send_message(chat_id, "小车执行原地右转");
cJSON_Delete(content_obj);
return;
}
// 原有前进/后退关键词可保留,复用麦克纳姆轮控制逻辑,适配MimiClaw原有指令[/code]
驴友花雕
驴友花雕
作者
2.2 源文件核心修改:tool_motor.c
[code]#include "tool_motor.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "cJSON.h"
#include
static const char *TAG = "motor";
// 四电机引脚映射:左前、右前、左后、右后,适配MimiClaw引脚分配规范
static const int motor_pins[4][2] = {
{18, 17}, // 左前电机
{4, 5}, // 右前电机
{6, 7}, // 左后电机
{8, 9} // 右后电机
};
static bool motor_initialized = false;
// 电机初始化:配置4个电机共8路GPIO为输出模式,适配MimiClaw初始化流程
esp_err_t tool_motor_init(void) {
if (motor_initialized) return ESP_OK;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; j++) {
int pin = motor_pins[i][j];
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << pin),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io_conf);
gpio_set_level(pin, 0); // 初始电平置0,保障MimiClaw启动安全
}
}
motor_initialized = true;
ESP_LOGI(TAG, "四电机驱动初始化完成,适配MimiClaw项目");
return ESP_OK;
}
// 单电机独立控制
void motor_control(int motor_id, int dir) {
if (motor_id < 0 || motor_id > 3) return;
int in1 = motor_pins[motor_id][0];
int in2 = motor_pins[motor_id][1];
switch (dir) {
case 1: // 正转
gpio_set_level(in1, 1);
gpio_set_level(in2, 0);
break;
case -1: // 反转
gpio_set_level(in1, 0);
gpio_set_level(in2, 1);
break;
default: // 停止
gpio_set_level(in1, 0);
gpio_set_level(in2, 0);
break;
}
}
// 兼容原有双电机差速控制(仅使用前两轮),保留MimiClaw原有功能
void car_diff_control(int action) {
int left = 0, right = 0;
switch (action) {
case 1: left = 1; right = 1; break; // 前进
case 2: left = -1; right = -1; break; // 后退
case 3: left = -1; right = 1; break; // 左转
case 4: left = 1; right = -1; break; // 右转
default: break;
}
motor_control(0, left);
motor_control(1, right);
motor_control(2, 0);
motor_control(3, 0);
}
// 核心:麦克纳姆轮全向运动控制逻辑,适配MimiClaw控制需求
void car_mecanum_control(int action) {
int lf = 0, rf = 0, lr = 0, rr = 0;
switch (action) {
case 1: // 前进:四轮同步正转
lf = 1; rf = 1; lr = 1; rr = 1;
break;
case 2: // 后退:四轮同步反转
lf = -1; rf = -1; lr = -1; rr = -1;
break;
case 3: // 左横移:对角电机组合转动
lf = -1; rf = 1; lr = 1; rr = -1;
break;
case 4: // 右横移:对角电机反向组合
lf = 1; rf = -1; lr = -1; rr = 1;
break;
case 5: // 原地左转:左右轮反向转动
lf = -1; rf = 1; lr = -1; rr = 1;
break;
case 6: // 原地右转:左右轮反向转动
lf = 1; rf = -1; lr = 1; rr = -1;
break;
default: // 默认停止
break;
}
// 执行电机控制
motor_control(0, lf);
motor_control(1, rf);
motor_control(2, lr);
motor_control(3, rr);
}
// 工具函数实现:参考原有代码逻辑,保持不变,适配MimiClaw工具调用规范[/code]
驴友花雕
驴友花雕
作者
## 二、电机驱动代码扩展(四轮支持,适配MimiClaw)
2.1 头文件修改:tool_motor.h
[code]#pragma once
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
// 电机初始化,适配MimiClaw项目初始化流程
esp_err_t tool_motor_init(void);
// 单电机控制:motor_id 0=左前 1=右前 2=左后 3=右后;dir=1正转/-1反转/0停止
void motor_control(int motor_id, int dir);
// 兼容原有功能:双电机差速小车控制,保留MimiClaw原有控制逻辑
void car_diff_control(int action);
// 新增功能:麦克纳姆轮全向控制,适配MimiClaw项目控制需求
// action定义:0停止 1前进 2后退 3左横移 4右横移 5原地左转 6原地右转
void car_mecanum_control(int action);
// 工具执行函数(飞书/CLI调用,适配MimiClaw工具调用规范)
esp_err_t tool_motor_single_execute(const char *in, char *out, size_t len);
esp_err_t tool_car_diff_execute(const char *in, char *out, size_t len);
esp_err_t tool_car_mecanum_execute(const char *in, char *out, size_t len);
#ifdef __cplusplus
}
#endif[/code]
驴友花雕
驴友花雕
作者
## 一、硬件选型与接线
1.1 硬件清单

1.2 引脚分配(规避GPIO19/20冲突)
核心注意:所有模块必须共地,电机驱动模块VCC单独接外部5V/3A电源,禁止使用开发板5V供电,避免影响MimiClaw项目原有供电稳定性!

- 没有更多了 -