# 行空板 K10 离线语音全向轮小车 代码解读
一、头文件
- #include "asr.h"
-
- #include "unihiker_k10.h"
-
- #include <Microbit_Motor.h>
复制代码
1. `asr.h`:**离线语音识别库**
内置语音模块,不需要 WiFi / 互联网;固定唤醒词:**你好小新**,支持自定义语音命令。
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 () 上电初始化(只运行 1 次)
- 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");
-
- }
复制代码
逐行说明:
1. `k10.begin()`:初始化行空板底层硬件。
2. `asr.asrInit(CONTINUOUS, CN_MODE, 10000)`
- CONTINUOUS:持续监听模式
- CN\_MODE:中文识别
- 10000:语音会话超时时间 (ms)
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("已唤醒行空板小车.......", 6, 0xFF0000);
-
- k10.canvas->updateCanvas();
-
- }
-
- else {
-
- k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
- `asr.isWakeUp()`:检测是否说出唤醒词【你好小新】
- 唤醒成功 → 屏幕第 6 行红色提示文字
- 未唤醒待机 → 屏幕第 4 行蓝色文字提示唤醒词
> 规则:**不唤醒,所有运动指令完全不响应**
- // 前进
-
- if (asr.isDetectCmdID(0+1)) {
-
- motorbit.motorRun(M1, CW, 200);
-
- motorbit.motorRun(M2, CW, 200);
-
- motorbit.motorRun(M3, CCW, 200);
-
- motorbit.motorRun(M4, CCW, 200);
-
- k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
四轮差动向前直行;
`canvasText(x,y,颜色,字体,透明度,抗锯齿)`:自由坐标文字,固定 Y=180 显示运动状态。
- // 停车
-
- if (asr.isDetectCmdID(1+1)) {
-
- motorbit.motorStop(ALL);
-
- k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
`motorStop(ALL)` 关闭全部电机。
- // 后退
-
- if (asr.isDetectCmdID(2+1)) {
-
- motorbit.motorRun(M1, CCW, 200);
-
- motorbit.motorRun(M2, CCW, 200);
-
- motorbit.motorRun(M3, CW, 200);
-
- motorbit.motorRun(M4, CW, 200);
-
- k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
电机转向和前进相反,实现后退。
- // 右横走
-
- if (asr.isDetectCmdID(3+1)) {
-
- motorbit.motorRun(M2, CCW, 200);
-
- motorbit.motorRun(M4, CW, 200);
-
- k10.canvas->canvasText("K10 小车右横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
只驱动 M2、M4,M1、M3 静止,整车向右平移。
- // 左横走
-
- if (asr.isDetectCmdID(4+1)) {
-
- motorbit.motorRun(M2, CW, 200);
-
- motorbit.motorRun(M4, CCW, 200);
-
- k10.canvas->canvasText("K10小车左横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
只驱动 M2、M4 反向,整车向左平移。
- // 原地转圈
-
- if (asr.isDetectCmdID(5+1)) {
-
- motorbit.motorRun(M1, CW, 200);
-
- motorbit.motorRun(M3, CW, 200);
-
- motorbit.motorRun(M2, CW, 200);
-
- motorbit.motorRun(M4, CW, 200);
-
- k10.canvas->canvasText("K10小车原地转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
-
- k10.canvas->updateCanvas();
-
- }
复制代码
四个电机全部正转,实现原地自旋。
- k10.canvas->canvasClear(6);
-
- }
复制代码
清空画布第 6 行文字,防止唤醒提示文字持续叠加。
# 整体工作流程
1. 上电 → 硬件与语音模块初始化
2. 待机,持续监听唤醒词
3. 说出:**你好小新** → 唤醒语音系统
4. 说出运动指令,小车执行动作
5. 电机持续运转,**必须语音下达 “停车” 才能停机**
|