一、项目和创意方向介绍
项目概述:
本项目旨在设计一款集手势识别、LED指示、OLED显示与语音播放功能于一体的创新故事机。通过整合先进的传感器技术、微控制器处理能力及多媒体展示技术,为用户带来前所未有的互动体验。用户仅需通过简单的手势动作,即可控制故事机播放不同的故事,实现科技与故事的完美融合。
创意方向:
本项目选择了“物联网”为创意方向,并聚焦于“人机交互”的细分领域。通过手势识别技术,我们打破了传统按键或触摸操作的限制,为用户提供了更加自然、便捷的交互方式。同时,结合STM32微控制器的强大处理能力和丰富的外设接口,实现了多功能的集成与高效管理,为智能家居产品的创新设计提供了新的思路。
二、原理图及PCB介绍
设计思路:
通过手势识别传感器将不同手势转换为数字信号发送给STM32单片机,单片机通过读取到的数据驱动LED灯的亮灭,OLED屏幕的显示,语音模块故事的播放。
方案框图:
使用VSCODS上的插件Draw.io lntegration绘制。单片机通过读取传感器的数据来驱动对应外设。
电路原理图:
使用嘉立创EDA绘制,整体原理图如下
5V转3.3V稳压电路,通过AMS1117-3.3芯片来输出3.3V的电压。
采用直插式供电,通过Typec口供电
电源指示灯电路
串口下载电路
BOOT电路
LED电路,根据不同手势有不同的显示效果
外设接口电路
MCU电路
本次项目中使用了指定厂商意法半导体公司的STM32ZET6芯片和莫仕(molex)公司的2p排针
PCB设计
使用嘉立创EDA绘制,对电源线进行了加粗处理,对晶振进行了包地和禁止铺铜处理,通过过孔加强散热。
三、成品功能测试
实物图:
供电没问题,电源指示灯正常亮起
按键功能没问题,能通过按键控制手势识别功能的开关
语言模块指示工作灯亮起,能正常工作
LED指示电路没问题,可以根据手势亮起对应的LED灯
OLED显示正常
四、程序说明
包含外设的头文件,初始化外设。
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/btim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/PAJ7620/PAJ7620_Driver.h"
#include "./BSP/MUSIC/music.h"
#include "./BSP/PAJ7620/PAJ7620.h"
int main(void)
{
uint8_t key;
uint8_t Gesture_run_state = 0;
HAL_Init(); /* ³õʼ»¯HAL¿â */
sys_stm32_clock_init(RCC_PLL_MUL9); /* ÉèÖÃʱÖÓ, 72Mhz */
delay_init(72); /* ÑÓʱ³õʼ»¯ */
usart_init(9600); /* ´®¿Ú³õʼ»¯Îª9600 */
btim_timx_int_init(100 - 1, 7200 - 1); /* 10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊý100´ÎÊä³öÒ»´ÎΪ10ms */
led_init(); /* ³õʼ»¯LED */
key_init(); /* ³õʼ»¯KEY */
OLED_Init(); /* ³õʼ»¯OLED */
OLED_Clear(); /* OLEDÇåÆÁ */
jq8900_oneuart_init(); /* ³õʼ»¯JQ8900 */
paj7620_Driver_Init(); /* ³õʼ»¯PAJ7620 */
通过while语句,实现对手势识别模块PAJ7620的控制、按键扫描、音乐播放以及OLED显示屏的更新。
while (1)
{
if(Gesture_run_state == 0)
{
Gesture_run_state = 1;
music_operate(MUSIC_SONG11); /* ²¥±¨ÊÖÊÆʶ±ð¹Ø±Õ */
}
if(Clock_Count % 10 == 0)
{
key = key_scan(0); /* µÃµ½¼üÖµ */
if (key == WKUP_PRES)
{
if(Gesture_run_state == 1)
{
Gesture_run_state = 2;
music_operate(MUSIC_SONG10); /* ²¥±¨ÊÖÊÆʶ±ð¿ªÆô */
goto exit_if; // Ìø³ö if ´úÂë¿é
}
if(Gesture_run_state == 2)
{
Gesture_run_state = 1;
music_operate(MUSIC_SONG11); /* ²¥±¨ÊÖÊÆʶ±ð¹Ø±Õ */
OLED_Clear();
goto exit_if; // Ìø³ö if ´úÂë¿é
}
}
exit_if:
if(Gesture_run_state == 2)
{
paj7620_Driver_Get_Gesture();
}
}
if(Clock_Count >= 100)
{
Clock_Count = 0;
if(Gesture_run_state == 1)
{
OLED_ShowString(1, 1, "Gesture Close");
}
if(Gesture_run_state == 2)
{
OLED_ShowString(1, 1, "Gesture Turn");
}
}
}
}
五、活动总结
很烦感谢硬禾学堂举办的FastBond3活动,为我们电子DIY爱好者提供了很好的机会,让我们可以尽情的发挥自己的想象,尽情的创作。希望硬核学堂越来越好。