news 2026/8/14 20:05:25

立创开源:基于STM32F103的智能波克布林宝箱桌面摆件设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
立创开源:基于STM32F103的智能波克布林宝箱桌面摆件设计与实现

立创开源:基于STM32F103的智能波克布林宝箱桌面摆件设计与实现

最近在立创开源社区看到一个特别有意思的项目——一个能自动开合的波克布林宝箱。这可不是普通的摆件,它不仅能当Switch卡带收纳盒,还能放戒指作为惊喜展示盒,而且功能相当智能。作为一个嵌入式爱好者,我立刻被吸引了,决定复刻一个,顺便把整个从硬件到软件的实现过程整理成教程,分享给大家。

这个宝箱的设计参考了甄大大开源的波克布林宝箱外观,但作者重绘了外壳和PCB,并编写了全新的代码,增加了不少实用的智能功能。比如,你可以双击它来开合,它有振动反馈,还能切换底座来适应卡带或戒指。更贴心的是,它还设计了外力保护和低功耗管理,防止宝箱被意外损坏,也延长了电池续航。

如果你也想动手做一个这样既好玩又有技术含量的桌面摆件,或者想学习如何用STM32单片机结合舵机、触摸感应等模块来实现一个完整的智能硬件项目,那么这篇教程就是为你准备的。我会从硬件选型、电路设计、软件编程到功能调试,一步步带你走完整个流程。

1. 项目概览与硬件清单

咱们先来看看这个波克布林宝箱到底是个啥,以及做它需要准备哪些“食材”。

1.1 项目功能亮点

这个宝箱不仅仅是个静态模型,它集成了好几个智能交互功能,让桌面摆件“活”了起来:

  • 双击控制:在宝箱的特定位置(通过触摸感应实现)快速双击,可以控制宝箱盖的自动打开或关闭。这比物理按键更酷,也更有科技感。
  • 振动反馈:当宝箱执行开合动作,或者检测到异常时,会通过振动电机给出触觉反馈,让交互更有实感。
  • 底座可切换:设计了两款底座,一款适合放置Switch游戏卡带,另一款适合放置戒指。你可以根据需求自由更换,实现一物多用。
  • 外力保护机制:这是一个非常实用的安全设计。
    1. 震动提示:当宝箱盖打开时,如果受到过大的外力(比如有人想强行关上),它会通过振动发出警告。
    2. 自动保护:如果外力持续过大,系统会自动进入保护模式,可能是停止舵机动作或进入特定状态,防止机械结构或电机损坏。
  • 无缝按键:使用TTP223触摸感应芯片,实现了无物理开孔的触摸按键,让宝箱外观更完整、精致。
  • 低功耗管理:当电池电量低时,系统会自动进入休眠模式,切断不必要的功耗,保护锂电池不会因过放而损坏。

1.2 核心硬件清单与选型

做硬件项目,第一步就是把物料备齐。下面这个表格是我根据开源资料整理的BOM(物料清单),包含了所有关键元器件。你可以照着买,也可以根据手头有的物料进行等效替换(注意引脚和参数要匹配)。

材料数量说明与选型要点
主控芯片STM32F103C6T61
执行机构舵机 SG901
用户交互TTP223触摸按键模块1
电源管理锂电池 (350mAh)1
锂电池充电模块1
AMS1117-3.31
L7805ABD2T-TR1
状态指示RGB全彩LED模块2
LED硬灯条1
电流检测INA219AIDR1
辅助元件拨动开关 (SS12D11)1
FPC/FFC软排线及接插件1套
结构外壳3D打印外壳 (PLA材料)1套

提示:表格中的电阻、电容(如100nF, 4.7kΩ)是电路中的必要元件,用于滤波、上拉/下拉等,画PCB时需要按原理图放置。TC118S是电机驱动芯片,可能用于驱动振动电机。

2. 系统设计与核心电路解析

硬件齐了,我们得知道它们是怎么连接和工作的。这部分我们聊聊系统的整体框架和几个关键电路。

2.1 系统框图与工作流程

你可以把整个宝箱想象成一个智能机器人:

  1. 感知:通过TTP223触摸芯片“感觉”到用户的双击指令。
  2. 思考:STM32单片机接收到触摸信号,结合当前宝箱状态(开/关、电量、是否受外力),判断该执行什么动作。
  3. 执行:STM32发出PWM信号控制SG90舵机转动,从而拉动宝箱盖。同时控制LED显示颜色,控制振动电机提供反馈。
  4. 监测:INA219芯片持续监测电池电压和系统电流,STM32据此判断电量,并在电量低时进入休眠。

整个系统的电力来源于那块350mAh的锂电池,通过两个稳压芯片(L7805和AMS1117)分别产生5V和3.3V,为不同部件供电。

2.2 电源电路设计要点

电源是项目稳定的基础,这里有几个坑我踩过,大家要注意:

  • 双路稳压:舵机工作时电流可能瞬间达到几百mA,如果和单片机共用一路电源,会产生电压波动,可能导致单片机复位。所以一定要用独立的L7805为舵机供电。单片机、触摸芯片、INA219等则使用AMS1117产生的3.3V。
  • 滤波电容:在每路稳压芯片的输入和输出端,一定要就近放置滤波电容(比如表格里的100nF和330nF)。它们能吸收电源线上的毛刺,保证芯片工作稳定,尤其是舵机启停的瞬间。
  • 电池保护:除了软件上的低功耗休眠,硬件上的拨动开关是最后一道防线。长期不用时,务必关闭开关。

2.3 触摸检测与舵机控制

这是两个最核心的输入输出环节。

TTP223触摸按键:它的使用非常简单。模块通常有三个引脚:VCC(接3.3V)、GND、OUT(信号输出)。默认情况下OUT输出低电平,当手指触摸感应区域时,OUT变为高电平。STM32只需要读取连接这个OUT的GPIO引脚的电平状态即可。难点在于用软件实现“双击”检测,这需要精确的计时和状态机编程,我们会在软件部分详细讲。

SG90舵机控制:舵机有三根线:电源(红,接5V)、地(棕,接GND)、信号(橙,接STM32的PWM输出引脚)。控制舵机角度本质上就是控制PWM信号的脉冲宽度。SG90的周期一般为20ms(50Hz),其中高电平脉冲宽度在0.5ms到2.5ms之间变化,对应着0度到180度的位置。你需要用STM32的定时器功能来生成这样一路PWM。

// 示例:使用STM32标准库初始化定时器产生PWM(以TIM3_CH2为例,控制PA7引脚) void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 1. 开启时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 2. 配置GPIO为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 3. 配置定时器基础:产生50Hz (20ms) 周期 // 假设系统时钟72MHz,预分频7200,则计时器时钟为10kHz // 自动重装载值设为200,则周期为 200 / 10kHz = 20ms TIM_TimeBaseStructure.TIM_Period = 200 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 4. 配置PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_ENABLE; TIM_OCInitStructure.TIM_Pulse = 15; // 初始脉冲宽度,对应约1.5ms,舵机中位 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); // 初始化通道2 // 5. 使能预装载和定时器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); } // 函数:设置舵机角度 (0~180度) void Set_Servo_Angle(uint8_t angle) { uint16_t pulse_width; // 将角度映射到脉冲宽度 (0.5ms ~ 2.5ms) // 脉冲计数值 = (0.5 + angle * (2.0 / 180)) * 10 // 10是因为定时器时钟10kHz,1ms对应10个计数值 pulse_width = 5 + angle * 10 / 180; // 简化计算 if(pulse_width > 25) pulse_width = 25; // 限制上限 if(pulse_width < 5) pulse_width = 5; // 限制下限 TIM_SetCompare2(TIM3, pulse_width); // 更新通道2的捕获比较值 }

3. 软件功能实现与代码解析

硬件搭好了,接下来就是赋予它灵魂的软件部分。我们重点讲解几个核心功能的实现思路。

3.1 双击检测算法

这是人机交互的关键。单纯的触摸是“按下”,双击是“快速按下-释放-再按下”。我们需要用状态机来实现。

