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

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

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

在这里插入图片描述
项目使用的平板灯、TT马达、全向福来轮与扩展板

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

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

在这里插入图片描述
WS2812灯带

在这里插入图片描述

知识点: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,不会卡顿。
示例极简代码:

#include <Adafruit_NeoPixel.h>
#define DATA_PIN P0 //K10外接灯带推荐P0
#define LED_COUNT 3
Adafruit_NeoPixel strip(LED_COUNT, DATA_PIN, NEO_GRB + NEO_KHZ800);

void setup(){
strip.begin();
strip.setBrightness(80);
strip.fill(strip.Color(255,0,0));
strip.show();
}
void loop(){
}
补充:行空板自带 3 颗 RGB 灯是内置 WS2812,封装在库内,直接调用k10.rgb,不用 NeoPixel 库。
2)Mind + 图形化
直接找到「WS2812 灯带」积木,选择引脚、灯数量即可。

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

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

实验开源代码

// 导入离线语音识别库
#include "asr.h"
// 导入行空板K10底层驱动库
#include "unihiker_k10.h"
// Microbit电机驱动板库,控制直流电机
#include <Microbit_Motor.h>
// DFRobot WS2812灯带驱动库
#include <DFRobot_NeoPixel.h>

// ==================== 对象、全局变量创建 ====================
UNIHIKER_K10     k10;               // 行空板K10主控对象
ASR              asr;               // 离线语音识别对象
DFRobot_NeoPixel neoPixel_P1;       // WS2812灯带对象,接引脚P1
uint8_t          screen_dir=2;      // 屏幕旋转方向参数
Microbit_Motor   motorbit;          // 电机驱动板对象

// ==================== 初始化函数,上电仅运行一次 ====================
void setup() {
	k10.begin();                     // 启动行空板硬件初始化(屏幕、按键等)

	// ASR初始化:持续识别模式、中文模式、拾音超时12000ms
	asr.asrInit(CONTINUOUS, CN_MODE, 12000);
	// 等待语音模块初始化完成,初始化未就绪持续循环等待
	while(asr._asrState == 0){delay(100);}

	k10.initScreen(screen_dir);      // 根据screen_dir设置屏幕方向
	k10.creatCanvas();               // 创建画布,用于屏幕文字绘制

	// 注册语音指令【指令ID,语音关键词】
	asr.addASRCommand(0+1, "kai deng");    // ID=1 开灯
	asr.addASRCommand(1+1, "guan deng");   // ID=2 关灯
	asr.addASRCommand(2+1, "lv deng");     // ID=3 绿灯
	asr.addASRCommand(3+1, "hong deng");  // ID=4 红灯
	asr.addASRCommand(4+1, "qian jin");   // ID=5 前进
	asr.addASRCommand(5+1, "ting che");    // ID=6 停车
	asr.addASRCommand(6+1, "hou tui");     // ID=7 后退
	asr.addASRCommand(7+1, "you heng");   // ID=8 右横移
	asr.addASRCommand(8+1, "zuo heng");    // ID=9 左横移
	asr.addASRCommand(9+1, "shun zhuan");  // ID=10 顺时针旋转
	asr.addASRCommand(10+1, "ni zhuan");   // ID=11 逆时针旋转

	// WS2812灯带初始化:引脚P1,总共37颗灯珠
	neoPixel_P1.begin(P1, 37);
	neoPixel_P1.setBrightness(100);        // 设置灯带最大亮度 0~255
}

