【花雕动手做】行空板 K10 系列实验之离线语音识别改装麦克娜姆轮玩具坦克小车


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

改装麦克娜姆轮玩具坦克小车






电机扩展板

主打:人工智能模块

语音识别合成相关说明


辅助:屏幕显示相关积木

接脚 IO 扩展模块


LED控制模块

【花雕动手做】行空板 K10 系列实验之离线语音识别改装麦克娜姆轮玩具坦克小车
实验开源代码
// 行空板离线语音识别ASR库,实现唤醒词、离线语音指令识别,无需联网
#include "asr.h"
// 行空板K10硬件底层驱动:屏幕、画布、字体等外设接口
#include "unihiker_k10.h"
// Microbit电机拓展板驱动库,控制四路直流电机M1/M2/M3/M4,适配四轮麦克纳姆轮
#include <Microbit_Motor.h>
// 全局对象实例化
UNIHIKER_K10 k10; // 行空板K10主控硬件对象
ASR asr; // 离线语音识别对象
uint8_t screen_dir=2; // 屏幕方向参数2:正向竖屏显示
Microbit_Motor motorbit; // 四路电机驱动对象
// 上电初始化函数,通电/复位仅执行一次
void setup() {
// 初始化行空板所有底层硬件驱动
k10.begin();
// 初始化离线语音模块
// CONTINUOUS:持续监听模式;CN_MODE:中文识别;10000:语音会话超时时间(毫秒)
asr.asrInit(CONTINUOUS, CN_MODE, 10000);
// 阻塞等待语音模块初始化完成
// _asrState == 0 代表模块未就绪,循环延时等待
while(asr._asrState == 0){delay(100);}
// 按照预设方向初始化屏幕
k10.initScreen(screen_dir);
// 创建绘图画布,所有文字、图形必须绘制在画布上
k10.creatCanvas();
// 注册语音指令:【指令ID,拼音关键词】
// 库规范:ID从1开始,所以使用 n+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 heng"); // ID4 右横走
asr.addASRCommand(4+1, "zuo heng"); // ID5 左横走
asr.addASRCommand(5+1, "zhuan quan");//ID6 原地转圈
asr.addASRCommand(6+1, "xie zou"); // ID7 斜着走
}
// 主循环,初始化完成后无限循环持续运行
void loop() {
// 判断是否识别到唤醒词【你好小新】
if (asr.isWakeUp()) {
// 唤醒成功,画布第1行输出红色提示文字
k10.canvas->canvasText("已唤醒行空板小车.......", 1, 0xFF0000);
k10.canvas->updateCanvas();
}
else {
// 未唤醒待机状态,第2行蓝色文字提示唤醒词
k10.canvas->canvasText("唤醒词为“你好小新”", 2, 0x0000FF);
k10.canvas->updateCanvas();
}
// ======语音指令识别分支======
// 识别【前进】:全部电机反转,小车直行前进
if (asr.isDetectCmdID(0+1)) {
motorbit.motorRun(ALL, CCW, 200);
// 自由坐标文字:X=0,Y=60,黑色,24号中英文字体
k10.canvas->canvasText(" K10 小车前进", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【停车】:停止所有电机
if (asr.isDetectCmdID(1+1)) {
motorbit.motorStop(ALL);
k10.canvas->canvasText(" K10 小车停止", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【后退】:全部电机正转,小车直行后退
if (asr.isDetectCmdID(2+1)) {
motorbit.motorRun(ALL, CW, 200);
k10.canvas->canvasText(" K10 小车后退", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【右横走】:麦克纳姆轮对角差速,整车向右横向平移
if (asr.isDetectCmdID(3+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M2, CW, 200);
motorbit.motorRun(M3, CCW, 200);
motorbit.motorRun(M4, CW, 200);
k10.canvas->canvasText(" K10 小车右横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【左横走】:麦克纳姆轮对角反向差速,整车向左横向平移
if (asr.isDetectCmdID(4+1)) {
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M2, CCW, 200);
motorbit.motorRun(M3, CW, 200);
motorbit.motorRun(M4, CCW, 200);
k10.canvas->canvasText(" K10小车左横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【原地转圈】:四轮差速实现原地自旋
if (asr.isDetectCmdID(5+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M2, CW, 200);
motorbit.motorRun(M3, CW, 200);
motorbit.motorRun(M4, CCW, 200);
k10.canvas->canvasText(" K10小车原地转圈", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 识别【斜着走】:M1、M3同步反转,实现斜向移动
if (asr.isDetectCmdID(6+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M3, CCW, 200);
k10.canvas->canvasText(" K10小车斜着走", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 清空画布第1行文字,避免唤醒提示文字残留叠加
k10.canvas->canvasClear(1);
}
行空板 K10 离线语音控制四轮麦克纳姆轮玩具小车 代码解读
一、头文件说明
#include “asr.h”
#include “unihiker_k10.h”
#include <Microbit_Motor.h>
asr.h:行空板内置离线语音识别库。支持唤醒词触发、自定义语音命令,不需要联网;默认唤醒词:你好小新。unihiker_k10.h:行空板 K10 硬件驱动库,管理屏幕、绘图画布、字体显示。Microbit_Motor.h:microbit 电机拓展板驱动库,独立控制 M1/M2/M3/M4 四路直流电机,适配四轮麦克纳姆轮底盘。
二、全局对象定义
UNIHIKER_K10 k10;
ASR asr;
uint8_t screen_dir=2;
Microbit_Motor motorbit;
k10:行空板主控硬件对象;asr:离线语音识别实例;screen_dir=2:屏幕正向竖屏;motorbit:四路电机驱动对象。
三、setup () 上电初始化(只执行一次)
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 heng”);
asr.addASRCommand(4+1, “zuo heng”);
asr.addASRCommand(5+1, “zhuan quan”);
asr.addASRCommand(6+1, “xie zou”);
}
逐行解析:
k10.begin():初始化行空板全部底层硬件;asr.asrInit(CONTINUOUS, CN_MODE, 10000)CONTINUOUS:持续监听模式CN_MODE:中文识别模式10000:语音会话超时时间,单位毫秒
while(asr._asrState == 0)阻塞循环,等待语音模块硬件初始化完成,未就绪不向下运行;initScreen设置屏幕方向,creatCanvas创建画布;asr.addASRCommand(指令ID,拼音)
重要:命令只能填写拼音,不能写中文;ID 从 1 开始,代码采用
n+1写法。

四、loop () 无限主循环
void loop() {
if (asr.isWakeUp()) {
k10.canvas->canvasText(“已唤醒行空板小车…”, 1, 0xFF0000);
k10.canvas->updateCanvas();
}
else {
k10.canvas->canvasText(“唤醒词为“你好小新””, 2, 0x0000FF);
k10.canvas->updateCanvas();
}asr.isWakeUp() 判断是否识别到唤醒词【你好小新】
- 唤醒成功:第 1 行红色文字提示;
- 未唤醒:第 2 行蓝色文字提示待机状态。
规则:没有唤醒,所有运动语音指令不会响应。
// 前进:所有电机CCW反转
if (asr.isDetectCmdID(0+1)) {
motorbit.motorRun(ALL, CCW, 200);
k10.canvas->canvasText(" K10 小车前进", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
canvasText(x,y,颜色,字体,透明度,抗锯齿):自由坐标绘制文字,固定在屏幕 Y=60 位置显示运动状态。
// 停车:停止全部电机
if (asr.isDetectCmdID(1+1)) {
motorbit.motorStop(ALL);
k10.canvas->canvasText(" K10 小车停止", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 后退:所有电机CW正转
if (asr.isDetectCmdID(2+1)) {
motorbit.motorRun(ALL, CW, 200);
k10.canvas->canvasText(" K10 小车后退", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 右横走 麦克纳姆轮经典横移时序
if (asr.isDetectCmdID(3+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M2, CW, 200);
motorbit.motorRun(M3, CCW, 200);
motorbit.motorRun(M4, CW, 200);
k10.canvas->canvasText(" K10 小车右横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 左横走
if (asr.isDetectCmdID(4+1)) {
motorbit.motorRun(M1, CW, 200);
motorbit.motorRun(M2, CCW, 200);
motorbit.motorRun(M3, CW, 200);
motorbit.motorRun(M4, CCW, 200);
k10.canvas->canvasText(" K10小车左横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 原地自旋
if (asr.isDetectCmdID(5+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M2, CW, 200);
motorbit.motorRun(M3, CW, 200);
motorbit.motorRun(M4, CCW, 200);
k10.canvas->canvasText(" K10小车原地转圈", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 斜向移动(仅M1、M3运转,M2、M4静止)
if (asr.isDetectCmdID(6+1)) {
motorbit.motorRun(M1, CCW, 200);
motorbit.motorRun(M3, CCW, 200);
k10.canvas->canvasText(" K10小车斜着走", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 清除第1行唤醒提示文字,防止文字叠加残留
k10.canvas->canvasClear(1);
}
整套方案工作流程
- 上电,语音模块初始化;
- 待机监听唤醒词;
- 说出 你好小新 → 唤醒;
- 紧接着说出语音指令,小车执行对应运动;
- 下达运动指令后电机持续运转,必须语音喊 “停车” 才能停机。
核心要点
1. 底盘适配
代码为四轮麦克纳姆轮专用时序,支持前进、后退、左右横移、原地旋转、斜走。普通两轮差速小车无法实现横移。
2. 无阻塞优势
代码全程没有delay(),语音识别持续工作,不会出现指令响应卡顿。
3. 两种画布打印方式区分
canvasText(文字,行号,颜色):按行数排版,适合提示信息;canvasText(X,Y,颜色,字体,透明度,抗锯齿):自由坐标,固定位置显示运动状态。
Mind+图形编程


实验场景图与视频记录





【【花雕动手做】行空板 K10 系列实验之离线语音识别改装麦克娜姆轮玩具坦克小车 #diy机器人 #坦克模型 #行空板K10 #机器人编程 #小车动手做】
更多推荐


所有评论(0)