在这里插入图片描述
在这里插入图片描述

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好

在这里插入图片描述
小车方案一使用的铝制底板、TT电机与扩展板

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主打:人工智能模块

在这里插入图片描述

语音识别相关说明

在这里插入图片描述

辅助:屏幕显示相关积木

在这里插入图片描述
扩展板模块

在这里插入图片描述

LED控制模块

在这里插入图片描述

知识点:语音识别(ASR)
一、什么是语音识别(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. 代码里的唤醒检测函数
asr.isWakeUp()

检测到唤醒词,函数返回 true;
没有检测到唤醒词,返回 false。
3. 模块状态标志

asr._asrState

值 = 0:语音模块正在启动、模型加载中,暂时无法工作;
值 ≠ 0:初始化完成,可以正常收音识别。
程序中用 while 循环等待模块就绪,避免硬件未启动造成程序崩溃。

四、硬件运行完整工作流程
上电初始化行空板主板与显示屏;
启动 ASR 语音芯片,加载离线语音模型;
等待语音模块就绪;
屏幕打印实验标题;
模块持续收音,安静待机,只监听唤醒词;
使用者说出:你好小新;
程序捕捉到唤醒信号,屏幕切换文字提示 “已唤醒行空板”;
没有听到唤醒词,则一直显示唤醒词提示语句;
每秒刷新一次屏幕,并清除文字,防止画面重叠。

五、离线语音识别优缺点
优点
完全离线,不用网络、不用流量;
响应速度极快,话音刚落立刻识别;
单片机就能驱动,成本低,非常适合机器人、智能音箱、门禁、实验教具;
不受网络波动影响,设备在野外也能正常使用。
缺点
词汇数量有限,一般只能预先录入几十条唤醒词 + 控制指令;
对嘈杂环境比较敏感,噪音大会出现识别失败;
无法自由识别任意一句话,只能识别预先烧录好的词语。

六、拓展功能(可以在现有代码上升级)
多级指令识别
唤醒之后,再识别 “开灯”“关灯”“前进”“后退”,控制电机与 LED 灯;
自定义唤醒词
修改库文件,把 “你好小新” 改成 “你好行空板”;
多句话语音交互
唤醒后连续识别多条语音命令;
调节收音灵敏度,解决误唤醒或者识别不到声音的问题。

七、容易遇到的常见问题
识别不到唤醒词
调低阈值数值,靠近麦克风,降低环境噪音。
无缘无故自动唤醒(误触发)
把灵敏度数值调高,提高抗干扰能力。
程序卡死在初始化循环
语音模块接线异常,串口通信断开,导致模块始终处于未就绪状态。

在这里插入图片描述
【花雕动手做】行空板 K10 系列实验之TT马达双路差速智能小车方案一
实验开源代码

// 引入离线语音识别库asr.h,提供语音唤醒、语音指令识别功能
#include "asr.h"
// 引入IOBOX电机驱动库,专门控制两路直流减速电机小车底盘
#include <IOBOX_Motor.h>
// 行空板K10主板底层驱动库,用于屏幕初始化、画布文字绘制
#include "unihiker_k10.h"

// 实例化所有硬件对象
UNIHIKER_K10 k10;       // 行空板主控对象,管理LCD屏幕
ASR          asr;        // 离线语音识别模块对象,处理麦克风收音识别
uint8_t      screen_dir=2;// 屏幕旋转参数,数值2代表屏幕倒置显示
IOBOX_Motor  motor_ib;   // IOBOX电机驱动对象,控制小车左右两路电机M1、M2

//=====================================================================
// setup() 上电初始化函数,设备开机/重启仅执行一次
// 作用:初始化主板、语音模块、屏幕,注册6条小车语音控制指令
//=====================================================================
void setup() {
	// 初始化行空板全部底层硬件(串口、总线、屏幕外设)
	k10.begin();

	// 初始化离线语音识别模块
	// CONTINUOUS:持续收音模式,麦克风不间断监听人声
	// CN_MODE:中文识别模式,仅识别中文口令
	// 12000:收音灵敏度阈值,数值越大抗环境噪音、误唤醒能力越强
	asr.asrInit(CONTINUOUS, CN_MODE, 12000);

	// 阻塞等待语音模块加载语音模型完成
	// _asrState == 0 表示语音模块未就绪,每100ms循环检测一次状态
	while(asr._asrState == 0){delay(100);}

	// 根据预设方向初始化LCD显示屏
	k10.initScreen(screen_dir);
	// 创建屏幕绘图画布缓冲区,所有文字先写入画布再统一刷新到屏幕
	k10.creatCanvas();

	// 批量注册6条小车控制语音指令(使用拼音匹配识别)
	asr.addASRCommand(0+1, "qian jin"); // ID=1 语音口令:前进
	asr.addASRCommand(1+1, "ting zhi"); // ID=2 语音口令:停止
	asr.addASRCommand(2+1, "hou tui");  // ID=3 语音口令:后退
	asr.addASRCommand(3+1, "you zhuan");// ID=4 语音口令:右转
	asr.addASRCommand(4+1, "zuo zhuan");// 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(电机通道, 转向, 速度)
		// motor_ib.ALL:同时控制M1、M2两路全部电机
		// motor_ib.CCW:电机逆时针转动,小车向前行驶
		// 254:速度参数,范围0~255,254接近满速
		motor_ib.motorRun(motor_ib.ALL, motor_ib.CCW, 254);
		// 全屏居中24号黑色大字显示小车状态
		// 参数:X坐标、Y坐标、文字颜色、字体、字号、自动换行开关
		k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ==========语音指令2:ting zhi 小车全部停止==========
	if (asr.isDetectCmdID(1+1)) {
		// motorStop(电机通道):停止对应电机输出,电机断电/刹车
		motor_ib.motorStop(motor_ib.ALL);
		k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ==========语音指令3:hou tui 小车后退==========
	if (asr.isDetectCmdID(2+1)) {
		k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
		// motor_ib.CW:电机顺时针转动,小车向后倒退,速度200(低于前进满速)
		motor_ib.motorRun(motor_ib.ALL, motor_ib.CW, 200);
	}

	// ==========语音指令4:you zhuan 小车原地右转1秒==========
	if (asr.isDetectCmdID(3+1)) {
		k10.canvas->canvasText("K10 小车右转", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
		// M1左轮正转、M2右轮反转,形成原地右转差速
		motor_ib.motorRun(motor_ib.M1, motor_ib.CW, 200);
		motor_ib.motorRun(motor_ib.M2, motor_ib.CCW, 200);
		delay(1000); // 保持转向动作1秒
		motor_ib.motorStop(motor_ib.ALL); // 1秒后自动停车
	}

	// ==========语音指令5:zuo zhuan 小车原地左转1秒==========
	if (asr.isDetectCmdID(4+1)) {
		k10.canvas->canvasText("K10 小车左转", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
		// M1左轮反转、M2右轮正转,形成原地左转差速
		motor_ib.motorRun(motor_ib.M1, motor_ib.CCW, 200);
		motor_ib.motorRun(motor_ib.M2, motor_ib.CW, 200);
		delay(1000); // 保持转向动作1秒
		motor_ib.motorStop(motor_ib.ALL); // 1秒后自动停车
	}

	// ==========语音指令6:zhuan quan 小车持续原地转圈==========
	if (asr.isDetectCmdID(5+1)) {
		k10.canvas->canvasText("K10小车原地转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
		// 左右轮反向差速,持续原地旋转,不会自动停止
		motor_ib.motorRun(motor_ib.M1, motor_ib.CCW, 200);
		motor_ib.motorRun(motor_ib.M2, motor_ib.CW, 200);
	}

	// 清空画布第6行及下方所有文字,清除上一轮状态提示,防止新旧文字重叠残影
	k10.canvas->canvasClear(6);
}

代码解读
一、项目整体功能概述
该程序运行在行空板 K10,搭配离线 ASR 语音识别模块、IOBOX 双路电机驱动板,实现语音遥控两轮差速小车底盘。
唤醒固定口令:你好小新;
支持 6 种语音动作:前进、停止、后退、原地右转、原地左转、持续原地转圈,屏幕同步大字展示小车当前运行状态。

二、头文件与硬件对象分段解析

#include "asr.h"
#include <IOBOX_Motor.h>
#include "unihiker_k10.h"

asr.h:离线语音识别库,提供语音唤醒、自定义拼音指令识别功能;
IOBOX_Motor.h:两路直流电机驱动专用库,控制小车左右轮电机正反转、调速、刹车;
unihiker_k10.h:行空板 K10 底层驱动,管理 LCD 屏幕、画布绘制。

UNIHIKER_K10 k10;
ASR          asr;
uint8_t      screen_dir=2;
IOBOX_Motor  motor_ib;

k10:行空板主控实例,负责屏幕显示;
asr:语音识别实例,处理麦克风收音、人声解析;
screen_dir=2:设置屏幕为倒置显示模式;
motor_ib:IOBOX 电机驱动对象,专门控制小车 M1 左电机、M2 右电机。

三、setup () 上电初始化函数(仅开机执行 1 次)

k10.begin();

初始化行空板全部底层硬件、通信总线资源。

asr.asrInit(CONTINUOUS, CN_MODE, 12000);
while(asr._asrState == 0){delay(100);}

初始化语音模块:持续收音、中文识别、12000 中等抗噪灵敏度;循环阻塞等待语音模型加载完成,硬件就绪后才向下执行。

k10.initScreen(screen_dir);
k10.creatCanvas();

按预设倒置参数点亮 LCD 屏幕,创建绘图缓冲区画布,所有文字先缓存再统一刷新。

asr.addASRCommand(0+1, "qian jin");
asr.addASRCommand(1+1, "ting zhi");
asr.addASRCommand(2+1, "hou tui");
asr.addASRCommand(3+1, "you zhuan");
asr.addASRCommand(4+1, "zuo zhuan");
asr.addASRCommand(5+1, "zhuan quan");

批量注册 6 条离线语音控制指令,离线模块仅能识别提前录入的拼音口令:
ID1 qian jin → 前进
ID2 ting zhi → 停止
ID3 hou tui → 后退
ID4 you zhuan → 右转
ID5 zuo zhuan → 左转
ID6 zhuan quan → 转圈

四、loop () 无限主循环,实时监听语音指令

  1. 唤醒状态判断
if (asr.isWakeUp())

函数检测是否识别唤醒词「你好小新」:
唤醒成功:屏幕第 6 行红色文字提示 “已唤醒行空板”;
未唤醒待机:屏幕蓝色文字提示唤醒口令;
updateCanvas() 将画布文字刷新到实体屏幕。
2. 语音指令动作逻辑
(1)前进 qian jin

motor_ib.motorRun(motor_ib.ALL, motor_ib.CCW, 254);

ALL:同时控制 M1、M2 两路电机;
CCW:电机逆时针同向转动,小车向前行驶;
速度 254:速度区间 0~255,接近满速。
(2)停止 ting zhi

motor_ib.motorStop(motor_ib.ALL);

关闭两路电机输出,小车立即刹车停稳。
(3)后退 hou tui

motor_ib.motorRun(motor_ib.ALL, motor_ib.CW, 200);

两路电机顺时针同向转动,小车后退,速度 200,低于前进全速。
(4)右转 you zhuan

motor_ib.motorRun(motor_ib.M1, motor_ib.CW, 200);
motor_ib.motorRun(motor_ib.M2, motor_ib.CCW, 200);
delay(1000);
motor_ib.motorStop(motor_ib.ALL);

差速原地转向:左轮正转、右轮反转,形成右转;延时 1 秒后自动停车。
(5)左转 zuo zhuan

motor_ib.motorRun(motor_ib.M1, motor_ib.CCW, 200);
motor_ib.motorRun(motor_ib.M2, motor_ib.CW, 200);
delay(1000);
motor_ib.motorStop(motor_ib.ALL);

左轮反转、右轮正转,原地左转,维持 1 秒后自动停止。
(6)转圈 zhuan quan
左右电机反向差速转动,无延时、不会自动停止,持续原地旋转,只能语音喊 “停止” 刹车。
3. 屏幕清理语句

k10.canvas->canvasClear(6);

清空第 6 行及下方全部文字,清除上一轮状态文字,避免新旧文字重叠产生残影。

五、两轮差速小车运动原理

在这里插入图片描述

六、完整设备运行流程
设备上电,初始化主板、语音模块,等待语音硬件就绪;
初始化屏幕画布,录入 6 条小车控制语音口令;
麦克风不间断监听唤醒词 “你好小新”;
说出唤醒词解锁语音控制;
下达对应语音口令,电机驱动控制小车执行动作,屏幕同步显示当前运动状态;
循环自动清空屏幕文字,持续等待下一条语音指令。

Mind+图形编程

在这里插入图片描述
实验场景图与视频记录

在这里插入图片描述
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