// 双击检测状态机示例 typedef enum { TOUCH_IDLE, // 空闲状态,等待第一次按下 TOUCH_FIRST_PRESS, // 第一次按下 TOUCH_FIRST_RELEASE, // 第一次释放,等待第二次按下 TOUCH_SECOND_PRESS // 第二次按下,判定为双击 } TouchState; TouchState tState = TOUCH_IDLE; uint32_t firstPressTime = 0; uint32_t intervalTimeout = 300; // 双击间隔超时时间,单位ms,通常300-500ms void Touch_Scan(void) { uint8_t currentTouch = GPIO_ReadInputDataBit(TOUCH_GPIO_PORT, TOUCH_GPIO_PIN); switch(tState) { case TOUCH_IDLE: if(currentTouch == 1) { // 检测到按下 tState = TOUCH_FIRST_PRESS; firstPressTime = GetSysTick(); // 记录第一次按下的时间 } break; case TOUCH_FIRST_PRESS: if(currentTouch == 0) { // 第一次释放 tState = TOUCH_FIRST_RELEASE; } break; case TOUCH_FIRST_RELEASE: if(currentTouch == 1) { // 在超时时间内再次按下 // 计算时间间隔 if((GetSysTick() - firstPressTime) < intervalTimeout) { tState = TOUCH_SECOND_PRESS; // 双击事件触发! DoubleClick_Callback(); // 重置状态,准备下一次检测 tState = TOUCH_IDLE; } else { // 超时,视为无效,回到空闲 tState = TOUCH_IDLE; } } // 检查是否超时 if((GetSysTick() - firstPressTime) >= intervalTimeout) { tState = TOUCH_IDLE; } break; default: tState = TOUCH_IDLE; break; } } // 需要在主循环或定时器中断中定期调用 Touch_Scan()

3.2 低电量检测与休眠管理

利用INA219芯片,我们可以实时读取电池电压。STM32通过I2C总线与INA219通信。

// 简化示例:读取INA219的总线电压寄存器(地址0x02) // INA219 I2C地址通常为0x40 (默认) 或 0x41 #define INA219_ADDR 0x40 #define INA219_REG_BUSVOLTAGE 0x02 float Read_Battery_Voltage(void) { uint16_t raw_voltage; float voltage; // 1. 发送要读取的寄存器地址 I2C_WriteByte(INA219_ADDR, INA219_REG_BUSVOLTAGE); // 2. 读取两个字节的数据 raw_voltage = I2C_ReadWord(INA219_ADDR); // 3. 数据转换 (INA219总线电压寄存器,每LSB为4mV) // 先右移3位(寄存器格式),再乘以4mV voltage = (raw_voltage >> 3) * 0.004; return voltage; // 单位:伏特 } // 在主循环中检查电量 void Check_Battery(void) { float vbat = Read_Battery_Voltage(); if(vbat < 3.5) { // 设置一个阈值,例如3.5V // 触发低电量警告,例如让LED闪烁红色 LowBattery_Warning(); if(vbat < 3.3) { // 更低阈值,进入休眠 Enter_Sleep_Mode(); } } }

进入休眠模式后,STM32可以关闭大部分外设时钟,自身也进入低功耗模式(如Stop模式),仅保留唤醒源(如外部中断)有效。此时整个系统的功耗可以降到极低,有效保护电池。

3.3 外力保护逻辑实现

外力保护可以通过监测舵机电流或堵转状态来实现。更简单的方法是在宝箱盖的机械结构上安装一个微动开关或霍尔传感器,检测盖子是否被意外强行移动。这里以软件思路为例:

当宝箱处于打开状态时,程序记录下当前舵机的目标角度(如90度)。如果此时检测到触摸信号(用户想双击关闭)并且通过某种方式(如额外的传感器)检测到盖子有异常阻力,则先不执行关闭动作,而是触发振动电机报警。如果阻力持续,则控制舵机回到打开位置并锁定,进入保护模式,需要重启或特殊操作才能解除。

4. 组装调试与心得分享

最后,我们把所有部分拼装起来,并聊聊调试过程中可能遇到的问题。

4.1 机械组装与走线

  1. 3D打印件处理:打印好的外壳可能需要打磨支撑和毛刺,确保舵机安装位和转轴孔位顺畅。
  2. 舵机安装与连杆:这是最需要耐心的地方。舵机需要牢固固定,并且通过连杆(可以用铁丝或3D打印的连杆)连接到宝箱盖上。需要反复调试连杆的长度和安装孔位,使得舵机从0度转到180度时,宝箱盖能完成从完全闭合到完全打开的动作。建议先用手动转动舵机测试,再上电。
  3. 内部走线:使用FPC软排线连接主板、触摸传感器、LED灯和振动电机。用胶带或热熔胶固定线缆,避免与舵机齿轮干涉。电池要妥善固定,最好用双面胶贴在空旷位置。

