基于Arduino与光敏电阻的智能捕鼠器:物联网入门实战

Arduino物联网智能硬件
于 2026-06-01 13:14:41 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述与核心思路

最近在整理创客工坊的教学案例,翻到了一个挺有意思的智能捕鼠器项目。这个项目用到的硬件很基础——一块Pinoo控制卡、一个光敏电阻、一个舵机和一个蜂鸣器,但组合起来却能实现一个完整的“感知-决策-执行”闭环,非常适合用来给刚接触物联网和智能硬件的朋友,特别是青少年创客,讲解系统集成的概念。整个项目的核心逻辑非常清晰:利用光传感器(LDR)监测陷阱入口处的光线变化,当有物体(比如老鼠)进入并遮挡光线时,传感器读数会突变,微控制器(这里用的是兼容Arduino Nano的Pinoo卡)捕获到这个信号后,立即驱动舵机转动,关闭陷阱门,同时触发蜂鸣器发出警报。这本质上是一个典型的状态监测与自动响应系统。

我之所以觉得这个项目值得拿出来细讲,是因为它麻雀虽小,五脏俱全。它不像一些复杂的机器人项目那样让人望而生畏,但又完整涵盖了传感器数据采集、阈值判断、执行器控制这几个物联网最核心的环节。对于学习者而言,成功做出一个能实际“动起来”、有反馈的项目,获得的成就感是巨大的。而且,整个搭建和编程过程在Mblock这样的图形化编程环境下完成,门槛大大降低,重点可以放在理解逻辑而非记忆语法上。接下来,我会结合自己多次带学生实践这个项目的经验,把从材料准备、结构搭建、电路连接到图形化编程的每一个步骤拆开揉碎了讲,特别是那些容易踩坑的细节和能让项目更稳定的技巧。

2. 硬件选型与核心元件原理剖析

在动手之前,我们得先搞清楚手头这些“积木”都是干什么的,以及为什么选它们。理解原理,后面调试的时候心里才有底。

2.1 Pinoo控制卡:为什么是它?

项目里用的是Pinoo控制卡,对于很多教育场景和入门者来说,这是一个非常友好的选择。它本质上是一个兼容Arduino Nano的开发板,但做了一系列的优化。最直观的就是它的接口——采用了颜色编码和防反插的RJ11水晶头接口。比如,舵机接口通常是橙色的,模拟传感器接口是绿色的。这意味着连接硬件时几乎不可能插错,极大降低了初学者的接线门槛和心理负担。对于我们要做的这个捕鼠器项目,接线正确是成功的第一步,Pinoo的这个设计省去了很多麻烦。

除了接口友好,Pinoo板通常预烧录了特定的固件,使其能够与Mblock这类图形化编程软件无缝对接。在Mblock中,你可以直接找到对应的“Pinoo”扩展,里面的积木块已经为你封装好了控制舵机、读取传感器等常用功能,你只需要拖拽组合即可,无需关心底层寄存器和复杂的函数调用。这让我们可以把精力完全集中在项目逻辑的实现上。当然,如果你后续想深入,Pinoo也完全支持用Arduino IDE进行文本代码编程,可扩展性很强。

注意:虽然Pinoo卡很方便,但在连接电脑前,请务必确认已安装对应的USB驱动(通常是CH340或CP2102驱动),否则电脑可能无法识别串口。这是新手最常遇到的第一个“拦路虎”。

2.2 光传感器(LDR):环境感知的“眼睛”

光敏电阻是这个项目的“触发器”。它的原理很简单:内部半导体材料的光电效应导致其电阻值随光照强度的增加而减小。在电路中,我们通常将它和一个固定电阻串联,构成一个分压电路。Pinoo/Arduino的模拟输入引脚(如A7)测量的是这个分压点的电压值。当光照强时,LDR电阻小,分得的电压低,读到的模拟值就小;当光照被遮挡(老鼠进入)时,LDR电阻骤增,分得的电压升高,读到的模拟值就变大。

这里有一个关键点:我们代码里判断的条件是“传感器值小于200时触发”。这听起来可能有点反直觉——不是遮挡后值变大吗?这里需要理解电路接法。在常见的接法中,LDR一端接VCC,另一端接模拟引脚和下拉电阻到GND。这样,光照越强,引脚电压越接近VCC(例如5V),模拟值就越高(接近1023);光照越弱,电压越低,模拟值越小。但有些模块或接法可能相反。所以,这个“200”的阈值不是固定的,它完全取决于你陷阱内部的环境光照强度。在编程前,我们必须先读取一下陷阱空置和模拟遮挡时的传感器数值,根据实际情况来设定这个阈值。这是项目成败的关键一步。

