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






【行空板 K10 系列实验之TT马达差速双驱五角轮离线语音识别智能小车 #行空板K10 #人工智能技术 #语音识别 #手工机械爱好者 #diy机器人】
https://www.bilibili.com/video/BV1ok3E61Evv/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1ok3E61Evv/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
一、头文件
[code]#include "asr.h"
#include "unihiker_k10.h"
#include
1. `asr.h`:行空板离线语音识别库,支持唤醒词 + 自定义语音指令识别,**不需要联网**;
2. `unihiker_k10.h`:行空板 K10 底层硬件库,驱动屏幕、画布;
3. `Microbit_Motor.h`:microbit 电机拓展板驱动库,控制直流电机 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`:四路电机驱动对象。
三、setup () 上电初始化(仅执行一次)
[code]void setup() {
k10.begin();
asr.asrInit(CONTINUOUS, CN_MODE, 10000);
while(asr._asrState == 0){delay(100);}
k10.initScreen(screen_dir);
k10.creatCanvas();
asr.addASRCommand(0+1, "qian jin");
asr.addASRCommand(1+1, "ting che");
asr.addASRCommand(2+1, "hou tui");
asr.addASRCommand(3+1, "you zhuan");
asr.addASRCommand(4+1, "zuo zhuan");
asr.addASRCommand(5+1, "zhuan quan");
}[/code]
逐行解析:
1. `k10.begin()`:初始化行空板所有硬件;
2. `asr.asrInit(CONTINUOUS, CN_MODE, 10000)`
- `CONTINUOUS`:持续监听模式
- `CN_MODE`:中文识别模式
- `10000`:语音会话超时时间(毫秒)
3. `while(asr._asrState == 0)` 阻塞等待语音模块初始化完成,初始化不成功不往下执行;
4. 初始化屏幕方向、创建绘图画布;
5. `asr.addASRCommand(指令ID,拼音)`
注册语音指令,**识别关键词必须填写拼音,不能写汉字**;
> 默认唤醒词:**你好小新**
> 规则:必须先说唤醒词,再下达运动指令,语音模块才会识别命令。
四、loop () 无限主循环
[code]void loop() {
if (asr.isWakeUp()) {
k10.canvas->canvasText(" 已唤醒行空板.......", 7, 0xFF0000);
k10.canvas->updateCanvas();
}
else {
k10.canvas->canvasText(" 行空板K10系列实验", 3, 0x009900);
k10.canvas->canvasText("唤醒词为“你好小新”", 5, 0x0000FF);
k10.canvas->updateCanvas();
}[/code]
- `asr.isWakeUp()`:判断是否识别到唤醒词【你好小新】
- 唤醒成功:屏幕第 7 行红色文字提示;
- 未唤醒:显示待机提示,告知用户唤醒词。
[code] if (asr.isDetectCmdID(0+1)) {
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M4, CCW, 200);
k10.canvas->canvasText(" K10 小车前进", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}[/code]
识别到【前进】:M1 正转,M4 反转,小车向前直行。
> 文字语法:canvasText (x 坐标,y 坐标,颜色,字体,透明度,抗锯齿),自由位置文字,不按行排布。
[code] if (asr.isDetectCmdID(1+1)) {
motorbit.motorStop(ALL);
k10.canvas->canvasText(" K10 小车停止", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}[/code]
识别【停车】:停止全部电机。
[code] if (asr.isDetectCmdID(2+1)) {
k10.canvas->canvasText(" K10 小车后退", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CCW, 120);
motorbit.motorRun(M4, CW, 120);
}[/code]
识别【后退】:电机反向运转,速度 120(比前进慢)。
[code] if (asr.isDetectCmdID(3+1)) {
k10.canvas->canvasText(" K10 小车右转", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M4, CCW, 200);
delay(1000);
motorbit.motorStop(ALL);
}[/code]
识别【右转】:原地转向,持续 1 秒后自动停机。
[code] if (asr.isDetectCmdID(4+1)) {
k10.canvas->canvasText(" K10 小车左转", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M4, CW, 200);
delay(1000);
motorbit.motorStop(ALL);
}[/code]
识别【左转】:原地转向,持续 1 秒自动停机。
[code] if (asr.isDetectCmdID(5+1)) {
k10.canvas->canvasText(" K10小车原地转圈", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M4, CW, 200);
}[/code]
识别【原地转圈】:电机持续旋转,**不会自动停止**。
[code] k10.canvas->canvasClear(7);
}[/code]
循环末尾清空屏幕第 7 行文字,避免唤醒提示文字长期残留叠加。
# 功能总览
**离线语音两轮差速小车控制系统**
工作流程:
上电 → 语音模块初始化完成 → 持续监听唤醒词
1. 说出:**你好小新** → 系统唤醒;
2. 紧接着说出语音指令,小车执行动作。
指令清单
# 核心要点与代码缺陷【实操重点】
## 1、硬件底盘
仅使用 M1、M4 两路电机,**适配两轮差速小车**
不能直接用于三轮全向轮 / 四轮麦克纳姆轮。
## 2、阻塞问题
左转、右转内部使用 `delay(1000)`
delay 运行期间整个程序暂停,**语音识别暂时失效**,这段时间无法接收新指令。
## 3、运动模式区分
- 左转 / 右转:点动,1 秒自动停
- 前进 / 后退 / 转圈:持续运行,必须语音下达【停车】才能停机
## 4、语音识别关键规则
指令只能用拼音注册;必须先唤醒,否则所有指令无效;离线识别,不需要 WiFi、互联网。
## 5、两种屏幕文字接口区别
1. `canvasText(文字,行数,颜色)`:按固定行排版;
2. `canvasText(x,y,颜色,字体,...)`:自由坐标绘制,适合状态标题。
# 运行必备条件
1. Mind + 扩展库:unihiker\_k10、Microbit\_Motor、asr 离线语音库
2. 开发板:行空板 K10(esp32s3bit)
3. 硬件接线:左右两轮电机分别接 M1、M4。
实验开源代码
[code]// 行空板离线语音识别ASR库,提供唤醒词、语音指令识别功能
#include "asr.h"
// 行空板K10硬件底层库:屏幕、画布、字体等外设驱动
#include "unihiker_k10.h"
// Microbit电机拓展板驱动库,控制直流电机M1~M4
#include
// 全局对象实例化
UNIHIKER_K10 k10; // K10主控硬件对象
ASR asr; // 离线语音识别对象
uint8_t screen_dir=2; // 屏幕方向参数 2:正向竖屏
Microbit_Motor motorbit; // 电机驱动对象
// 上电初始化函数,通电仅运行一次
void setup() {
// 初始化行空板全部硬件(屏幕、外设底层驱动)
k10.begin();
// 初始化语音识别模块
// CONTINUOUS:持续识别模式;CN_MODE:中文识别模式;10000:语音超时阈值(ms)
asr.asrInit(CONTINUOUS, CN_MODE, 10000);
// 阻塞等待语音模块初始化完成
// _asrState == 0 代表未就绪,循环等待直到初始化成功
while(asr._asrState == 0){delay(100);}
// 初始化屏幕方向
k10.initScreen(screen_dir);
// 创建画布,所有文字图形绘制载体
k10.creatCanvas();
// 注册语音指令:指令ID , 识别关键词(空格分隔拼音)
// ID+1 是库规范用法,ID从1开始计数
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 zhuan"); // ID4 右转
asr.addASRCommand(4+1, "zuo zhuan"); // ID5 左转
asr.addASRCommand(5+1, "zhuan quan"); // ID6 原地转圈
}
// 主循环,初始化完成后无限循环执行
void loop() {
// 判断:是否检测到唤醒词【你好小新】
if (asr.isWakeUp()) {
// 唤醒成功,第7行打印红色提示文本
k10.canvas->canvasText(" 已唤醒行空板.......", 7, 0xFF0000);
k10.canvas->updateCanvas();
}
else {
// 未唤醒,显示待机界面提示文字
k10.canvas->canvasText(" 行空板K10系列实验", 3, 0x009900);
k10.canvas->canvasText("唤醒词为“你好小新”", 5, 0x0000FF);
k10.canvas->updateCanvas();
}
// 检测识别到【前进】指令
if (asr.isDetectCmdID(0+1)) {
motorbit.motorRun(M1, CW, 200); // M1正转
motorbit.motorRun(M4, CCW, 200); // M4反转
// 自定义位置文字:X坐标0,Y坐标210,黑色字体,24号中英文字体,透明度50,抗锯齿开启
k10.canvas->canvasText(" K10 小车前进", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 检测识别到【停车】指令
if (asr.isDetectCmdID(1+1)) {
motorbit.motorStop(ALL); // 停止全部电机
k10.canvas->canvasText(" K10 小车停止", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 检测识别到【后退】指令
if (asr.isDetectCmdID(2+1)) {
k10.canvas->canvasText(" K10 小车后退", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CCW, 120); // M1反转
motorbit.motorRun(M4, CW, 120); // M4正转
}
// 检测识别到【右转】指令
if (asr.isDetectCmdID(3+1)) {
k10.canvas->canvasText(" K10 小车右转", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M4, CCW, 200);
delay(1000); // 持续转动1秒
motorbit.motorStop(ALL);
}
// 检测识别到【左转】指令
if (asr.isDetectCmdID(4+1)) {
k10.canvas->canvasText(" K10 小车左转", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M4, CW, 200);
delay(1000); // 持续转动1秒
motorbit.motorStop(ALL);
}
// 检测识别到【原地转圈】指令
if (asr.isDetectCmdID(5+1)) {
k10.canvas->canvasText(" K10小车原地转圈", 0, 210, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M4, CW, 200);
}
// 清空画布第7行文字,防止唤醒提示文字残留
k10.canvas->canvasClear(7);
}
[/code]
一、什么是语音识别(ASR)
语音识别英文缩写是 ASR(Automatic Speech Recognition),简单来说:让单片机、电脑听懂人说话,把麦克风采集到的声音信号,转换成文字或者指令。
分为两大类:
在线语音识别:需要联网,把声音上传到云端服务器解析,识别词汇量巨大;
离线语音识别:不需要 WiFi、不需要网络,语音模型预先存放在芯片内部,本地直接处理声音,适合单片机、行空板、Arduino 这类硬件。
你代码里使用的就是离线本地 ASR 语音模块。
二、离线语音模块核心功能(对应你 K10 代码)
1. 两种工作模式
(1)持续拾音模式 CONTINUOUS
麦克风一直处于收音状态,不间断监听声音,专门用来做语音唤醒。
对应代码:asr.asrInit(CONTINUOUS, CN_MODE, 12000);
(2)按键触发模式
按下按键才开始录音识别,省电,一般用于命令词识别。
2. 语言模式 CN_MODE
CN_MODE:中文模式,只识别汉语;
EN_MODE:英文模式,识别英语。
本程序开启中文识别,用来识别唤醒词:你好小新。
3. 灵敏度阈值(第三个参数 12000)
数值代表声音检测灵敏度:
数值越大:越不容易被环境杂音误触发,抗干扰强;
数值越小:轻声说话就能识别,但是容易被噪音误唤醒。
12000 属于中等灵敏度,适合室内环境使用。
三、语音唤醒技术(本项目核心)
1. 唤醒词机制
唤醒词就是开门密码。模块平时处于低功耗监听状态,只监听这一句话,其他普通对话会直接忽略。
只有说出预设唤醒词(你好小新),模块才会被 “唤醒”,进入待命状态,之后才可以识别后续控制指令。
2. 代码里的唤醒检测函数
[code]asr.isWakeUp()[/code]
检测到唤醒词,函数返回 true;
没有检测到唤醒词,返回 false。
3. 模块状态标志
[code]asr._asrState[/code]
值 = 0:语音模块正在启动、模型加载中,暂时无法工作;
值 ≠ 0:初始化完成,可以正常收音识别。
程序中用 while 循环等待模块就绪,避免硬件未启动造成程序崩溃。
四、硬件运行完整工作流程
上电初始化行空板主板与显示屏;
启动 ASR 语音芯片,加载离线语音模型;
等待语音模块就绪;
屏幕打印实验标题;
模块持续收音,安静待机,只监听唤醒词;
使用者说出:你好小新;
程序捕捉到唤醒信号,屏幕切换文字提示 “已唤醒行空板”;
没有听到唤醒词,则一直显示唤醒词提示语句;
每秒刷新一次屏幕,并清除文字,防止画面重叠。
五、离线语音识别优缺点
优点
完全离线,不用网络、不用流量;
响应速度极快,话音刚落立刻识别;
单片机就能驱动,成本低,非常适合机器人、智能音箱、门禁、实验教具;
不受网络波动影响,设备在野外也能正常使用。
缺点
词汇数量有限,一般只能预先录入几十条唤醒词 + 控制指令;
对嘈杂环境比较敏感,噪音大会出现识别失败;
无法自由识别任意一句话,只能识别预先烧录好的词语。
六、拓展功能(可以在现有代码上升级)
多级指令识别
唤醒之后,再识别 “开灯”“关灯”“前进”“后退”,控制电机与 LED 灯;
自定义唤醒词
修改库文件,把 “你好小新” 改成 “你好行空板”;
多句话语音交互
唤醒后连续识别多条语音命令;
调节收音灵敏度,解决误唤醒或者识别不到声音的问题。
七、容易遇到的常见问题
识别不到唤醒词
调低阈值数值,靠近麦克风,降低环境噪音。
无缘无故自动唤醒(误触发)
把灵敏度数值调高,提高抗干扰能力。
程序卡死在初始化循环
语音模块接线异常,串口通信断开,导致模块始终处于未就绪状态。
扩展板模块
LED控制模块
语音识别与合成模块相关说明