15浏览
查看: 15|回复: 6

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

[复制链接]
本文基于已成功部署的迷你小龙虾 MimiClaw 项目,手把手教你将双电机差速小车升级为四电机麦克纳姆轮小车,实现前进、后退、左横移、右横移、原地左转、原地右转全向移动功能。所有代码均经过实战验证,支持飞书关键词远程控制,可直接复用,完美适配MimiClaw项目原有架构。

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

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

## 一、硬件选型与接线

1.1 硬件清单

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

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

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

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

## 二、电机驱动代码扩展(四轮支持,适配MimiClaw)

2.1 头文件修改:tool_motor.h

  1. #pragma once
  2. #include "esp_err.h"
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. // 电机初始化,适配MimiClaw项目初始化流程
  7. esp_err_t tool_motor_init(void);
  8. // 单电机控制:motor_id 0=左前 1=右前 2=左后 3=右后;dir=1正转/-1反转/0停止
  9. void motor_control(int motor_id, int dir);  
  10. // 兼容原有功能:双电机差速小车控制,保留MimiClaw原有控制逻辑
  11. void car_diff_control(int action);
  12. // 新增功能:麦克纳姆轮全向控制,适配MimiClaw项目控制需求
  13. // action定义:0停止 1前进 2后退 3左横移 4右横移 5原地左转 6原地右转
  14. void car_mecanum_control(int action);  
  15. // 工具执行函数(飞书/CLI调用,适配MimiClaw工具调用规范)
  16. esp_err_t tool_motor_single_execute(const char *in, char *out, size_t len);
  17. esp_err_t tool_car_diff_execute(const char *in, char *out, size_t len);
  18. esp_err_t tool_car_mecanum_execute(const char *in, char *out, size_t len);
  19. #ifdef __cplusplus
  20. }
  21. #endif
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

2.2 源文件核心修改:tool_motor.c

  1. #include "tool_motor.h"
  2. #include "driver/gpio.h"
  3. #include "esp_log.h"
  4. #include "cJSON.h"
  5. #include <string.h>
  6. static const char *TAG = "motor";
  7. // 四电机引脚映射:左前、右前、左后、右后,适配MimiClaw引脚分配规范
  8. static const int motor_pins[4][2] = {
  9.     {18, 17},   // 左前电机
  10.     {4,  5},    // 右前电机
  11.     {6,  7},    // 左后电机
  12.     {8,  9}     // 右后电机
  13. };
  14. static bool motor_initialized = false;
  15. // 电机初始化:配置4个电机共8路GPIO为输出模式,适配MimiClaw初始化流程
  16. esp_err_t tool_motor_init(void) {
  17.     if (motor_initialized) return ESP_OK;
  18.     for (int i = 0; i < 4; i++) {
  19.         for (int j = 0; j < 2; j++) {
  20.             int pin = motor_pins[i][j];
  21.             gpio_config_t io_conf = {
  22.                 .pin_bit_mask = (1ULL << pin),
  23.                 .mode = GPIO_MODE_OUTPUT,
  24.                 .pull_up_en = GPIO_PULLUP_DISABLE,
  25.                 .pull_down_en = GPIO_PULLDOWN_DISABLE,
  26.                 .intr_type = GPIO_INTR_DISABLE,
  27.             };
  28.             gpio_config(&io_conf);
  29.             gpio_set_level(pin, 0); // 初始电平置0,保障MimiClaw启动安全
  30.         }
  31.     }
  32.     motor_initialized = true;
  33.     ESP_LOGI(TAG, "四电机驱动初始化完成,适配MimiClaw项目");
  34.     return ESP_OK;
  35. }
  36. // 单电机独立控制
  37. void motor_control(int motor_id, int dir) {
  38.     if (motor_id < 0 || motor_id > 3) return;
  39.     int in1 = motor_pins[motor_id][0];
  40.     int in2 = motor_pins[motor_id][1];
  41.     switch (dir) {
  42.         case 1:  // 正转
  43.             gpio_set_level(in1, 1);
  44.             gpio_set_level(in2, 0);
  45.             break;
  46.         case -1: // 反转
  47.             gpio_set_level(in1, 0);
  48.             gpio_set_level(in2, 1);
  49.             break;
  50.         default: // 停止
  51.             gpio_set_level(in1, 0);
  52.             gpio_set_level(in2, 0);
  53.             break;
  54.     }
  55. }
  56. // 兼容原有双电机差速控制(仅使用前两轮),保留MimiClaw原有功能
  57. void car_diff_control(int action) {
  58.     int left = 0, right = 0;
  59.     switch (action) {
  60.         case 1: left = 1; right = 1; break;    // 前进
  61.         case 2: left = -1; right = -1; break;  // 后退
  62.         case 3: left = -1; right = 1; break;   // 左转
  63.         case 4: left = 1; right = -1; break;   // 右转
  64.         default: break;
  65.     }
  66.     motor_control(0, left);
  67.     motor_control(1, right);
  68.     motor_control(2, 0);
  69.     motor_control(3, 0);
  70. }
  71. // 核心:麦克纳姆轮全向运动控制逻辑,适配MimiClaw控制需求
  72. void car_mecanum_control(int action) {
  73.     int lf = 0, rf = 0, lr = 0, rr = 0;
  74.     switch (action) {
  75.         case 1: // 前进:四轮同步正转
  76.             lf = 1; rf = 1; lr = 1; rr = 1;
  77.             break;
  78.         case 2: // 后退:四轮同步反转
  79.             lf = -1; rf = -1; lr = -1; rr = -1;
  80.             break;
  81.         case 3: // 左横移:对角电机组合转动
  82.             lf = -1; rf = 1; lr = 1; rr = -1;
  83.             break;
  84.         case 4: // 右横移:对角电机反向组合
  85.             lf = 1; rf = -1; lr = -1; rr = 1;
  86.             break;
  87.         case 5: // 原地左转:左右轮反向转动
  88.             lf = -1; rf = 1; lr = -1; rr = 1;
  89.             break;
  90.         case 6: // 原地右转:左右轮反向转动
  91.             lf = 1; rf = -1; lr = 1; rr = -1;
  92.             break;
  93.         default: // 默认停止
  94.             break;
  95.     }
  96.     // 执行电机控制
  97.     motor_control(0, lf);
  98.     motor_control(1, rf);
  99.     motor_control(2, lr);
  100.     motor_control(3, rr);
  101. }
  102. // 工具函数实现:参考原有代码逻辑,保持不变,适配MimiClaw工具调用规范
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