2.3 伺服电机(舵机):精准的执行机构

我们选用舵机来关门,是因为它能进行精确的角度控制。与普通直流电机只能控制正反转和速度不同,舵机接收的是脉冲宽度调制(PWM)信号,这个信号的脉宽对应着输出轴的目标角度。在Mblock的Pinoo扩展里,通常有“设置舵机角度”的积木,我们只需要指定角度(比如0度和135度),底层库会帮我们生成对应的PWM信号。

对于这个捕鼠门,我们需要考虑两个角度:开门角度关门角度。通常,我们会将开门角度设为0度或一个较小的角度,让门保持敞开;当触发条件满足时,迅速将其设置为135度(或其他足够关闭门的角度)。舵机的扭矩也是一个需要考虑的因素,如果门比较重或者有摩擦,需要选择扭矩足够(如1.6kg/cm以上)的舵机,否则可能出现关不严或卡住的情况。

2.4 蜂鸣器模块:状态反馈的“嘴巴”

蜂鸣器在这里起到报警和状态提示的作用。它分为有源和无源两种。有源蜂鸣器内部自带振荡电路,通电就会以固定频率发声;无源蜂鸣器则需要外部提供PWM信号才能发声,可以控制音调。项目中常用的通常是有源蜂鸣器模块,控制简单,一根信号线置高电平就响,置低电平就停。在代码里,我们用“重复执行20次,每次响0.5秒停0.5秒”来实现间歇性的报警声,这样比长鸣更省电,听觉上也更有效。

3. 陷阱结构设计与机械搭建详解

硬件原理清楚了,我们得给它们安个家。一个好的机械结构是项目稳定运行的基础。原方案使用“Dekota”(一种类似泡沫板的轻质板材)来制作陷阱主体,这材料易于切割和粘合,非常适合原型制作。

3.1 材料准备与切割要点

你需要准备以下材料:

  • 主体材料:Dekota板或类似厚度的瓦楞纸板、KT板。尺寸建议至少30cm x 20cm,以保证陷阱有足够空间。
  • 工具:美工刀、钢尺、切割垫。
  • 连接件:细铁丝(用于制作门轴)、粗铁丝或连杆(用于连接舵机摇臂和门)、热熔胶枪及胶棒。
  • 电子部分:Pinoo控制卡、9V电池盒(或相应的电源)、光传感器、舵机、蜂鸣器模块、连接线。

切割板材时,我建议先画好设计图。一个简单的长方体陷阱至少需要6块板:底板、顶板、两个侧板、一个后板和一个活动门板。底板需要开一个小孔,用于安装光传感器,让传感器能感知从入口处透进来的光。侧板或后板上需要为舵机开一个安装孔,并预留走线的位置。

实操心得:用美工刀切割时,一定要用钢尺压紧,沿着尺子边缘进行多次划切,而不是试图一刀切断。这样切出来的边缘更整齐,也更安全。对于需要开圆孔或方孔安装传感器、舵机的情况,可以先钻一个小孔,再用刀慢慢修整扩大。

3.2 活动门与传动机构制作

这是机械部分的核心,目的是把舵机的旋转运动,转换成门的开合运动。

  1. 制作门轴:在活动门板的两侧靠近边缘的位置,用锥子或钻头小心地打出小孔。取一段细铁丝,穿过这两个孔,作为门的转轴。细铁丝的两端可以弯折成“L”形,卡在陷阱侧板预先开好的小缺口或孔洞里,这样门就能灵活地绕轴转动了。
  2. 连接舵机:将舵机用热熔胶牢固地固定在陷阱外侧的合适位置,确保其输出轴(安装着摇臂)的旋转平面与门板的运动平面平行或易于连接。将舵机摇臂(通常随舵机附送)安装到输出轴上。
  3. 制作连杆:取一段粗铁丝或竹签,一端与舵机摇臂的末端孔连接(可以用细扎带或热熔胶固定),另一端与活动门板的上部(远离转轴的一端)连接。这样,当舵机摇臂转动时,就会通过这根连杆推拉门板,实现开合。

