从玩具小车到智能台灯:用STM32和光敏电阻DIY一个自动追光/避光的小项目
从玩具小车到智能台灯用STM32和光敏电阻DIY自动追光系统周末整理储物间时翻出儿子淘汰的玩具小车底盘看着那些还能转动的轮子和电机突然想到可以用它做个会追太阳的智能小车。这个想法让我兴奋不已——用最基础的光敏电阻和常见的STM32开发板就能实现一个能感知光线、自主移动的智能装置。更妙的是同样的原理稍加改动就能变成根据环境光自动调节亮度的智能台灯。1. 项目构思与核心逻辑去年参加创客展时看到过一个能跟着手电筒光跑的机器人当时就觉得特别酷。其实这类项目的核心逻辑出奇简单用光敏电阻感知光线强弱变化通过STM32处理信号最后控制电机或LED做出响应。就像向日葵追着太阳转一样我们的装置也会朝着光线更强的方向移动。追光小车的控制逻辑在车头两侧各安装一个光敏电阻左L右R当左侧光强右侧时右转电机加速当右侧光强左侧时左转电机加速两侧光强相近时直行智能台灯的变体方案// 伪代码示例 if(环境光 阈值){ PWM输出 最大亮度 - (阈值 - 当前光强)*系数; }else{ PWM输出 最小亮度; }2. 硬件搭建实战指南我用的是一块吃灰已久的STM32F103C8T6最小系统板俗称蓝板价格不到20元。光敏电阻在电子市场5毛钱一个建议买GL5528这类常见型号。电机驱动模块选择了经典的L298N能同时驱动两个直流电机。关键硬件连接表模块连接引脚备注左侧光敏电阻PA0需接10KΩ分压电阻右侧光敏电阻PA1需接10KΩ分压电阻L298N ENBPB0 (PWM)右电机调速L298N ENAPB1 (PWM)左电机调速L298N IN1PB12右电机方向L298N IN2PB13右电机方向L298N IN3PB14左电机方向L298N IN4PB15左电机方向注意光敏电阻没有极性但分压电阻的阻值需要根据实际光照范围调整。我在室内测试时10KΩ效果不错户外强光环境下可能需要换成1KΩ。焊接时有个小技巧用热熔胶把光敏电阻固定在可旋转的小支架上这样就能灵活调整探测角度。我在车头用乐高积木搭了个简易云台效果出奇地好。3. 软件设计中的精妙之处初始化ADC时我选择了双通道交替采样模式这样能同时读取两个光敏电阻的值避免因采样时间差导致的判断误差。STM32的定时器产生PWM波控制电机转速通过改变占空比实现差速转向。核心控制代码片段// 光强差值计算 int light_diff left_light - right_light; // 转向控制逻辑 if(abs(light_diff) 50){ // 死区阈值 Motor_Forward(80); // 直行速度80% }else if(light_diff 0){ Motor_TurnRight(map(light_diff, 50, 500, 30, 100)); // 差值越大转向越急 }else{ Motor_TurnLeft(map(-light_diff, 50, 500, 30, 100)); }这里用到的map()函数是个非常实用的数值映射工具能把光强差值线性转换为PWM占空比。我在实际调试中发现加入非线性修正系数效果更好// 加入平方系数使小转角更平缓 pwm_out base_speed * (1 pow(light_diff/500.0, 2));4. 调试过程中的经验之谈第一个版本的小车表现得像喝醉酒似的总是来回摆动。后来发现是采样频率太高100Hz导致系统反应过度。通过示波器观察ADC波形后把采样间隔调整为200ms并加入5次移动平均滤波动作立刻流畅多了。常见问题排查清单小车原地转圈 → 检查光敏电阻是否对称安装对弱光无反应 → 尝试减小分压电阻阻值电机间歇性停转 → 检查电源是否供电不足ADC值跳动剧烈 → 增加软件滤波或并联电容有个有趣的发现当把台灯版本的光敏电阻用铝箔包裹成小喇叭形状时方向性检测灵敏度提升了3倍。这原理类似单反相机的遮光罩能减少环境杂散光干扰。5. 项目升级与创意拓展基础版本成功后我又尝试了几个变种避光模式修改判断逻辑让小车逃离强光光强记忆加入EEPROM存储用户偏好的亮度设置无线遥控通过蓝牙模块用手机调节灵敏度太阳能充电加装光伏板实现能量自给最实用的改进是给台灯版本增加人体感应模块HC-SR501实现人来灯亮人走灯灭的智能场景。配合光敏检测白天有人经过时只微微亮起夜晚则全亮度照明。// 智能台灯进阶逻辑 if(人体检测 环境光 夜间阈值){ LED亮度 最大亮度; }else if(人体检测 环境光 白天阈值){ LED亮度 50%亮度; }else{ LED亮度 0; }这个项目最让我惊喜的是原本对电子不感兴趣的儿子看到会追着手电跑的小车后主动要求学习编程。我们现在正一起用3D打印机制作更专业的底盘计划加入超声波避障功能。也许这就是创客项目最大的魅力——用简单的技术点燃创造的火花。