63浏览
查看: 63|回复: 7

[K10教程] 【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯

[复制链接]
【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2

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

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


【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

项目使用的平板灯、TT马达、全向福来轮与扩展板等

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图3

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图5

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图6

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图4

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2





回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

知识点:WS2812 灯带

一、基础定义
WS2812(常称 内置驱动 5050 RGB 灯珠),是单线串行智能控制 LED。
单颗灯珠集成:5050 RGB 三色 LED + WS2812 控制芯片。
特点:只需要 1 根数据线、电源、GND,大量灯珠可以首尾串联。
衍生型号:WS2812B(市面上最通用版本,改善散热),日常大家说 WS2812 一般就是 WS2812B。

二、电气参数
供电电压:DC 5V
重点:灯珠芯片 5V 供电,但数据引脚支持 3.3V 电平(ESP32 / 行空板 K10、掌控板可以直接驱动,无需电平转换)
通信方式:单总线异步串行通信
色彩:24 位色彩(R 0~255,G 0~255,B 0~255),一共 1670 万颜色
通信速率:800KHz
静态电流:很低;全亮白光时单颗最大约 60mA

三、信号传输原理(关键)
数据线 DI 输入信号:
第一颗灯读取属于自己的 24bit 颜色数据,剩下数据自动从 DO 引脚转发给下一颗灯。
串联顺序:主控 DATA → DI 灯 1 → DO→DI 灯 2 → DO→DI 灯 3……
优势:所有灯共用一根 IO 口,扩展非常方便。
限制:信号单向传输,不能反向接线。

四、硬件接线规范
三根线:
VCC:5V
GND:电源负极(必须和主控共地! 不共地极易乱色、闪烁)
DI:数据输入(接到单片机 IO)
高频踩坑(机器人项目必看)
不要使用行空板 3.3V 给长灯带供电!
3.3V 引脚电流小,只能驱动 3~5 颗短灯带;超过建议单独外接 5V 电源。
长线(>1 米):电源线两端并联 1000μF 电解电容;数据端串联 300Ω 电阻,减少信号反射,防止频闪。
严禁 DO 当成 DI 使用。

五、常用规格分类
裸灯珠:单颗 WS2812B(适合小车状态指示灯)
软灯带:IP30 裸板、IP65 硅胶套管、IP67 防水
硬灯条、圆环(彩灯圆盘)
灯珠密度:30 灯 / 米、60 灯 / 米、144 灯 / 米

六、单片机驱动方案(适配你的硬件)
1)行空板 K10 / 掌控板 Arduino (C++)
推荐库:Adafruit_NeoPixel
ESP32 底层使用 RMT 硬件外设驱动,不占用 CPU,不会卡顿。
示例极简代码:

  1. #include <Adafruit_NeoPixel.h>
  2. #define DATA_PIN P0    //K10外接灯带推荐P0
  3. #define LED_COUNT 3
  4. Adafruit_NeoPixel strip(LED_COUNT, DATA_PIN, NEO_GRB + NEO_KHZ800);
  5. void setup(){
  6.   strip.begin();
  7.   strip.setBrightness(80);
  8.   strip.fill(strip.Color(255,0,0));
  9.   strip.show();
  10. }
  11. void loop(){
  12. }
复制代码

补充:行空板自带 3 颗 RGB 灯是内置 WS2812,封装在库内,直接调用k10.rgb,不用 NeoPixel 库。
2)Mind + 图形化
直接找到「WS2812 灯带」积木,选择引脚、灯数量即可。

七、优缺点汇总
优点
单线控制,仅占用 1 路 IO,资源占用少;
独立控色,每一颗灯可以显示不同颜色,实现流水灯、呼吸灯、状态指示;
3.3V 单片机可以直接驱动数据信号;
价格低廉,创客项目标配;
串联扩展简单。
缺点
需要5V 供电,3.3V 无法带动多颗灯珠;
串行传输:灯带越长,刷新耗时越大(100 颗灯刷新会产生轻微延迟);
电源布线不当极易出现首尾亮度不一致;
抗干扰一般,BLDC 电机、大功率驱动旁边容易出现随机乱闪,需要做好地线隔离。

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1
【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