## 三、飞书关键词控制扩展(适配MimiClaw飞书Bot)

在feishu_bot.c的handle_message_event函数中,新增麦克纳姆轮关键词匹配代码,适配MimiClaw飞书Bot原有消息处理逻辑:

  1. // 新增:麦克纳姆轮小车全向控制(适配MimiClaw飞书Bot指令规范)
  2. if (strstr(cleaned, "左横移") != NULL) {
  3.     car_mecanum_control(3);
  4.     feishu_send_message(chat_id, "小车执行左横移");
  5.     cJSON_Delete(content_obj);
  6.     return;
  7. }
  8. if (strstr(cleaned, "右横移") != NULL) {
  9.     car_mecanum_control(4);
  10.     feishu_send_message(chat_id, "小车执行右横移");
  11.     cJSON_Delete(content_obj);
  12.     return;
  13. }
  14. if (strstr(cleaned, "原地左转") != NULL || strstr(cleaned, "自旋左") != NULL) {
  15.     car_mecanum_control(5);
  16.     feishu_send_message(chat_id, "小车执行原地左转");
  17.     cJSON_Delete(content_obj);
  18.     return;
  19. }
  20. if (strstr(cleaned, "原地右转") != NULL || strstr(cleaned, "自旋右") != NULL) {
  21.     car_mecanum_control(6);
  22.     feishu_send_message(chat_id, "小车执行原地右转");
  23.     cJSON_Delete(content_obj);
  24.     return;
  25. }
  26. // 原有前进/后退关键词可保留,复用麦克纳姆轮控制逻辑,适配MimiClaw原有指令
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

## 四、工具注册配置(tool_registry.c,适配MimiClaw工具注册规范)

新增麦克纳姆轮小车控制工具,支持飞书/CLI调用,适配MimiClaw项目工具注册流程:

  1. // 定义麦克纳姆轮控制工具(适配MimiClaw工具定义规范)
  2. mimi_tool_t car_mecanum = {
  3.     .name = "car_mecanum",
  4.     .description = "麦克纳姆轮小车控制,支持:forward/backward/left/right/stop/left_spin/right_spin,适配MimiClaw项目",
  5.     .input_schema_json = "{"type":"object","properties":{"action":{"type":"string"}},"required":["action"]}",
  6.     .execute = tool_car_mecanum_execute,
  7. };
  8. // 注册工具,加入MimiClaw工具列表
  9. register_tool(&car_mecanum);
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

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

## 五、测试指令(适配MimiClaw控制方式)

1. 飞书文字控制(直接发送,适配MimiClaw飞书Bot指令)

  1. - 前进 → 小车直线前进
  2. - 后退 → 小车直线后退
  3. - 左横移 → 小车水平向左平移
  4. - 右横移 → 小车水平向右平移
  5. - 原地左转 → 小车原地逆时针旋转
  6. - 原地右转 → 小车原地顺时针旋转
复制代码

2. 串口CLI指令测试(JSON格式,适配MimiClaw CLI调试规范)

  1. car_mecanum {"action":"left"}    // 左横移
  2. car_mecanum {"action":"right"}   // 右横移
  3. car_mecanum {"action":"stop"}    // 停止
复制代码


回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail