# 行空板 K10 离线语音控制四轮麦克纳姆轮玩具小车 代码解读
一、头文件说明
- #include "asr.h"
-
- #include "unihiker_k10.h"
-
- #include <Microbit_Motor.h>
复制代码
1. `asr.h`:行空板内置离线语音识别库。支持唤醒词触发、自定义语音命令,**不需要联网**;默认唤醒词:**你好小新**。
2. `unihiker_k10.h`:行空板 K10 硬件驱动库,管理屏幕、绘图画布、字体显示。
3. `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");
-
- }
复制代码
逐行解析:
1. `k10.begin()`:初始化行空板全部底层硬件;
2. `asr.asrInit(CONTINUOUS, CN_MODE, 10000)`
- `CONTINUOUS`:持续监听模式
- `CN_MODE`:中文识别模式
- `10000`:语音会话超时时间,单位毫秒
3. `while(asr._asrState == 0)` 阻塞循环,等待语音模块硬件初始化完成,未就绪不向下运行;
4. `initScreen` 设置屏幕方向,`creatCanvas` 创建画布;
5. `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. 待机监听唤醒词;
3. 说出 **你好小新** → 唤醒;
4. 紧接着说出语音指令,小车执行对应运动;
5. 下达运动指令后电机持续运转,**必须语音喊 “停车” 才能停机**。
# 核心要点
## 1. 底盘适配
代码为**四轮麦克纳姆轮专用时序**,支持前进、后退、左右横移、原地旋转、斜走。普通两轮差速小车无法实现横移。
## 2. 无阻塞优势
代码全程没有`delay()`,语音识别持续工作,不会出现指令响应卡顿。
## 3. 两种画布打印方式区分
- `canvasText(文字,行号,颜色)`:按行数排版,适合提示信息;
- `canvasText(X,Y,颜色,字体,透明度,抗锯齿)`:自由坐标,固定位置显示运动状态。
|