【花雕动手做】K10实验之语音控制机器人电机正反向旋转
2026-06-26613
AI 快速预览详细
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,适用于中小学信息科技课程。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。通过本实验,孩子可以轻松实现语音控制机器人电机的正反向旋转,无需额外设备,适合STEM教育场景。
![]() 行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。 主要特点 集成摄像头&内置算法,可进行离线图像检测 集成麦克风&内置算法,可进行离线语音识别 集成扬声器&内置算法,可进行离线语音合成 2.8寸彩色屏幕,数据展示更清晰 集成度高,利于教学 接口丰富,兼容软件多,扩展性好 ![]() |






【【花雕动手做】行空板 K10 系列实验之实时语音控制机器人电机正向与反向旋转】
https://www.bilibili.com/video/BV1jx7V6yELS/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV1jx7V6yELS/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
一、项目整体功能
本项目使用行空板 K10 + 离线 ASR 语音识别 + I2C 扩展 IO 模块,实现语音控制电机转向:
说出唤醒词 你好小新 唤醒设备;
语音指令 “正转”,IO 输出高电平,电机正向转动,蓝色指示灯亮起,屏幕显示文字;
语音指令 “反转”,IO 输出低电平,电机反向转动,红色指示灯亮起;
全程 LCD 屏幕实时显示当前状态。
二、头文件与对象解析
[code]#include "asr.h"
#include "unihiker_k10.h"
#include "DFRobot_UnihikerExpansion.h"[/code]
asr.h:离线语音识别库,提供语音唤醒、口令识别功能。
unihiker_k10.h:行空板主控库,负责屏幕、板载 RGB 彩灯控制。
DFRobot_UnihikerExpansion.h:I2C 引脚扩展库,用来拓展 GPIO 输出口,控制电机方向信号。
[code]UNIHIKER_K10 k10;
ASR asr;
uint8_t screen_dir=2;
DFRobot_UnihikerExpansion_I2C eunihiker(&Wire) ;[/code]
k10:行空板硬件实例;
asr:语音识别模块实例;
screen_dir=2:设置屏幕为倒置方向;
eunihiker:I2C 扩展板对象,调用系统 I2C 总线通信。
三、setup () 初始化函数(上电只运行一次)
[code]k10.begin()[/code]
初始化行空板所有硬件外设。
[code]asr.asrInit(CONTINUOUS, CN_MODE, 12000);[/code]
开启语音模块:持续收音模式、中文识别、中等灵敏度,抵抗环境噪音。
[code]while(asr._asrState == 0){delay(100);}[/code]
阻塞等待语音模块完成初始化,只有模块就绪才继续向下执行,防止程序崩溃。
屏幕初始化
[code]k10.initScreen(screen_dir);
k10.creatCanvas();[/code]
按照设定方向点亮屏幕,创建绘图缓冲区。
等待 I2C 扩展板连接成功
[code]while(!eunihiker.begin()){delay(1000);}[/code]
反复检测扩展板通信,硬件连接失败则每隔 1 秒重试。
引脚配置
[code]eunihiker.setMode(eC0, eWriteGpio);[/code]
将扩展板 C0 端口设置为数字输出引脚,用来输出高低电平控制电机正反转。
录入语音指令
[code]asr.addASRCommand(2+1, "zheng zhuan");
asr.addASRCommand(3+1, "fan zhuan");[/code]
编号 3:拼音 zheng zhuan,对应口令 “正转”;
编号 4:拼音 fan zhuan,对应口令 “反转”;
离线语音只能识别预先录入的拼音指令。
四、loop () 主循环程序
1. 唤醒状态检测
[code]if (asr.isWakeUp())[/code]
检测是否识别到唤醒词 “你好小新”:
唤醒成功:屏幕红色文字提示已唤醒;
未唤醒:屏幕蓝色文字提示唤醒口令。
2. 正转指令分支
[code]if (asr.isDetectCmdID(2+1))[/code]
当识别到 “正转” 语音:
屏幕打印提示文字;
扩展板 C0 引脚输出高电平 eHIGH,电机正向旋转;
行空板第 0 路 RGB 灯点亮为蓝色。
3. 反转指令分支
[code]if (asr.isDetectCmdID(3+1))[/code]
当识别到 “反转” 语音:
清除原有文字,打印新提示;
C0 引脚输出低电平 eLOW,电机反向旋转;
RGB 灯变为红色。
4. 屏幕清理
[code]k10.canvas->canvasClear(6);[/code]
清空第 6 行及以下所有文字,为下一轮刷新做准备。
五、完整运行流程
设备上电,初始化主板、语音模块,等待外设就绪;
连接 I2C 扩展板,把 C0 引脚设置为输出模式;
预存两条语音命令:正转、反转;
麦克风持续监听唤醒词;
说出 “你好小新” 完成唤醒;
语音下达指令,扩展 IO 输出电平控制电机转向,同时屏幕与彩灯同步反馈状态;
自动清空屏幕,持续等待下一次语音指令。
实验开源代码
[code]// 导入离线语音识别库,实现ASR语音唤醒与指令识别
#include "asr.h"
// 导入行空板K10主板基础库,用于屏幕、板载RGB灯控制
#include "unihiker_k10.h"
// 导入行空板I2C扩展IO模块驱动库,用来控制电机方向引脚
#include "DFRobot_UnihikerExpansion.h"
// 实例化硬件对象
UNIHIKER_K10 k10; // 行空板主控对象
ASR asr; // 语音识别对象
uint8_t screen_dir=2; // 屏幕方向参数,2=倒置显示
// 创建I2C扩展板对象,使用系统默认I2C总线Wire
DFRobot_UnihikerExpansion_I2C eunihiker(&Wire) ;
//====================上电初始化函数(只运行一次)====================
void setup() {
k10.begin(); // 初始化行空板底层硬件总线、外设
// 初始化语音模块:持续收音模式、中文识别、中等抗噪灵敏度
asr.asrInit(CONTINUOUS, CN_MODE, 12000);
// 循环等待语音模块加载完成,未就绪就持续等待
while(asr._asrState == 0){delay(100);}
// 初始化显示屏,创建绘图画布
k10.initScreen(screen_dir);
k10.creatCanvas();
// 循环检测I2C扩展板,直到硬件通信成功,每秒重试一次
while(!eunihiker.begin()){delay(1000);}
// 将扩展板C0引脚设置为输出GPIO模式,用来输出高低电平控制电机转向
eunihiker.setMode(eC0, eWriteGpio);
// 注册两条语音指令(拼音格式)
// 指令ID=3,语音指令:zheng zhuan 正转
asr.addASRCommand(2+1, "zheng zhuan");
// 指令ID=4,语音指令:fan zhuan 反转
asr.addASRCommand(3+1, "fan zhuan");
}
//====================主循环,无限重复运行====================
void loop() {
// 判断是否收到唤醒词:你好小新
if (asr.isWakeUp()) {
// 唤醒成功,第6行输出红色文字
k10.canvas->canvasText("已唤醒行空板.......", 6, 0xFF0000);
k10.canvas->updateCanvas(); //刷新屏幕画面
}
else {
// 未唤醒,显示蓝色文字提示唤醒关键词
k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
k10.canvas->updateCanvas();
}
// 识别到【正转】语音指令
if (asr.isDetectCmdID(2+1)) {
k10.canvas->canvasText("检测语音命令", 8, 0x000000);
k10.canvas->canvasText("电机正向旋转", 10, 0x0000FF);
k10.canvas->updateCanvas();
// 扩展板C0引脚输出高电平,控制电机正转
eunihiker.setGpioState(eC0, eHIGH);
// 点亮第0颗RGB彩灯为蓝色
k10.rgb->write(0, 0x0000FF);
}
// 识别到【反转】语音指令
if (asr.isDetectCmdID(3+1)) {
k10.canvas->canvasClear(10); //清空第10行旧文字,防止重叠
k10.canvas->canvasText("检测语音命令", 8, 0x000000);
k10.canvas->canvasText("电机反向旋转", 10, 0x0000FF);
k10.canvas->updateCanvas();
// 扩展板C0引脚输出低电平,控制电机反转
eunihiker.setGpioState(eC0, eLOW);
// 点亮第0颗RGB彩灯为红色
k10.rgb->write(0, 0xFF0000);
}
// 清空第6行及以下所有文字,清除画面,等待下一轮指令
k10.canvas->canvasClear(6);
}[/code]
一、什么是语音识别(ASR)
语音识别英文缩写是 ASR(Automatic Speech Recognition),简单来说:让单片机、电脑听懂人说话,把麦克风采集到的声音信号,转换成文字或者指令。
分为两大类:
在线语音识别:需要联网,把声音上传到云端服务器解析,识别词汇量巨大;
离线语音识别:不需要 WiFi、不需要网络,语音模型预先存放在芯片内部,本地直接处理声音,适合单片机、行空板、Arduino 这类硬件。
你代码里使用的就是离线本地 ASR 语音模块。
二、离线语音模块核心功能(对应你 K10 代码)
1. 两种工作模式
(1)持续拾音模式 CONTINUOUS
麦克风一直处于收音状态,不间断监听声音,专门用来做语音唤醒。
对应代码:asr.asrInit(CONTINUOUS, CN_MODE, 12000);
(2)按键触发模式
按下按键才开始录音识别,省电,一般用于命令词识别。
2. 语言模式 CN_MODE
CN_MODE:中文模式,只识别汉语;
EN_MODE:英文模式,识别英语。
本程序开启中文识别,用来识别唤醒词:你好小新。
3. 灵敏度阈值(第三个参数 12000)
数值代表声音检测灵敏度:
数值越大:越不容易被环境杂音误触发,抗干扰强;
数值越小:轻声说话就能识别,但是容易被噪音误唤醒。
12000 属于中等灵敏度,适合室内环境使用。
三、语音唤醒技术(本项目核心)
1. 唤醒词机制
唤醒词就是开门密码。模块平时处于低功耗监听状态,只监听这一句话,其他普通对话会直接忽略。
只有说出预设唤醒词(你好小新),模块才会被 “唤醒”,进入待命状态,之后才可以识别后续控制指令。
2. 代码里的唤醒检测函数
[code]asr.isWakeUp()[/code]
检测到唤醒词,函数返回 true;
没有检测到唤醒词,返回 false。
3. 模块状态标志
[code]asr._asrState[/code]
值 = 0:语音模块正在启动、模型加载中,暂时无法工作;
值 ≠ 0:初始化完成,可以正常收音识别。
程序中用 while 循环等待模块就绪,避免硬件未启动造成程序崩溃。
四、硬件运行完整工作流程
上电初始化行空板主板与显示屏;
启动 ASR 语音芯片,加载离线语音模型;
等待语音模块就绪;
屏幕打印实验标题;
模块持续收音,安静待机,只监听唤醒词;
使用者说出:你好小新;
程序捕捉到唤醒信号,屏幕切换文字提示 “已唤醒行空板”;
没有听到唤醒词,则一直显示唤醒词提示语句;
每秒刷新一次屏幕,并清除文字,防止画面重叠。
五、离线语音识别优缺点
优点
完全离线,不用网络、不用流量;
响应速度极快,话音刚落立刻识别;
单片机就能驱动,成本低,非常适合机器人、智能音箱、门禁、实验教具;
不受网络波动影响,设备在野外也能正常使用。
缺点
词汇数量有限,一般只能预先录入几十条唤醒词 + 控制指令;
对嘈杂环境比较敏感,噪音大会出现识别失败;
无法自由识别任意一句话,只能识别预先烧录好的词语。
六、拓展功能(可以在现有代码上升级)
多级指令识别
唤醒之后,再识别 “开灯”“关灯”“前进”“后退”,控制电机与 LED 灯;
自定义唤醒词
修改库文件,把 “你好小新” 改成 “你好行空板”;
多句话语音交互
唤醒后连续识别多条语音命令;
调节收音灵敏度,解决误唤醒或者识别不到声音的问题。
七、容易遇到的常见问题
识别不到唤醒词
调低阈值数值,靠近麦克风,降低环境噪音。
无缘无故自动唤醒(误触发)
把灵敏度数值调高,提高抗干扰能力。
程序卡死在初始化循环
语音模块接线异常,串口通信断开,导致模块始终处于未就绪状态。
扩展板模块
LED控制模块
语音识别相关说明