注意事项:这个四连杆机构需要仔细调试。首先,在编程让舵机归零前,手动将门板置于“全开”位置,然后将舵机摇臂调整到与之对应的角度(通常是90度方向)再安装连杆。这样可以确保舵机在0度和135度时,门能对应全开和全关位。其次,所有连接点不能太紧,要留有一点活动余量,否则会增加舵机负载甚至卡死。

3.3 传感器与模块的安装固定

  • 光传感器(LDR):将其从陷阱内部穿过底板预先开好的孔,用热熔胶从内部固定,确保其感光面朝上,正对陷阱入口。这样,当老鼠从入口进入时,身体会遮挡住外部射入的光线。
  • 蜂鸣器模块:用热熔胶固定在陷阱内侧壁或顶板上,注意发声孔不要被遮挡。
  • Pinoo控制卡与电源:可以固定在陷阱外侧或一个独立的控制盒内,便于连接和调试。务必确保所有连接线整齐,避免被活动部件缠绕。

4. 电路连接与系统集成

机械结构完成后,就可以进行电路连接了。Pinoo的彩色接口让这一步变得非常直观。

  1. 电源连接:将9V电池盒的插头接入Pinoo控制卡上标有“9V”或“VIN”的电源接口。务必注意正负极,通常电池盒的插头中心为正极。
  2. 舵机连接:将舵机的RJ11连接线(通常是橙色线)插入Pinoo卡上标有“舵机”或数字“2”的橙色接口。Pinoo的接口通常集成了电源、地和信号线,所以一根线搞定。
  3. 蜂鸣器连接:将蜂鸣器模块的连接线插入Pinoo卡上标有“数字”或数字“3”的接口(颜色可能为蓝色或绿色)。
  4. 光传感器连接:将光传感器(LDR)模块的连接线插入Pinoo卡上标有“模拟”或“A7”的绿色接口。

重要检查:连接所有设备前,先不要上电。仔细检查每个接口是否插紧,是否有线材裸露短路的风险。特别是舵机,如果接线错误或短路,很容易烧毁控制卡或舵机本身。

5. Mblock图形化编程逻辑实现

硬件连好后,就到了赋予项目“灵魂”的编程环节。我们使用Mblock 3(或更新版本)进行图形化编程。

5.1 软件环境配置与固件更新

首先,你需要去Mblock官网下载并安装Mblock 3软件。安装完成后,打开软件,按以下步骤配置环境:

  1. 添加Pinoo扩展:点击软件左上角的“扩展”按钮,在弹出的扩展中心搜索“Pinoo”,找到后点击添加。这样,积木区就会出现Pinoo专属的积木块。
  2. 连接硬件:用USB线将Pinoo控制卡连接到电脑。点击软件左上角的“连接”,选择“串口”,然后在列表中选择对应的COM口(如COM6、COM3等,具体端口号以电脑设备管理器中的显示为准)。
  3. 选择主控板:点击“主板”,在列表中选择“Arduino Nano”。因为Pinoo核心兼容的是Arduino Nano。
  4. 更新固件(关键步骤):第一次使用或遇到通信问题时,需要更新固件。点击“连接”->“固件更新”,按照提示操作。务必确保在固件更新过程中,不要断开USB线或关闭软件,否则可能导致板子变砖。

5.2 分步调试与代码编写

不要试图一次性写完所有功能。分步调试是保证成功的最佳实践。

第一步:测试舵机 我们首先写一个小程序,测试舵机是否能被正确控制。

  • 从“事件”类积木中,拖出一个“当绿旗被点击”积木。
  • 从“Pinoo”扩展积木中,找到“设置舵机角度”积木,将其拼接在绿旗下。
  • 在“设置舵机角度”积木上,选择端口为“2”(你连接的舵机端口),角度先设为“0”。
  • 点击绿旗运行,观察舵机是否转动到0度位置(对应门全开)。然后可以手动修改角度值为“135”,再次点击绿旗,看舵机是否转到关门位置。这个测试能确保你的机械连接和舵机控制是正常的。

第二步:测试光传感器 我们需要知道陷阱在“空置”和“被遮挡”时,传感器的读数范围。

  • 在“绿旗”积木下,拼接一个“重复执行”积木。
  • 在“重复执行”积木内部,放入“说”积木(在“外观”类里)。
  • 从“Pinoo”扩展中,找到“读取光传感器模拟值”积木,将其拖入“说”积木的输入框内。
  • 点击绿旗,舞台上角色就会持续说出当前光传感器的模拟值(范围0-1023)。
  • 记录两个关键值
    • 基准值:陷阱空置,入口无遮挡时的读数。假设是850。
    • 触发值:用手或纸板完全模拟老鼠遮挡入口时的读数。假设是150。
  • 那么,我们的触发阈值就应该设定在基准值和触发值之间,比如 200。这样,当读数低于200(即光照变弱)时,就判定为有物体进入。

第三步:测试蜂鸣器

  • 在“绿旗”下,使用“Pinoo”扩展中的“设置数字引脚3输出高电平”积木可以让蜂鸣器响,“输出低电平”则关闭。你可以用“等待1秒”积木交替设置高低电平,测试蜂鸣器功能是否正常。

第四步:整合完整逻辑 现在,我们将所有模块整合起来,编写主程序。

PLAINTEXT
当绿旗被点击
设置舵机(端口2)角度为0度 // 初始化,开门
重复执行
如果 <(读取光传感器(端口A7)模拟值) < (200)> 那么 // 判断是否遮挡
设置舵机(端口2)角度为135度 // 关门
重复执行(20)次 // 报警20次
设置数字引脚(3)输出高电平 // 蜂鸣器响
等待(0.5)秒
设置数字引脚(3)输出低电平 // 蜂鸣器停
等待(0.5)秒
结束
停止(全部脚本) // 触发一次后,停止所有脚本,防止重复触发
结束
结束

这段代码的逻辑是:程序启动后,先开门。然后不断检查光线值。一旦检测到遮挡(值低于200),立即关门,并让蜂鸣器间歇鸣叫20次(共20秒),然后整个程序停止。你也可以去掉“停止全部脚本”,这样陷阱在报警后会继续监测,但需要增加一个复位机制(比如按某个键重新开门)。

5.3 上传程序到硬件

代码在电脑上调试无误后,就需要上传到Pinoo控制卡中,让其脱机运行。

  1. 在Mblock中,右键点击我们编写好的脚本(通常是“当绿旗被点击”那块积木),在弹出的菜单中选择“上传到Arduino”。
  2. 软件会进行编译,并在下方信息区显示进度。编译成功后,会自动开始上传。
  3. 看到“上传成功”或“Download Finished”的提示后,先点击“关闭”按钮,然后断开USB线。
  4. 最后,给Pinoo控制卡接上9V电池,整个智能捕鼠器就可以独立工作了!

6. 系统调试、优化与问题排查实录

项目做完不是终点,能稳定可靠地工作才是。下面是我在多次实践中总结的调试经验和常见问题。

6.1 光传感器阈值校准与抗干扰

这是调试中最关键的一环。前面记录的“基准值”和“触发值”可能受环境光线影响。比如白天和晚上,陷阱内的基准光强可能相差很大。

  • 问题:白天阈值设为200工作正常,到了晚上环境光很暗,基准值本身就低于200,导致陷阱一上电就误触发关门。
  • 解决方案:采用动态阈值或更稳定的触发逻辑。
    • 方案A(简单校准):在程序初始化时,先读取几次光传感器值,取一个平均值作为“环境光基准”。然后将触发条件设为“当前值 < 环境光基准 - 100”。这样就能适应不同的环境亮度。
    • 方案B(状态触发):不依赖固定阈值,而是检测光线值的“突变”。例如,连续监测,如果光线值在短时间内(如0.1秒)下降幅度超过一个预设范围(如300),则判定为有物体快速进入遮挡。这能有效避免环境光缓慢变化造成的误触发。

6.2 舵机运行不畅或卡死

  • 问题1:舵机嗡嗡响但转不动。这通常是负载过大或机械结构卡死。检查门轴是否转动灵活,连杆是否别劲。可以尝试用手轻轻辅助,看是否能转动。如果不行,需要调整机械结构,或者更换扭矩更大的舵机。
  • 问题2:关门角度不准确。可能是舵机中位(0度)未校准,或者连杆长度不合适。可以尝试在代码中微调关门角度(比如从135度调到130度或140度),找到能完全关紧门的角度。也可以在机械上调整连杆与摇臂、门的连接点位置。
  • 问题3:舵机偶尔抽搐或不受控。可能是电源供电不足。舵机在启动瞬间电流很大,如果电池电量不足或线缆电阻过大,会导致Pinoo控制卡电压被拉低,甚至重启。确保使用全新的9V电池,或者考虑使用输出电流更大的外接电源(如6节AA电池盒)。

