从电压分压器到Arduino:自制传感器入门与创意实现

从电压分压器到Arduino:自制传感器入门与创意实现 1. 项目概述从“饥饿的琵琶鱼”到理解传感器本质最近在整理工作室的旧项目时翻出了一个几年前做的“饥饿的琵琶鱼”互动装置。这个装置的核心是用纸板、导电墨水和一些基础电子元件实现了对三种不同“小鱼”的识别。乍一看像个手工玩具但它背后完整地演绎了从电压分压器原理到Arduino实践的全过程是一个理解传感器底层逻辑的绝佳入门项目。传感器听起来很高深但它的核心原理往往出奇地简单。无论是测量温度、压力、光线还是角度很多传感器的“感知”行为最终都转化为电路中一个可测量的电阻值变化。而这个变化的电阻如何被我们的微控制器比如Arduino“读懂”关键就在于一个基础电路——电压分压器。这个项目没有使用任何现成的模块而是从制作自己的“电阻”开始一步步搭建整个传感系统非常适合想深入理解“传感”究竟是怎么一回事的电子爱好者、创客或者相关专业的学生。通过它你不仅能做出一个有趣的互动装置更能掌握一套“从零造传感器”的底层方法论未来可以灵活应用到各种需要低成本、定制化传感的创意项目中。2. 核心原理深度解析电阻与电压分压器2.1 电阻不仅仅是那个色环小元件提到电阻很多人第一反应是电路板上那些带有色环的圆柱形小元件。但电阻的本质是物质对电流的阻碍作用。任何材料都有电阻只是大小不同。铜导线电阻极小所以我们通常忽略不计橡胶的电阻极大近乎绝缘而我们要用到的导电墨水或称电路涂料其电阻介于两者之间这正是我们可以用它来“绘制”电阻的原因。这里有个关键概念对于一段均匀的导电材料其电阻值R由三个因素决定材料本身的电阻率ρ、导体的长度L和横截面积A。公式是 R ρ * (L / A)。电阻率ρ是材料的固有属性导电墨水出厂时就定了。我们能动手改变的是长度L和横截面积A。画一条又长又细的墨线电阻就大画一条又短又粗的墨线电阻就小。这就是我们自制电阻的理论基础——通过控制墨迹的几何形状来控制阻值。注意导电墨水干燥后的电阻并非绝对稳定会受湿度、涂层均匀度、老化等因素影响。因此我们制作的是“低精度”Lo-Fi传感器适用于对绝对精度要求不高但需要快速原型和低成本定制的场景比如艺术装置、教育演示或概念验证。2.2 电压分压器传感器的“翻译官”理解了电阻就能看懂电压分压器了。这是模拟电路中最基础、也最重要的电路之一。它的结构很简单两个电阻R1和R2串联接在电源电压Vin如Arduino的5V和地GND之间。它的工作原理基于欧姆定律和串联电路的特性串联电路中电流I处处相等总电压等于各电阻分压之和。因此电流 I Vin / (R1 R2)。那么在两个电阻的连接点我们称之为Vout的电压就是R2上的分压Vout I * R2 Vin * [R2 / (R1 R2)]。看这个公式Vout Vin * [R2 / (R1 R2)]。输出电Vout完全由输入电压Vin和两个电阻的比值决定。如果我们把R2换成一个阻值会变化的元件比如我们的自制电阻、热敏电阻、光敏电阻或者商业化的电位器、弯曲传感器那么Vout就会随着R2的变化而成比例地变化。Arduino的模拟输入引脚A0-A5就是一位“电压表”。它能读取0到5V之间的电压并将其映射为一个0到1023的整数ADC值。这样物理世界的变化导致R2变化→ 引起了Vout电压变化 → 被Arduino读取为一个0-1023的数字。于是微控制器就“感知”到了外部世界的变化。电压分压器在此扮演了将电阻变化“翻译”成电压变化的角色。2.3 项目中的电路设计在我们的琵琶鱼项目中具体电路是这样的R1一个固定的1kΩ电阻按原文所述。这个电阻是已知的、稳定的。R2我们自制的、贴在三条小鱼背后的电阻阻值各不相同例如500Ω 1.5kΩ 5kΩ。Vin接Arduino的5V引脚。Vout接Arduino的模拟引脚A0。当不同的小鱼即不同的R2接触到传感条时A0引脚读到的电压值就会不同。我们只需要在代码中为每个小鱼电阻设定一个对应的电压或ADC值范围就能区分它们了。3. 材料准备与工具选择3.1 核心材料清单与替代方案原项目清单很具体但在实际制作中很多材料可以灵活替换或就地取材。类别原项目材料作用常见替代方案与选购建议导电材料导电墨水/涂料 (Conductive Ink)绘制自定义电阻铅笔6B以上石墨含量高可绘制但电阻较大且不稳定。铜箔胶带裁剪成细长条电阻极小需搭配刻痕增加阻值。银浆性能最好也最贵。首选建议购买小支装的碳系导电墨水性价比高易于绘制。基底与结构纸板盒 (约12”x16”x2”)项目主体结构任何硬纸盒、木板、亚克力板均可。大小足够容纳Arduino和面包板即可。额外纸板、彩纸制作小鱼、装饰卡纸、瓦楞纸、甚至塑料片。电子元件Arduino Uno/Leonardo主控制器Arduino Nano更小巧、ESP32带Wi-Fi可扩展物联网。RGB LED (共阳/共阴) x2灯光反馈务必弄清是共阳CA还是共阴CC电路接法不同。原图是共阳。1kΩ电阻 (1/4W)电压分压器的固定电阻R1常用色环棕黑红金。准备多个其他值如220Ω、10kΩ也常备。杜邦线 (公对公)连接电路准备一捆各种长度。面包板 (中小型) x2免焊接电路搭建一大块或两小块。鳄鱼夹测试线连接传感条非常有用可准备红黑各几条。连接线导电缝纫线制作传感条触点替代细漆包线、耳机线里的铜丝、甚至用导电墨水在纸上画两条长线。导电线的优点是柔软易固定。工具万用表测量电阻、调试必备。数字万用表即可用于测量自制电阻值和调试电路通断。剪刀、美工刀裁剪-胶带 (绝缘胶带、透明胶)固定电工胶带更安全。热熔胶枪/白胶粘合固定元件和结构。3.2 工具使用的实操心得万用表是“眼睛”在电子制作中万用表的重要性怎么强调都不过分。制作电阻后立刻用其测量阻值是否在预期范围如500Ω-10kΩ。调试时用它测量传感条两端电压能快速定位是电路问题还是代码问题。导电墨水的使用技巧像挤牙膏一样轻轻挤出用牙签或废弃的笔尖引导绘制。线条要均匀连贯头尾的“焊盘”可以画得大一些、厚一些方便后续连接导线。完全干燥通常需几小时后再测量电阻。面包板布局虽然原图用了一大块面包板但更推荐用两块小型面包板用长杜邦线连接。这样在将电路装入纸盒时可以更灵活地摆放LED和主控板避免内部过于拥挤。4. 分步实现从自制电阻到完整系统4.1 步骤一设计与制作自定义电阻这是项目的核心手工环节目标是做出三个阻值明显不同的电阻。设计电阻图案在普通打印纸或卡纸上用铅笔画三个直径约2.5厘米的圆。在每个圆内设计一条连续的、连接圆两侧的墨线。根据公式 R ∝ L / A为了获得不同阻值低阻值鱼画一条短而粗的直线或简单的“U”形弯。中阻值鱼画一条细长的直线或带有几个弯折的线。高阻值鱼画一条细长且蜿蜒曲折的线比如“之”字形或弹簧状在有限面积内最大化长度。实操技巧可以先在草稿纸上用铅笔画几种图案然后用万用表测量铅笔迹的阻值来验证设计思路虽然铅笔电阻不稳定但趋势是对的。绘制与固化按照设计用导电墨水仔细描画。确保线条首尾分别连接圆的两侧边缘且线条连续无断开。画好后平放静置数小时直至完全干透。测量与验证用万用表的电阻档Ω档表笔分别接触线条的起点和终点读取稳定后的阻值。记录下三条鱼电阻的实测值例如鱼A-680Ω 鱼B-1.8kΩ 鱼C-4.7kΩ。调试技巧如果测出的电阻远大于预期例如几十kΩ说明墨线可能有极细的断点或薄弱处。保持一个表笔不动用另一个表笔沿着墨线轻轻滑动观察阻值是否在某处突然跳变。在跳变点补一点导电墨水可有效降低电阻。安装到小鱼上将三个干透的电阻圆片分别粘贴到三张剪好的小鱼形状卡纸背面。确保电阻圆片一端的导电部分在小鱼头部附近露出另一端在尾部露出以便后续与传感条接触。4.2 步骤二搭建LED反馈电路灯光电路是独立于传感电路的用于提供视觉反馈。识别RGB LED引脚常见的RGB LED有4个引脚。最长的那根通常是公共端共阳则为正极共阴则为负极。另外三根分别对应红R、绿G、蓝B。如果不确定可以用Arduino的3.3V或5V串联一个220Ω电阻限流快速测试点亮。按图搭建电路参照原项目原理图。如果使用共阳RGB LED则公共端接5VR、G、B引脚各通过一个220Ω限流电阻分别接到Arduino的三个数字引脚例如引脚9 10 11。如果使用共阴RGB LED则公共端接GND其余接法相同。编写测试代码上传一个简单的程序分别控制R、G、B引脚输出PWM信号analogWrite(pin, 255)测试每个颜色是否能单独点亮以及混合颜色如黄色、紫色是否正确。4.3 步骤三制作传感条与连接电路传感条是连接物理小鱼和电子电路的桥梁。制作传感条在纸盒顶盖的预定位置比如画个“NOM”标志的地方用锥子或剪刀戳两个小孔间距略小于小鱼电阻圆片的直径。取两根约15厘米长的导电缝纫线。将一根线对折形成一个环从孔下穿上来在盒子顶部将线头展开并用胶带牢牢固定这样盒子下方就垂下了一个线环。另一根线同样操作。现在盒子下方有两个垂下的线环。取两段短的导电缝纫线或细导线分别穿过这两个线环并在盒子顶部将其两端拉直、固定形成两条平行的、裸露的导电条。这就是我们的“传感条”。小鱼背上的电阻两端需要同时接触到这两条导电条。连接至Arduino电路将一条传感条假设为“传感条A”通过鳄鱼夹导线直接连接到Arduino的5V引脚。将另一条传感条“传感条B”通过鳄鱼夹导线连接到一个1kΩ的固定电阻的一端。将这个1kΩ电阻的另一端连接到Arduino的模拟输入引脚A0。同时将这个1kΩ电阻与A0引脚的连接点用一根导线连接到Arduino的GND。这一步至关重要它构成了一个完整的电压分压器电路5V - 传感条A - 小鱼电阻R2- 传感条B - 1kΩ固定电阻R1- GND。A0测量的是R1两端的电压即Vout。4.4 步骤四Arduino代码编写与校准代码的逻辑是读取A0的电压值判断其落在哪个区间从而控制LED显示对应的颜色。基础代码框架// 定义LED引脚 const int redPin 9; const int greenPin 10; const int bluePin 11; // 定义小鱼对应的ADC值范围需要校准后填入 int fish1_min 0; int fish1_max 0; int fish2_min 0; int fish2_max 0; int fish3_min 0; int fish3_max 0; void setup() { Serial.begin(9600); // 初始化串口用于调试 pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // 初始关闭LED setColor(0, 0, 0); } void loop() { int sensorValue analogRead(A0); // 读取A0的ADC值0-1023 Serial.println(sensorValue); // 打印到串口监视器用于校准 // 判断是哪条鱼 if (sensorValue fish1_min sensorValue fish1_max) { setColor(255, 0, 0); // 红色对应鱼1 } else if (sensorValue fish2_min sensorValue fish2_max) { setColor(0, 255, 0); // 绿色对应鱼2 } else if (sensorValue fish3_min sensorValue fish3_max) { setColor(0, 0, 255); // 蓝色对应鱼3 } else { setColor(0, 0, 0); // 无鱼接触熄灭LED } delay(100); // 短暂延迟稳定读数 } // 设置RGB颜色的辅助函数 void setColor(int red, int green, int blue) { // 如果是共阳LED需要取反analogWrite(pin, 255 - value) analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }关键校准步骤——确定ADC范围 这是最核心的调试环节。不要猜测要用数据说话。上传上述代码先随意设置范围值如0-1023。打开Arduino IDE的串口监视器波特率设为9600。将小鱼1稳稳地按在传感条上确保其背面的电阻两端与两条传感条接触良好。观察串口监视器输出的数值它会在一小范围内波动。记录下波动的最小值和最大值。例如读数在480-520之间跳动则fish1_min 480, fish1_max 520。移开小鱼1换上小鱼2重复过程记录范围例如720-760。换上小鱼3记录范围例如850-890。将这三个范围值更新到代码的变量定义中。理论计算验证进阶你可以用万用表实测小鱼电阻R_fish然后用公式ADC_预期 1023 * (1000 / (R_fish 1000))来估算ADC值。这能帮你快速判断测量值是否合理。例如R_fish500Ω则ADC_预期 ≈ 1023 * (1000/1500) ≈ 682。实测值应在682附近。设置颜色与调试根据你小鱼的“身份”在if语句中设置对应的RGB颜色。上传校准后的代码依次用三条小鱼测试观察LED颜色是否正确变化。4.5 步骤五整合与外观制作将电子部分装入纸盒并完成琵琶鱼的外观。制作外壳与装饰在纸盒正面用卡纸剪出琵琶鱼的造型并上色。在鱼的眼睛和诱饵lure位置开孔。在孔后粘贴漫射材料如硫酸纸、磨砂塑料片或白色半透油纸使LED光线均匀柔和。内部布局与固定将Arduino和面包板用尼龙扎带或扭扭棒固定在纸盒底部。将LED的引脚用长杜邦线引出穿过小孔到达正面的眼睛和诱饵位置并固定。确保所有连接牢固不会因移动盒子而松脱。完成传感区域在盒子顶部传感条所在的位置用彩纸装饰并写上“NOM”作为目标区域。确保传感条表面清洁无绝缘物覆盖。5. 调试、优化与扩展思路5.1 常见问题与排查技巧即使按照步骤操作也可能会遇到问题。下面是一个快速排查指南现象可能原因排查步骤与解决方案串口读数始终为0电路未形成回路A0引脚接触不良传感条未接触。1. 用万用表通断档检查从5V-传感条A-小鱼电阻-传感条B-1kΩ电阻-A0-GND整个回路是否连通。2. 检查A0引脚连接是否牢固。3. 确保小鱼电阻两端同时紧贴两条传感条。串口读数始终为1023或接近传感条B到A0的线路断路导致A0通过内部上拉电阻读到高电平。重点检查1kΩ电阻是否虚焊/虚接以及传感条B到电阻的连线是否断开。用万用表测量A0对GND电压不接小鱼时应接近0V接上小鱼后应在0-5V之间。读数不稳定跳动剧烈接触不良导电墨水电阻不均匀电源干扰。1. 确保小鱼按压稳定传感条表面干净。2. 在代码中增加软件滤波如连续读取10次取平均值。3. 检查Arduino的5V和GND是否稳定可为电路单独增加一个10uF的滤波电容。无法区分某两条鱼两条鱼的电阻值太接近导致ADC值范围重叠。1. 重新制作电阻拉大两者阻值差距例如调整墨线长度/粗细。2. 在代码中调整判断范围的“缓冲区”确保范围不重叠。也可以采用更复杂的算法如取多次读数的中值。LED不亮或颜色不对LED引脚接错共阳/共阴极搞反限流电阻过大或过小。1. 确认公共端接的是5V共阳还是GND共阴。2. 用digitalWrite(pin, HIGH/LOW)单独测试每个颜色引脚是否能点亮。3. 检查setColor函数中的逻辑共阳LED需要analogWrite(pin, 255-value)。5.2 项目优化与进阶扩展这个基础框架有巨大的扩展潜力增加传感“鱼”的数量只要自制出更多不同阻值的电阻并在代码中增加对应的判断区间即可。注意Arduino Uno的ADC是10位0-1023理论上可以区分很多状态但受电阻制作精度和接触稳定性限制区分5-10种是可行的。提升稳定性与抗干扰软件去抖在analogRead后加入延时和多次采样平均能有效平滑数据。硬件滤波在A0引脚和GND之间并联一个0.1uF的电容可以滤除高频噪声。改善接触将传感条换成弹性更好的铜箔或弹簧触点或将小鱼电阻部分换成铜箔接触更可靠。改变传感形式电压分压器是通用原理。你可以把自制的电阻换成其他敏感材料压力传感器在两片导电海绵或导电布中间夹一层压敏材料如带凸点的防滑垫压力越大接触面积越大电阻越小。弯曲传感器在柔性基板如塑料片上画一条长长的导电墨线弯曲时墨线被拉伸或产生微裂纹电阻增大。湿度传感器在电极间画上叉指状导电墨水墨水吸湿后电阻下降。升级控制器与联网将Arduino Uno换成ESP32就可以通过Wi-Fi将“哪条鱼被吃了”的状态发送到服务器或手机App做成一个简单的物联网玩具。改变交互反馈除了LED可以连接舵机让琵琶鱼的嘴巴开合或者连接MP3模块播放不同的音效让互动体验更丰富。这个项目的魅力在于它剥开了传感器神秘的外衣展示了其最朴素的工作原理。当你用自己画的墨线、几块钱的元件就让微控制器“感知”到了你创造的物理实体时那种对底层原理的掌控感是使用现成模块无法比拟的。它为你打开了一扇门让你意识到许多有趣的交互传感器其实都可以从工作台边的简单材料中诞生。