1. 项目概述与核心思路养过花、种过菜的朋友大概都有过类似的烦恼辛辛苦苦打理的小花园一夜之间就成了附近猫狗的“公共厕所”。直接驱赶不现实安装围栏又影响美观市面上的一些电子驱赶器要么价格不菲要么效果存疑。作为一名电子爱好者我决定自己动手设计一个低成本、低功耗且足够有效的超声波驱猫器。核心思路很简单利用猫狗等动物对高频声音敏感的特性当运动传感器检测到有动物闯入时自动发射一段人耳几乎听不见、但对动物来说却十分刺耳的超声波从而让它们主动远离这片区域。这个项目的核心是ATTINY85微控制器它就像整个设备的大脑负责逻辑判断和信号生成。传感器部分选用常见的HC-SR501人体红外模块它能可靠地检测到移动的热源比如猫狗。执行机构则是一个51mm的超声波扬声器或称压电换能器它能将电信号转换成高频声波。整个系统由4节镍氢电池供电力求做到结构紧凑、安装方便且续航持久。我最终将频率设定在15kHz经过实测这个频率在有效驱赶和避免过度干扰之间取得了不错的平衡。下面我就把这个从电路设计、编程到外壳组装的全过程分享出来如果你也受类似问题困扰或者对嵌入式DIY感兴趣不妨跟着做一遍。2. 核心器件选型与原理剖析为什么是这些元件每个选择背后都有其考量理解这些是成功复现和后续优化的基础。2.1 “大脑”的选择为何是ATTINY85在微控制器领域选择非常多从功能强大的ESP32到经典的Arduino Uno。我选择ATTINY85主要基于以下几点成本与体积ATTINY85是8引脚DIP封装体积小巧价格低廉对于这种功能单一的项目来说性价比极高。功耗控制本项目需要长期户外待机功耗是关键。ATTINY85支持多种睡眠模式在“掉电”模式下电流可降至微安级别非常适合电池供电场景。足够的IO口虽然只有6个可用IO口但本项目刚好够用一个用于PWM输出驱动扬声器一个用于接收传感器信号剩下的用于编程接口和复位资源利用恰到好处。开发灵活性虽然不直接兼容Arduino IDE需要额外支持包但使用Atmel Studio或通过USBasp编程器可以更底层、更高效地控制硬件特别是对定时器和PWM的精确操控。注意ATTINY85的工作电压范围是2.7V-5.5V。我们使用4节镍氢电池标称4.8V满电约5.6V放电后约4.0V直接供电完全在其工作范围内因此省去了稳压电路既简化了设计又提高了效率。2.2 “眼睛”的配置HC-SR501传感器的工作逻辑HC-SR501是一个基于热释电红外原理的模块它检测的是移动物体发出的红外辐射变化。输出信号当检测到移动时其输出引脚会从低电平跳变为高电平约3.3V并持续一段时间可通过板载电位器调节通常2-5秒。电平转换的必要性ATTINY85的IO口逻辑高电平识别阈值大约是Vcc的0.6倍。当Vcc为4.8V时阈值约为2.88V。HC-SR501输出的3.3V高电平虽然高于此阈值但在电池电压波动时可能处于临界状态。为了确保可靠性我增加了一个MOSFETA03400作为电平转换/缓冲器。传感器信号驱动MOSFET的栅极再由MOSFET的漏极输出一个干净的、与电池电压同电平的信号给ATTINY85。这比简单的电阻分压更稳定、功耗更低。调节技巧模块上有两个电位器一个调节延时时间即触发后输出高电平的持续时间一个调节灵敏度探测距离。对于驱猫场景建议将延时调至中等如3秒避免一次触发播放过长灵敏度可根据你需要保护的区域大小来调节。2.3 “嘴巴”的奥秘超声波扬声器与频率选择我们使用的“扬声器”实质是一个压电陶瓷超声波换能器。工作原理对其施加交变电压时内部的压电陶瓷片会产生机械形变从而推动金属片振动发出声音。其谐振频率通常在20kHz以上但在其谐振点附近比如15kHz-25kHz也能有效工作只是效率稍低。频率为何选15kHz这是一个经验值源于多次测试。理论上猫的听觉范围上限可达65kHz狗约45kHz而健康年轻人的听觉上限通常在20kHz左右。选择15kHz是出于以下折中有效性15kHz对猫狗而言已是清晰可闻的高频噪音足以引起不适。安全性这个频率对于大多数成年人尤其是年龄稍长者和儿童来说已经接近或超出听觉范围不易察觉避免了干扰邻居。如果频率过低如10kHz人耳能清楚听到尖锐噪音过高如25kHz虽然人完全听不到但需要换能器工作在更高效率的谐振点且驱动电路可能更复杂。驱动简易性ATTINY85的IO口直接驱动能力有限最大40mA在15kHz下驱动一个中小功率的超声波换能器刚好合适无需额外的功放电路简化了设计。2.4 电源与整体功耗估算系统功耗主要集中在两个状态待机状态ATTINY85处于掉电睡眠模式HC-SR501传感器持续工作。HC-SR501的静态电流约50uAATTINY85睡眠电流约1uA加上其他电路漏电待机总电流可控制在100uA以内。工作状态触发后ATTINY85唤醒开启PWM驱动扬声器。此时主要功耗来自扬声器。一个典型的40mm超声波换能器在工作时电流约20-40mA。续航估算假设使用4节2000mAh的镍氢电池。待机功耗按100uA计2000mAh / 0.1mA 20,000小时 ≈ 833天。这部分耗电可忽略不计。工作功耗是关键。假设每天触发50次每次发声10秒。每天总工作时间500秒约8.3分钟工作电流按30mA计。每天消耗电量30mA * (8.3/60)h ≈ 4.15mAh。电池总容量8000mAh4*2000mAh串联电压升高容量不变。理论续航8000mAh / 4.15mAh/天 ≈ 1928天超过5年。由此可见在触发不频繁的场景下这套系统的续航能力非常可观完全满足户外长期部署的需求。3. 电路设计与PCB制作详解有了清晰的原理我们就可以着手将想法转化为实际的电路板。好的电路设计是稳定性的基石。3.1 电路原理图深度解析我的设计力求简洁高效所有元件都围绕核心功能展开。下图是核心部分的逻辑示意图注实际PCB布局会更紧凑此处应有一张清晰的电路原理图由于文本限制我用文字描述关键连接电源输入电池正极BAT经过开关SW1后为整个板子供电VCC。C2100uF电解电容作为电源滤波消除瞬间大电流引起的电压波动。微控制器核心U1为ATTINY85。其VCC接系统VCCGND接系统地。C1100nF陶瓷电容紧靠芯片电源引脚放置用于高频去耦这是保证MCU稳定运行的关键细节。复位电路R210k上拉电阻将RESET引脚保持在高电平。按钮SW2和C3100nF构成手动复位按下SW2瞬间将C3放电使RESET引脚被拉低松开后通过R2缓慢充电至高电平完成复位过程。传感器信号输入HC-SR501的输出信号通过连接器J2接入。信号先经过MOSFET Q1A03400。当传感器输出高电平3.3V时Q1导通将ATTINY85的PB4引脚通过R42.2k下拉至GND低电平。这里使用下拉是为了与后续编程的中断触发方式匹配。R310k是栅极下拉电阻确保传感器无输出时Q1可靠关断。超声波输出ATTINY85的PB3引脚直接通过连接器J1驱动超声波扬声器。PB3被配置为PWM输出模式。编程接口J3是一个标准的6针ISP接口连接USBasp编程器用于烧录程序。即使成品完成后这个接口也保留方便后续更新固件。状态指示LED1绿色连接在PB1引脚作为程序运行状态指示便于调试。3.2 PCB布局与焊接要点PCB设计在Eagle中完成采用双层板设计。布局时我遵循了几个原则电源路径优先从电源输入到ATTINY85的VCC引脚走线尽量短而宽减少阻抗。模拟与数字分离虽然本项目数字信号为主但仍将传感器输入部分与MCU的时钟区域稍作远离。去耦电容就近放置100nF的C1必须尽可能靠近ATTINY85的VCC和GND引脚。连接器统一朝向所有外部连接器J1, J2, J3, J4都布置在板子边缘并尽量朝向一致方便接线。焊接顺序建议先贴片后直插首先焊接最小的元件即0805封装的电阻R3、R4LED1以及SOT-23封装的MOSFET Q1。使用细头烙铁和镊子。焊接集成电路插座强烈建议使用一个8脚的DIP插座来安装ATTINY85而不是直接焊接芯片。这样既保护芯片免受焊接热应力也方便日后更换或编程。焊接电解电容和按钮然后是C2注意极性和轻触开关SW2。最后焊接连接器将排针裁切好焊接XH-2用于传感器、扬声器、开关和XH-3用于电池连接器以及6Pin的ISP接口。检查与清理焊接完成后用放大镜检查有无虚焊、短路。用酒精清洗板子上的助焊剂残留。实操心得焊接SOT-23 MOSFET时可以先在一个焊盘上上少量锡用镊子夹住元件对准位置加热焊盘固定住一个脚再焊接其余两个脚。焊接排针时可以先将其插在一条废排母上再焊接这样可以保证所有排针高度一致且垂直于板子。3.3 外壳设计与3D打印一个可靠的户外外壳必须考虑防水、散热和安装。我使用Fusion 360设计了分体式外壳。主体结构分为上盖含传感器窗口和扬声器孔、主板舱室、电池仓和下盖四部分。这种设计便于组装和维修。散热与颜色选择外壳留有细长的散热缝隙。务必选择浅色如白色、浅灰的PLA材料打印。深色外壳在阳光直射下会吸收大量热量导致PLA软化变形。白色能有效反射阳光避免设备因高温损坏。防水设计虽然不是完全防水但通过结构设计尽量防溅。传感器窗口有内凹设计扬声器孔朝下底部留有排水孔防止积水。所有接缝处可以考虑涂抹少量硅胶密封胶。打印参数使用0.4mm喷嘴层高0.3mm填充率20%。主体部分打印大约需要12小时。确保打印平台调平准确以获得良好的底面效果和结构强度。4. 软件编程与固件烧录这是项目的灵魂所在。我们将让ATTINY85学会“感知-决策-行动”。4.1 开发环境搭建与芯片配置ATTINY85并非Arduino官方支持的核心板但可以通过添加第三方支持包来使用Arduino IDE编程。不过为了更精细地控制功耗和PWM我选择了使用Atmel Studio现为Microchip Studio配合USBasp编程器进行开发。这里也介绍Arduino IDE的方法供不同习惯的开发者选择。方法一使用Arduino IDE适合快速原型打开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编程器到板子的ISP接口。在“工具”菜单中依次选择开发板ATtiny25/45/85处理器ATtiny85时钟内部 1 MHz(为降低功耗)编程器USBasp点击“烧录引导程序”。这实际上是在配置ATTINY85的熔丝位将其时钟源设置为内部1MHz RC振荡器。方法二使用Atmel Studio AVRDUDE本项目采用我更倾向于这种方法因为它能提供对寄存器级的直接控制。安装Microchip Studio。使用USBasp连接设备和电脑。我们通过AVRDUDE一个命令行烧录工具来配置熔丝位和烧录程序。为了方便我使用了它的图形界面AVRDUDESS。打开AVRDUDESS选择编程器为USBaspMCU选择attiny85。在“熔丝位”区域将低位熔丝位设置为0x62高位熔丝位设置为0xdf。这表示使用内部1MHz RC振荡器。使能掉电检测BOD电压设为2.7V。保留复位引脚功能禁用DWEN。点击“编程”写入熔丝位。4.2 程序逻辑与代码解读程序的核心是一个由外部中断触发的状态机。主循环几乎不做事大部分时间MCU都在睡觉。#include avr/io.h #include avr/interrupt.h #include avr/sleep.h // 定义引脚 #define SPEAKER_PIN PB3 #define PIR_INPUT_PIN PB4 #define LED_PIN PB1 // 发声持续时间毫秒 #define SOUND_DURATION 10000 volatile uint8_t pir_triggered 0; // 外部中断服务程序当PIR传感器输出信号下降沿时触发 ISR(PCINT0_vect) { if (!(PINB (1 PIR_INPUT_PIN))) { // 确认是低电平因为我们的电路是低有效 pir_triggered 1; } } void setup_pwm_15khz() { // 配置PB3为输出 DDRB | (1 SPEAKER_PIN); // 使用定时器1TC1生成PWM // 模式CTC比较匹配时清除定时器TOP值为OCR1C TCCR1 (1 CTC1) | (1 COM1A0); // 比较匹配时切换OC1APB1输出但我们将用OC1BPB3 GTCCR (1 COM1B1) | (1 COM1B0); // 设置OC1BPB3在比较匹配时切换 // 设置PWM频率Fpwm F_CPU / (2 * N * (OCR1C 1)) // 使用1MHz系统时钟预分频器N1 // 目标频率15kHz OCR1C (F_CPU / (2 * N * Fpwm)) - 1 (1e6 / (2*1*15000)) - 1 ≈ 33.33 -1 32.33 // 实际测试发现驱动效果取OCR1C67, OCR1B33时效果较好。 OCR1C 67; // 设置TOP值决定频率 OCR1B 33; // 设置占空比这里约为50% // 启动定时器预分频器1无分频 TCCR1 | (1 CS10); } void stop_pwm() { // 停止定时器1 TCCR1 ~((1 CS13) | (1 CS12) | (1 CS11) | (1 CS10)); // 将PB3设为输入模式停止输出 DDRB ~(1 SPEAKER_PIN); PORTB ~(1 SPEAKER_PIN); // 确保输出低电平 } void enter_sleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 设置最省电的掉电模式 sleep_enable(); sei(); // 确保中断使能否则无法唤醒 sleep_cpu(); // 进入睡眠 // 唤醒后继续从这里执行 sleep_disable(); } int main(void) { // 初始化 // 配置LED引脚为输出并熄灭 DDRB | (1 LED_PIN); PORTB ~(1 LED_PIN); // 配置PIR输入引脚启用内部上拉电阻 DDRB ~(1 PIR_INPUT_PIN); PORTB | (1 PIR_INPUT_PIN); // 启用内部上拉 // 配置引脚变化中断PCINT在PIR输入引脚上 GIMSK | (1 PCIE); // 使能PCINT中断 PCMSK | (1 PCINT4); // 使能PB4PIR_INPUT_PIN的引脚变化中断 // 全局中断使能 sei(); // 主循环 while (1) { if (pir_triggered) { pir_triggered 0; PORTB | (1 LED_PIN); // 点亮LED指示触发 setup_pwm_15khz(); // 启动15kHz PWM // 简单延时保持发声一段时间 for (uint32_t i 0; i (SOUND_DURATION * 1000L / 10); i) { _delay_ms(10); // 使用内置延时函数实际项目建议用定时器 // 在延时期间中断仍然可以响应但这里我们忽略新的触发避免重复打断 } stop_pwm(); // 停止发声 PORTB ~(1 LED_PIN); // 熄灭LED } // 进入深度睡眠等待下一次中断唤醒 enter_sleep(); } }代码关键点解析中断唤醒程序初始化后立即进入掉电睡眠。当猫触发HC-SR501其输出信号变化导致ATTINY85的PB4引脚电平变化触发引脚变化中断将MCU唤醒。PWM频率计算代码中通过配置定时器1的CTC模式来生成精确的15kHz方波。计算公式已在注释中说明。调整OCR1C和OCR1B的值可以改变频率和占空比。低功耗实现enter_sleep()函数将MCU设置为SLEEP_MODE_PWR_DOWN。在此模式下几乎所有时钟和模块都停止工作电流消耗降至1μA以下。防误触发处理在发声的10秒内SOUND_DURATION虽然程序在延时循环中但中断标志pir_triggered已被清零且延时循环内没有再次检查该标志。这意味着一次触发后至少有10秒的“不应期”防止因动物持续移动导致的连续触发节省电量并避免噪音过长。4.3 使用AVRDUDESS烧录固件对于不熟悉命令行的用户AVRDUDESS是福音。将编译好的程序.hex文件准备好。打开AVRDUDESS确保编程器、端口和MCU型号选择正确。在“Flash”区域点击浏览选择你的cat_repeller.hex文件。勾选“写入”选项。点击“编程”按钮。软件会擦除芯片、写入程序、校验整个过程几秒钟即可完成。断开编程器给设备上电应该就能听到传感器触发时扬声器发出的微弱高频声年轻人可能听得到。5. 机械组装与总装步骤电路和程序都准备好了最后一步是把所有部件严丝合缝地装进外壳里。5.1 部件预处理与连接器制作在总装前先处理好各个模块超声波扬声器焊接两根长约15cm的导线到扬声器的焊盘上导线另一端压接一个XH-2.54母头。注意正负极通常红色为正。HC-SR501传感器同样焊接两根导线建议用不同颜色区分电源和信号连接一个XH-2.54母头。传感器板子上通常标有VCC、OUT、GND。电池盒焊接导线并连接一个XH-2.54母头。建议在正极导线上串接一个可恢复保险丝如500mA增加安全性。电源开关焊接两根导线并连接XH-2.54母头。注意事项使用专业的压线钳制作XH连接器确保接触牢固。焊接后最好用热缩管包裹焊点防止短路。5.2 分步组装流程安装电源开关在3D打印外壳的侧面标记位置用6mm钻头打孔。将开关从内向外塞入用附带的螺母锁紧。固定超声波扬声器将扬声器放入外壳内部的专用卡槽或使用打印的支架。如果使用支架用M3*10mm螺丝和螺母从外侧固定。这里有个技巧先在外壳内侧的螺丝柱上涂一点热熔胶再放上螺母这样在拧螺丝时螺母就不会跟着转动方便单手操作。粘贴运动传感器将HC-SR501从外壳正面的方形窗口由内向外推出使其探测面略微凸出外壳。调整好角度一般水平向前后用热熔胶在其四周与外壳接触的部分进行固定。注意不要将胶涂到传感器的菲涅尔透镜上。安装主板将PCB主板放入外壳内的定位柱上。确认所有连接器J1~J4朝向正确且不会被其他部件压迫。用少量热熔胶或双面胶将PCB底部固定在外壳上确保稳固。连接所有线缆将扬声器、传感器、电池盒、开关的XH连接器分别对应插入PCB上的J1、J2、J4和电源输入接口。务必对照原理图确保连接正确特别是电源正负极。固定电池盒使用魔术贴尼龙搭扣将电池盒粘贴在外壳内预留的空位上。魔术贴的好处是方便日后更换电池。封闭底盖将底盖对准外壳使用4颗M3*10mm的自攻螺丝或预先攻好丝的螺丝进行固定。如果使用自攻螺丝直接拧入塑料柱即可如果使用机牙螺丝则需要先用M3丝锥在塑料柱上攻出螺纹。底盖上的细长缝隙是排水孔安装时注意方向。5.3 最终测试与部署功能测试装入4节充满电的镍氢电池打开电源开关。等待约1分钟让HC-SR501初始化期间其输出可能不规则跳动。之后用手在传感器前快速晃动应能听到扬声器发出高频声可用手机录音并频谱分析确认或让听觉好的年轻人帮忙听同时绿色LED应闪烁一下。灵敏度与延时调节根据你的需要用小螺丝刀调节HC-SR501模块上的两个电位器。一个是灵敏度探测距离逆时针减小一个是延时触发后输出高电平的持续时间逆时针缩短。建议初始设置为灵敏度调到最大距离的70%延时调到3秒左右。户外部署选择一个需要保护的区域如苗圃或沙坑边缘。将设备固定在柱子、栅栏或墙上传感器探测方向应对准需要防护的区域。注意避免传感器前方有频繁移动的物体如树枝造成误触发。效果观察超声波传播具有方向性正前方效果最强。有效范围通常在传感器前方120度锥角内距离1-3米。观察几天看目标区域是否有动物活动痕迹减少。可根据效果微调传感器的朝向和灵敏度。6. 常见问题排查与进阶优化即使按照步骤操作也可能会遇到一些问题。这里汇总一些常见情况及解决办法。6.1 问题排查速查表现象可能原因排查步骤与解决方案上电无任何反应1. 电池没电或装反2. 电源开关损坏或未接通3. PCB电源短路1. 用万用表测量电池电压应4.8V检查极性。2. 用万用表通断档检查开关功能。3. 断开电池测量PCB上VCC与GND之间的电阻阻值过小如几欧姆说明有短路检查焊接。LED不亮传感器触发无反应1. ATTINY85未正确编程或熔丝位错误2. 复位电路问题MCU一直处于复位状态3. 传感器供电不正常1. 重新连接编程器尝试读取芯片签名Signature确认连接和芯片型号。重新烧录程序和熔丝位。2. 检查复位按钮SW2是否卡住检查C3和R2焊接。3. 测量传感器VCC引脚电压应有~5V。传感器触发时LED亮但无超声波1. 扬声器损坏或连接线断路2. PB3引脚输出配置错误3. 定时器PWM配置错误1. 用万用表测量扬声器两端电阻正常应为几欧姆到几十欧姆非开路。检查连接器。2. 用示波器或逻辑分析仪探头测量PB3引脚触发时应有15kHz方波。若无检查代码中DDRB和PWM配置。3. 确认代码中OCR1C和OCR1B的值计算正确定时器已启动CS10位被设置。一直持续发出超声波1. HC-SR501传感器输出常高2. MOSFET Q1击穿短路3. 软件中断逻辑错误1. 断开传感器与PCB的连接测量其OUT引脚电压。无触发时应为低电平0V。若常高尝试调节传感器上的延时电位器或更换传感器。2. 断电测量Q1的源极和漏极之间电阻若接近0欧姆则已损坏。3. 检查代码中中断服务程序ISR和pir_triggered标志位的清除逻辑。驱赶效果不明显1. 超声波扬声器功率太小或频率不对2. 安装位置或方向不佳3. 动物已产生适应性1. 尝试更换更大直径如60mm的超声波换能器。在代码中微调OCR1C值尝试18kHz或20kHz频率。2. 确保扬声器正面朝向需要保护的区域无遮挡。调整传感器角度使其能更早探测到动物。3. 考虑增加随机性例如让发声持续时间、间隔时间随机变化。6.2 进阶优化建议如果你不满足于基础功能这里有几个提升方向增加频率扫频固定的单一频率容易让动物适应。可以修改代码让PWM频率在一定范围内例如15kHz-25kHz周期性或随机地变化制造更令人动物不安的噪音。// 示例简单线性扫频 void sweep_frequency(uint16_t start_freq, uint16_t end_freq, uint16_t duration_ms) { for(uint16_t f start_freq; f end_freq; f 100) { // 每100Hz步进 uint8_t ocr1c_val (F_CPU / (2 * 1 * f)) - 1; // 计算OCR1C值 OCR1C ocr1c_val; OCR1B ocr1c_val / 2; // 保持50%占空比 _delay_ms(duration_ms / ((end_freq - start_freq)/100)); } } // 在触发后调用 sweep_frequency(15000, 25000, 10000);多传感器与方向识别使用两个HC-SR501传感器分别朝向不同角度。通过判断哪个传感器先触发可以粗略判断动物来的方向并控制对应的超声波扬声器需增加一个发声实现定向驱赶。太阳能供电对于阳光充足的位置可以增加一块小型的6V/2W太阳能电池板和一个TP4056充电管理模块搭配一个3.7V锂电池如18650。这样可以实现完全无线、永续的户外工作。增加工作模式通过一个拨码开关或光敏电阻可以设置“常开”、“夜间模式”、“间歇模式”等更加智能省电。这个项目从构思到实现花费了不少心思但看到自己做的设备在花园里默默工作让心爱的花草免遭“毒手”成就感还是满满的。硬件DIY的魅力就在于你可以完全控制每一个细节并根据自己的需求随时调整。希望这份详细的指南能帮你成功打造属于自己的智能驱猫或驱其他小动物卫士。如果在制作过程中遇到任何问题欢迎在社区里交流讨论分享你的改进方案。
基于ATTINY85与HC-SR501的超声波驱猫器DIY全流程详解
1. 项目概述与核心思路养过花、种过菜的朋友大概都有过类似的烦恼辛辛苦苦打理的小花园一夜之间就成了附近猫狗的“公共厕所”。直接驱赶不现实安装围栏又影响美观市面上的一些电子驱赶器要么价格不菲要么效果存疑。作为一名电子爱好者我决定自己动手设计一个低成本、低功耗且足够有效的超声波驱猫器。核心思路很简单利用猫狗等动物对高频声音敏感的特性当运动传感器检测到有动物闯入时自动发射一段人耳几乎听不见、但对动物来说却十分刺耳的超声波从而让它们主动远离这片区域。这个项目的核心是ATTINY85微控制器它就像整个设备的大脑负责逻辑判断和信号生成。传感器部分选用常见的HC-SR501人体红外模块它能可靠地检测到移动的热源比如猫狗。执行机构则是一个51mm的超声波扬声器或称压电换能器它能将电信号转换成高频声波。整个系统由4节镍氢电池供电力求做到结构紧凑、安装方便且续航持久。我最终将频率设定在15kHz经过实测这个频率在有效驱赶和避免过度干扰之间取得了不错的平衡。下面我就把这个从电路设计、编程到外壳组装的全过程分享出来如果你也受类似问题困扰或者对嵌入式DIY感兴趣不妨跟着做一遍。2. 核心器件选型与原理剖析为什么是这些元件每个选择背后都有其考量理解这些是成功复现和后续优化的基础。2.1 “大脑”的选择为何是ATTINY85在微控制器领域选择非常多从功能强大的ESP32到经典的Arduino Uno。我选择ATTINY85主要基于以下几点成本与体积ATTINY85是8引脚DIP封装体积小巧价格低廉对于这种功能单一的项目来说性价比极高。功耗控制本项目需要长期户外待机功耗是关键。ATTINY85支持多种睡眠模式在“掉电”模式下电流可降至微安级别非常适合电池供电场景。足够的IO口虽然只有6个可用IO口但本项目刚好够用一个用于PWM输出驱动扬声器一个用于接收传感器信号剩下的用于编程接口和复位资源利用恰到好处。开发灵活性虽然不直接兼容Arduino IDE需要额外支持包但使用Atmel Studio或通过USBasp编程器可以更底层、更高效地控制硬件特别是对定时器和PWM的精确操控。注意ATTINY85的工作电压范围是2.7V-5.5V。我们使用4节镍氢电池标称4.8V满电约5.6V放电后约4.0V直接供电完全在其工作范围内因此省去了稳压电路既简化了设计又提高了效率。2.2 “眼睛”的配置HC-SR501传感器的工作逻辑HC-SR501是一个基于热释电红外原理的模块它检测的是移动物体发出的红外辐射变化。输出信号当检测到移动时其输出引脚会从低电平跳变为高电平约3.3V并持续一段时间可通过板载电位器调节通常2-5秒。电平转换的必要性ATTINY85的IO口逻辑高电平识别阈值大约是Vcc的0.6倍。当Vcc为4.8V时阈值约为2.88V。HC-SR501输出的3.3V高电平虽然高于此阈值但在电池电压波动时可能处于临界状态。为了确保可靠性我增加了一个MOSFETA03400作为电平转换/缓冲器。传感器信号驱动MOSFET的栅极再由MOSFET的漏极输出一个干净的、与电池电压同电平的信号给ATTINY85。这比简单的电阻分压更稳定、功耗更低。调节技巧模块上有两个电位器一个调节延时时间即触发后输出高电平的持续时间一个调节灵敏度探测距离。对于驱猫场景建议将延时调至中等如3秒避免一次触发播放过长灵敏度可根据你需要保护的区域大小来调节。2.3 “嘴巴”的奥秘超声波扬声器与频率选择我们使用的“扬声器”实质是一个压电陶瓷超声波换能器。工作原理对其施加交变电压时内部的压电陶瓷片会产生机械形变从而推动金属片振动发出声音。其谐振频率通常在20kHz以上但在其谐振点附近比如15kHz-25kHz也能有效工作只是效率稍低。频率为何选15kHz这是一个经验值源于多次测试。理论上猫的听觉范围上限可达65kHz狗约45kHz而健康年轻人的听觉上限通常在20kHz左右。选择15kHz是出于以下折中有效性15kHz对猫狗而言已是清晰可闻的高频噪音足以引起不适。安全性这个频率对于大多数成年人尤其是年龄稍长者和儿童来说已经接近或超出听觉范围不易察觉避免了干扰邻居。如果频率过低如10kHz人耳能清楚听到尖锐噪音过高如25kHz虽然人完全听不到但需要换能器工作在更高效率的谐振点且驱动电路可能更复杂。驱动简易性ATTINY85的IO口直接驱动能力有限最大40mA在15kHz下驱动一个中小功率的超声波换能器刚好合适无需额外的功放电路简化了设计。2.4 电源与整体功耗估算系统功耗主要集中在两个状态待机状态ATTINY85处于掉电睡眠模式HC-SR501传感器持续工作。HC-SR501的静态电流约50uAATTINY85睡眠电流约1uA加上其他电路漏电待机总电流可控制在100uA以内。工作状态触发后ATTINY85唤醒开启PWM驱动扬声器。此时主要功耗来自扬声器。一个典型的40mm超声波换能器在工作时电流约20-40mA。续航估算假设使用4节2000mAh的镍氢电池。待机功耗按100uA计2000mAh / 0.1mA 20,000小时 ≈ 833天。这部分耗电可忽略不计。工作功耗是关键。假设每天触发50次每次发声10秒。每天总工作时间500秒约8.3分钟工作电流按30mA计。每天消耗电量30mA * (8.3/60)h ≈ 4.15mAh。电池总容量8000mAh4*2000mAh串联电压升高容量不变。理论续航8000mAh / 4.15mAh/天 ≈ 1928天超过5年。由此可见在触发不频繁的场景下这套系统的续航能力非常可观完全满足户外长期部署的需求。3. 电路设计与PCB制作详解有了清晰的原理我们就可以着手将想法转化为实际的电路板。好的电路设计是稳定性的基石。3.1 电路原理图深度解析我的设计力求简洁高效所有元件都围绕核心功能展开。下图是核心部分的逻辑示意图注实际PCB布局会更紧凑此处应有一张清晰的电路原理图由于文本限制我用文字描述关键连接电源输入电池正极BAT经过开关SW1后为整个板子供电VCC。C2100uF电解电容作为电源滤波消除瞬间大电流引起的电压波动。微控制器核心U1为ATTINY85。其VCC接系统VCCGND接系统地。C1100nF陶瓷电容紧靠芯片电源引脚放置用于高频去耦这是保证MCU稳定运行的关键细节。复位电路R210k上拉电阻将RESET引脚保持在高电平。按钮SW2和C3100nF构成手动复位按下SW2瞬间将C3放电使RESET引脚被拉低松开后通过R2缓慢充电至高电平完成复位过程。传感器信号输入HC-SR501的输出信号通过连接器J2接入。信号先经过MOSFET Q1A03400。当传感器输出高电平3.3V时Q1导通将ATTINY85的PB4引脚通过R42.2k下拉至GND低电平。这里使用下拉是为了与后续编程的中断触发方式匹配。R310k是栅极下拉电阻确保传感器无输出时Q1可靠关断。超声波输出ATTINY85的PB3引脚直接通过连接器J1驱动超声波扬声器。PB3被配置为PWM输出模式。编程接口J3是一个标准的6针ISP接口连接USBasp编程器用于烧录程序。即使成品完成后这个接口也保留方便后续更新固件。状态指示LED1绿色连接在PB1引脚作为程序运行状态指示便于调试。3.2 PCB布局与焊接要点PCB设计在Eagle中完成采用双层板设计。布局时我遵循了几个原则电源路径优先从电源输入到ATTINY85的VCC引脚走线尽量短而宽减少阻抗。模拟与数字分离虽然本项目数字信号为主但仍将传感器输入部分与MCU的时钟区域稍作远离。去耦电容就近放置100nF的C1必须尽可能靠近ATTINY85的VCC和GND引脚。连接器统一朝向所有外部连接器J1, J2, J3, J4都布置在板子边缘并尽量朝向一致方便接线。焊接顺序建议先贴片后直插首先焊接最小的元件即0805封装的电阻R3、R4LED1以及SOT-23封装的MOSFET Q1。使用细头烙铁和镊子。焊接集成电路插座强烈建议使用一个8脚的DIP插座来安装ATTINY85而不是直接焊接芯片。这样既保护芯片免受焊接热应力也方便日后更换或编程。焊接电解电容和按钮然后是C2注意极性和轻触开关SW2。最后焊接连接器将排针裁切好焊接XH-2用于传感器、扬声器、开关和XH-3用于电池连接器以及6Pin的ISP接口。检查与清理焊接完成后用放大镜检查有无虚焊、短路。用酒精清洗板子上的助焊剂残留。实操心得焊接SOT-23 MOSFET时可以先在一个焊盘上上少量锡用镊子夹住元件对准位置加热焊盘固定住一个脚再焊接其余两个脚。焊接排针时可以先将其插在一条废排母上再焊接这样可以保证所有排针高度一致且垂直于板子。3.3 外壳设计与3D打印一个可靠的户外外壳必须考虑防水、散热和安装。我使用Fusion 360设计了分体式外壳。主体结构分为上盖含传感器窗口和扬声器孔、主板舱室、电池仓和下盖四部分。这种设计便于组装和维修。散热与颜色选择外壳留有细长的散热缝隙。务必选择浅色如白色、浅灰的PLA材料打印。深色外壳在阳光直射下会吸收大量热量导致PLA软化变形。白色能有效反射阳光避免设备因高温损坏。防水设计虽然不是完全防水但通过结构设计尽量防溅。传感器窗口有内凹设计扬声器孔朝下底部留有排水孔防止积水。所有接缝处可以考虑涂抹少量硅胶密封胶。打印参数使用0.4mm喷嘴层高0.3mm填充率20%。主体部分打印大约需要12小时。确保打印平台调平准确以获得良好的底面效果和结构强度。4. 软件编程与固件烧录这是项目的灵魂所在。我们将让ATTINY85学会“感知-决策-行动”。4.1 开发环境搭建与芯片配置ATTINY85并非Arduino官方支持的核心板但可以通过添加第三方支持包来使用Arduino IDE编程。不过为了更精细地控制功耗和PWM我选择了使用Atmel Studio现为Microchip Studio配合USBasp编程器进行开发。这里也介绍Arduino IDE的方法供不同习惯的开发者选择。方法一使用Arduino IDE适合快速原型打开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编程器到板子的ISP接口。在“工具”菜单中依次选择开发板ATtiny25/45/85处理器ATtiny85时钟内部 1 MHz(为降低功耗)编程器USBasp点击“烧录引导程序”。这实际上是在配置ATTINY85的熔丝位将其时钟源设置为内部1MHz RC振荡器。方法二使用Atmel Studio AVRDUDE本项目采用我更倾向于这种方法因为它能提供对寄存器级的直接控制。安装Microchip Studio。使用USBasp连接设备和电脑。我们通过AVRDUDE一个命令行烧录工具来配置熔丝位和烧录程序。为了方便我使用了它的图形界面AVRDUDESS。打开AVRDUDESS选择编程器为USBaspMCU选择attiny85。在“熔丝位”区域将低位熔丝位设置为0x62高位熔丝位设置为0xdf。这表示使用内部1MHz RC振荡器。使能掉电检测BOD电压设为2.7V。保留复位引脚功能禁用DWEN。点击“编程”写入熔丝位。4.2 程序逻辑与代码解读程序的核心是一个由外部中断触发的状态机。主循环几乎不做事大部分时间MCU都在睡觉。#include avr/io.h #include avr/interrupt.h #include avr/sleep.h // 定义引脚 #define SPEAKER_PIN PB3 #define PIR_INPUT_PIN PB4 #define LED_PIN PB1 // 发声持续时间毫秒 #define SOUND_DURATION 10000 volatile uint8_t pir_triggered 0; // 外部中断服务程序当PIR传感器输出信号下降沿时触发 ISR(PCINT0_vect) { if (!(PINB (1 PIR_INPUT_PIN))) { // 确认是低电平因为我们的电路是低有效 pir_triggered 1; } } void setup_pwm_15khz() { // 配置PB3为输出 DDRB | (1 SPEAKER_PIN); // 使用定时器1TC1生成PWM // 模式CTC比较匹配时清除定时器TOP值为OCR1C TCCR1 (1 CTC1) | (1 COM1A0); // 比较匹配时切换OC1APB1输出但我们将用OC1BPB3 GTCCR (1 COM1B1) | (1 COM1B0); // 设置OC1BPB3在比较匹配时切换 // 设置PWM频率Fpwm F_CPU / (2 * N * (OCR1C 1)) // 使用1MHz系统时钟预分频器N1 // 目标频率15kHz OCR1C (F_CPU / (2 * N * Fpwm)) - 1 (1e6 / (2*1*15000)) - 1 ≈ 33.33 -1 32.33 // 实际测试发现驱动效果取OCR1C67, OCR1B33时效果较好。 OCR1C 67; // 设置TOP值决定频率 OCR1B 33; // 设置占空比这里约为50% // 启动定时器预分频器1无分频 TCCR1 | (1 CS10); } void stop_pwm() { // 停止定时器1 TCCR1 ~((1 CS13) | (1 CS12) | (1 CS11) | (1 CS10)); // 将PB3设为输入模式停止输出 DDRB ~(1 SPEAKER_PIN); PORTB ~(1 SPEAKER_PIN); // 确保输出低电平 } void enter_sleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 设置最省电的掉电模式 sleep_enable(); sei(); // 确保中断使能否则无法唤醒 sleep_cpu(); // 进入睡眠 // 唤醒后继续从这里执行 sleep_disable(); } int main(void) { // 初始化 // 配置LED引脚为输出并熄灭 DDRB | (1 LED_PIN); PORTB ~(1 LED_PIN); // 配置PIR输入引脚启用内部上拉电阻 DDRB ~(1 PIR_INPUT_PIN); PORTB | (1 PIR_INPUT_PIN); // 启用内部上拉 // 配置引脚变化中断PCINT在PIR输入引脚上 GIMSK | (1 PCIE); // 使能PCINT中断 PCMSK | (1 PCINT4); // 使能PB4PIR_INPUT_PIN的引脚变化中断 // 全局中断使能 sei(); // 主循环 while (1) { if (pir_triggered) { pir_triggered 0; PORTB | (1 LED_PIN); // 点亮LED指示触发 setup_pwm_15khz(); // 启动15kHz PWM // 简单延时保持发声一段时间 for (uint32_t i 0; i (SOUND_DURATION * 1000L / 10); i) { _delay_ms(10); // 使用内置延时函数实际项目建议用定时器 // 在延时期间中断仍然可以响应但这里我们忽略新的触发避免重复打断 } stop_pwm(); // 停止发声 PORTB ~(1 LED_PIN); // 熄灭LED } // 进入深度睡眠等待下一次中断唤醒 enter_sleep(); } }代码关键点解析中断唤醒程序初始化后立即进入掉电睡眠。当猫触发HC-SR501其输出信号变化导致ATTINY85的PB4引脚电平变化触发引脚变化中断将MCU唤醒。PWM频率计算代码中通过配置定时器1的CTC模式来生成精确的15kHz方波。计算公式已在注释中说明。调整OCR1C和OCR1B的值可以改变频率和占空比。低功耗实现enter_sleep()函数将MCU设置为SLEEP_MODE_PWR_DOWN。在此模式下几乎所有时钟和模块都停止工作电流消耗降至1μA以下。防误触发处理在发声的10秒内SOUND_DURATION虽然程序在延时循环中但中断标志pir_triggered已被清零且延时循环内没有再次检查该标志。这意味着一次触发后至少有10秒的“不应期”防止因动物持续移动导致的连续触发节省电量并避免噪音过长。4.3 使用AVRDUDESS烧录固件对于不熟悉命令行的用户AVRDUDESS是福音。将编译好的程序.hex文件准备好。打开AVRDUDESS确保编程器、端口和MCU型号选择正确。在“Flash”区域点击浏览选择你的cat_repeller.hex文件。勾选“写入”选项。点击“编程”按钮。软件会擦除芯片、写入程序、校验整个过程几秒钟即可完成。断开编程器给设备上电应该就能听到传感器触发时扬声器发出的微弱高频声年轻人可能听得到。5. 机械组装与总装步骤电路和程序都准备好了最后一步是把所有部件严丝合缝地装进外壳里。5.1 部件预处理与连接器制作在总装前先处理好各个模块超声波扬声器焊接两根长约15cm的导线到扬声器的焊盘上导线另一端压接一个XH-2.54母头。注意正负极通常红色为正。HC-SR501传感器同样焊接两根导线建议用不同颜色区分电源和信号连接一个XH-2.54母头。传感器板子上通常标有VCC、OUT、GND。电池盒焊接导线并连接一个XH-2.54母头。建议在正极导线上串接一个可恢复保险丝如500mA增加安全性。电源开关焊接两根导线并连接XH-2.54母头。注意事项使用专业的压线钳制作XH连接器确保接触牢固。焊接后最好用热缩管包裹焊点防止短路。5.2 分步组装流程安装电源开关在3D打印外壳的侧面标记位置用6mm钻头打孔。将开关从内向外塞入用附带的螺母锁紧。固定超声波扬声器将扬声器放入外壳内部的专用卡槽或使用打印的支架。如果使用支架用M3*10mm螺丝和螺母从外侧固定。这里有个技巧先在外壳内侧的螺丝柱上涂一点热熔胶再放上螺母这样在拧螺丝时螺母就不会跟着转动方便单手操作。粘贴运动传感器将HC-SR501从外壳正面的方形窗口由内向外推出使其探测面略微凸出外壳。调整好角度一般水平向前后用热熔胶在其四周与外壳接触的部分进行固定。注意不要将胶涂到传感器的菲涅尔透镜上。安装主板将PCB主板放入外壳内的定位柱上。确认所有连接器J1~J4朝向正确且不会被其他部件压迫。用少量热熔胶或双面胶将PCB底部固定在外壳上确保稳固。连接所有线缆将扬声器、传感器、电池盒、开关的XH连接器分别对应插入PCB上的J1、J2、J4和电源输入接口。务必对照原理图确保连接正确特别是电源正负极。固定电池盒使用魔术贴尼龙搭扣将电池盒粘贴在外壳内预留的空位上。魔术贴的好处是方便日后更换电池。封闭底盖将底盖对准外壳使用4颗M3*10mm的自攻螺丝或预先攻好丝的螺丝进行固定。如果使用自攻螺丝直接拧入塑料柱即可如果使用机牙螺丝则需要先用M3丝锥在塑料柱上攻出螺纹。底盖上的细长缝隙是排水孔安装时注意方向。5.3 最终测试与部署功能测试装入4节充满电的镍氢电池打开电源开关。等待约1分钟让HC-SR501初始化期间其输出可能不规则跳动。之后用手在传感器前快速晃动应能听到扬声器发出高频声可用手机录音并频谱分析确认或让听觉好的年轻人帮忙听同时绿色LED应闪烁一下。灵敏度与延时调节根据你的需要用小螺丝刀调节HC-SR501模块上的两个电位器。一个是灵敏度探测距离逆时针减小一个是延时触发后输出高电平的持续时间逆时针缩短。建议初始设置为灵敏度调到最大距离的70%延时调到3秒左右。户外部署选择一个需要保护的区域如苗圃或沙坑边缘。将设备固定在柱子、栅栏或墙上传感器探测方向应对准需要防护的区域。注意避免传感器前方有频繁移动的物体如树枝造成误触发。效果观察超声波传播具有方向性正前方效果最强。有效范围通常在传感器前方120度锥角内距离1-3米。观察几天看目标区域是否有动物活动痕迹减少。可根据效果微调传感器的朝向和灵敏度。6. 常见问题排查与进阶优化即使按照步骤操作也可能会遇到一些问题。这里汇总一些常见情况及解决办法。6.1 问题排查速查表现象可能原因排查步骤与解决方案上电无任何反应1. 电池没电或装反2. 电源开关损坏或未接通3. PCB电源短路1. 用万用表测量电池电压应4.8V检查极性。2. 用万用表通断档检查开关功能。3. 断开电池测量PCB上VCC与GND之间的电阻阻值过小如几欧姆说明有短路检查焊接。LED不亮传感器触发无反应1. ATTINY85未正确编程或熔丝位错误2. 复位电路问题MCU一直处于复位状态3. 传感器供电不正常1. 重新连接编程器尝试读取芯片签名Signature确认连接和芯片型号。重新烧录程序和熔丝位。2. 检查复位按钮SW2是否卡住检查C3和R2焊接。3. 测量传感器VCC引脚电压应有~5V。传感器触发时LED亮但无超声波1. 扬声器损坏或连接线断路2. PB3引脚输出配置错误3. 定时器PWM配置错误1. 用万用表测量扬声器两端电阻正常应为几欧姆到几十欧姆非开路。检查连接器。2. 用示波器或逻辑分析仪探头测量PB3引脚触发时应有15kHz方波。若无检查代码中DDRB和PWM配置。3. 确认代码中OCR1C和OCR1B的值计算正确定时器已启动CS10位被设置。一直持续发出超声波1. HC-SR501传感器输出常高2. MOSFET Q1击穿短路3. 软件中断逻辑错误1. 断开传感器与PCB的连接测量其OUT引脚电压。无触发时应为低电平0V。若常高尝试调节传感器上的延时电位器或更换传感器。2. 断电测量Q1的源极和漏极之间电阻若接近0欧姆则已损坏。3. 检查代码中中断服务程序ISR和pir_triggered标志位的清除逻辑。驱赶效果不明显1. 超声波扬声器功率太小或频率不对2. 安装位置或方向不佳3. 动物已产生适应性1. 尝试更换更大直径如60mm的超声波换能器。在代码中微调OCR1C值尝试18kHz或20kHz频率。2. 确保扬声器正面朝向需要保护的区域无遮挡。调整传感器角度使其能更早探测到动物。3. 考虑增加随机性例如让发声持续时间、间隔时间随机变化。6.2 进阶优化建议如果你不满足于基础功能这里有几个提升方向增加频率扫频固定的单一频率容易让动物适应。可以修改代码让PWM频率在一定范围内例如15kHz-25kHz周期性或随机地变化制造更令人动物不安的噪音。// 示例简单线性扫频 void sweep_frequency(uint16_t start_freq, uint16_t end_freq, uint16_t duration_ms) { for(uint16_t f start_freq; f end_freq; f 100) { // 每100Hz步进 uint8_t ocr1c_val (F_CPU / (2 * 1 * f)) - 1; // 计算OCR1C值 OCR1C ocr1c_val; OCR1B ocr1c_val / 2; // 保持50%占空比 _delay_ms(duration_ms / ((end_freq - start_freq)/100)); } } // 在触发后调用 sweep_frequency(15000, 25000, 10000);多传感器与方向识别使用两个HC-SR501传感器分别朝向不同角度。通过判断哪个传感器先触发可以粗略判断动物来的方向并控制对应的超声波扬声器需增加一个发声实现定向驱赶。太阳能供电对于阳光充足的位置可以增加一块小型的6V/2W太阳能电池板和一个TP4056充电管理模块搭配一个3.7V锂电池如18650。这样可以实现完全无线、永续的户外工作。增加工作模式通过一个拨码开关或光敏电阻可以设置“常开”、“夜间模式”、“间歇模式”等更加智能省电。这个项目从构思到实现花费了不少心思但看到自己做的设备在花园里默默工作让心爱的花草免遭“毒手”成就感还是满满的。硬件DIY的魅力就在于你可以完全控制每一个细节并根据自己的需求随时调整。希望这份详细的指南能帮你成功打造属于自己的智能驱猫或驱其他小动物卫士。如果在制作过程中遇到任何问题欢迎在社区里交流讨论分享你的改进方案。