// ==================== 主循环,不断循环执行 ====================
void loop() {
	// 判断:是否唤醒(唤醒词:你好小新)
	if (asr.isWakeUp()) {
		// 画布输出红色提示文字
		k10.canvas->canvasText("已唤醒平板灯小车.......", 6, 0xFF0000);
		k10.canvas->updateCanvas();  // 刷新屏幕显示
	}
	else {
		// 未唤醒状态,提示唤醒词
		k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:开灯 ID=1 ============
	if (asr.isDetectCmdID(0+1)) {
		neoPixel_P1.setRangeColor(0, 36, 0xFFFFFF); // 全部灯设白色(0~36号,一共37颗)
		// 在坐标(0,180)输出24号中文字体文字,背景黑色
		k10.canvas->canvasText("K10 小车开灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:关灯 ID=2 ============
	if (asr.isDetectCmdID(1+1)) {
		neoPixel_P1.clear();  // 清空灯带,全部熄灭
		k10.canvas->canvasText("K10 小车关灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:绿灯 ID=3 ============
	if (asr.isDetectCmdID(2+1)) {
		neoPixel_P1.setRangeColor(0, 36, 0x00FF00); // 全部绿色
		k10.canvas->canvasText("K10 小车绿灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:红灯 ID=4 ============
	if (asr.isDetectCmdID(3+1)) {
		neoPixel_P1.setRangeColor(0, 36, 0xFF0000); // 全部红色
		k10.canvas->canvasText("K10 小车红灯", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:前进 ID=5(三轮全向M2、M3正转) ============
	if (asr.isDetectCmdID(4+1)) {
		motorbit.motorRun(M2, CW, 200);    // M2电机 正向 速度200
		motorbit.motorRun(M3, CW, 200);    // M3电机 正向 速度200
		k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:停车 ID=6 ============
	if (asr.isDetectCmdID(5+1)) {
		motorbit.motorStop(ALL);           // 停止所有电机
		k10.canvas->canvasText("K10 小车停止", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:后退 ID=7 ============
	if (asr.isDetectCmdID(6+1)) {
		motorbit.motorRun(M2, CCW, 200);   // M2反向
		motorbit.motorRun(M3, CCW, 200);   // M3反向
		k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:右横移 ID=8 ============
	if (asr.isDetectCmdID(7+1)) {
		motorbit.motorRun(M1, CCW, 200);
		motorbit.motorRun(M2, CW, 200);
		motorbit.motorStop(M3);
		k10.canvas->canvasText("K10 小车右横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:左横移 ID=9 ============
	if (asr.isDetectCmdID(8+1)) {
		motorbit.motorRun(M1, CW, 200);
		motorbit.motorRun(M2, CCW, 200);
		motorbit.motorStop(M3);
		k10.canvas->canvasText("K10小车左横", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:顺时针旋转ID=10,持续2秒自动停止 ============
	if (asr.isDetectCmdID(9+1)) {
		motorbit.motorRun(M1, CCW, 200);
		motorbit.motorRun(M2, CCW, 200);
		motorbit.motorRun(M3, CW, 200);
		delay(2000);                      // 维持转动2秒
		motorbit.motorStop(ALL);          // 2秒后停车
		k10.canvas->canvasText("K10小车顺时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	// ============ 语音指令:逆时针旋转ID=11,持续2秒自动停止 ============
	if (asr.isDetectCmdID(10+1)) {
		motorbit.motorRun(M1, CW, 200);
		motorbit.motorRun(M2, CW, 200);
		motorbit.motorRun(M3, CCW, 200);
		delay(2000);                      // 维持转动2秒
		motorbit.motorStop(ALL);          // 2秒后停车
		k10.canvas->canvasText("K10小车逆时针转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->updateCanvas();
	}

	k10.canvas->canvasClear(6); // 清除画布指定区域文字,避免文字重叠
}

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

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

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

#include "asr.h"                 // K10内置离线语音识别库(本地ASR,不需要网络)
#include "unihiker_k10.h"        // 行空板K10底层驱动:屏幕、画布、硬件资源
#include <Microbit_Motor.h>      // microbit电机扩展板驱动,控制三路直流电机
#include <DFRobot_NeoPixel.h>    // WS2812灯带驱动库

UNIHIKER_K10     k10;               // 行空板主控实例
ASR              asr;               // 离线语音识别实例
DFRobot_NeoPixel neoPixel_P1;       // WS2812灯带,数据引脚P1
uint8_t          screen_dir=2;      // 屏幕显示旋转方向
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. 唤醒状态监测
if (asr.isWakeUp())
isWakeUp():检测是否说出唤醒词你好小新

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

  1. 灯光指令逻辑

在这里插入图片描述

  1. 三轮全向底盘运动指令(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 秒停止

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

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

Mind+图形编程

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

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

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

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

Logo

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

更多推荐