116浏览
查看: 116|回复: 9

[K10教程] 【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

[复制链接]
【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

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

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


【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

改装麦克娜姆轮玩具坦克小车

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图3

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图3

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

主打:人工智能模块

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

语音识别合成相关说明

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

辅助:屏幕显示相关积木

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2

接脚 IO 扩展模块

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图4

LED控制模块

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图3

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

【花雕动手做】行空板 K10 系列实验之离线语音识别改装麦克娜姆轮玩具坦克小车

实验开源代码

  1. // 行空板离线语音识别ASR库,实现唤醒词、离线语音指令识别,无需联网
  2. #include "asr.h"
  3. // 行空板K10硬件底层驱动:屏幕、画布、字体等外设接口
  4. #include "unihiker_k10.h"
  5. // Microbit电机拓展板驱动库,控制四路直流电机M1/M2/M3/M4,适配四轮麦克纳姆轮
  6. #include <Microbit_Motor.h>
  7. // 全局对象实例化
  8. UNIHIKER_K10   k10;         // 行空板K10主控硬件对象
  9. ASR            asr;          // 离线语音识别对象
  10. uint8_t        screen_dir=2; // 屏幕方向参数2:正向竖屏显示
  11. Microbit_Motor motorbit;     // 四路电机驱动对象
  12. // 上电初始化函数,通电/复位仅执行一次
  13. void setup() {
  14.     // 初始化行空板所有底层硬件驱动
  15.         k10.begin();
  16.     // 初始化离线语音模块
  17.     // CONTINUOUS:持续监听模式;CN_MODE:中文识别;10000:语音会话超时时间(毫秒)
  18.         asr.asrInit(CONTINUOUS, CN_MODE, 10000);
  19.     // 阻塞等待语音模块初始化完成
  20.     // _asrState == 0 代表模块未就绪,循环延时等待
  21.         while(asr._asrState == 0){delay(100);}
  22.     // 按照预设方向初始化屏幕
  23.         k10.initScreen(screen_dir);
  24.     // 创建绘图画布,所有文字、图形必须绘制在画布上
  25.         k10.creatCanvas();
  26.     // 注册语音指令:【指令ID,拼音关键词】
  27.     // 库规范:ID从1开始,所以使用 n+1;识别匹配只能填写拼音,不可直接写中文
  28.         asr.addASRCommand(0+1, "qian jin");  // ID1 前进
  29.         asr.addASRCommand(1+1, "ting che");  // ID2 停车
  30.         asr.addASRCommand(2+1, "hou tui");  // ID3 后退
  31.         asr.addASRCommand(3+1, "you heng"); // ID4 右横走
  32.         asr.addASRCommand(4+1, "zuo heng");  // ID5 左横走
  33.         asr.addASRCommand(5+1, "zhuan quan");//ID6 原地转圈
  34.         asr.addASRCommand(6+1, "xie zou");   // ID7 斜着走
  35. }
  36. // 主循环,初始化完成后无限循环持续运行
  37. void loop() {
  38.     // 判断是否识别到唤醒词【你好小新】
  39.         if (asr.isWakeUp()) {
  40.         // 唤醒成功,画布第1行输出红色提示文字
  41.                 k10.canvas->canvasText("已唤醒行空板小车.......", 1, 0xFF0000);
  42.                 k10.canvas->updateCanvas();
  43.         }
  44.         else {
  45.         // 未唤醒待机状态,第2行蓝色文字提示唤醒词
  46.                 k10.canvas->canvasText("唤醒词为“你好小新”", 2, 0x0000FF);
  47.                 k10.canvas->updateCanvas();
  48.         }
  49.     // ======语音指令识别分支======
  50.     // 识别【前进】:全部电机反转,小车直行前进
  51.         if (asr.isDetectCmdID(0+1)) {
  52.                 motorbit.motorRun(ALL, CCW, 200);
  53.         // 自由坐标文字:X=0,Y=60,黑色,24号中英文字体
  54.                 k10.canvas->canvasText("       K10 小车前进", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  55.                 k10.canvas->updateCanvas();
  56.         }
  57.     // 识别【停车】:停止所有电机
  58.         if (asr.isDetectCmdID(1+1)) {
  59.                 motorbit.motorStop(ALL);
  60.                 k10.canvas->canvasText("       K10 小车停止", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  61.                 k10.canvas->updateCanvas();
  62.         }
  63.     // 识别【后退】:全部电机正转,小车直行后退
  64.         if (asr.isDetectCmdID(2+1)) {
  65.                 motorbit.motorRun(ALL, CW, 200);
  66.                 k10.canvas->canvasText("       K10 小车后退", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  67.                 k10.canvas->updateCanvas();
  68.         }
  69.     // 识别【右横走】:麦克纳姆轮对角差速,整车向右横向平移
  70.         if (asr.isDetectCmdID(3+1)) {
  71.                 motorbit.motorRun(M1, CCW, 200);
  72.                 motorbit.motorRun(M2, CW, 200);
  73.                 motorbit.motorRun(M3, CCW, 200);
  74.                 motorbit.motorRun(M4, CW, 200);
  75.                 k10.canvas->canvasText("       K10 小车右横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  76.                 k10.canvas->updateCanvas();
  77.         }
  78.     // 识别【左横走】:麦克纳姆轮对角反向差速,整车向左横向平移
  79.         if (asr.isDetectCmdID(4+1)) {
  80.                 motorbit.motorRun(M1, CW, 200);
  81.                 motorbit.motorRun(M2, CCW, 200);
  82.                 motorbit.motorRun(M3, CW, 200);
  83.                 motorbit.motorRun(M4, CCW, 200);
  84.                 k10.canvas->canvasText("       K10小车左横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  85.                 k10.canvas->updateCanvas();
  86.         }
  87.     // 识别【原地转圈】:四轮差速实现原地自旋
  88.         if (asr.isDetectCmdID(5+1)) {
  89.                 motorbit.motorRun(M1, CCW, 200);
  90.                 motorbit.motorRun(M2, CW, 200);
  91.                 motorbit.motorRun(M3, CW, 200);
  92.                 motorbit.motorRun(M4, CCW, 200);
  93.                 k10.canvas->canvasText("   K10小车原地转圈", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  94.                 k10.canvas->updateCanvas();
  95.         }
  96.     // 识别【斜着走】:M1、M3同步反转,实现斜向移动
  97.         if (asr.isDetectCmdID(6+1)) {
  98.                 motorbit.motorRun(M1, CCW, 200);
  99.                 motorbit.motorRun(M3, CCW, 200);
  100.                 k10.canvas->canvasText("      K10小车斜着走", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  101.                 k10.canvas->updateCanvas();
  102.         }
  103.     // 清空画布第1行文字,避免唤醒提示文字残留叠加
  104.         k10.canvas->canvasClear(1);
  105. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

# 行空板 K10 离线语音控制四轮麦克纳姆轮玩具小车 代码解读

一、头文件说明

  1. #include "asr.h"
  2. #include "unihiker_k10.h"
  3. #include <Microbit_Motor.h>
复制代码

1. `asr.h`:行空板内置离线语音识别库。支持唤醒词触发、自定义语音命令,**不需要联网**;默认唤醒词:**你好小新**。
2. `unihiker_k10.h`:行空板 K10 硬件驱动库,管理屏幕、绘图画布、字体显示。
3. `Microbit_Motor.h`:microbit 电机拓展板驱动库,独立控制 M1/M2/M3/M4 四路直流电机,适配四轮麦克纳姆轮底盘。

二、全局对象定义

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

- `k10`:行空板主控硬件对象;
- `asr`:离线语音识别实例;
- `screen_dir=2`:屏幕正向竖屏;
- `motorbit`:四路电机驱动对象。

三、setup () 上电初始化(只执行一次)

  1. void setup() {
  2.         k10.begin();
  3.         asr.asrInit(CONTINUOUS, CN_MODE, 10000);
  4.         while(asr._asrState == 0){delay(100);}
  5.         k10.initScreen(screen_dir);
  6.         k10.creatCanvas();
  7.         asr.addASRCommand(0+1, "qian jin");
  8.         asr.addASRCommand(1+1, "ting che");
  9.         asr.addASRCommand(2+1, "hou tui");
  10.         asr.addASRCommand(3+1, "you heng");
  11.         asr.addASRCommand(4+1, "zuo heng");
  12.         asr.addASRCommand(5+1, "zhuan quan");
  13.         asr.addASRCommand(6+1, "xie zou");
  14. }
复制代码

逐行解析:

1. `k10.begin()`:初始化行空板全部底层硬件;
2. `asr.asrInit(CONTINUOUS, CN_MODE, 10000)`
   - `CONTINUOUS`:持续监听模式
   - `CN_MODE`:中文识别模式
   - `10000`:语音会话超时时间,单位毫秒
3. `while(asr._asrState == 0)` 阻塞循环,等待语音模块硬件初始化完成,未就绪不向下运行;
4. `initScreen` 设置屏幕方向,`creatCanvas` 创建画布;
5. `asr.addASRCommand(指令ID,拼音)`
>重要:命令只能填写拼音,不能写中文;ID 从 1 开始,代码采用`n+1`写法。


【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

四、loop () 无限主循环

  1. void loop() {
  2.         if (asr.isWakeUp()) {
  3.                 k10.canvas->canvasText("已唤醒行空板小车.......", 1, 0xFF0000);
  4.                 k10.canvas->updateCanvas();
  5.         }
  6.         else {
  7.                 k10.canvas->canvasText("唤醒词为“你好小新”", 2, 0x0000FF);
  8.                 k10.canvas->updateCanvas();
  9.         }
复制代码

`asr.isWakeUp()` 判断是否识别到唤醒词【你好小新】

- 唤醒成功:第 1 行红色文字提示;
- 未唤醒:第 2 行蓝色文字提示待机状态。

> 规则:没有唤醒,所有运动语音指令不会响应。

  1. // 前进:所有电机CCW反转
  2.         if (asr.isDetectCmdID(0+1)) {
  3.                 motorbit.motorRun(ALL, CCW, 200);
  4.                 k10.canvas->canvasText("       K10 小车前进", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  5.                 k10.canvas->updateCanvas();
  6.         }
复制代码

`canvasText(x,y,颜色,字体,透明度,抗锯齿)`:自由坐标绘制文字,固定在屏幕 Y=60 位置显示运动状态。

       
  1. // 停车:停止全部电机
  2.         if (asr.isDetectCmdID(1+1)) {
  3.                 motorbit.motorStop(ALL);
  4.                 k10.canvas->canvasText("       K10 小车停止", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  5.                 k10.canvas->updateCanvas();
  6.         }
  7.         // 后退:所有电机CW正转
  8.         if (asr.isDetectCmdID(2+1)) {
  9.                 motorbit.motorRun(ALL, CW, 200);
  10.                 k10.canvas->canvasText("       K10 小车后退", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  11.                 k10.canvas->updateCanvas();
  12.         }
  13.         // 右横走 麦克纳姆轮经典横移时序
  14.         if (asr.isDetectCmdID(3+1)) {
  15.                 motorbit.motorRun(M1, CCW, 200);
  16.                 motorbit.motorRun(M2, CW, 200);
  17.                 motorbit.motorRun(M3, CCW, 200);
  18.                 motorbit.motorRun(M4, CW, 200);
  19.                 k10.canvas->canvasText("       K10 小车右横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  20.                 k10.canvas->updateCanvas();
  21.         }
  22.         // 左横走
  23.         if (asr.isDetectCmdID(4+1)) {
  24.                 motorbit.motorRun(M1, CW, 200);
  25.                 motorbit.motorRun(M2, CCW, 200);
  26.                 motorbit.motorRun(M3, CW, 200);
  27.                 motorbit.motorRun(M4, CCW, 200);
  28.                 k10.canvas->canvasText("       K10小车左横", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  29.                 k10.canvas->updateCanvas();
  30.         }
  31.         // 原地自旋
  32.         if (asr.isDetectCmdID(5+1)) {
  33.                 motorbit.motorRun(M1, CCW, 200);
  34.                 motorbit.motorRun(M2, CW, 200);
  35.                 motorbit.motorRun(M3, CW, 200);
  36.                 motorbit.motorRun(M4, CCW, 200);
  37.                 k10.canvas->canvasText("   K10小车原地转圈", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  38.                 k10.canvas->updateCanvas();
  39.         }
  40.         // 斜向移动(仅M1、M3运转,M2、M4静止)
  41.         if (asr.isDetectCmdID(6+1)) {
  42.                 motorbit.motorRun(M1, CCW, 200);
  43.                 motorbit.motorRun(M3, CCW, 200);
  44.                 k10.canvas->canvasText("      K10小车斜着走", 0, 60, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  45.                 k10.canvas->updateCanvas();
  46.         }
  47.         // 清除第1行唤醒提示文字,防止文字叠加残留
  48.         k10.canvas->canvasClear(1);
  49. }
复制代码


# 整套方案工作流程

1. 上电,语音模块初始化;
2. 待机监听唤醒词;
3. 说出 **你好小新** → 唤醒;
4. 紧接着说出语音指令,小车执行对应运动;
5. 下达运动指令后电机持续运转,**必须语音喊 “停车” 才能停机**。

# 核心要点

## 1. 底盘适配

代码为**四轮麦克纳姆轮专用时序**,支持前进、后退、左右横移、原地旋转、斜走。普通两轮差速小车无法实现横移。

## 2. 无阻塞优势

代码全程没有`delay()`,语音识别持续工作,不会出现指令响应卡顿。

## 3. 两种画布打印方式区分

- `canvasText(文字,行号,颜色)`:按行数排版,适合提示信息;
- `canvasText(X,Y,颜色,字体,透明度,抗锯齿)`:自由坐标,固定位置显示运动状态。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

Mind+图形编程

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2
【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

实验场景图与视频记录

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图3
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 天前

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图1

【花雕动手做】行空板K10之改装麦克娜姆轮玩具坦克小车图2


【【花雕动手做】行空板 K10 系列实验之离线语音识别改装麦克娜姆轮玩具坦克小车 #diy机器人 #坦克模型 #行空板K10 #机器人编程 #小车动手做】

https://www.bilibili.com/video/BV1RG3F6WEBh/?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