【花雕动手做】行空板 K10 系列实验之3640无刷电机三驱动全向福来轮语音识别控制智能小车


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

3640无刷电机三驱全向福来轮小车使用的特色底板、马达、7.4V锂电池、全向福来轮与扩展板














主打:人工智能模块

语音识别合成相关说明


辅助:屏幕显示相关积木

接脚 IO 扩展模块
知识点:三驱福来轮(三轮全向轮)控制原理
一、福来轮(全向 Omni 轮)基础结构与力学特性
福来轮vs麦克纳姆轮对比
- 轮子结构
福来轮由主驱动轮毂 + 一圈垂直于主轴的被动小滚轮组成:
电机驱动主轮毂旋转,沿轮毂切线方向输出主动推力;
外圈小滚轮与主轴 90° 垂直,可无阻力被动横向滑动;
单个轮子只能输出单方向主动力,垂直主轴方向完全自由滑动。 - 和麦克纳姆轮核心区别
麦克纳姆轮:斜 45° 辊子,单轮可同时分解横向 + 纵向分力,最少 4 轮底盘;
福来全向轮:辊子垂直主轴,单轮只有单向主动推力,必须 3 轮呈 120° 三角布局,依靠矢量叠加实现全向移动。
二、三轮标准布局(核心硬件前提)
三个福来轮在圆形底盘上均匀正三角分布,两两夹角严格 120°,每个轮子主轴指向底盘几何中心:

三轮120°布局坐标系
1 号轮(前轮):安装角 90°,主轴沿车身 Y 轴正方向;
2 号轮(左后):安装角 210°;
3 号轮(右后):安装角 330°;
每个轮子独立配 1 个直流减速电机 + 驱动芯片,三路 PWM 独立调速、正反转控制。
关键:三个轮子缺一不可,两轮福来轮无法实现全向平移 / 原地自转。
三、底层力学运动原理(矢量叠加核心)
单个福来轮仅能沿自身主轴方向产生推力,垂直主轴方向可自由滑动,无阻力;
三个轮子的推力矢量在 XY 平面叠加,合成车身X 横向、Y 纵向平移速度 + 绕中心旋转角速度;
通过修改三个电机的转速大小、旋转方向(正负速度),改变三个推力矢量,就能合成平面内任意运动:直行、横移、斜走、原地零半径旋转。
运动学速度换算公式(主控代码核心计算)
设车身目标运动:
Vx:车身左右横向速度(右为正)
Vy:车身前后纵向速度(前为正)
ω:车身原地旋转角速度(顺时针为正)
R:底盘中心到任意轮子的距离
三个轮子目标线速度:
plaintext
V1 = Vy + R·ω
V2 = -0.5·Vy - 0.866·Vx + R·ω
V3 = -0.5·Vy + 0.866·Vx + R·ω
计算结果正负号 = 电机转向;数值绝对值 = PWM 调速占空比;
主控收到前进 / 横移 / 转圈指令后,先算出 Vx、Vy、ω,再代入公式算出三路电机转速输出。
四、6 种标准运动电机控制逻辑(对应语音遥控场景)
- 直线向前(Vy>0,Vx=0,ω=0)
目标:仅纵向向前,无横向偏移、不旋转
计算结果:
V1 = 正转,V2 = 反转,V3 = 反转,三轮速度绝对值相等
1 号轮向前推,2、3 号轮向后抵消横向分力,合力纯向前。 - 直线向后(Vy<0,Vx=0,ω=0)
全部转向与前进反向:V1 反转,V2、V3 正转,速度大小一致。 - 车身整体向右横移(Vx>0,Vy=0,ω=0)
V1=0(前轮停机),V2 正转,V3 反转,速度相同;
2、3 轮推力合成纯向右合力,前轮横向自由滑动无阻力。 - 车身整体向左横移(Vx<0,Vy=0,ω=0)
V1 停机,V2 反转,V3 正转,左右合力向左。 - 原地顺时针转圈(Vx=0,Vy=0,ω>0)
V1、V2、V3 全部同向正转,速度大小完全相等;
三轮推力形成环绕中心的旋转力偶,无平移分量,原地自转。 - 斜向行走(Vx、Vy 同时不为 0,ω=0)
三轮按公式分配不同转速,同时产生纵向 + 横向合力,车身斜向直行。 - 停车
V1=V2=V3=0,三路电机全部断电刹车。
五、电子控制完整流程(行空板 / ESP32 语音小车适配)
- 硬件链路
主控(行空板 K10)→ 三路 PWM 引脚 → L298N/L9110S 电机驱动 → 三路 N20 减速电机 → 福来轮
PWM 占空比:0~255 对应速度大小;
IO 高低电平控制电机 CW 正转 / CCW 反转;
可选:电机 AB 相编码器,采集脉冲做 PID 速度闭环,修正打滑误差。 - 软件控制流程(语音小车逻辑)
语音识别模块接收口令(前进 / 右横 / 转圈),解析出目标 Vx、Vy、ω;
主控代入三轮运动学公式,计算 V1/V2/V3 三路电机目标速度;
将速度正负转为电机转向,数值转为 PWM 输出;
循环实时刷新三路电机转速,屏幕同步显示运动状态;
喊 “停车” 时三路电机全部置 0 停机。
六、三轮福来轮 vs 四轮麦克纳姆轮优缺点对比

