1. 项目背景与核心思路去年冬天在B站看到有人用RGB灯阵做了个电子宠物当时就萌生了用STM32做个桌面互动装置的想法。这个桌宠小狗项目的核心目标是打造一个能感知环境、与人互动的智能硬件装置它需要具备以下能力通过传感器感知周围环境声音、触摸用OLED屏幕显示动态表情通过舵机实现物理动作反馈保持低功耗运行毕竟要长期插在电脑USB口选择STM32F103C8T6蓝色pill开发板作为主控是因为足够处理多任务传感器采集显示刷新动作控制自带USB接口方便供电和调试价格便宜核心板不到20元社区资源丰富遇到问题容易找到解决方案2. 硬件设计与EDA实战2.1 元件选型与电路设计整个系统由以下几个关键模块组成模块型号关键参数成本主控STM32F103C8T672MHz Cortex-M318元显示屏0.96寸OLEDI2C接口128x6412元声音传感器KY-038灵敏度可调3.5元触摸传感器TTP223电容式触摸1.2元舵机SG90180度旋转8元在嘉立创EDA专业版中设计PCB时特别注意了电源部分虽然USB供电已经很稳定但还是加了100μF的电解电容和0.1μF的陶瓷电容组合传感器接口所有外部接口都做了ESD保护用TVS二极管布局优化把OLED和主控放在板子同侧方便后期外壳安装踩坑记录第一版设计忘了加I2C上拉电阻导致OLED显示不稳定。后来在4.7kΩ上拉电阻两端并联了0.1μF电容解决干扰问题。2.2 PCB设计技巧层叠结构使用经典的2层板设计顶层主要走信号线底层铺铜作为地平面布线要点I2C总线走线等长控制在±5mm以内舵机电源线加粗到1mm瞬间电流可能达到500mA晶振走线尽量短周围做包地处理设计验证用DRC检查时特别关注了线间距≥0.3mm过孔直径≥0.5mm丝印与焊盘间距≥0.2mm3. 软件架构与核心代码3.1 系统框架设计采用前后台系统架构前台主循环处理显示更新和状态机后台中断处理传感器输入// 系统状态定义 typedef enum { SLEEP_MODE, NORMAL_MODE, PLAY_MODE, HUNGRY_MODE } PetState; // 全局状态变量 volatile PetState currentState NORMAL_MODE;3.2 关键功能实现1. 表情动画系统使用自定义的位图动画将多帧表情存储在数组中const uint8_t happyFace[4][1024] { { /* 第一帧数据 */ }, { /* 第二帧数据 */ }, // ... }; void drawAnimation(uint8_t frames[][1024], uint8_t count) { for(int i0; icount; i) { OLED_DrawBMP(0, 0, 128, 64, frames[i]); HAL_Delay(100); } }2. 传感器数据处理使用ADC采集声音传感器数据采用滑动窗口滤波#define SAMPLE_SIZE 10 uint16_t soundSamples[SAMPLE_SIZE]; uint8_t sampleIndex 0; uint16_t getSoundLevel() { soundSamples[sampleIndex] HAL_ADC_GetValue(hadc1); sampleIndex (sampleIndex 1) % SAMPLE_SIZE; uint32_t sum 0; for(int i0; iSAMPLE_SIZE; i) { sum soundSamples[i]; } return sum / SAMPLE_SIZE; }4. 机械结构与外壳设计4.1 3D打印部件使用FDM 3D打印机创想三维Ender-3制作外壳材料PLA容易打印且无毒层高0.2mm平衡打印速度和质量填充率15%足够支撑结构强度设计要点预留传感器窗口声音孔和触摸区域舵机安装位加入橡胶垫减少震动OLED屏幕开孔比实际显示区大1mm容错4.2 组装技巧使用M2螺丝固定PCB板舵机线用热熔胶固定防止松动在触摸传感器背面贴双面胶增强灵敏度整体重心设计在底座中心防止倾倒5. 调试与优化记录5.1 功耗优化初始版本待机电流达到50mA通过以下措施降到8mA关闭未用外设时钟ADC、TIM2等显示屏采用动态刷新有变化时才更新主循环加入__WFI()指令进入睡眠模式while(1) { if(needUpdate 0) { __WFI(); // 进入睡眠模式 } // ... 其他处理 }5.2 常见问题排查问题1舵机偶尔不受控原因电源电压跌落解决在舵机电源端增加470μF电容问题2触摸传感器误触发原因USB线带来的干扰解决在信号线上加10nF电容滤波问题3OLED显示残影原因刷新太快导致电荷积累解决每次刷新前先执行清屏命令6. 项目效果与扩展思路最终成品实现了5种基础表情开心、困倦、饥饿等3种互动模式摸头、拍手、摇晃待机时长可达72小时USB供电时未来可以扩展增加WiFi模块实现远程互动加入MPU6050实现姿态感知开发手机APP自定义表情整个项目从电路设计到3D打印全部成本控制在60元以内PCB打样用了嘉立创的免费券最贵的部件反而是那个SG90舵机。最意外的是这个看似简单的小装置成了我桌面上最治愈的存在——每次编译代码失败时看到它委屈的表情都觉得没那么挫败了。