一·项目和设计思路介绍
随着人工智能技术的发展,智能手势识别在各类人机交互应用中扮演着越来越重要的角色。手势识别技术在现代人机交互领域有着广泛的应用前景。基于STM32的手势识别系统由于其高效、低功耗和高集成度,成为了嵌入式系统应用的一个重要方向。本项目旨在开发一个基于STM32微控制器的智能手势识别系统,以实现便捷的人机交互操控。
二·项目设计思路及实现方法
1·系统整体架构包括手势传感模块、数据处理模块、特征提取模块和手势识别模块。
2·传感器模块选择与接口
选择PAJ7620作为手势识别传感器,它提供了丰富的手势识别功能,并且易于与STM32微控制器进行通信。PAJ7620通过I2C接口与STM32连接,传输手势数据。
3· STM32微控制器选择
选择STM32F103系列微控制器作为核心处理器,因其具备足够的计算能力和丰富的外设接口。STM32将负责接收PAJ7620的数据,通过I2C接口读取手势信息,并根据预设的手势动作执行相应的控制命令。
4. 手势识别数据处理
- 初始化传感器:在系统启动时,通过I2C总线初始化PAJ7620传感器。
- 数据采集:定期从PAJ7620读取手势数据,并解析出具体的手势类型。
- 动作识别:根据读取的手势数据,进行手势分类和识别。将识别到的手势映射到特定的控制命令。
- 控制外部设备:将识别结果转换为对外部设备的控制信号。比如,通过GPIO控制LED灯的开关,或者通过PWM信号控制马达的转速。
三·方案框图和原理图介绍
方案框图:
原理图:
这个系统通过STM32F103微控制器实现核心处理功能。其中,电源管理电路保证了系统稳定运行,BOOT和复位电路确保系统可靠启动。各外围模块如存储器、显示器、语音识别及手势识别模块共同协作,为系统提供各种输入输出功能。LED指示灯阵列则用来显式反馈给用户。
器件介绍:
1. STM32 微控制器核心
STM32F103:位于中间的主要微控制器,所有外围设备都连接到它上面。执行系统中央处理任务,处理输入信号和控制各个外设。
2. 电源管理
去耦电容:C1至C10的电容用于滤除电源噪声,确保系统供电稳定。
稳压电路(AMS1117):将输入电压调节到系统所需的工作电压。
3. 输入/输出口
TYPE-C 供电口:通过 USB Type-C 接口供电。
BOOT 电路:包含拨动开关和电阻,用于选择系统的启动模式。
4. 存储单元
Flash存储器:用于存储系统程序和数据。
5. 显示模块
OLED 显示:用于显示系统状态或用户界面信息。
6. 语音模块
LD3320 语音识别模块:负责语音信号的处理和识别。
语音输入电路:用于接收和放大语音输入信号。
7. 手势识别模块
手势传感器:用于捕捉手势动作,并将手势数据传送给STM32进行处理。
复位电路:提供一个复位信号以确保模块能正确启动和操作。
8. 指示灯
LED阵列:用于指示系统工作状态。
9. 时钟电路
8M振荡器:提供系统时钟信号。
10. 其他接口
各种通信接口,如I2C、UART等,用于与外部设备进行数据交换。
四·设计中用到来自指定厂商元器件
厂商元器件简介
- type-c接口:使用(TE Connectivity)公司的产品是知名的电子元器件制造商,提供各种类型的连接器和接口。
- 电阻:TE Connectivity 提供各种电子连接器和被动元件。
- 24C04:本次储存器时使用的onsemi公司的器件它主要专注于功率管理、传感器解决方案、模拟集成电路等领域。
- lm1117: 这款降压芯片我也是用的是onsemi公司的器件
五·PCB设计介绍
布局:
- 核心处理单元
- STM32微控制器位于中心位置,其他所有功能模块围绕它布局。这种布局使得信号路径最短,减少了信号延迟和干扰。
- 电源模块
- 位于右上角,包含Type-C接口和电源滤波元件。这样的位置方便电源输入和分配。
- 显示模块
- 在左上角标有“OLED”的位置,是用于连接OLED显示屏的接口。
- LED指示灯和按键
- 左上角和左侧下部分分别有LED指示灯和按键,这些元件用于显示系统状态和手动操作输入。
- 语音模块和手势识别模块
- 位于右侧中间区域,结合简化的示意图可以推测此区域有语音识别和手势识别模块的连接点。
- 去耦电容
- 分布在整个板子的中央区域,特别是靠近STM32微控制器的位置,用于稳定电源信号。
布线:
- 信号线
- 走线主要采用最短路径连接,这有助于减少信号延迟,特别是高速信号和敏感信号线路。
- 电源线和地线
- 电源线和地线设计为较宽的走线,以减少电流的损耗和噪声干扰。电源模块和地线连接都经过了适当加宽处理。
- 布线层次
- 假设这块板是多层PCB(通常是双层或四层),各层分别用于电源线、地线和信号线的布置,以减少信号的交叉干扰。
- 去耦电容的位置
- 去耦电容靠近电源引脚工作,可以有效地滤除电源噪声,确保STM32工作稳定。
- 模块分离
- 各个功能模块如电源、语音、显示、接口等都尽量互相独立布局,减少模块之间的电气干扰。
六·硬件功能展示
七·软件代码介绍
由于本次的设计中使用的代码较多,不便于展示,使用我截取了片段的代码,拿来展示。
当中是本次设计使用的主要代码的一个初始化代码,
int main(void)
{
int x=0;
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
usart_init(9600);
led_init();
key_init();
OLED_Init();
LD3320_Init();
EXTIX_Init();
LD_Reset();
nAsrStatus = LD_ASR_NONE;
SCS(0);
下面的一段则是实现手势识别读取的功能代码。
static uint8_t atk_ms7620_read(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat)
{
atk_ms7620_iic_start();
atk_ms7620_iic_send_byte((addr << 1) | 0);
if (atk_ms7620_iic_wait_ack() == 1)
{
atk_ms7620_iic_stop();
return ATK_MS7620_EACK;
}
atk_ms7620_iic_send_byte(reg);
if (atk_ms7620_iic_wait_ack() == 1)
{
atk_ms7620_iic_stop();
return ATK_MS7620_EACK;
}
atk_ms7620_iic_start();
atk_ms7620_iic_send_byte((addr << 1) | 1);
if (atk_ms7620_iic_wait_ack() == 1)
{
atk_ms7620_iic_stop();
return ATK_MS7620_EACK;
}
while (len)
{
*dat = atk_ms7620_iic_read_byte((len > 1) ? 1 : 0);
len--;
dat++;
}
atk_ms7620_iic_stop();
return ATK_MS7620_EOK;
}
以及一段语音识别的中断代码。
void ProcessInt(void)
{
uint8_t nAsrResCount=0;
ucRegVal = LD_ReadReg(0x2B);
LD_WriteReg(0x29,0) ;
LD_WriteReg(0x02,0) ;
if((ucRegVal & 0x10)&&LD_ReadReg(0xb2)==0x21&&LD_ReadReg(0xbf)==0x35)
{
nAsrResCount = LD_ReadReg(0xba);
if(nAsrResCount>0 && nAsrResCount<=4)
{
nAsrStatus=LD_ASR_FOUNDOK;
}
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
}
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
LD_WriteReg(0x2b, 0);
LD_WriteReg(0x1C,0);
LD_WriteReg(0x29,0);
LD_WriteReg(0x02,0);
LD_WriteReg(0x2B,0);
LD_WriteReg(0xBA,0);
LD_WriteReg(0xBC,0);
LD_WriteReg(0x08,1);
LD_WriteReg(0x08,0);
}
八·总结
设计一个基于STM32的智能手势识别系统是一项复杂但有趣的工程任务,涉及硬件设计、软件开发和系统集成的多个方面。通过科学合理的电路设计、优化的软件算法和严格的系统调试,最终可以实现一个性能优良、用户体验好的智能手势识别系统。这一过程不仅提高了我的技术能力,也让我在团队合作和项目管理方面得到了提升。很感谢电子森林官方提供的平台和机会。