欢迎光临
我们一直在努力

【花雕动手做】行空板 K10 系列实验之TT 马达三驱动全向福来轮语音识别控制小车

在这里插入图片描述 在这里插入图片描述

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点 集成摄像头&内置算法,可进行离线图像检测 集成麦克风&内置算法,可进行离线语音识别 集成扬声器&内置算法,可进行离线语音合成 2.8寸彩色屏幕,数据展示更清晰 集成度高,利于教学 接口丰富,兼容软件多,扩展性好

在这里插入图片描述 三驱全向福来轮小车使用的特色底板、TT马达、锂电池、全向福来轮与扩展板

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 知识点:三驱福来轮(三轮全向轮)控制原理 一、福来轮(全向 Omni 轮)基础结构与力学特性 福来轮vs麦克纳姆轮对比

  • 轮子结构 福来轮由主驱动轮毂 + 一圈垂直于主轴的被动小滚轮组成: 电机驱动主轮毂旋转,沿轮毂切线方向输出主动推力; 外圈小滚轮与主轴 90° 垂直,可无阻力被动横向滑动; 单个轮子只能输出单方向主动力,垂直主轴方向完全自由滑动。
  • 和麦克纳姆轮核心区别 麦克纳姆轮:斜 45° 辊子,单轮可同时分解横向 + 纵向分力,最少 4 轮底盘; 福来全向轮:辊子垂直主轴,单轮只有单向主动推力,必须 3 轮呈 120° 三角布局,依靠矢量叠加实现全向移动。
  • 二、三轮标准布局(核心硬件前提) 三个福来轮在圆形底盘上均匀正三角分布,两两夹角严格 120°,每个轮子主轴指向底盘几何中心:

    在这里插入图片描述

    三轮120°布局坐标系 1 号轮(前轮):安装角 90°,主轴沿车身 Y 轴正方向; 2 号轮(左后):安装角 210°; 3 号轮(右后):安装角 330°; 每个轮子独立配 1 个直流减速电机 + 驱动芯片,三路 PWM 独立调速、正反转控制。 关键:三个轮子缺一不可,两轮福来轮无法实现全向平移 / 原地自转。

    三、底层力学运动原理(矢量叠加核心) 单个福来轮仅能沿自身主轴方向产生推力,垂直主轴方向可自由滑动,无阻力; 三个轮子的推力矢量在 XY 平面叠加,合成车身X 横向、Y 纵向平移速度 + 绕中心旋转角速度; 通过修改三个电机的转速大小、旋转方向(正负速度),改变三个推力矢量,就能合成平面内任意运动:直行、横移、斜走、原地零半径旋转。 运动学速度换算公式(主控代码核心计算) 设车身目标运动: Vx:车身左右横向速度(右为正) Vy:车身前后纵向速度(前为正) ω:车身原地旋转角速度(顺时针为正) R:底盘中心到任意轮子的距离 三个轮子目标线速度: plaintext V1 = Vy + R·ω V2 = -0.5·Vy – 0.866·Vx + R·ω V3 = -0.5·Vy + 0.866·Vx + R·ω 计算结果正负号 = 电机转向;数值绝对值 = PWM 调速占空比; 主控收到前进 / 横移 / 转圈指令后,先算出 Vx、Vy、ω,再代入公式算出三路电机转速输出。

    四、6 种标准运动电机控制逻辑(对应语音遥控场景)

  • 直线向前(Vy>0,Vx=0,ω=0) 目标:仅纵向向前,无横向偏移、不旋转 计算结果: V1 = 正转,V2 = 反转,V3 = 反转,三轮速度绝对值相等 1 号轮向前推,2、3 号轮向后抵消横向分力,合力纯向前。
  • 直线向后(Vy<0,Vx=0,ω=0) 全部转向与前进反向:V1 反转,V2、V3 正转,速度大小一致。
  • 车身整体向右横移(Vx>0,Vy=0,ω=0) V1=0(前轮停机),V2 正转,V3 反转,速度相同; 2、3 轮推力合成纯向右合力,前轮横向自由滑动无阻力。
  • 车身整体向左横移(Vx<0,Vy=0,ω=0) V1 停机,V2 反转,V3 正转,左右合力向左。
  • 原地顺时针转圈(Vx=0,Vy=0,ω>0) V1、V2、V3 全部同向正转,速度大小完全相等; 三轮推力形成环绕中心的旋转力偶,无平移分量,原地自转。
  • 斜向行走(Vx、Vy 同时不为 0,ω=0) 三轮按公式分配不同转速,同时产生纵向 + 横向合力,车身斜向直行。
  • 停车 V1=V2=V3=0,三路电机全部断电刹车。
  • 五、电子控制完整流程(行空板 / ESP32 语音小车适配)

  • 硬件链路 主控(行空板 K10)→ 三路 PWM 引脚 → L298N/L9110S 电机驱动 → 三路 N20 减速电机 → 福来轮 PWM 占空比:0~255 对应速度大小; IO 高低电平控制电机 CW 正转 / CCW 反转; 可选:电机 AB 相编码器,采集脉冲做 PID 速度闭环,修正打滑误差。
  • 软件控制流程(语音小车逻辑) 语音识别模块接收口令(前进 / 右横 / 转圈),解析出目标 Vx、Vy、ω; 主控代入三轮运动学公式,计算 V1/V2/V3 三路电机目标速度; 将速度正负转为电机转向,数值转为 PWM 输出; 循环实时刷新三路电机转速,屏幕同步显示运动状态; 喊 “停车” 时三路电机全部置 0 停机。
  • 六、三轮福来轮 vs 四轮麦克纳姆轮优缺点对比

    在这里插入图片描述

    七、典型应用场景 创客教育语音遥控小车(你当前行空板语音项目); 小型桌面巡检机器人、绘图机器人; 狭小空间转运轻型物料 AGV; 云台小型全向移动底座。

    八、三轮驱动与四轮驱动全向福来轮配置图

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    【花雕动手做】行空板 K10 系列实验之TT 马达三驱动全向福来轮语音识别控制小车

    实验开源代码

    // 引入离线语音识别库asr.h,实现语音唤醒、拼音口令识别、持续收音监听
    #include "asr.h"
    // 行空板K10底层驱动库,负责LCD屏幕初始化、画布文字绘制、主板硬件初始化
    #include "unihiker_k10.h"
    // Microbit三路电机驱动库,适配三轮福来全向轮底盘,独立控制M1/M2/M3三路电机调速换向
    #include <Microbit_Motor.h>

    // =====================硬件对象实例化=====================
    UNIHIKER_K10 k10; // 行空板主控对象,统一管理屏幕、系统通信总线
    ASR asr; // 离线语音识别模块实例,处理麦克风收音与人声解析
    uint8_t screen_dir=2; // 屏幕旋转参数:数值2代表屏幕倒置显示
    Microbit_Motor motorbit; // 三路电机驱动实例,对应三轮福来轮底盘:M1、M2、M3三个独立电机

    //=====================================================================
    // setup() 上电初始化函数,设备开机/重启仅执行1次
    // 功能:初始化主板、语音模块、屏幕,批量注册7条三轮福来轮小车语音控制口令
    //=====================================================================
    void setup() {
    // 初始化行空板全部底层硬件:串口、I2C总线、LCD屏幕、外设IO资源
    k10.begin();

    // 初始化离线语音识别模块三大核心参数
    // CONTINUOUS:持续收音模式,麦克风不间断监听环境人声
    // CN_MODE:中文识别模式,仅识别中文拼音口令
    // 12000:收音灵敏度阈值,数值越大抗环境噪音、误唤醒能力越强
    asr.asrInit(CONTINUOUS, CN_MODE, 12000);

    // 阻塞循环等待语音模块加载语音模型完成
    // _asrState == 0 代表语音模块未就绪,每100ms循环检测一次状态,防止未初始化调用报错
    while(asr._asrState == 0){delay(100);}

    // 根据预设screen_dir参数初始化LCD显示屏
    k10.initScreen(screen_dir);
    // 创建屏幕绘图画布缓冲区,所有文字先写入画布缓存,统一刷新到实体屏幕
    k10.creatCanvas();

    // 批量注册7条离线语音小车控制指令(拼音匹配识别)
    asr.addASRCommand(0+1, "qian jin"); // ID=1 语音口令:前进
    asr.addASRCommand(1+1, "ting che"); // ID=2 语音口令:停车
    asr.addASRCommand(2+1, "hou tui"); // ID=3 语音口令:后退
    asr.addASRCommand(3+1, "you heng"); // ID=4 语音口令:右横移
    asr.addASRCommand(4+1, "zuo heng"); // ID=5 语音口令:左横移
    asr.addASRCommand(5+1, "shun zhuan"); // ID=6 语音口令:顺时针原地转圈
    asr.addASRCommand(6+1, "ni zhuan"); // ID=7 语音口令:逆时针原地转圈
    }

    //=====================================================================
    // loop() 主循环函数,初始化完成后无限循环运行
    // 功能:实时检测语音唤醒、识别语音口令,调用三路电机库控制三轮福来全向小车,同步屏幕状态大字
    //=====================================================================
    void loop() {
    // 语音唤醒判断:检测麦克风是否识别到固定唤醒词【你好小新】
    if (asr.isWakeUp()) {
    // 唤醒成功:画布第6行输出红色提示文字
    k10.canvas->canvasText("已唤醒行空板小车…….", 6, 0xFF0000);
    // 将画布缓存内容刷新输出到LCD实体屏幕
    k10.canvas->updateCanvas();
    }
    else {
    // 未唤醒待机状态:第4行输出蓝色文字,提示用户唤醒关键词
    k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令1:qian jin 小车直线前进(三轮福来轮)==========
    if (asr.isDetectCmdID(0+1)) {
    // motorRun(电机通道, 转向, 速度)
    // M2电机顺时针CW、M3电机逆时针CCW,M1不启动;三轮推力矢量合成纯向前合力
    motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CCW, 200);
    // 全屏居中24号黑色大字显示小车运行状态
    // 参数:X坐标、Y坐标、文字颜色、中英文字体、字号、自动换行开关
    k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令2:ting che 小车全部刹车停止==========
    if (asr.isDetectCmdID(1+1)) {
    // motorStop(ALL):一次性切断M1/M2/M3三路电机输出,电机断电锁死,小车立刻静止
    motorbit.motorStop(ALL);
    k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令3:hou tui 小车直线后退==========
    if (asr.isDetectCmdID(2+1)) {
    // M2逆时针CCW、M3顺时针CW,与前进转向完全反向,矢量合成纯向后推力
    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CW, 200);
    k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令4:you heng 小车整体向右横向平移==========
    if (asr.isDetectCmdID(3+1)) {
    // M1逆时针、M2顺时针、M3逆时针,三轮推力抵消纵向分力,合成向右横向合力
    motorbit.motorRun(M1, CCW, 200);
    motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CCW, 200);
    k10.canvas->canvasText("K10 小车右横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令5:zuo heng 小车整体向左横向平移==========
    if (asr.isDetectCmdID(4+1)) {
    // M1顺时针、M2逆时针、M3顺时针,三轮推力抵消纵向分力,合成向左横向合力
    motorbit.motorRun(M1, CW, 200);
    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CW, 200);
    k10.canvas->canvasText("K10小车左横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令6:shun zhuan 小车原地顺时针转圈==========
    if (asr.isDetectCmdID(5+1)) {
    // M1/M2/M3全部逆时针CCW同步转动,三轮推力形成环绕底盘中心的旋转力偶,无平移分量
    motorbit.motorRun(M1, CCW, 200);
    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CCW, 200);
    k10.canvas->canvasText("K10小车顺时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // ==========语音指令7:ni zhuan 小车原地逆时针转圈==========
    if (asr.isDetectCmdID(6+1)) {
    // M1/M2/M3全部顺时针CW同步转动,反向旋转力偶,车身原地逆时针自转
    motorbit.motorRun(M1, CW, 200);
    motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CW, 200);
    k10.canvas->canvasText("K10小车逆时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
    k10.canvas->updateCanvas();
    }

    // 清空画布第6行及下方所有文字,清除上一轮运动状态文字,防止新旧文字重叠产生残影
    k10.canvas->canvasClear(6);
    }

    代码解读

    一、项目整体功能 本程序硬件搭配:行空板 K10 + 离线 ASR 语音识别模块 + Microbit 三路电机驱动 + 三轮福来全向轮底盘,实现语音全向小车控制。 固定唤醒口令:你好小新; 共 7 组语音动作指令:前进、停车、后退、右横移、左横移、顺时针原地转圈、逆时针原地转圈; 依靠福来轮 90° 被动辊子矢量推力叠加,实现直行、左右横移、双向零半径自转; LCD 屏幕使用 24 号大号字体实时显示车辆当前运动状态,三路电机统一速度 200(调速范围 0~255)。

    二、头文件与硬件对象解析

    #include "asr.h"
    #include "unihiker_k10.h"
    #include <Microbit_Motor.h>

    asr.h:离线语音识别库,提供持续收音、唤醒检测、自定义拼音指令识别; unihiker_k10.h:行空板底层驱动,管理 LCD 屏幕、画布文字、主板硬件初始化; Microbit_Motor.h:三路电机专用驱动库,独立控制 M1/M2/M3 电机,适配三轮福来轮底盘。

    UNIHIKER_K10 k10;
    ASR asr;
    uint8_t screen_dir=2;
    Microbit_Motor motorbit;

    k10:行空板主控实例,负责屏幕显示、系统总线初始化; asr:语音识别实例,处理麦克风收音与人声解析; screen_dir=2:设置屏幕倒置显示; motorbit:三路电机驱动对象,对应三轮福来轮三个独立驱动电机 M1、M2、M3。

    三、setup () 上电初始化(仅开机运行 1 次)

    k10.begin();

    初始化行空板全部底层硬件、I2C / 串口总线、屏幕外设资源。

    asr.asrInit(CONTINUOUS, CN_MODE, 12000);
    while(asr._asrState == 0){delay(100);}

    语音模块初始化配置: CONTINUOUS:持续收音模式,麦克风实时监听环境人声; CN_MODE:中文识别模式,仅识别中文拼音口令; 12000:收音灵敏度,数值越大抗噪音、防误唤醒能力越强; 循环阻塞等待语音模块加载语音模型,硬件就绪后才执行后续代码。

    k10.initScreen(screen_dir);
    k10.creatCanvas();

    按照倒置参数点亮 LCD 屏幕,创建绘图缓存画布,所有文字先存入缓存,再统一刷新到屏幕,避免频繁刷屏闪烁。

    asr.addASRCommand(0+1, "qian jin"); // ID1 前进
    asr.addASRCommand(1+1, "ting che"); // ID2 停车
    asr.addASRCommand(2+1, "hou tui"); // ID3 后退
    asr.addASRCommand(3+1, "you heng"); // ID4 右横移
    asr.addASRCommand(4+1, "zuo heng"); // ID5 左横移
    asr.addASRCommand(5+1, "shun zhuan"); // ID6 顺时针转圈
    asr.addASRCommand(6+1, "ni zhuan"); // ID7 逆时针转圈

    批量注册 7 条离线语音拼音口令,离线语音模块仅能识别提前录入的指令,无法识别未注册词语。

    四、loop () 无限主循环,实时监听语音指令

  • 唤醒状态检测 asr.isWakeUp() 函数判断是否识别唤醒词「你好小新」: 唤醒成功:屏幕第 6 行红色文字提示 “已唤醒行空板小车”; 未唤醒待机:屏幕第 4 行蓝色文字提示唤醒口令; updateCanvas() 将画布缓存文字一次性刷新输出到实体屏幕。
  • Microbit 电机库核心函数说明 motorRun(通道, 转向, 速度) 通道:M1/M2/M3 单路电机,ALL 代表同时控制全部三路; 转向:CW顺时针,CCW逆时针; 速度区间:0~255,本程序统一使用 200 中高速; motorStop(ALL):切断三路电机全部输出,电机断电刹车,小车立刻锁死静止。
  • 每条语音指令运动逻辑(三轮福来轮矢量推力原理) ① qian jin 前进
  • motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CCW, 200);

    M1 前轮停机,M2、M3 后轮反向转动,两轮推力矢量叠加,横向分力抵消,合力纯向前,车身直线直行。 ② ting che 停车

    motorbit.motorStop(ALL);

    M1/M2/M3 三路电机全部停止输出,三轮无驱动力,小车立刻静止锁死。 ③ hou tui 后退

    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CW, 200);

    M2、M3 转向与前进完全反向,矢量合成纯向后推力,车身直线倒退。 ④ you heng 右横移

    motorbit.motorRun(M1, CCW, 200);
    motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CCW, 200);

    三轮配合转动,前后纵向推力相互抵消,仅保留向右横向合力,车身整体向右平移。 ⑤ zuo heng 左横移

    motorbit.motorRun(M1, CW, 200);
    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CW, 200);

    三轮推力抵消纵向分力,横向合力向左,车身整体向左平移。 ⑥ shun zhuan 顺时针原地转圈

    motorbit.motorRun(M1, CCW, 200);
    motorbit.motorRun(M2, CCW, 200);
    motorbit.motorRun(M3, CCW, 200);

    三轮全部同步逆时针转动,推力形成环绕底盘中心的旋转力偶,无平移分量,原地持续顺时针自转。 ⑦ ni zhuan 逆时针原地转圈

    motorbit.motorRun(M1, CW, 200);
    motorbit.motorRun(M2, CW, 200);
    motorbit.motorRun(M3, CW, 200);

    三轮全部同步顺时针转动,反向旋转力偶,车身原地逆时针持续自转。 4. 屏幕清理语句

    k10.canvas->canvasClear(6);

    清空画布第 6 行及下方所有文字,清除上一轮运动状态文字,防止新旧文字重叠产生残影。

    五、7 种运动模式电机配置对照表

    在这里插入图片描述

    六、完整设备运行流程 设备上电,初始化行空板硬件、语音模块,循环等待语音芯片加载语音模型; 初始化倒置 LCD 屏幕、创建绘图画布,录入 7 条小车语音控制拼音指令; 麦克风不间断持续监听唤醒词「你好小新」; 说出唤醒词解锁语音控制权限,屏幕红色文字提示已唤醒; 说出对应语音口令,三路电机按照三轮福来轮矢量差速逻辑运转,屏幕同步大字显示当前运动状态; 循环末尾自动清空屏幕下方文字,持续等待下一条语音指令。

    Mind+图形编程

    在这里插入图片描述 在这里插入图片描述

    实验场景图与视频记录

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    【【花雕动手做】行空板 K10 系列实验之TT 马达三驱动全向福来轮语音识别控制小车#自制小车 #人工智能机器人 #语音识别 #厉害了我的车】

    https://www.bilibili.com/video/BV1aVM36kEey/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987

    行空板 K10 之TT马达三驱全向轮语音小车

    赞(0)
    未经允许不得转载:171主机测评 » 【花雕动手做】行空板 K10 系列实验之TT 马达三驱动全向福来轮语音识别控制小车
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址