【花雕动手做】行空板 K10 方盒内置式麦轮语音识别小车
2026-07-17516
AI 快速预览详细
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板。它集成了2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。这款开发板非常适合STEM教育场景,能够帮助孩子轻松实现语音识别小车等AI项目,提升编程和物联网技能。
![]() 行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。 主要特点 集成摄像头&内置算法,可进行离线图像检测 集成麦克风&内置算法,可进行离线语音识别 集成扬声器&内置算法,可进行离线语音合成 2.8寸彩色屏幕,数据展示更清晰 集成度高,利于教学 接口丰富,兼容软件多,扩展性好 ![]() |






【[花雕动手做] 行空板 K10 系列实验之方盒麦克纳姆轮内置式四驱语音识别小车 #人工智能技术 #语音识别 #行空板K10 #DIY动手做 #科技改变生活】
https://www.bilibili.com/video/BV1avKn6aEY5/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1avKn6aEY5/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
https://www.bilibili.com/video/BV1RbKn6vEUF/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1RbKn6vEUF/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
一、项目整体概况
### 硬件组合
行空板 K10 主控 + 离线 ASR 语音识别模块 + Microbit 四路直流电机驱动板 + 四轮麦克纳姆轮底盘
### 核心功能
1. 离线语音唤醒:唤醒固定关键词「你好小新」,唤醒后才可操控小车;
2. 7 条拼音语音指令:前进、停车、后退、右横移、左横移、原地转圈、斜向直行;
3. 麦克纳姆全向移动:依靠 45° 斜辊分力抵消原理,实现直行、横移、零半径自转、斜走;
4. 分级差异化调速:直行 / 横移低速稳行、转圈中速、斜向行走全速;
5. LCD 屏幕实时文字反馈,分层展示唤醒提示、小车运动状态。
二、头文件与全局对象解析
[code]#include "asr.h"
#include "unihiker_k10.h"
#include
1. `asr.h`:离线语音识别库,提供持续收音、人声唤醒、拼音指令匹配功能;
2. `unihiker_k10.h`:行空板底层驱动,封装屏幕画布、硬件初始化、IO 操作 API;
3. `Microbit_Motor.h`:四路电机专用驱动库,独立控制 M1 左前 / M2 右前 / M3 右后 / M4 左后四个麦轮电机。
[code]UNIHIKER_K10 k10;
ASR asr;
uint8_t screen_dir=2;
Microbit_Motor motorbit;[/code]
- `k10`:行空板主控实例,统一管理屏幕、主板通信总线;
- `asr`:语音识别实例,处理麦克风收音与人声解析;
- `screen_dir=2`:屏幕倒置显示,适配小车安装视角;
- `motorbit`:四路电机驱动实例
- `CW`:电机顺时针旋转
- `CCW`:电机逆时针旋转
- 速度参数范围 0~255,数值越大转速越快。
三、setup () 上电初始化(开机仅执行 1 次)
1. `k10.begin();`
初始化行空板全部底层硬件:I2C、串口、LCD 屏幕、板载外设总线。
2. 语音模块初始化
[code]asr.asrInit(CONTINUOUS, CN_MODE, 10000);
while(asr._asrState == 0){delay(100);}[/code]
- `CONTINUOUS`:不间断持续收音;
- `CN_MODE`:中文拼音识别模式,仅识别预存口令;
- `10000`:高抗噪灵敏度,过滤环境杂音,减少误唤醒;
- 循环阻塞等待语音识别模型加载完成,避免未就绪调用报错。
3. 屏幕初始化
[code]k10.initScreen(screen_dir);
k10.creatCanvas();[/code]
按倒置参数点亮屏幕,创建画布缓存,文字先存入缓存再统一刷新,降低屏幕闪烁。
4. 注册 7 条语音指令
[code]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, "zhuan quan"); // ID6 原地转圈
asr.addASRCommand(6+1, "xie zou"); // ID7 斜着走[/code]
离线语音模块仅能识别提前录入的拼音口令,无法识别未注册词语。
四、loop () 无限主循环,实时监听语音并控制小车
### 1. 唤醒状态屏幕提示逻辑
`asr.isWakeUp()` 判断是否识别唤醒词「你好小新」
- 唤醒成功:画布第 6 行红色文字 `已唤醒行空板小车.......`;
- 未唤醒待机:画布第 4 行蓝色文字 `唤醒词为“你好小新”`;
`updateCanvas()` 将画布缓存一次性刷新到实体屏幕。
### 2. Microbit 电机库核心 API
1. `motorRun(通道, 转向, 速度)`
- 通道:`ALL`同时控制四路电机 / M1/M2/M3/M4 单独单路;
- 转向:`CW`顺时针、`CCW`逆时针;
2. `motorStop(ALL)`:切断四路电机全部动力,小车立即锁死静止。
### 3. 每条语音指令电机控制逻辑
#### (1)qian jin 前进,速度 102
[code]motorbit.motorRun(ALL, CCW, 102);[/code]
四轮全部同步逆时针低速运转,麦克纳姆轮横向分力两两抵消,仅保留向前合力,行驶平稳不窜动。
#### (2)ting che 停车
[code]motorbit.motorStop(ALL);[/code]
四路电机同步断电刹车,小车立刻静止。
#### (3)hou tui 后退,速度 102
[code]motorbit.motorRun(ALL, CW, 102);[/code]
四轮全部同步顺时针低速反转,合力向后,直线平稳倒退。
#### (4)you heng 右横移,速度 100
[code]motorbit.motorRun(M1, CW, 100);
motorbit.motorRun(M2, CCW, 100);
motorbit.motorRun(M3, CCW, 100);
motorbit.motorRun(M4, CW, 100);[/code]
四轮差速配合,前后纵向推力完全抵消,只保留向右横向分力,整车平行右滑。
#### (5)zuo heng 左横移,速度 100
[code]motorbit.motorRun(M1, CCW, 100);
motorbit.motorRun(M2, CW, 100);
motorbit.motorRun(M3, CW, 100);
motorbit.motorRun(M4, CCW, 100);[/code]
电机转向与右横移全部反向,纵向分力抵消,合力向左,整车平行左滑。
#### (6)zhuan quan 原地转圈,速度 150
[code]motorbit.motorRun(M1, CCW, 150);
motorbit.motorRun(M2, CCW, 150);
motorbit.motorRun(M3, CW, 150);
motorbit.motorRun(M4, CW, 150);[/code]
左前、右前轮一组同向,右后、左后轮另一组反向,仅产生旋转力矩,无平移分量,原地顺时针自转,转速高于直行。
#### (7)xie zou 斜着走,速度 200
[code]motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M3, CW, 200);[/code]
仅左前 M1、右后 M3 电机全速运转,M2、M4 停机,推力合成左前方斜向直行。
### 4. 屏幕清理
[code]k10.canvas->canvasClear(6);[/code]
清空画布第 6 行及下方所有文字,清除唤醒提示残留内容,避免新旧文字重叠出现残影。
五、运动模式电机参数对照表
六、完整设备运行流程
1. 设备上电,初始化行空板硬件、语音识别模块,循环等待语音模型加载完成;
2. 初始化倒置 LCD 屏幕、创建绘图画布,批量注册 7 条拼音语音指令;
3. 麦克风不间断持续监听唤醒词「你好小新」;
4. 识别唤醒词后屏幕红色文字提示,未唤醒则蓝色文字提示唤醒口令;
5. 说出对应语音口令,四路电机按照麦克纳姆轮矢量差速逻辑运转,屏幕同步打印车辆运行状态;
6. 循环末尾自动清空屏幕下方文字,持续循环等待下一条语音指令。
实验开源代码
[code]// 引入离线语音识别库asr.h:提供语音唤醒、拼音指令识别、持续收音监听全套功能
#include "asr.h"
// 行空板K10主板底层驱动库:封装LCD屏幕、画布绘制、主板硬件初始化、系统总线管理API
#include "unihiker_k10.h"
// Microbit四路电机驱动库,专门适配四轮麦克纳姆轮底盘,独立控制M1/M2/M3/M4四路直流减速电机
#include
// ===================== 全局硬件对象实例化 =====================
UNIHIKER_K10 k10; // 行空板主控实例,统一管理屏幕、板载IO、底层通信总线
ASR asr; // 离线语音识别模块实例,负责麦克风收音、人声解析、唤醒判断
uint8_t screen_dir=2; // 屏幕旋转配置参数:数值2 = 屏幕倒置显示,适配小车安装视角
Microbit_Motor motorbit; // 四路电机驱动实例
/* 麦克纳姆四轮底盘电机编号标准定义
M1 = 左前轮
M2 = 右前轮
M3 = 右后轮
M4 = 左后轮
CW = Clockwise 电机顺时针旋转
CCW = CounterClockwise 电机逆时针旋转
速度参数取值范围 0~255,数值越大PWM占空比越高,电机转速越快 */
//=====================================================================
// setup() 上电初始化函数,设备开机/重启仅执行1次
// 功能:初始化主板硬件、语音识别模块、LCD画布,注册7条麦轮小车语音拼音指令
//=====================================================================
void setup() {
// 初始化行空板全部底层硬件资源:I2C、串口、屏幕、板载外设、IO总线
k10.begin();
// 离线语音识别模块初始化,传入3个核心配置参数
// 1.CONTINUOUS:持续收音模式,麦克风不间断循环监听环境人声
// 2.CN_MODE:中文识别模式,仅支持预先注册的中文拼音口令识别
// 3.10000:收音抗噪灵敏度阈值,数值越高过滤环境杂音、防止误唤醒能力越强
asr.asrInit(CONTINUOUS, CN_MODE, 10000);
// 阻塞循环等待语音识别模型加载完成
// _asrState == 0 代表语音模块未就绪,每100ms检测一次状态,避免未初始化调用导致程序报错
while(asr._asrState == 0){delay(100);}
// 根据screen_dir=2参数初始化倒置LCD显示屏
k10.initScreen(screen_dir);
// 创建屏幕绘图画布缓存区,所有文字先写入缓存,再统一刷新到屏幕,减少高频刷屏闪烁
k10.creatCanvas();
// 批量注册7条离线语音控制指令,离线ASR仅能识别提前录入的拼音
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, "zhuan quan"); // ID=6 语音口令:原地转圈
asr.addASRCommand(6+1, "xie zou"); // ID=7 语音口令:斜着走(斜向直行)
}
//=====================================================================
// loop() 主循环函数,硬件初始化完成后无限循环持续运行
// 功能:实时检测语音唤醒状态、匹配语音指令、输出四路电机控制信号,屏幕同步刷新小车运行状态文字
//=====================================================================
void loop() {
// 检测麦克风是否识别到固定唤醒关键词【你好小新】
if (asr.isWakeUp()) {
// 唤醒成功:在画布第6行绘制红色提示文字 RGB=0xFF0000
k10.canvas->canvasText("已唤醒行空板小车.......", 6, 0xFF0000);
// 将画布缓存内所有文字一次性刷新输出到实体LCD屏幕
k10.canvas->updateCanvas();
}
else {
// 未唤醒待机状态:画布第4行绘制蓝色提示文字 RGB=0x0000FF,提示用户唤醒口令
k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
k10.canvas->updateCanvas();
}
// ==========语音指令ID1:qian jin 小车直线前进(CCW四轮同步逆时针,低速102)==========
if (asr.isDetectCmdID(0+1)) {
// ALL参数代表同时控制M1/M2/M3/M4全部四路电机,统一逆时针旋转,速度102(中低速,行驶更稳)
// 四轮同向转动后,麦克纳姆轮横向分力两两抵消,仅保留向前的纵向合力,车身笔直前进
motorbit.motorRun(ALL, CCW, 102);
// 屏幕绘制状态大字:参数依次为 X坐标,Y坐标,文字黑色RGB,中英文字体,字号50,自动换行开启
k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID2:ting che 小车全部电机刹车停机==========
if (asr.isDetectCmdID(1+1)) {
// motorStop(ALL):同时切断四路电机驱动输出,电机断电锁死,小车立刻静止
motorbit.motorStop(ALL);
k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID3:hou tui 小车直线后退(CW四轮同步顺时针,低速102)==========
if (asr.isDetectCmdID(2+1)) {
// 四轮全部顺时针反转,与前进转向完全反向,纵向合力向后,车身直线倒退
motorbit.motorRun(ALL, CW, 102);
k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID4:you heng 车身整体向右横向平移,速度100==========
if (asr.isDetectCmdID(3+1)) {
// 麦克纳姆轮标准右横移差速组合:前后纵向推力完全抵消,仅保留向右横向合力
motorbit.motorRun(M1, CW, 100); // 左前轮顺时针
motorbit.motorRun(M2, CCW, 100); // 右前轮逆时针
motorbit.motorRun(M3, CCW, 100); // 右后轮逆时针
motorbit.motorRun(M4, CW, 100); // 左后轮顺时针
k10.canvas->canvasText("K10 小车右横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID5:zuo heng 车身整体向左横向平移,速度100==========
if (asr.isDetectCmdID(4+1)) {
// 所有电机转向与右横移完全反向,纵向分力抵消,横向合力向左,整车平行左滑
motorbit.motorRun(M1, CCW, 100); // 左前轮逆时针
motorbit.motorRun(M2, CW, 100); // 右前轮顺时针
motorbit.motorRun(M3, CW, 100); // 右后轮顺时针
motorbit.motorRun(M4, CCW, 100); // 左后轮逆时针
k10.canvas->canvasText("K10小车左横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID6:zhuan quan 原地顺时针转圈,转速150(比平移更快)==========
if (asr.isDetectCmdID(5+1)) {
// 对角电机同方向、两组对角反向转动,只产生纯旋转力矩,无前后左右平移分量,零半径原地自转
motorbit.motorRun(M1, CCW, 150); // 左前轮逆时针
motorbit.motorRun(M2, CCW, 150); // 右前轮逆时针
motorbit.motorRun(M3, CW, 150); // 右后轮顺时针
motorbit.motorRun(M4, CW, 150); // 左后轮顺时针
k10.canvas->canvasText("K10小车原地转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ==========语音指令ID7:xie zou 小车斜向行走(左前方斜走,高速200)==========
if (asr.isDetectCmdID(6+1)) {
// 仅左前M1、右后M3电机高速顺时针运转,M2右前、M4左后轮停机,推力合成左前方斜向合力
motorbit.motorRun(M1, 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);
}
[/code]
一、基础结构与核心原理
### 1. 物理构造
麦克纳姆轮(Mecanum Wheel)由两部分组成:
1. **主轮毂**:连接电机输出轴,是轮子主体支撑结构;
2. **斜置被动辊子**:一圈圆柱形小滚轮,以**45° 夹角**倾斜环绕在轮毂外圈,辊子可自由无阻力自转。
区别于普通橡胶轮、福来轮:
- 普通轮:只能沿主轴前后移动,转向必须差速转弯,无法横移;
- 福来轮:辊子与主轴垂直,最少 3 轮 120° 布局才能全向;
- 麦克纳姆轮:辊子 45° 斜角,**四轮矩形布局**即可实现平面全向移动。
### 2. 力学核心原理
单个麦克纳姆轮转动时,驱动力会分解成两个垂直分力:
- 沿轮毂切线的主推力;
- 沿 45° 被动辊子的侧向分力。
通过调整**四个轮子的转向、转速**,四组分力相互叠加、抵消,最终车身可以合成:向前、向后、左横、右横、原地自转、任意角度斜走 6 类运动,无需转动转向舵机,零转弯半径。
二、标准底盘布局(最通用四轮方案)
主流小车、AGV 统一采用**矩形对称四轮排布**,对角轮子辊子倾斜方向一致:
1. M1 左前轮:辊子右下倾斜
2. M2 右前轮:辊子左下倾斜
3. M3 右后轮:辊子右下倾斜
4. M4 左后轮:辊子左下倾斜
对角轮结构完全相同,保证矢量分力对称抵消,行驶不跑偏。
> 补充:三轮无法做标准麦克纳姆底盘,最少四轮;六轮多用于重载大型 AGV。
三、六种基础运动矢量逻辑
### 1. 直线前进
四轮全部同方向同速旋转;横向分力两两抵消,只保留向前合力,车身笔直直行。
### 2. 直线后退
四轮全部反向同速旋转,合力向后,直线倒退。
### 3. 车身整体右横移
左前、右后轮一组转向,右前、左后轮反向;前后纵向分力完全抵消,仅保留向右横向推力,车身平行右滑。
### 4. 车身整体左横移
电机转向与右横移全部反向,整车向左平行滑动。
### 5. 原地零半径自转(顺时针 / 逆时针)
对角电机同向、两组对角反向旋转,只产生旋转力矩,无前后左右平移,原地转圈。
### 6. 斜向任意角度行走
调整左右、前后两组轮子转速比例,纵向 + 横向分力同时存在,实现 45°/30°/60° 等任意斜向直行。
四、硬件驱动分类
### 1. 直流减速有刷电机(创客小车主流)
搭配 L298N、TB6612、Microbit 电机驱动板,PWM 调速,成本低,适合行空板、掌控板创客教学小车。
### 2. 6 线无刷直流麦轮电机(大功率载重款)
内置驱动板,引出启动 EN、转向 DIR、PWM 调速、限速反馈线,支持宽电压、大扭矩,载重更强,可解除限速全速运行。
### 3. 伺服一体化麦克纳姆轮(工业 AGV)
集成编码器、闭环驱动,自带 PID 调速,载重百公斤级,用于工厂物料搬运机器人。
五、优势特点
1. **全向移动,零转弯半径**
狭小空间灵活运动,仓储、室内巡检、桌面小车、竞赛机器人优势极大,普通两轮差速小车无法横移。
2. **运动顺滑,受力均衡**
四轮对称受力,相比三轮福来轮重心更稳,重载不易抖动、侧翻。
3. **控制逻辑标准化**
固定矢量分配规则,代码模块化,可快速实现前进、横移、自转等全部动作。
4. **场景适配广**
从小型桌面创客小车,到工厂吨级重载 AGV、赛场格斗机器人、医院物资转运车都在使用。
六、缺点与使用局限
1. **地面要求高**
辊子为硬质塑料 / 橡胶,地面凹凸、缝隙、地毯会卡住小辊子,出现卡顿、跑偏;最佳地面:平整瓷砖、环氧地坪、光滑木板。
2. **磨损更快**
横向移动时被动辊子持续摩擦地面,长期横移会损耗外圈小滚轮,需要定期更换耗材。
3. 同等功率下速度略慢
力被分解为两个分力,纯直行有效推力只有电机输出的 70% 左右,想要和普通轮同速需要更大扭矩电机。
4. 成本更高
一套四个麦克纳姆轮价格远高于普通橡胶驱动轮,配套四路独立电机驱动,硬件成本翻倍。
七、主流应用场景
### 1. 创客教育场景
行空板、ESP32、掌控板语音遥控小车,竞赛机器人、智能桌面搬运小车,适合学习矢量运动、物联网远程控制。
### 2. 工业 AGV 物流机器人
工厂车间物料转运、仓储货架取货机器人,狭小过道无需转弯,直接横移进出工位。
### 3. 商用服务机器人
酒店送餐机器人、医院药品转运机器人、展厅巡检安防机器人。
### 4. 竞赛与特种设备
格斗机器人、水下推进载体、舞台灯光移动载具、精密仪器平移平台。
接脚 IO 扩展模块
语音识别合成相关说明