本帖最后由 驴友花雕 于 2026-7-3 18:08 编辑
【花雕动手做】行空板 K10 系列实验之 TT 马达四驱动全向福来轮语音控制智能小车
实验开源代码
- // 引入离线语音识别库asr.h,提供语音唤醒、拼音指令识别、收音监听功能
- #include "asr.h"
- // 行空板K10主板底层驱动库,负责屏幕画布、硬件底层初始化
- #include "unihiker_k10.h"
- // Microbit四路电机驱动库,适配麦克纳姆轮四轮小车,支持M1/M2/M3/M4四路电机独立调速转向
- #include <Microbit_Motor.h>
-
- // =====================硬件对象实例化=====================
- UNIHIKER_K10 k10; // 行空板主控对象,统一管理LCD屏幕、系统总线
- ASR asr; // 离线语音识别模块对象,处理麦克风收音与人声解析
- uint8_t screen_dir=2; // 屏幕旋转参数:数值2代表屏幕倒置显示
- Microbit_Motor motorbit; // 四路电机驱动实例,控制麦克纳姆四轮小车M1/M2/M3/M4电机
-
- //=====================================================================
- // setup() 上电初始化函数,设备开机/重启仅执行1次
- // 功能:初始化主板、语音模块、屏幕,提前注册6条麦克纳姆小车语音控制指令
- //=====================================================================
- void setup() {
- // 初始化行空板全部底层硬件:串口、I2C、屏幕、外设资源
- k10.begin();
-
- // 初始化离线语音识别模块
- // CONTINUOUS:持续收音模式,麦克风不间断监听环境人声
- // CN_MODE:中文识别模式,仅识别中文拼音口令
- // 12000:收音灵敏度阈值,数值越大抗环境噪音、误唤醒能力越强
- asr.asrInit(CONTINUOUS, CN_MODE, 12000);
-
- // 阻塞等待语音模块加载语音模型完成
- // _asrState == 0 代表语音模块未就绪,每100ms循环检测一次状态,避免未初始化调用报错
- while(asr._asrState == 0){delay(100);}
-
- // 根据预设screen_dir参数初始化LCD显示屏
- k10.initScreen(screen_dir);
- // 创建屏幕绘图画布缓冲区,所有文字先写入画布缓存,统一刷新到实体屏幕
- k10.creatCanvas();
-
- // 批量注册6条离线语音小车控制指令(拼音匹配识别)
- asr.addASRCommand(0+1, "qian jin"); // ID=1 语音口令:前进
- asr.addASRCommand(1+1, "ting che"); // ID=2 语音口令:停车
- asr.addASRCommand(2+1, "hou tui"); // ID=3 语音口令:后退
- asr.addASRCommand(3+1, "you heng"); // ID=4 语音口令:右横移(右平移)
- asr.addASRCommand(4+1, "zuo heng"); // ID=5 语音口令:左横移(左平移)
- asr.addASRCommand(5+1, "zhuan quan");//ID=6 语音口令:原地转圈
- }
-
- //=====================================================================
- // loop() 主循环函数,初始化完成后无限循环运行
- // 功能:实时检测语音唤醒、识别语音口令,调用四路电机库控制麦克纳姆小车,同步屏幕状态文字
- //=====================================================================
- void loop() {
- // 语音唤醒判断:检测麦克风是否识别到唤醒词【你好小新】
- if (asr.isWakeUp()) {
- // 唤醒成功:画布第6行输出红色提示文字
- k10.canvas->canvasText("已唤醒行空板小车.......", 6, 0xFF0000);
- // 将画布缓存内容刷新输出到LCD屏幕
- k10.canvas->updateCanvas();
- }
- else {
- // 未唤醒待机状态:第4行输出蓝色文字,提示用户唤醒关键词
- k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
- k10.canvas->updateCanvas();
- }
-
- // ==========语音指令1:qian jin 小车直线前进(麦克纳姆轮)==========
- if (asr.isDetectCmdID(0+1)) {
- // motorRun(电机通道, 转向, 速度)
- // M1左前电机 CW顺时针,M3右后电机 CCW逆时针,四轮配合直行向前
- motorbit.motorRun(M1, CW, 200);
- motorbit.motorRun(M3, CCW, 200);
- // 全屏居中24号黑色大字显示小车状态
- // 参数:X坐标、Y坐标、文字颜色、中英文字体、字号、自动换行开关
- k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
-
- // ==========语音指令2:ting che 小车全部停车刹车==========
- if (asr.isDetectCmdID(1+1)) {
- // motorStop(ALL):切断M1/M2/M3/M4四路电机全部输出,电机断电锁死,小车立刻静止
- motorbit.motorStop(ALL);
- k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
-
- // ==========语音指令3:hou tui 小车直线后退==========
- if (asr.isDetectCmdID(2+1)) {
- // M1左前CCW反转,M3右后CW反转,四轮配合直线向后倒退
- motorbit.motorRun(M1, CCW, 200);
- motorbit.motorRun(M3, CW, 200);
- k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
- k10.canvas->updateCanvas();
- }
-
- // ==========语音指令4:you heng 小车向右横向平移(右横移)==========
- if (asr.isDetectCmdID(3+1)) {
- // M2右前CCW、M4左后CW,麦克纳姆轮差速实现车身整体向右平移
- 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();
- }
-
- // ==========语音指令5:zuo heng 小车向左横向平移(左横移)==========
- if (asr.isDetectCmdID(4+1)) {
- // M2右前CW、M4左后CCW,麦克纳姆轮差速实现车身整体向左平移
- 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();
- }
-
- // ==========语音指令6:zhuan quan 小车原地顺时针转圈==========
- if (asr.isDetectCmdID(5+1)) {
- // M1/M2/M3/M4四路电机全部CW顺时针同向差速,车身原地持续旋转
- 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);
- }
复制代码
|