从零制作会眨眼的猫猫胸针:ATTiny85与PWM技术实战
1. 项目概述一枚会眨眼的猫猫胸针最近在逛一些创客集市和线上手作社区时发现一个特别有意思的小玩意儿——“Blinky cat lapel pin”直译过来就是“会眨眼的猫猫胸针”。这可不是普通的别针它最大的亮点在于当你佩戴它时上面的小猫眼睛会周期性地、俏皮地一眨一眨瞬间让普通的胸针有了生命力和互动感。无论是别在西装领口、帆布包上还是作为礼物送给朋友都能带来一份独特的惊喜和科技感。这个项目本质上是一个微型电子穿戴艺术品它巧妙地将基础的电子电路、编程逻辑与手工创作结合在了一起。对于电子爱好者来说它是一个入门级的嵌入式项目对于手工达人而言它是将科技融入日常饰品的绝佳尝试。制作这样一枚胸针你需要接触到的核心包括微控制器比如常见的ATTiny85、LED灯、电阻、电池以及最重要的——如何将这些硬邦邦的电子元件封装进一个可爱、小巧且坚固的外壳里。整个过程充满了从电路设计、程序烧录到手工封装的全流程挑战与乐趣。接下来我就以一个实践者的角度带你从零开始深度拆解这枚“眨眼猫”胸针的制作全流程分享其中每一个环节的技术细节和那些只有亲手做过才会知道的“坑”。2. 核心设计思路与方案选型制作一个会眨眼的胸针听起来简单但细想下来有几个核心问题需要解决用什么控制眨眼电源怎么解决如何做到足够小巧便携外观怎么设计才好看又实用基于这些我梳理出了一套经过验证的可行方案。2.1 主控芯片的抉择为何是ATTiny85在微控制器的世界里选择很多从功能强大的ESP32到经典的Arduino Uno。但对于一枚胸针我们的核心诉求是极致的小型化、低功耗、够用的IO口和简单的编程。综合比较下来ATTiny85几乎是为此场景量身定做的。首先看尺寸ATTiny85是8引脚DIP或SOIC封装体积非常小巧比你的小拇指指甲盖还小轻松融入胸针背面。其次它虽然只有8个引脚但刨去电源和地我们依然能剩下5个可用的IO口驱动一对LED猫眼绰绰有余。最关键的是功耗在睡眠模式下它的电流可以降到微安级别这对于使用纽扣电池供电、希望续航时间尽可能长的穿戴设备来说至关重要。最后它可以通过Arduino IDE进行编程利用像Digispark这样的开发板作为烧录器学习成本和开发门槛极低。相比之下Arduino Nano体积偏大ESP32功能过剩且功耗较高都不适合这个精致的小项目。注意ATTiny85有3.3V和5V两种工作电压版本。为了兼容最常见的3V纽扣电池如CR2032务必选择支持3.3V工作电压的型号或者在电路设计时加入稳压模块。我直接选用了3.3V版本的ATTiny85省事。2.2 供电系统的设计平衡续航与体积胸针的供电必须独立、便携。纽扣电池是首选其中CR20323V220mAh因其普及度高、体积适中、电量充足成为最主流的选择。但直接连接电池和ATTiny85存在一个问题ATTiny85的工作电压范围是2.7V-5.5V虽然3V在范围内但随着电池电量耗尽电压会缓慢下降可能导致单片机工作不稳定或LED亮度明显变暗。因此一个可靠的方案是增加一个微型稳压电路。我选择了一颗AMS1117-3.3稳压芯片尽管它有一定静态功耗但电路简单稳定确保始终为ATTiny85和LED提供稳定的3.3V电压。这样直到电池电压降至接近3.3V加上压差约1V之前系统都能稳定工作相当于有效利用了电池的大部分电量避免了“明明有电却无法工作”的尴尬。另一个更极致的低功耗方案是使用低压差LDO稳压芯片如ME6211静态电流可低至1μA但对焊接手艺要求更高。2.3 眨眼效果的实现逻辑不仅仅是开关LED“眨眼”这个动作在程序上不是简单的LED亮灭。一个自然的眨眼应该包含“缓慢闭合”和“快速睁开”的过程可能中间还有短暂的停留。如果用ATTiny85的纯数字输出HIGH/LOW只能实现生硬的亮灭像机器猫。为了达到拟真的效果我们需要用到PWM脉冲宽度调制技术。ATTiny85的某些引脚支持硬件PWM输出如PB0 PB1。我们可以通过编程让PWM输出的占空比即一个周期内高电平的时间比例随时间变化从而控制LED的亮度平滑变化。一个简单的眨眼循环可以这样设计在100毫秒内让PWM占空比从100%最亮线性降低到0%熄灭模拟眼皮闭合然后保持熄灭状态50毫秒最后在50毫秒内让占空比从0%快速升回100%模拟睁眼。之后可以加入一个随机或固定的长时间间隔比如2-5秒再进行下一次眨眼这样看起来就更生动、不机械。2.4 外观与结构设计电子与手工艺的融合这是将电路板变成“胸针”的关键一步。设计目标有四个美观、保护电路、方便佩戴、易于更换电池。主体材料我强烈推荐使用激光切割的亚克力板。它透明或半透明的特性可以营造出朦胧的光晕效果让猫眼看起来更柔和。设计一个前后两层的结构前面板是雕刻有猫咪脸型重点是两个眼睛孔洞的彩色或不透明亚克力后面板是透明的用于固定电路和电池。电路固定不能使用螺丝太占空间。我使用的是强力双面胶或热熔胶。将ATTiny85、电阻、稳压芯片等贴片元件焊接在一块微型的万用板洞洞板上然后整体粘贴在透明后盖的内侧。LED灯珠则要穿过前面板的眼睛孔洞用胶水从背面固定确保其位置精准。电池仓为了可更换电池不能把电池焊死。我采用的方法是使用一个CR2032电池座一种带弹片的塑料件将其粘贴在后盖板上。然后用一小块带有金属触点的柔性PCB或甚至用弯曲的钢片作为电池座的电极延伸连接到我们的主电路板。这样按压后盖就能轻松取换电池。别针集成最牢固的方式是在两层亚克力板封装时将一枚标准的胸针别针可在手工艺品店买到用螺丝或强力的环氧树脂胶夹紧固定在两层板之间。确保别针的焊接点或连接处不会短路到内部的电路。3. 核心元件详解与电路设计有了整体思路我们来逐一审视每个核心元件并绘制出具体的电路连接图。这是将想法落地的蓝图。3.1 物料清单BOM与采购要点下表是制作一枚胸针所需的核心电子物料元件名称规格/型号数量作用与选购要点微控制器ATTiny853.3V版本1核心大脑。注意区分3.3V/5V版。LED0805或0603贴片LED暖白/琥珀色2作为猫眼。贴片型号更省空间。颜色建议选柔和暖色。限流电阻0805贴片电阻100Ω - 220Ω2每个LED串联一个防止过流烧毁。具体阻值根据LED参数调整。稳压芯片AMS1117-3.3 或 ME6211C33M3G1提供稳定3.3V电压。后者功耗更低。输入输出电容0805贴片电容10μF 0.1μF各1用于稳压芯片输入输出滤波保证稳定。纽扣电池CR20321主电源。选择质量可靠的品牌。电池座CR2032贴片式电池座1固定电池便于更换。万用板单面洞洞板约20x20mm1焊接所有元件的基础。亚克力板厚度2-3mm 颜色自选2片前后外壳。需激光切割设计文件。胸针别针金属别针背扣1最终佩戴部件。采购心得贴片元件0805封装是保持小巧的关键但焊接需要一把尖头烙铁和一点耐心。初次尝试可以购买ATTiny85的DIP封装版本和直插LED虽然体积大些但焊接成功率极高。亚克力板切割可以在淘宝找到很多定制商家只需提供设计好的DXF或AI文件。3.2 电路原理图与连接详解整个电路的原理并不复杂核心是围绕ATTiny85展开。下面我详细说明每个连接电源部分CR2032电池的正极连接至稳压芯片AMS1117-3.3的IN引脚。IN和GND之间并联一个10μF的电容C1进行输入滤波。AMS1117的OUT引脚输出稳定的3.3V这里连接到ATTiny85的VCC引脚8以及后续所有需要电源的地方。OUT和GND之间并联一个0.1μF的电容C2进行输出滤波。AMS1117的GND引脚连接到电池的负极-并作为整个电路的公共地GND。主控部分ATTiny85的GND引脚4连接到公共地。其RESET引脚引脚1需要连接一个10kΩ的上拉电阻到VCC防止意外复位。为了编程烧录我们通常还会引出PB2引脚7 SCK、PB1引脚6 MISO、PB0引脚5 MOSI这三个SPI引脚到一个临时的编程接口如排针方便连接烧录器。输出部分猫眼我们使用ATTiny85的两个支持PWM的引脚来控制LED。例如将PB0引脚5通过一个100Ω的电阻R1连接到第一颗LED的正极阳极LED的负极阴极接地。同理将PB1引脚6通过另一个100Ω电阻R2连接到第二颗LED的正极并接地。务必注意LED的正负极贴片LED通常有绿色标记或缺口的一端是阴极负极。为什么电阻是100Ω这是一个估算值。假设LED在3.3V下正向压降约为2V那么限流电阻需要分担1.3V的电压。我们希望LED工作电流在10-15mA左右以获得良好亮度且不超负荷。根据欧姆定律 R V / I 1.3V / 0.01A 130Ω。选择最接近的标准值100Ω实际电流约为13mA是安全且明亮的。3.3 PCB布局与焊接注意事项由于空间极其有限在洞洞板上的布局就是一场“微观城市规划”。布局优先先将最大的元件——ATTiny85或它的IC座放置在板子中央。稳压芯片放在靠近电池输入一侧。两个LED的焊盘位置要精确对应到未来亚克力面板上眼睛孔洞的位置这可能需要你先固定好面板再来确定焊盘位置或者精确测量。飞线技巧使用极细的漆包线或AWG30的导线进行连接。焊接前先用刀片或烙铁头烫掉漆包线端头的绝缘漆。连接时尽量走短线并且让导线贴着板子走避免立体交叉防止最后盖不上盖子。焊接顺序先焊接高度最低的贴片电阻、电容然后是稳压芯片最后是ATTiny85和LED。焊接LED时要快准狠长时间加热容易损坏。可以使用镊子辅助固定。绝缘处理所有焊接完成后务必用万用表通断档检查是否有短路特别是VCC和GND之间。确认无误后可以在电路板背面焊点面贴上一层绝缘胶带如聚酰亚胺胶带防止安装时与金属别针或亚克力板接触短路。实操心得第一次焊接这么小的板子手抖是难免的。我的建议是使用助焊膏在焊盘上点一点助焊膏再上锡焊接会流畅很多。另外准备一个放大镜台灯对眼睛和成功率都是巨大的提升。4. 软件编程与眨眼算法实现硬件是身体软件才是灵魂。让猫眼“活”起来全靠我们烧录进去的代码。4.1 开发环境搭建与芯片烧录ATTiny85可以通过Arduino IDE来编程这大大降低了难度。安装ATTiny核心打开Arduino IDE进入“文件”-“首选项”在“附加开发板管理器网址”中添加https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json。然后进入“工具”-“开发板”-“开发板管理器”搜索“attiny”安装 “attiny by David A. Mellis”。连接编程器你需要一个USBasp、USBtinyISP或者最常见的用一个Arduino Uno作为ISP编程器。这里以Arduino Uno为例按照标准方式将Uno与ATTiny85连接Uno的10111213引脚分别接ATTiny85的RESET MOSI MISO SCK并共地共VCC注意电压匹配。配置IDE在“工具”菜单下依次选择开发板ATtiny25/45/85处理器ATtiny85时钟内部 8 MHz为了在3.3V下稳定工作编程器Arduino as ISP烧录引导程序点击“工具”-“烧录引导程序”。这步很重要它设定了芯片的时钟和熔丝位。上传程序编写好你的眨眼代码见下一节点击上传。注意使用Uno作为ISP时需要在点击上传的瞬间快速按下Uno上的复位按钮这个时机需要多试几次才能掌握。4.2 模拟眨眼效果的PWM程序下面是一个实现柔和眨眼效果的Arduino程序示例。它使用了analogWrite()函数该函数在支持PWM的引脚上生成PWM信号。// 定义LED连接的引脚 const int eyeLeft 0; // 对应ATTiny85的PB0 (物理引脚5) const int eyeRight 1; // 对应ATTiny85的PB1 (物理引脚6) // 眨眼参数 const int blinkCloseTime 100; // 闭眼过程时长毫秒 const int blinkHoldTime 50; // 闭眼保持时长毫秒 const int blinkOpenTime 50; // 睁眼过程时长毫秒 const int minInterval 2000; // 两次眨眼的最小间隔毫秒 const int maxInterval 5000; // 两次眨眼的最大间隔毫秒 void setup() { // 初始化两个引脚为输出模式 pinMode(eyeLeft, OUTPUT); pinMode(eyeRight, OUTPUT); // 初始状态为亮睁眼 analogWrite(eyeLeft, 255); // 255为全亮 analogWrite(eyeRight, 255); } void loop() { // 执行一次眨眼动画 performBlink(); // 等待一个随机的时间间隔让眨眼看起来更自然 int waitTime random(minInterval, maxInterval); delay(waitTime); } // 执行单次眨眼动画的函数 void performBlink() { // 阶段1缓慢闭眼亮度从255降到0 for (int brightness 255; brightness 0; brightness--) { analogWrite(eyeLeft, brightness); analogWrite(eyeRight, brightness); delay(blinkCloseTime / 255); // 计算每步的延迟 } // 阶段2保持闭眼状态 delay(blinkHoldTime); // 阶段3快速睁眼亮度从0升到255 for (int brightness 0; brightness 255; brightness) { analogWrite(eyeLeft, brightness); analogWrite(eyeRight, brightness); delay(blinkOpenTime / 255); } }代码解析analogWrite(pin, value)value取值0-255对应PWM占空比0%-100%。我们通过循环改变这个值来模拟亮度变化。random(min, max)用于生成最小和最大间隔之间的随机数让眨眼间隔不固定避免机械感。三个时间参数blinkCloseTime,blinkHoldTime,blinkOpenTime可以随意调整创造出不同情绪的眨眼效果比如慵懒的慢眨或机灵的快眨。4.3 低功耗优化策略如果希望胸针的续航从几天延长到几周甚至几个月低功耗优化是必须的。ATTiny85在这方面能力很强。睡眠模式在两次眨眼的漫长等待间隔里让芯片进入深度睡眠。可以使用avr/sleep.h库。在delay(waitTime)的地方替换为进入睡眠模式的代码并通过看门狗定时器WDT在指定时间后唤醒。这样等待期间的电流可以从毫安级降至微安级。关闭未用模块在setup()中可以禁用ADC模数转换器、BOD掉电检测等模块来省电。降低时钟频率如果不是必须可以将系统时钟从8MHz将为1MHz功耗会显著下降。这需要在烧录引导程序时选择“内部 1 MHz”。实现低功耗后一枚CR2032电池驱动这颗ATTiny85和两个LED工作数月是完全可能的。不过对于初次制作可以先实现基本功能低功耗作为进阶优化项。5. 机械组装与外壳封装实战这是最考验手工和耐心的一环目标是把脆弱的电路板变成一件坚固的饰品。5.1 亚克力外壳的制作与处理设计图纸使用矢量绘图软件如Inkscape AutoCAD 甚至PPT绘制外壳图纸。你需要两个完全一样外形的板子作为前后盖。前面板需要镂空出猫咪轮廓和两个精确的眼睛圆孔。可以在四个角设计小圆孔用于后期穿入铜柱或螺栓固定。设计好后导出为DXF格式。激光切割将文件发给切割服务商。材料选择2mm厚的亚克力。颜色上前面板推荐白色、黑色或不透明的彩色后面板一定要用透明或半透明以便观察电池和电路状态。撕膜与打磨切割好的亚克力板有保护膜撕掉后边缘可能有些许激光灼烧的痕迹或毛刺。使用细砂纸如800目以上蘸水轻轻打磨边缘使其光滑圆润避免划手。5.2 电路板的固定与内部走线预组装测试在正式粘合前将电路板、电池座、别针与亚克力板进行预组装。打开电池测试眨眼功能是否正常。同时检查LED是否正好从前面板的孔洞中露出位置有无偏差。固定电路板在透明后盖板的内侧即将朝向电路的一面规划好电路板的位置。使用少量热熔胶或双面泡棉胶将电路板粘贴固定。注意胶不要涂到焊点或元件上也不要堵住电池座的位置。固定电池座同样使用胶将CR2032电池座粘贴在后盖板内侧边缘。确保电池的正负极触点方向正确且放入电池后电池盖板能顺利合上。连接电池与电路用两根细导线将电池座的正负极分别连接到电路板的VCC和GND输入点。焊接务必牢固并做好绝缘。固定别针将金属别针放在前后盖板之间的预留位置通常是上部。在合盖时用一滴环氧树脂胶或强力AB胶将其尾部粘牢在后盖板上。这是主要的受力点必须非常牢固。5.3 最终合盖与密封合盖对准将前后面板精确对准特别是眼睛孔洞和LED要对齐。粘合沿着亚克力板的边缘均匀地涂上一圈氯仿三氯甲烷或专用的亚克力粘合剂。这是最关键也最危险的一步。氯仿能溶解亚克力使其自身融合粘合后强度极高且几乎无痕但它有毒且易挥发必须在通风极好的环境下操作用针头或牙签蘸取少量轻轻点在接缝处毛细作用会使溶液渗入缝隙。等待几分钟固化。替代方案如果不愿使用化学粘合剂可以使用极细的螺丝配合螺母从四个角的预留孔穿入固定。这样更安全且可拆卸但外观上会看到螺丝头。重大注意事项使用氯仿等化学粘合剂时务必佩戴手套和口罩在户外或强通风处操作远离明火。它是制作亚克力模型的神器但安全第一。也可以购买低气味的亚克力专用胶水虽然强度稍逊但更安全。6. 调试、问题排查与进阶玩法即使按照步骤小心制作第一次也难免遇到问题。这里汇总一些常见故障和解决方法。6.1 上电不亮/不眨眼这是最常见的问题排查思路应遵循“电源 - 主控 - 输出”的路径。现象可能原因排查方法LED完全不亮1. 电池没电或装反。2. 电源线路断路导线虚焊。3. 稳压芯片损坏或焊接错误。1. 用万用表测电池电压应高于3V。2. 用万用表通断档从电池正极一路查到ATTiny85的VCC引脚看哪里不通。3. 检查AMS1117的引脚连接IN接电池 OUT接VCC GND接电池-。LED常亮但不眨眼1. 程序未成功烧录。2. ATTiny85熔丝位设置错误如时钟源不对。3. 复位引脚Pin1未上拉芯片不断复位。1. 尝试重新烧录程序确认IDE中“上传”过程无报错。2. 用“烧录引导程序”功能重新烧录一次确保时钟选“内部8MHz”。3. 检查RESET引脚是否通过10k电阻接到了VCC。只有一只眼亮/眨眼1. 对应LED损坏或焊反。2. 对应引脚PB0或PB1的焊接或连线有问题。3. 程序中引脚定义错误。1. 交换两只LED的接线看问题是否跟随LED转移。2. 检查该LED通路上的电阻和焊点。3. 核对程序中的eyeLeft和eyeRight引脚号与实际连接是否一致。眨眼速度异常快或慢1. 程序中的延时参数设置不合理。2. 芯片时钟频率设置错误如选了1MHz但程序按8MHz延时。1. 调整blinkCloseTime等参数加大数值变慢减小变快。2. 确认烧录引导程序时选择的时钟频率与程序预期一致。6.2 续航时间远短于预期如果电池一两天就没电了肯定是功耗太大了。测量静态电流将万用表调到电流档mA串联在电池和电路板之间。在LED熄灭的间隔期观察电流读数。如果远高于1-2mA说明有漏电。排查漏电点LED漏电流即使输出为0LED仍可能有微小电流。确保程序在熄灭时是analogWrite(pin, 0)而非仅仅digitalWrite(pin, LOW)。对于数字输出LOW如果LED阳极接VCC阴极接引脚则引脚LOW时LED会亮反之则不亮。我们的接法引脚-电阻-LED阳极-GND用analogWrite(pin, 0)最稳妥。稳压芯片静态电流AMS1117静态电流约5mA是耗电大户。如果追求极致续航应换用静态电流仅1μA的LDO如ME6211。未启用睡眠模式如前所述启用睡眠模式是省电的关键。6.3 进阶创意与扩展基础版成功后你可以尝试更多有趣的变体多表情猫使用一颗RGB LED代替单色LED。通过程序控制可以实现眨眼、困倦呼吸灯效果、惊讶快速闪烁等多种表情。互动触发增加一个微型振动传感器或光敏电阻。当检测到被触摸别针被拿起或环境变暗放入口袋时才开始眨眼一段时间其他时间深度睡眠能极大延长续航。无线充电嫌弃换电池麻烦可以尝试集成一个微型无线充电接收线圈Qi协议和一块小锂电池实现放上充电板即可充电科技感更足。造型多样化不仅仅是猫可以是兔子、狐狸、幽灵等任何你喜欢的形象。眼睛也可以是心形、星星等不同形状。制作这枚Blinky cat lapel pin的整个过程是一次非常完整的微型项目体验。它从想法出发贯穿了电子电路设计、嵌入式编程、3D建模/激光切割、手工组装和调试排故的全流程。最大的成就感莫过于看到自己亲手制作的、带着体温的小物件在黑暗中向你俏皮地眨着眼睛。它不再是一个冰冷的电路而是一个承载了创意和技术的个性化符号。无论你是送给朋友还是别在自己身上这份独特的“数字手工”魅力是任何量产商品都无法替代的。