七、典型应用场景
创客教育语音遥控小车(你当前行空板语音项目);
小型桌面巡检机器人、绘图机器人;
狭小空间转运轻型物料 AGV;
云台小型全向移动底座。
八、三轮驱动与四轮驱动全向福来轮配置图



【花雕动手做】行空板 K10 系列实验之3640无刷电机三驱动全向福来轮语音控制智能小车
实验开源代码
// 引入离线语音识别核心库asr.h,提供语音唤醒、拼音口令识别、持续收音监听功能
#include "asr.h"
// 行空板K10主板底层驱动库,封装屏幕画布、引脚配置pinMode、IO电平输出等硬件操作API
#include "unihiker_k10.h"
// ====================== 全局硬件对象实例化 ======================
UNIHIKER_K10 k10; // 行空板主控对象,统一管理LCD屏幕、板载GPIO、系统底层总线
ASR asr; // 离线语音识别模块实例,负责麦克风收音、人声解析、指令判断
uint8_t screen_dir=2; // 屏幕旋转配置参数:数值2代表屏幕倒置显示
// ==================================================================
// setup() 上电初始化函数,设备开机/重启仅执行1次
// 功能:配置板载引脚输出模式、初始化主板/语音模块/屏幕、设置上电安全刹车电平、注册5条语音控制口令
// ==================================================================
void setup() {
// 将板载物理引脚P0配置为数字输出模式,用于电机驱动逻辑控制
pinMode(P0, OUTPUT);
// 将板载物理引脚P1配置为数字输出模式,另一路电机逻辑控制引脚
pinMode(P1, OUTPUT);
// 初始化行空板全部底层硬件资源:串口、I2C通信总线、LCD屏幕、板载IO外设
k10.begin();
// 初始化离线语音识别模块三大核心配置参数
// CONTINUOUS:持续收音模式,麦克风不间断循环监听环境人声
// CN_MODE:中文识别模式,仅能识别预先注册的中文拼音口令
// 12000:收音抗噪灵敏度阈值,数值越大过滤环境杂音、防止误唤醒能力越强
asr.asrInit(CONTINUOUS, CN_MODE, 12000);
// 阻塞循环等待语音模块加载语音识别模型完成
// _asrState == 0 代表模块未就绪,每100ms循环检测一次状态,避免未初始化调用报错
while(asr._asrState == 0){delay(100);}
// 根据预设screen_dir参数初始化LCD显示屏
k10.initScreen(screen_dir);
// 创建屏幕绘图画布缓存区,所有文字先存入缓存,再统一刷新到实体屏幕,减少刷屏闪烁
k10.creatCanvas();
// 上电初始化全部控制引脚为高电平,小车默认刹车静止,防止开机瞬间误冲,保障硬件安全
digitalWrite(P0, HIGH); // 板载引脚P0上电拉高
digitalWrite(P1, HIGH); // 板载引脚P1上电拉高
digital_write(eP2, HIGH); // 扩展IO引脚eP2上电拉高
// 批量注册5条离线语音拼音控制指令,离线识别模块仅能识别提前录入的口令
asr.addASRCommand(0+1, "qi dong"); // ID=1 语音口令:启动
asr.addASRCommand(1+1, "ting che"); // ID=2 语音口令:停车
asr.addASRCommand(2+1, "qian jin"); // ID=3 语音口令:前进
asr.addASRCommand(3+1, "hou tui"); // ID=4 语音口令:后退
asr.addASRCommand(4+1, "zhuan quan");// ID=5 语音口令:原地转圈
}
// ==================================================================
// loop() 主循环函数,硬件初始化完成后无限循环持续运行
// 功能:实时检测语音唤醒状态、识别语音口令、输出多路IO高低电平控制小车驱动、屏幕同步打印运行状态文字
// ==================================================================
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();
}
// ---------------- 语音指令ID1:qi dong 小车整机启动解锁 ----------------
if (asr.isDetectCmdID(0+1)) {
// P0、P1、扩展eP2全部拉低,解除电机锁定,进入可运动状态
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, LOW);
// 屏幕居中显示24号黑色大字运行状态
// 参数说明:X坐标,Y坐标,文字RGB颜色,中英文字体,字号大小,自动换行开关
k10.canvas->canvasText("K10 小车启动", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ---------------- 语音指令ID2:ting che 小车刹车停机锁定 ----------------
if (asr.isDetectCmdID(1+1)) {
// P0、P1、eP2全部拉高,电机驱动锁定,切断动力输出,小车立即静止
digitalWrite(P0, HIGH);
digitalWrite(P1, HIGH);
digital_write(eP2, HIGH);
k10.canvas->canvasText("K10 小车停车", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ---------------- 语音指令ID3:qian jin 小车直线向前行驶 ----------------
if (asr.isDetectCmdID(2+1)) {
// P0、P1拉低保持解锁;eP2拉高、eP4拉高,输出直行差速电平组合
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, HIGH);
digital_write(eP4, HIGH);
k10.canvas->canvasText("K10 小车前进", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ---------------- 语音指令ID4:hou tui 小车直线向后倒退 ----------------
if (asr.isDetectCmdID(3+1)) {
// P0、P1拉低解锁;仅eP2拉高,输出后退差速电平组合
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, HIGH);
k10.canvas->canvasText("K10 小车后退", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// ---------------- 语音指令ID5:zhuan quan 小车原地持续转圈 ----------------
if (asr.isDetectCmdID(4+1)) {
// P0、P1、eP2拉低解锁;eP3/eP4/eP6拉高,输出原地自转差速电平组合
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, LOW);
digital_write(eP3, HIGH);
digital_write(eP4, HIGH);
digital_write(eP6, HIGH);
k10.canvas->canvasText("K10小车原地转圈", 0, 180, 0x000000, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
// 清空画布第6行及下方全部文字,清除上一轮状态残留文字,避免新旧文字重叠产生残影
k10.canvas->canvasClear(6);
}
代码解读
一、项目整体功能
硬件组合:行空板 K10 + 离线 ASR 语音识别 + IO 电平控制式电机驱动底盘(两轮差速小车)
- 固定唤醒口令:你好小新,唤醒后才能操控小车;
- 5 条语音拼音指令:启动、停车、前进、后退、原地转圈;
- 依靠板载 IO (P0/P1)+ 扩展 IO (eP2/eP3/eP4/eP6) 输出高低电平组合,切换电机锁定 / 直行 / 后退 / 自转模式;
- LCD 屏幕使用 24 号大号字体,实时展示小车当前运行状态。
二、头文件与全局对象解析
#include "asr.h"
#include "unihiker_k10.h"
asr.h:离线语音识别库,实现持续收音、唤醒检测、自定义拼音指令识别;unihiker_k10.h:行空板底层驱动库,管理屏幕画布、引脚模式配置、IO 电平输出函数。
UNIHIKER_K10 k10;
ASR asr;
uint8_t screen_dir=2;
k10:行空板主控实例,统一管理屏幕、板载 GPIO、底层硬件初始化;asr:语音识别实例,处理麦克风收音与人声解析;screen_dir=2:设置屏幕倒置显示。
三、setup () 上电初始化(开机仅执行一次)
pinMode(P0, OUTPUT); pinMode(P1, OUTPUT);
将板载 P0、P1 配置为数字输出引脚,作为整机解锁总控信号。k10.begin();
初始化行空板全部硬件、I2C / 串口总线、屏幕外设资源。- 语音模块初始化
asr.asrInit(CONTINUOUS, CN_MODE, 12000);
while(asr._asrState == 0){delay(100);}
CONTINUOUS:不间断持续收音;CN_MODE:中文识别,仅识别预存拼音口令;12000:抗噪灵敏度,数值越大越不容易误唤醒;
循环阻塞等待语音模型加载完毕,模块就绪才向下执行。
- 屏幕初始化
k10.initScreen(screen_dir);
k10.creatCanvas();
按照倒置参数点亮屏幕,创建画布缓存,文字先存入缓存再统一刷新,减少屏幕闪烁。
5. 上电安全默认电平
digitalWrite(P0, HIGH);
digitalWrite(P1, HIGH);
digital_write(eP2, HIGH);
整机控制引脚上电默认高电平,小车初始锁定刹车,避免开机窜动。
6. 注册语音指令
asr.addASRCommand(0+1, "qi dong"); // ID1 启动
asr.addASRCommand(1+1, "ting che"); // ID2 停车
asr.addASRCommand(2+1, "qian jin"); // ID3 前进
asr.addASRCommand(3+1, "hou tui"); // ID4 后退
asr.addASRCommand(4+1, "zhuan quan");// ID5 原地转圈
提前录入 5 条拼音口令,语音模块仅能识别预存指令。
四、loop () 无限主循环,实时监听语音
1. 唤醒状态判断
asr.isWakeUp() 检测是否识别唤醒词「你好小新」:
- 唤醒成功:屏幕第 6 行红色文字提示 “已唤醒行空板小车”;
- 未唤醒待机:屏幕第 4 行蓝色文字提示唤醒口令;
updateCanvas()将画布缓存文字一次性刷新到实体屏幕。
2. 各语音指令硬件电平逻辑
1)qi dong 启动(整机解锁)
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, LOW);
P0、P1 拉低解除整机锁定,小车进入可运动状态。
2)ting che 停车(整机锁定刹车)
digitalWrite(P0, HIGH);
digitalWrite(P1, HIGH);
digital_write(eP2, HIGH);
总控引脚全部拉高,电机切断动力,小车立刻锁死静止。
3)qian jin 前进(直线直行)
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, HIGH);
digital_write(eP4, HIGH);
保持解锁状态,eP2、eP4 拉高,输出直行差速电平,两轮同向正转向前。
4)hou tui 后退(直线倒退)
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, HIGH);
保持解锁,仅 eP2 拉高,电机反向输出,直线向后倒退。
5)zhuan quan 原地转圈
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
digital_write(eP2, LOW);
digital_write(eP3, HIGH);
digital_write(eP4, HIGH);
digital_write(eP6, HIGH);
解锁 + 转圈模式,eP3/eP4/eP6 拉高,左右电机反向差速,原地持续自转。
3. 屏幕清理
k10.canvas->canvasClear(6);
清空画布第 6 行及下方所有文字,清除上一轮状态,防止新旧文字重叠残影。
五、引脚功能总表

六、运动动作对照表

七、完整运行流程
- 上电配置 P0/P1 为输出引脚,初始化行空板全部硬件;
- 启动离线语音识别,循环等待语音模型加载完成;
- 初始化倒置 LCD 屏幕、创建绘图画布;
- 所有控制引脚默认拉高,上电小车保持锁定刹车;
- 注册 5 条语音拼音控制指令;
- 麦克风不间断监听唤醒词 “你好小新”;
- 唤醒后说出对应口令,多路 IO 输出对应电平驱动电机,屏幕同步显示车辆状态;
- 循环末尾自动清空屏幕文字,持续等待下一条语音指令。
Mind+图形编程


实验场景图与视频记录




【【花雕动手做】行空板 K10 系列实验之3640无刷电机三驱动全向福来轮语音控制智能小车 #厉害了我的车 #行空板K10 #人工智能技术 #DIY动手做】
行空板 K10 之三驱动全向福来轮语音小车
更多推荐



所有评论(0)