6.3 系统误触发或灵敏度问题

  • 问题:小虫子飞过或风吹动杂物遮挡,导致误触发
  • 解决方案:在软件逻辑上增加“去抖”和“持续判断”。
    • 去抖:当检测到光线值低于阈值时,不要立即动作,而是“等待10毫秒”再次检测。如果连续几次检测都满足条件,才判定为有效触发。这可以过滤掉瞬间的干扰。
    • 持续判断:要求光线被遮挡的状态持续一段时间(如0.5秒)才触发,这可以避免快速掠过的物体(如飞虫)导致误报。

6.4 常见问题速查表

问题现象 可能原因 排查步骤与解决方案
Mblock无法连接Pinoo 1. USB驱动未安装
2. 串口选择错误
3. 数据线仅供电不支持数据传输
1. 安装CH340/CP2102驱动
2. 在设备管理器中查看正确COM口
3. 更换可靠的Micro USB数据线
上传程序失败 1. 主板型号选择错误
2. 其他程序占用了串口
3. 上传时按下了复位键
1. 确认选择“Arduino Nano”
2. 关闭可能占用串口的其他软件
3. 上传期间不要操作硬件
光传感器读数不变或为0 1. 传感器损坏或接触不良
2. 接错了接口(应接模拟口)
3. 环境光线极暗
1. 用万用表检查传感器分压点电压变化
2. 确认插在A7等模拟端口
3. 用手电筒照射测试
舵机不转动 1. 电源供电不足
2. 信号线接触不良
3. 代码中端口号设置错误
1. 更换新电池或使用外接电源
2. 重新插拔舵机连接线
3. 检查代码中舵机端口是否为实际连接的端口(如2)
蜂鸣器不响 1. 模块是有源还是无源类型用错
2. 代码中引脚输出模式错误
1. 有源蜂鸣器直接给高电平;无源需给PWM信号。确认模块类型。
2. 检查代码是否为“设置数字引脚输出高电平”
陷阱触发一次后无法复位 代码逻辑中使用了“停止全部脚本” 修改逻辑,触发报警后,等待一个外部复位信号(如按钮),再将舵机置回0度,并重新开始循环检测。

7. 项目扩展与进阶思路

这个基础项目就像一个乐高底座,有非常多的扩展可能性,可以让它变得更智能、更强大。

  1. 增加复位机制:目前触发后程序就停止了。可以增加一个按钮传感器,连接到一个数字输入口。当触发捕鼠后,按下按钮,程序重置舵机到开门角度,并重新开始监测。代码上就是用一个“等待直到按钮被按下”的积木块来替代“停止全部脚本”。
  2. 状态指示与远程通知:增加一个RGB LED模块。正常监测时显示蓝色,触发时显示红色并闪烁。更进一步,可以结合物联网模块(如Wi-Fi或蓝牙),在触发时向手机发送一条通知。这需要升级到支持物联网的控制器(如Pinoo IoT套件中的板子),并使用MQTT或相关的云服务积木块。
  3. 数据记录与分析:利用Pinoo的SD卡扩展模块(如果有),或者通过串口将光传感器数据实时发送到电脑,记录老鼠活动的时间、频率等信息。这可以用于研究老鼠的活动规律。
  4. 多传感器融合提高可靠性:仅靠光传感器可能因环境光变化误报。可以增加一个红外对射传感器或超声波传感器在入口处,形成双保险。逻辑改为“当光传感器红外传感器同时被触发时,才判定为有目标进入”,可以极大降低误报率。
  5. 能量优化与太阳能供电:如果放在户外,可以考虑增加一个小型太阳能板和一个锂电池管理模块,实现能源自给自足,让陷阱可以长期在野外工作。

这个项目从想法到实现,最让我有感触的不是最终关上门的那一下,而是整个过程中遇到的问题和解决它们的方法。比如,最初我用纸板做陷阱,门轴摩擦力太大,舵机根本带不动,后来换用细铁丝做轴并上了点润滑油才解决。又比如,一开始没做光传感器的阈值校准,结果下午做的陷阱,到了晚上自己就“砰”一声关上了,虚惊一场。这些细节,才是真正长经验的地方。硬件项目就是这样,代码可能只占三成,机械结构、电路连接和调试占了七成。多动手,多试错,从每一次“为什么不工作”里学到的东西,远比一次成功要多得多。如果你也做了这个项目,不妨试试我上面提到的增加按钮复位或者LED指示的改进,你会发现,在基础上添砖加瓦,让作品一点点变得更完善,这个过程本身就充满了乐趣。