4.2 软件调试技巧

  • 分模块调试:不要一下子把所有代码都写完。先调通LED闪烁(系统跑起来了),再调通触摸按键(能打印检测状态),然后调通舵机(能用手势控制转动),最后调通INA219(能读出电压)。每步都确认无误,再整合。
  • 利用串口打印:在代码关键位置用printf通过串口打印变量值(如触摸状态、电压值、角度值),这是最直接的调试手段。STM32可以通过USB转TTL模块连接电脑串口助手。
  • 保护措施:在调试舵机PWM时,初始化的脉冲宽度值一定要设置在安全范围(如1.5ms左右),避免一上电舵机就打到极限位置,损坏机械结构。

4.3 常见问题与解决

  • 舵机抖动或不转:检查5V电源功率是否足够(电池电量足吗?L7805输入输出电容接了吗?)。检查PWM信号频率(50Hz)和脉冲宽度是否在有效范围。
  • 触摸按键不灵敏:检查TTP223模块的触发模式设置跳线(有些模块可调保持或触发模式)。确保触摸焊盘或导线没有受到干扰,可以尝试调整触摸灵敏度电容(如果有)。
  • INA219读数不准:检查I2C上拉电阻(通常4.7kΩ)是否接好。确认INA219的配置寄存器是否正确初始化(开源代码中一般会提供配置函数)。
  • 耗电太快:检查程序是否真的进入了休眠。用万用表测量系统在“关闭”状态下的总电流,如果还有几十mA,说明有模块没断电。确保在休眠函数中,将不用的GPIO设置为模拟输入(最省电),关闭所有外设时钟。

这个波克布林宝箱项目麻雀虽小,五脏俱全,涵盖了嵌入式开发从电源管理、传感器采集、执行器控制到低功耗设计的多个核心知识点。把它做出来放在桌上,不仅是个有趣的摆件,更是一个你亲手打造的智能小装置,成就感满满。希望这篇教程能帮你少走弯路,顺利做出属于自己的智能宝箱。如果在制作过程中遇到问题,不妨回到立创开源的原项目页面,看看其他制作者的经验分享,一起交流学习。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:58:12

YimMenu全景指南:从技术原理到实践应用的完整探索

YimMenu全景指南&#xff1a;从技术原理到实践应用的完整探索 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

作者头像 李华
网站建设 2026/8/14 20:03:48

Qwen3.5-27B开源镜像免配置部署:开箱即用Web界面快速上手

Qwen3.5-27B开源镜像免配置部署&#xff1a;开箱即用Web界面快速上手 想体验一个能看懂图片、会聊天的强大AI助手&#xff0c;但又不想折腾复杂的模型下载、环境配置和代码部署&#xff1f;今天&#xff0c;我来带你快速上手一个已经为你准备好的“开箱即用”方案——基于Qwen…

作者头像 李华
网站建设 2026/7/14 15:58:13

WeChatFerry:微信自动化处理的高效解决方案

WeChatFerry&#xff1a;微信自动化处理的高效解决方案 【免费下载链接】WeChatFerry 微信逆向&#xff0c;微信机器人&#xff0c;可接入 ChatGPT、ChatGLM、讯飞星火、Tigerbot等大模型。Hook WeChat. 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatFerry …

作者头像 李华
网站建设 2026/7/14 15:58:13

12. 基于TI MSPM0G3507开发板的I2C协议详解与SHT20温湿度传感器驱动实战

12. 基于TI MSPM0G3507开发板的I2C协议详解与SHT20温湿度传感器驱动实战 最近在做一个环境监测的小项目&#xff0c;用到了TI的MSPM0G3507开发板来读取SHT20温湿度传感器的数据。很多刚开始接触嵌入式或者准备电赛的朋友都问过我&#xff0c;I2C协议到底怎么用&#xff1f;软件…

作者头像 李华
网站建设 2026/7/14 15:58:15

ZYNQ实战:手把手教你用AXI-CAN在Linux下搭建CAN通信(附完整测试命令)

ZYNQ实战&#xff1a;从零构建Linux下的AXI-CAN通信系统 在嵌入式系统开发中&#xff0c;CAN总线因其高可靠性和实时性被广泛应用于汽车电子、工业控制等领域。本文将带你完整实现基于ZYNQ平台的AXI-CAN通信系统&#xff0c;从硬件配置到Linux驱动调试&#xff0c;最后通过实际…

作者头像 李华