【花雕动手做】行空板 K10 系列实验之全向福来轮语音控制 TT 马达四驱小车
实验开源代码
- // 行空板K10离线语音识别库,提供唤醒词、离线语音指令识别(无需网络)
- #include "asr.h"
- // 行空板K10硬件底层驱动:屏幕、画布、中英文字体等外设接口
- #include "unihiker_k10.h"
- // Microbit电机拓展板驱动库,控制M1/M2/M3/M4四路直流电机,适配麦克纳姆轮底盘
- #include <Microbit_Motor.h>
-
- // 全局对象实例化
- UNIHIKER_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 原地转圈
- }
-
- // 主循环,初始化结束后无限循环运行
- void loop() {
- // 判断是否识别唤醒词【你好小新】
- if (asr.isWakeUp()) {
- // 唤醒成功,画布第6行打印红色提示
- k10.canvas->canvasText("已唤醒行空板小车.......", 6, 0xFF0000);
- k10.canvas->updateCanvas();
- }
- else {
- // 未唤醒待机状态,第4行蓝色文字提示唤醒词
- k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
- k10.canvas->updateCanvas();
- }
-
- // =====================语音指令分支=====================
- // 识别【前进】
- if (asr.isDetectCmdID(0+1)) {
- motorbit.motorRun(M1, CW, 200); // M1正转
- motorbit.motorRun(M2, CW, 200); // M2正转
- motorbit.motorRun(M3, CCW, 200); // M3反转
- motorbit.motorRun(M4, CCW, 200); // M4反转
- // 自由坐标文字:X=0,Y=180,黑色,24号中英文字体,透明度50,开启抗锯齿
- k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
-
- // 识别【停车】:停止全部电机
- if (asr.isDetectCmdID(1+1)) {
- motorbit.motorStop(ALL);
- k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
-
- // 识别【后退】
- if (asr.isDetectCmdID(2+1)) {
- motorbit.motorRun(M1, CCW, 200); // M1反转
- motorbit.motorRun(M2, CCW, 200); // M2反转
- motorbit.motorRun(M3, CW, 200); // M3正转
- motorbit.motorRun(M4, CW, 200); // M4正转
- 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();
- }
-
- // 识别【左横走】
- 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();
- }
-
- // 识别【原地转圈】四个电机全部正转,实现自旋
- 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();
- }
-
- // 清空画布第6行文字,防止唤醒提示文字叠加残留
- k10.canvas->canvasClear(6);
- }
复制代码
|