【花雕动手做】行空板 K10 系列实验之离线语音识别控制WS2812B小车移动平板灯

实验开源代码

  1. // 导入离线语音识别库
  2. #include "asr.h"
  3. // 导入行空板K10底层驱动库
  4. #include "unihiker_k10.h"
  5. // Microbit电机驱动板库,控制直流电机
  6. #include <Microbit_Motor.h>
  7. // DFRobot WS2812灯带驱动库
  8. #include <DFRobot_NeoPixel.h>
  9. // ==================== 对象、全局变量创建 ====================
  10. UNIHIKER_K10     k10;               // 行空板K10主控对象
  11. ASR              asr;               // 离线语音识别对象
  12. DFRobot_NeoPixel neoPixel_P1;       // WS2812灯带对象,接引脚P1
  13. uint8_t          screen_dir=2;      // 屏幕旋转方向参数
  14. Microbit_Motor   motorbit;          // 电机驱动板对象
  15. // ==================== 初始化函数,上电仅运行一次 ====================
  16. void setup() {
  17.         k10.begin();                     // 启动行空板硬件初始化(屏幕、按键等)
  18.         // ASR初始化:持续识别模式、中文模式、拾音超时12000ms
  19.         asr.asrInit(CONTINUOUS, CN_MODE, 12000);
  20.         // 等待语音模块初始化完成,初始化未就绪持续循环等待
  21.         while(asr._asrState == 0){delay(100);}
  22.         k10.initScreen(screen_dir);      // 根据screen_dir设置屏幕方向
  23.         k10.creatCanvas();               // 创建画布,用于屏幕文字绘制
  24.         // 注册语音指令【指令ID,语音关键词】
  25.         asr.addASRCommand(0+1, "kai deng");    // ID=1 开灯
  26.         asr.addASRCommand(1+1, "guan deng");   // ID=2 关灯
  27.         asr.addASRCommand(2+1, "lv deng");     // ID=3 绿灯
  28.         asr.addASRCommand(3+1, "hong deng");  // ID=4 红灯
  29.         asr.addASRCommand(4+1, "qian jin");   // ID=5 前进
  30.         asr.addASRCommand(5+1, "ting che");    // ID=6 停车
  31.         asr.addASRCommand(6+1, "hou tui");     // ID=7 后退
  32.         asr.addASRCommand(7+1, "you heng");   // ID=8 右横移
  33.         asr.addASRCommand(8+1, "zuo heng");    // ID=9 左横移
  34.         asr.addASRCommand(9+1, "shun zhuan");  // ID=10 顺时针旋转
  35.         asr.addASRCommand(10+1, "ni zhuan");   // ID=11 逆时针旋转
  36.         // WS2812灯带初始化:引脚P1,总共37颗灯珠
  37.         neoPixel_P1.begin(P1, 37);
  38.         neoPixel_P1.setBrightness(100);        // 设置灯带最大亮度 0~255
  39. }
  40. // ==================== 主循环,不断循环执行 ====================
  41. void loop() {
  42.         // 判断:是否唤醒(唤醒词:你好小新)
  43.         if (asr.isWakeUp()) {
  44.                 // 画布输出红色提示文字
  45.                 k10.canvas->canvasText("已唤醒平板灯小车.......", 6, 0xFF0000);
  46.                 k10.canvas->updateCanvas();  // 刷新屏幕显示
  47.         }
  48.         else {
  49.                 // 未唤醒状态,提示唤醒词
  50.                 k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
  51.                 k10.canvas->updateCanvas();
  52.         }
  53.         // ============ 语音指令:开灯 ID=1 ============
  54.         if (asr.isDetectCmdID(0+1)) {
  55.                 neoPixel_P1.setRangeColor(0, 36, 0xFFFFFF); // 全部灯设白色(0~36号,一共37颗)
  56.                 // 在坐标(0,180)输出24号中文字体文字,背景黑色
  57.                 k10.canvas->canvasText("K10 小车开灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  58.                 k10.canvas->updateCanvas();
  59.         }
  60.         // ============ 语音指令:关灯 ID=2 ============
  61.         if (asr.isDetectCmdID(1+1)) {
  62.                 neoPixel_P1.clear();  // 清空灯带,全部熄灭
  63.                 k10.canvas->canvasText("K10 小车关灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  64.                 k10.canvas->updateCanvas();
  65.         }
  66.         // ============ 语音指令:绿灯 ID=3 ============
  67.         if (asr.isDetectCmdID(2+1)) {
  68.                 neoPixel_P1.setRangeColor(0, 36, 0x00FF00); // 全部绿色
  69.                 k10.canvas->canvasText("K10 小车绿灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  70.                 k10.canvas->updateCanvas();
  71.         }
  72.         // ============ 语音指令:红灯 ID=4 ============
  73.         if (asr.isDetectCmdID(3+1)) {
  74.                 neoPixel_P1.setRangeColor(0, 36, 0xFF0000); // 全部红色
  75.                 k10.canvas->canvasText("K10 小车红灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  76.                 k10.canvas->updateCanvas();
  77.         }
  78.         // ============ 语音指令:前进 ID=5(三轮全向M2、M3正转) ============
  79.         if (asr.isDetectCmdID(4+1)) {
  80.                 motorbit.motorRun(M2, CW, 200);    // M2电机 正向 速度200
  81.                 motorbit.motorRun(M3, CW, 200);    // M3电机 正向 速度200
  82.                 k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  83.                 k10.canvas->updateCanvas();
  84.         }
  85.         // ============ 语音指令:停车 ID=6 ============
  86.         if (asr.isDetectCmdID(5+1)) {
  87.                 motorbit.motorStop(ALL);           // 停止所有电机
  88.                 k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  89.                 k10.canvas->updateCanvas();
  90.         }
  91.         // ============ 语音指令:后退 ID=7 ============
  92.         if (asr.isDetectCmdID(6+1)) {
  93.                 motorbit.motorRun(M2, CCW, 200);   // M2反向
  94.                 motorbit.motorRun(M3, CCW, 200);   // M3反向
  95.                 k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  96.                 k10.canvas->updateCanvas();
  97.         }
  98.         // ============ 语音指令:右横移 ID=8 ============
  99.         if (asr.isDetectCmdID(7+1)) {
  100.                 motorbit.motorRun(M1, CCW, 200);
  101.                 motorbit.motorRun(M2, CW, 200);
  102.                 motorbit.motorStop(M3);
  103.                 k10.canvas->canvasText("K10 小车右横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  104.                 k10.canvas->updateCanvas();
  105.         }
  106.         // ============ 语音指令:左横移 ID=9 ============
  107.         if (asr.isDetectCmdID(8+1)) {
  108.                 motorbit.motorRun(M1, CW, 200);
  109.                 motorbit.motorRun(M2, CCW, 200);
  110.                 motorbit.motorStop(M3);
  111.                 k10.canvas->canvasText("K10小车左横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  112.                 k10.canvas->updateCanvas();
  113.         }
  114.         // ============ 语音指令:顺时针旋转ID=10,持续2秒自动停止 ============
  115.         if (asr.isDetectCmdID(9+1)) {
  116.                 motorbit.motorRun(M1, CCW, 200);
  117.                 motorbit.motorRun(M2, CCW, 200);
  118.                 motorbit.motorRun(M3, CW, 200);
  119.                 delay(2000);                      // 维持转动2秒
  120.                 motorbit.motorStop(ALL);          // 2秒后停车
  121.                 k10.canvas->canvasText("K10小车顺时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  122.                 k10.canvas->updateCanvas();
  123.         }
  124.         // ============ 语音指令:逆时针旋转ID=11,持续2秒自动停止 ============
  125.         if (asr.isDetectCmdID(10+1)) {
  126.                 motorbit.motorRun(M1, CW, 200);
  127.                 motorbit.motorRun(M2, CW, 200);
  128.                 motorbit.motorRun(M3, CCW, 200);
  129.                 delay(2000);                      // 维持转动2秒
  130.                 motorbit.motorStop(ALL);          // 2秒后停车
  131.                 k10.canvas->canvasText("K10小车逆时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
  132.                 k10.canvas->updateCanvas();
  133.         }
  134.         k10.canvas->canvasClear(6); // 清除画布指定区域文字,避免文字重叠
  135. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

行空板 K10 离线语音三轮全向平板灯小车代码解读

项目概况
硬件:行空板 K10 + Microbit 电机扩展板 + 三轮全向轮底盘 + P1 外接 37 颗 WS2812 灯带
功能:离线语音控制灯光、小车全向运动;唤醒词:你好小新
开发环境:Mind+ Arduino 模式

一、头文件与对象定义解读

  1. #include "asr.h"                 // K10内置离线语音识别库(本地ASR,不需要网络)
  2. #include "unihiker_k10.h"        // 行空板K10底层驱动:屏幕、画布、硬件资源
  3. #include <Microbit_Motor.h>      // microbit电机扩展板驱动,控制三路直流电机
  4. #include <DFRobot_NeoPixel.h>    // WS2812灯带驱动库
  5. UNIHIKER_K10     k10;               // 行空板主控实例
  6. ASR              asr;               // 离线语音识别实例
  7. DFRobot_NeoPixel neoPixel_P1;       // WS2812灯带,数据引脚P1
  8. uint8_t          screen_dir=2;      // 屏幕显示旋转方向
  9. Microbit_Motor   motorbit;          // 电机驱动板实例
复制代码

二、setup () 上电初始化(只运行 1 次)
k10.begin():初始化行空板硬件
asr.asrInit(CONTINUOUS, CN_MODE, 12000)
CONTINUOUS:持续语音监听模式
CN_MODE:中文识别
12000:语音拾音最大超时时间 (ms)
while(asr._asrState == 0){delay(100);}
阻塞等待语音模块启动完成;模块未就绪,不往下执行。
k10.initScreen() + k10.creatCanvas():初始化屏幕、创建绘图画布
asr.addASRCommand(ID, "语音指令")
注册离线关键词,建立【编号 - 语音文本】映射;识别到语音后,可以通过 ID 判断指令。
neoPixel_P1.begin(P1, 37):灯带引脚 P1,总共有 37 颗灯珠;设置最大亮度。

三、loop () 无限主循环(程序核心)
1. 唤醒状态监测

  1. if (asr.isWakeUp())
  2. isWakeUp():检测是否说出唤醒词你好小新
复制代码

已唤醒:屏幕红色文字提示
未唤醒:屏幕蓝色文字提示唤醒词

2. 灯光指令逻辑

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1

3. 三轮全向底盘运动指令(M1/M2/M3 三路电机)
底盘为标准 120° 排布三轮全向轮
qian jin 前进:M2、M3 正向运转
hou tui 后退:M2、M3 反向运转
ting che 停车:所有电机立刻停止
you heng 右横移:M1 反转、M2 正转、M3 停机
zuo heng 左横移:M1 正转、M2 反转、M3 停机
shun zhuan 顺时针转圈:三个电机按对应方向运行 delay(2000),2 秒后自动停车
ni zhuan 逆时针转圈:反向旋转,维持 2 秒停止

4. 屏幕绘制逻辑
k10.canvas->canvasText() 在画布写入文字
k10.canvas->updateCanvas() 将画布内容刷新到屏幕
循环末尾 k10.canvas->canvasClear(6):清空局部画布,防止文字叠加残影。

四、核心工作流程
上电 → 硬件全部初始化,等待语音模块就绪
持续监听唤醒词「你好小新」
唤醒成功后,开始识别注册好的语音命令
识别对应指令:
灯光指令 → 修改 WS2812 灯带颜色
运动指令 → 控制三轮全向电机运转,屏幕同步显示状态
持续循环,等待下一次语音指令。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

本帖最后由 驴友花雕 于 2026-8-3 17:03 编辑

Mind+图形编程

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1
        【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2
        【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图3
         【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图4
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

实验场景图与视频记录

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图4

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图3
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 天前

【花雕动手做】行空板K10之语音调控可移动WS2812B平板灯

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图1

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图2

【花雕动手做】行空板 K10 之语音调控可移动WS2812B平板灯图3


【【花雕动手做】行空板 K10 系列实验之离线语音识别控制WS2812B小车移动平板灯  #diy电子爱好者 #脑洞大开的diy #行空板K10 #移动平板灯】

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