28浏览
查看: 28|回复: 11

[K10教程] 【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号

[复制链接]
【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

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

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


【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

驴友花雕  高级技神
 楼主|

发表于 昨天 19:03

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

小车方案二使用的铝制M底板、TT电机与扩展板

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图3

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图4

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图6

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图5
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 19:28

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

主打:人工智能模块

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

语音识别相关说明

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 19:29

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

本帖最后由 驴友花雕 于 2026-7-2 06:27 编辑

辅助:屏幕显示相关积木

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

接脚 IO 扩展模块

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图3

LED控制模块

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 昨天 19:32

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

知识点:语音识别(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. 代码里的唤醒检测函数

```cpp
asr.isWakeUp()
```

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

```cpp
asr._asrState
```

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

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

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

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

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


【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 10 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

小车动力电池的二个方案(7.4V)

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图3

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

【花雕动手做】行空板 K10 系列实验之TT马达双路差速智能小车方案二号M底盘
实验开源代码

  1. // 引入离线语音识别驱动头文件asr.h,实现语音唤醒、自定义语音指令识别
  2. #include "asr.h"
  3. // 引入行空板K10主板底层库,用于屏幕控制、板载引脚digital_write输出
  4. #include "unihiker_k10.h"
  5. // =====================硬件对象实例化=====================
  6. UNIHIKER_K10 k10;      // 行空板主控对象,统一管理屏幕、板载IO引脚
  7. ASR          asr;       // 离线语音识别模块对象,处理麦克风收音与人声解析
  8. uint8_t      screen_dir=2; // 屏幕旋转参数:数值2代表屏幕倒置显示
  9. //=====================================================================
  10. // setup() 上电初始化函数,设备开机/重启仅执行1次
  11. // 功能:初始化主板、语音模块、屏幕,注册5条小车语音控制指令
  12. //=====================================================================
  13. void setup() {
  14.         // 初始化行空板全部底层硬件:串口、IO总线、LCD屏幕、外设资源
  15.         k10.begin();
  16.         // 初始化离线语音识别模块
  17.         // CONTINUOUS:持续收音模式,麦克风不间断监听环境人声
  18.         // CN_MODE:中文识别模式,仅识别中文拼音口令
  19.         // 12000:收音灵敏度阈值,数值越大抗环境噪音、误唤醒能力越强
  20.         asr.asrInit(CONTINUOUS, CN_MODE, 12000);
  21.         // 阻塞循环等待语音模块加载语音模型完成
  22.         // _asrState == 0 代表语音模块未就绪,每100ms循环检测一次状态,防止未初始化调用报错
  23.         while(asr._asrState == 0){delay(100);}
  24.         // 根据预设screen_dir参数初始化LCD显示屏
  25.         k10.initScreen(screen_dir);
  26.         // 创建屏幕绘图画布缓冲区,所有文字先写入画布缓存,统一刷新到实体屏幕
  27.         k10.creatCanvas();
  28.         // 批量注册5条离线语音小车控制指令(采用拼音匹配识别)
  29.         asr.addASRCommand(0+1, "qian jin"); // ID=1 语音口令:前进
  30.         asr.addASRCommand(1+1, "ting che"); // ID=2 语音口令:停车
  31.         asr.addASRCommand(2+1, "hou tui");  // ID=3 语音口令:后退
  32.         asr.addASRCommand(3+1, "you zhuan");// ID=4 语音口令:右转
  33.         asr.addASRCommand(4+1, "zuo zhuan");// ID=5 语音口令:左转
  34. }
  35. //=====================================================================
  36. // loop() 主循环函数,初始化完成后无限循环运行
  37. // 功能:实时监听语音唤醒、识别语音口令,输出IO电平控制两路电机,同步屏幕状态文字
  38. //=====================================================================
  39. void loop() {
  40.         // 语音唤醒判断:检测麦克风是否识别到唤醒词【你好小新】
  41.         if (asr.isWakeUp()) {
  42.                 // 唤醒成功:画布第6行输出红色提示文字
  43.                 k10.canvas->canvasText("已唤醒行空板小车.......", 6, 0xFF0000);
  44.                 // 将画布缓存内容刷新输出到LCD屏幕
  45.                 k10.canvas->updateCanvas();
  46.         }
  47.         else {
  48.                 // 未唤醒待机状态:第4行输出蓝色文字,提示用户唤醒关键词
  49.                 k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
  50.                 k10.canvas->updateCanvas();
  51.         }
  52.         // =====================语音指令1:qian jin 小车前进=====================
  53.         if (asr.isDetectCmdID(0+1)) {
  54.                 // 全屏居中24号黑色大字显示小车运动状态
  55.                 // 参数:X坐标、Y坐标、文字颜色、中英文字体、字号、自动换行开关
  56.                 k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  57.                 k10.canvas->updateCanvas();
  58.                 // 输出电平控制L298N/L293D电机驱动芯片引脚,左右电机同步正转,小车直行前进
  59.                 digital_write(eP12, HIGH); // 左电机方向1
  60.                 digital_write(eP13, LOW);  // 左电机方向2
  61.                 digital_write(eP14, HIGH); // 右电机方向1
  62.                 digital_write(eP15, LOW);  // 右电机方向2
  63.         }
  64.         // =====================语音指令2:ting che 小车停车=====================
  65.         if (asr.isDetectCmdID(1+1)) {
  66.                 k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  67.                 k10.canvas->updateCanvas();
  68.                 // 全部控制引脚拉低,电机无压差,断电刹车,小车立刻停稳
  69.                 digital_write(eP12, LOW);
  70.                 digital_write(eP13, LOW);
  71.                 digital_write(eP14, LOW);
  72.                 digital_write(eP15, LOW);
  73.         }
  74.         // =====================语音指令3:hou tui 小车后退=====================
  75.         if (asr.isDetectCmdID(2+1)) {
  76.                 k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  77.                 k10.canvas->updateCanvas();
  78.                 // 反转左右电机电平,电机反向转动,小车直线后退
  79.                 digital_write(eP12, LOW);
  80.                 digital_write(eP13, HIGH);
  81.                 digital_write(eP14, LOW);
  82.                 digital_write(eP15, HIGH);
  83.         }
  84.         // =====================语音指令4:you zhuan 小车原地右转=====================
  85.         if (asr.isDetectCmdID(3+1)) {
  86.                 k10.canvas->canvasText("K10 小车右转", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  87.                 k10.canvas->updateCanvas();
  88.                 // 左轮反转、右轮正转,形成差速,小车原地向右转向
  89.                 digital_write(eP12, LOW);
  90.                 digital_write(eP13, HIGH);
  91.                 digital_write(eP14, HIGH);
  92.                 digital_write(eP15, LOW);
  93.         }
  94.         // =====================语音指令5:zuo zhuan 小车原地左转=====================
  95.         if (asr.isDetectCmdID(4+1)) {
  96.                 k10.canvas->canvasText("K10小车左转", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  97.                 k10.canvas->updateCanvas();
  98.                 // 左轮正转、右轮反转,形成差速,小车原地向左转向
  99.                 digital_write(eP12, HIGH);
  100.                 digital_write(eP13, LOW);
  101.                 digital_write(eP14, LOW);
  102.                 digital_write(eP15, HIGH);
  103.         }
  104.         // 清空画布第6行及下方所有文字,清除上一轮状态提示,防止新旧文字重叠产生残影
  105.         k10.canvas->canvasClear(6);
  106. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

代码解读
一、项目整体功能
该程序运行在行空板 K10,搭配离线 ASR 语音模块、L298N/L293D 电机驱动,实现语音控制两轮差速小车:
唤醒固定口令:你好小新;
5 组语音动作:前进、停车、后退、原地右转、原地左转;
行空板 4 路 IO 输出高低电平控制电机驱动,屏幕大号文字实时展示小车运行状态。

二、头文件与硬件对象说明

  1. #include "asr.h"
  2. #include "unihiker_k10.h"
复制代码

asr.h:离线语音识别库,提供语音唤醒、自定义拼音指令识别;
unihiker_k10.h:行空板核心库,包含屏幕画布绘制、digital_write IO 电平输出函数。

  1. UNIHIKER_K10 k10;
  2. ASR          asr;
  3. uint8_t      screen_dir=2;
复制代码

k10:行空板主控对象,管理屏幕、板载 IO 引脚;
asr:语音识别对象,处理麦克风收音、人声解析;
screen_dir=2:设置屏幕倒置显示。

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

  1. k10.begin();
复制代码

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

  1. asr.asrInit(CONTINUOUS, CN_MODE, 12000);
  2. while(asr._asrState == 0){delay(100);}
复制代码

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

  1. k10.initScreen(screen_dir);
  2. k10.creatCanvas();
复制代码

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

  1. asr.addASRCommand(0+1, "qian jin");  // ID1 前进
  2. asr.addASRCommand(1+1, "ting che"); // ID2 停车
  3. asr.addASRCommand(2+1, "hou tui");   // ID3 后退
  4. asr.addASRCommand(3+1, "you zhuan");// ID4 右转
  5. asr.addASRCommand(4+1, "zuo zhuan");// ID5 左转
复制代码

提前注册 5 条离线语音口令,语音模块仅能识别预存的拼音。

四、loop () 无限主循环,实时监听语音指令
1. 唤醒状态检测

  1. if (asr.isWakeUp())
复制代码

检测是否识别唤醒词「你好小新」:
唤醒成功:屏幕第 6 行红色文字提示 “已唤醒行空板小车”;
未唤醒:蓝色文字提示唤醒口令;
updateCanvas() 将画布内容刷新到实体屏幕。

2. 引脚硬件分配规则
eP12、eP13 → 左电机 M1 方向控制脚
eP14、eP15 → 右电机 M2 方向控制脚
digital_write(引脚, HIGH/LOW):输出高低电平给电机驱动,改变电机转向。

3. 各语音指令动作逻辑
① qian jin 前进
左右电机同向正转:
eP12=HIGH,eP13=LOW;eP14=HIGH,eP15=LOW
屏幕显示:K10 小车前进
② ting che 停车
四路引脚全部拉低,电机无压差,直接刹车停稳:
eP12/eP13/eP14/eP15 = LOW
屏幕显示:K10 小车停止
③ hou tui 后退
左右电机同向反转:
eP12=LOW,eP13=HIGH;eP14=LOW,eP15=HIGH
屏幕显示:K10 小车后退
④ you zhuan 原地右转
左轮反转、右轮正转,差速实现右转:
eP12=LOW,eP13=HIGH;eP14=HIGH,eP15=LOW
屏幕显示:K10 小车右转
⑤ zuo zhuan 原地左转
左轮正转、右轮反转,差速实现左转:
eP12=HIGH,eP13=LOW;eP14=LOW,eP15=HIGH
屏幕显示:K10 小车左转

4. 屏幕清理

  1. k10.canvas->canvasClear(6);
复制代码

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

五、电平与车辆动作对照表

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

六、完整运行流程
设备上电,初始化主板、语音模块,等待语音芯片加载完成;
初始化倒置屏幕、创建画布,录入 5 条小车语音口令;
麦克风持续监听唤醒词 “你好小新”;
唤醒后说出对应语音口令,四路 IO 同步输出对应电平驱动电机,屏幕同步显示运行文字;
循环自动清空屏幕文字,持续等待下一条语音指令。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

Mind+图形编程

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

实验场景图与视频记录

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图3

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图3

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图2
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】行空板 K10 之TT马达差速M底盘小车二号

【花雕动手做】行空板 K10 之 TT 马达差速 M 底盘小车二号图1
【【花雕动手做】行空板 K10 系列实验之TT马达双路差速智能小车方案二号M底盘#行空板K10 #人工智能 #自制机器人 #语音识别控制 #DIY小车】

https://www.bilibili.com/video/BV1BUTr6KEb7/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail