1. 项目概述:打造会听话的桌面萌宠
你有没有想过在桌面上放一个能听懂你说话的小宠物?它会在你工作累了的时候给你表演个后空翻,或者在你开心时摇头晃脑地跳舞?基于STM32和ASRPRO的语音交互桌面萌宠项目就能实现这个梦想!
这个项目特别适合喜欢动手制作的电子爱好者,无论你是刚接触单片机的新手,还是有一定经验的开发者,都能从中找到乐趣。整个系统的核心思路很简单:ASRPRO语音模块负责"听"懂你的指令,STM32单片机作为"大脑"处理指令并控制四个舵机做出相应动作,OLED屏幕则用来显示萌宠的各种表情状态。
我实际做这个项目的时候,发现最难的不是编程和接线,而是让那些机械动作看起来自然流畅。比如让萌宠"趴下"这个动作,就需要协调四个舵机的转动角度和速度,否则就会显得很僵硬。经过几次调试后,我终于找到了最自然的动作组合,看着小东西在桌面上灵活转动,那种成就感真的很棒!
2. 硬件准备与选型指南
2.1 核心控制器选择
STM32F103C8T6是这个项目的核心大脑,我选择它是因为性价比超高,而且资源足够丰富。这款芯片有64KB的Flash和20KB的RAM,完全能满足我们的需求。最重要的是,它有4个定时器可以产生PWM信号,正好用来控制4个舵机。
在实际选购时,我建议多买一两片备用,因为焊接或者调试过程中难免会出现意外。价格大概在15-20元左右一片,国产的替代芯片如GD32F103C8T6也可以考虑,但需要注意一些细微的差异。
2.2 语音模块配置
ASRPRO语音识别模块是这个项目的"耳朵",我选择它是因为识别率高且配置简单。相比其他语音模块,ASRPRO支持离线识别,不需要联网就能工作,响应速度也很快。
这里有个小技巧:在购买ASRPRO时,最好选择已经焊好排针的版本,这样可以直接插到面包板上使用。如果买的是裸板,需要自己焊接排针,对新手来说可能有点挑战。
2.3 执行机构与显示设备
四个180度舵机是萌宠的"四肢",我建议选择金属齿轮的舵机,虽然价格稍贵但更耐用。OLED显示屏我用的0.96寸版本,分辨率是128x64,足够显示各种表情图案。
材料清单汇总:
- STM32F103C8T6系统板 x1
- ASRPRO语音识别模块 x1
- 0.96寸OLED显示屏 x1
- 180度舵机 x4
- 杜邦线若干(建议多准备些)
- 400孔面包板 x1
- 烧录器(DAP或STLink都可以)
- 喇叭(与ASRPRO配套使用)
3. 硬件连接详解
3.1 舵机连接方法
舵机的连接需要特别注意,每个舵机有三根线:电源线(红色)、地线(棕色或黑色)、信号线(黄色或橙色)。四个舵机的信号线分别连接到STM32的PA0、PA1、PA2、PA3引脚。
电源连接有个重要技巧:不要直接从STM32的5V引脚给所有舵机供电,因为同时转动时电流可能很大。我建议在面包板上做一个电源分配电路,用外部5V电源供电,或者至少从STM32的5V引脚引出一根线到面包板的正极排孔,然后再分给各个舵机。
// 舵机信号线连接:
// 舵机1信号线 -> PA0
// 舵机2信号线 -> PA1
// 舵机3信号线 -> PA2
// 舵机4信号线 -> PA3
3.2 OLED显示屏接线
OLED显示屏使用I2C接口,接线相对简单但容易接反。我第一次就接反了,幸好没烧坏屏幕。正确的接法是:
OLED -> STM32
GND -> GND
VCC -> 3.3V
SCL -> PB8
SDA -> PB9
特别注意:有些OLED模块的引脚顺序可能不同,一定要看清楚模块上的标识。如果屏幕不亮,首先检查电源和接地是否正确。
3.3 ASRPRO与STM32通信连接
ASRPRO和STM32之间通过串口通信,接线如下:
ASRPRO -> STM32
GND -> GND
3.3V -> 3.3V
TX -> PA10(RX)
这里有个容易出错的地方:ASRPRO的TX要接到STM32的RX引脚(PA10),但不需要连接RX到TX,因为在这个项目中只需要单向通信(ASRPRO发送指令给STM32)。
4. 开发环境搭建
4.1 Keil5安装与配置
Keil MDK-ARM是STM32开发的主要工具,安装过程需要注意几个关键点。首先去Keil官网下载MDK-ARM版本,选择Cortex-M3架构的支持包。安装完成后,需要注册激活,网上有很多详细的教程可以参考。
我建议安装524a版本,因为这个版本比较稳定,兼容性好。新版本有时会出现一些奇怪的问题,对于初学者来说调试起来比较困难。
安装完成后,需要安装STM32F1系列的设备支持包。在Keil中点击Pack Installer,搜索STM32F1,安装最新的DFP包即可。
4.2 天问Block配置语音指令
天问Block是配置ASRPRO的图形化工具,在浏览器中搜索"天问Block"就能找到官网下载。安装完成后,首先需要注册账号,因为生成语音模型需要在线编译。
语音指令的配置过程很有趣,你可以自定义唤醒词和指令词。比如我设置的唤醒词是"小宠物",指令词包括"握手"、"趴下"、"跳舞"等。每个指令词对应一个字符代码,比如'A'代表握手,'B'代表站立等。
在实际使用中,我发现指令词最好选择发音清晰、不容易混淆的词语。比如"左手"和"右手"在语音识别中容易混淆,不如改成"左边"和"右边"。
5. 核心程序设计
5.1 PWM舵机控制原理
舵机控制是通过PWM(脉冲宽度调制)信号实现的。虽然听起来很高大上,但实际上原理很简单:通过调整脉冲的宽度来控制舵机的转动角度。
一般舵机的控制脉冲周期为20ms(50Hz),脉冲宽度在0.5ms到2.5ms之间对应0度到180度。在代码中,我们通过调整定时器的比较值来生成不同宽度的脉冲。
void Servo_SetAngle1(float Angle)
{
// 将角度转换为PWM比较值
// 公式:Compare = Angle/180 * 2000 + 500
// 500对应0.5ms,2500对应2.5ms
PWM_SetCompare1(Angle/180*2000+500);
}
在实际调试中,我发现每个舵机的实际角度和理论值可能有细微差异,需要逐个校准。最好的方法是先用代码让舵机转到90度,然后观察实际位置是否垂直,如果不垂直就调整代码中的参数。
5.2 多舵机协同控制
让多个舵机协调运动是最大的挑战之一。如果简单地让所有舵机同时转到目标角度,动作会显得很生硬。我通过两种方式让动作更自然:
一是添加中间过渡动作,比如从站立到趴下,先让前腿弯曲,再让后腿弯曲,最后调整身体姿态。二是添加适当的延时,让动作有快有慢,更像生物的运动方式。
void PaXia(void)
{
// 先显示表情
OLED_ShowImage(1,1,128,64,KeAi);
OLED_Update();
// 分步骤控制各个舵机
Servo_SetAngle2(170); // 前腿弯曲
Delay_ms(300);
Servo_SetAngle1(65); // 头部低下
Delay_ms(300);
Servo_SetAngle3(100); // 后腿弯曲
Servo_SetAngle4(60); // 身体放低
}
5.3 语音指令处理逻辑
语音指令的处理主要在主循环中实现。STM32不断检查串口是否有数据传来,一旦收到特定字符就执行相应的动作。
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
RxData=USART_ReceiveData(USART1);
if(RxData=='A') // 握手指令
{
WoShou();
}
if(RxData=='B') // 站立指令
{
LiZheng();
}
// 其他指令处理...
}
}
在实际使用中,我建议添加一些错误处理机制,比如超时判断和指令校验,避免误触发。
6. 表情显示与动画设计
6.1 OLED取模软件使用
OLED显示表情需要先用取模软件将图片转换为数组数据。我推荐使用PCtoLCD2002这个软件,它支持多种取模方式设置。
取模时需要注意设置正确的参数:阴码、逐行式、顺向,16x16点阵。取模后得到的数组可以直接放在代码中使用。
// 示例:微笑表情的取模数据
const unsigned char WeiXiao[] = {
// 这里省略具体的数组数据
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
// ...更多数据
};
6.2 表情与动作的同步
为了让萌宠更加生动,需要让表情和动作同步变化。比如在握手时显示微笑表情,在趴下时显示可爱的表情。
我设计了一个简单的状态机来管理表情变化:
void UpdateExpression(uint8_t action)
{
switch(action)
{
case ACTION_SHAKE_HAND:
OLED_ShowImage(1,1,128,64,WeiXiao);
break;
case ACTION_LIE_DOWN:
OLED_ShowImage(1,1,128,64,KeAi);
break;
case ACTION_DANCE:
OLED_ShowImage(1,1,128,64,AiXin);
break;
default:
OLED_ShowImage(1,1,128,64,YanJing);
}
OLED_Update();
}
7. 调试技巧与常见问题解决
7.1 舵机角度校准
舵机角度校准是最耗时的部分。每个舵机的机械零点可能略有不同,需要逐个校准。我的方法是先让所有舵机转到90度,然后观察实际位置,如有偏差就在代码中调整偏移量。
// 实际使用中的校准值可能需要在代码中调整
void Servo_SetAngle1(float Angle)
{
// 添加校准偏移量,每个舵机可能不同
float calibratedAngle = Angle + angleOffset1;
PWM_SetCompare1(calibratedAngle/180*2000+500);
}
7.2 语音识别优化
语音识别率可以通过以下方法优化:首先选择安静的环境进行训练,其次训练时用正常的语速和音量,最后指令词要选择发音差异大的词语。
如果识别率还是不理想,可以尝试调整ASRPRO的灵敏度参数,或者在代码中添加简单的纠错机制,比如连续收到相同指令时才执行。
7.3 电源稳定性处理
多个舵机同时运动时电流可能很大,会导致电源电压下降,影响系统稳定性。我建议采取以下措施:
- 给STM32和舵机分别供电,或者至少加一个大电容(1000μF以上)在电源输入端
- 在程序中对舵机运动做限流,避免多个舵机同时高速运动
- 添加电压监测,如果电压过低就暂停舵机运动
8. 项目扩展与创意改进
8.1 增加传感器反馈
为了让萌宠更加智能,可以增加一些传感器。比如添加超声波传感器实现避障功能,或者添加触摸传感器实现触摸交互。
// 简单的超声波测距示例
float GetDistance(void)
{
// 触发超声波传感器
// 测量回波时间
// 计算并返回距离
}
8.2 无线控制功能
通过添加蓝牙或WiFi模块,可以实现手机远程控制。我建议使用HC-05蓝牙模块,价格便宜且易于使用。
手机端可以开发一个简单的APP,通过按钮控制萌宠的各种动作,还可以自定义动作序列。
8.3 个性化外观设计
硬件部分完成后,可以给萌宠设计一个漂亮的外观。可以用3D打印制作外壳,或者用毛毡、布料等材料手工制作。
我给我的桌面萌宠设计了一个小猫的外形,用热熔胶把绒毛布料粘在外壳上,看起来特别可爱。眼睛部分正好对应OLED屏幕,各种表情都能清晰显示。
8.4 声音反馈增强
除了视觉反馈,还可以添加声音反馈。比如在完成动作时播放音效,或者添加简单的语音合成功能。
ASRPRO模块本身就支持语音播放功能,可以在识别指令后播放相应的提示音,让交互更加丰富。
整个项目从硬件搭建到软件调试,再到外观制作,大概需要2-3个周末的时间。虽然过程中会遇到各种问题,但解决问题的过程本身就是最好的学习。当你最终看到自己制作的萌宠在桌面上灵活运动,听从你的语音指令时,所有的努力都是值得的。
我最满意的是跳舞功能,四个舵机协调运动,配合OLED屏幕上的爱心表情,真的很有生命力。有时候工作累了,就让它跳个舞,心情顿时就好了很多。
这个项目不仅让我学会了STM32和ASRPRO的使用,更重要的是学会了如何让机械运动更加自然生动。这些经验在以后的机器人项目中也会很有用。如果你在制作过程中遇到问题,欢迎在评论区交流,我很乐意分享更多细节经验。
727



被折叠的 条评论
为什么被折叠?



