尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

极地特快沙盘Part2:灯光控制与Arduino联动全解析

极地特快沙盘Part2:灯光控制与Arduino联动全解析 如果你点进来大概率是等这篇等了一阵子。Part 1 里我把这台“极地特快”的车壳、底盘、转向架和一圈轨道基础都弄完了当时拍着胸脯说剩下的是“小工程”结果一上手就发现真正让这列火车活过来的根本不是外壳而是藏在车壳里那套让人又爱又恨的灯控系统。这篇就把 Part 2 做的事从头到尾拆开讲车厢内部灯光怎么装、控制电路怎么搭、运行调试里我踩过的坑以及站台和雪景怎么跟列车联动。全程是模型人的视角不整虚的适合入坑沙盘、想做一台属于自己的“极地特快”的朋友照着抄。1. 先盘底子Part 1 完成到什么程度Part 2 要补哪些课Part 1 结束时这台车处于“能跑但没灵魂”的状态。车壳按电影《极地特快》那种深蓝配金线的风格做的HO 比例1:87车头加三节客车厢底盘和转向架从厂家散件拼起来动力轮对装了两对直流电机额定 12V轨道用 R216 半径的弯轨围了一圈外加一个 4% 的小坡和一段 60cm 长的隧道。当时测车空载能跑但问题很明显车厢内部全黑跑起来像运煤车进隧道时车头那颗临时接的 LED 会闪一下还有一个弯道偶发跳轮的问题没根治。所以 Part 2 的任务清单是这样定的车厢内部灯光以及车头大灯、尾灯的完整照明方案电源分配和滤波解决轨道接缝处灯光闪烁的问题用一块 Arduino 做整车控制逻辑包含速度、灯光联动和进出站动作把跑车时暴露的弯道、坡道问题一起调掉补充站台灯光、信号灯和雪景让沙盘从“一圈轨道”变成“一个场景”。这里我得解释一个很多人问过的问题为什么不一次性把这些全做了做模型最忌讳一上来就铺很大的摊子。Part 1 把车跑起来是为了确认机械层面没有硬伤Part 2 才往上垒电气和场景。如果反过来先装好一车厢灯再发现转向架蹭车壳拆灯的工程量会让人瞬间失去耐心。这部分的验收标准我定了四条一、车厢内灯光肉眼看不到明显频闪整套系统满载电流不超过 1A二、隧道内运行全程灯光不闪三、进出弯道不脱轨、不跳轮四、列车进站自动减速站台灯亮出站后站台灯灭。后面所有工作都对着这四条来省得做到一半跑偏。2. 车体灯光从“能亮”到“有层次感”的选型与安装2.1 先想清楚你要的是“亮”还是“电影感”很多新手第一步就买一堆 LED 往车里塞结果整个车厢亮得跟手术室一样毫无氛围。电影里极地特快车厢内是暖黄的光带一点昏暗感所以选灯不是越亮越好。色温是关键中的关键。暖白大概 2700K~3000K和过去钨丝灯泡的感觉接近正白 5000K 以上拍照好看但用在沙盘里会瞬间破坏“复古圣诞列车”的调调。我自己最开始用的是朋友送的 6000K 冷白光 LED装上后那叫一个惨整节车厢像冷库。后来全拆了换暖白画面感完全不同。这个学费交得值至少记住了模型灯光的第一原则是色调服务于氛围而不是服务于亮度。2.2 三种灯的对比与我的选择市面常用方案大概是这几种我把特点列出来方案优点缺点适合场景白炽微型灯Grain of Wheat色温暖、显色好发热大、寿命短、容易烧蒸汽机车锅炉火苗、老式站台灯3mm 直插 LED便宜、好焊接、色温可选体积大车壳透光孔得打磨车头大灯、尾灯、信号灯SMD LED1206/0805体积小、亮度均匀、可贴片焊接难度稍高需要镊子和助焊剂车厢内部照明、仪表盘背光光纤加 LED 光源一根光纤分出多个光点弯曲半径有要求端面要打磨抛光车厢顶灯带、沿线灯柱我的配置是车头大灯用 2 颗 3mm 暖白 LED色温 3000K尾灯用 2 颗 3mm 红色 LED车厢内部每节用 1 颗 1206 SMD 暖白 LED通过光导纤维引到车厢顶部灯槽形成一条连续光带。这样每节车厢只需 1 颗 LED电流小、发热低亮度也能均匀分布到整节车厢里。2.3 电阻计算不能偷懒LED 必须串限流电阻这是入门常识但很多人还是随手拿一个几十欧的电阻就上。LED 是电流型器件电压稍微波动电流就会大变。以我的系统为例供电先降到 5V 再给灯暖白 LED 正向压降约 3.0V工作电流取 15mA限流电阻 R (5 - 3) / 0.015 ≈ 133Ω取 150Ω红色 LED 正向压降约 2.0V同样 15mAR (5 - 2) / 0.015 200Ω取 220Ω。如果直接把灯接在 12V 上那计算要重新来12V 减去 3V再除以 15mA等于 600Ω取 680Ω 也行电流小一点灯更长寿。还有一条很容易踩的坑千万不要把两颗 LED 直接并联然后用一个电阻。LED 的压降有离散性并联后电流会偏向压降低的那颗结果就是一颗亮一颗暗时间久了暗的那颗还会因为电流不均加速老化。正确做法是每颗 LED 单独串电阻或者挑压降一致的同批型号串联后再串电阻。我自己图省事并联过一次最后还是老老实实拆开重焊。2.4 走线与固定决定以后拆车麻不麻烦这部分没人一开始会在意等你要换灯的时候就知道多重要了。我用的线是 0.2mm 到 0.3mm 的漆包线细、软、好走线但有一个麻烦必须先刮掉表面绝缘漆再上锡否则焊不上。可以用小刀轻轻刮或用打火机快速燎一下再用酒精擦干净。LED 固定我强烈建议用 UV 胶或白乳胶不要用热熔胶。灯珠持续工作后温度虽然不高但热熔胶受热一段时间后会软化顺着车壳流下来直接就毁掉漆面。那个画面我不想再回忆第二次。车壳和底盘之间一定要留一个可拔插的连接器我用的 2.54mm 排针加杜邦线。没这东西以后每拆一次壳就要焊一次线焊几次车壳卡扣就开始松动最后整台车都松垮垮的。排针两块钱一大把这个钱别省。3. 电源与滤波12V、5V、GND 三线怎么分为什么隧道里灯还闪3.1 轨道供电还是车载电池我为什么选轨道供电这是个老问题。轨道供电的好处是车轻、不用拆壳充电、跑多久都行坏处是轨道接缝、表面氧化会造成瞬时断电车载电池的好处是供电稳、不受轨道状态影响坏处是要在车壳里塞电池和充电模块重量上去了空间没了。我最后选了轨道供电加车载滤波的方案重点解决瞬时断电问题。这么做的好处是以后扩展站台、信号灯联动的时候整车和场景共用一个电源逻辑简单。3.2 电源结构12V 给电机5V 给控制灯也走 5V原车的直流电机额定 12V直接由轨道取电就行。但 Arduino 和 LED 不能吃 12V需要压降。我一开始想过用 7805但 12V 降到 5V压差 7V满载时发热非常夸张在封闭车壳里就是个小型取暖器。最后换成 DC-DC 降压模块型号是 MP1584输出调到 5.0V效率高发热小体积也就拇指盖大小。要注意的是Arduino 的 5V 系统和电机 12V 系统必须共地否则 PWM 控制信号会飘出现速度忽快忽慢的怪问题。具体接法是把 DC-DC 模块的输入负极和输出负极接到同一点再和电机驱动模块的 GND 连在一起。3.3 进隧道闪烁的根因以及一个便宜到离谱的“续命电容”好多人都遇到过隧道里灯光闪一下的问题。根因不是隧道本身而是轨道接缝处车轮短暂离轨或者车轮与轨道接触点氧化导致电阻变大瞬间压降。电机有惯性断电几十毫秒根本感觉不出但 LED 对电压变化极敏感电流一断马上灭。要解决这个最重要的手段是保持轨道导电面的清洁但模型跑久了接缝还是会接触不良。我在车内电源总线上并联了一个 5.5V 1F 的超级电容实测效果非常明显。计算逻辑很简单假设整车灯光总电流约 0.3A超级电容供电时允许电压从 5V 掉到 4.5V那么可维持时间约为 C × ΔU / I 1 × 0.5 / 0.3 ≈ 1.67 秒。这个余量足够列车平滑通过一整条轨道接缝甚至短暂断电区域。如果只靠 1000μF 的电解电容按同样公式算出来只有 1.7ms基本等于没用。但超级电容有个脾气它不能直接在电源上并联否则上电瞬间等效短路电流会把整流桥或降压模块打坏。正确做法是在超级电容正极串一个 5Ω~10Ω 的限流电阻再从电阻后端引到灯光负载同时加一颗 1N5819 肖特基二极管放在输入和电容之间防止断电时电容的电往回倒灌给电机驱动模块。这个二极管设计一开始我忽略了结果列车在隧道内不仅灯没保住Arduino 还莫名其妙重启了一次后来查资料才意识到是倒灌把控制板电压扰动了。加完二极管之后问题彻底消失。3.4 车头灯、尾灯和车厢灯的供电分配我把车头大灯和尾灯直接接在 12V 经过各自限流电阻的支路上车厢灯走 5V。原因是车头灯电流小用 12V 供电在轨道电压波动时亮度变化不太明显车厢灯集中供电方便后面用 Arduino 的 PWM 做调光。两部分用电隔离只在 Arduino 侧共地避免电机启停带来的大电流波动干扰灯光。4. 控制中枢一块 Arduino 让速度策略和灯光联动不再各玩各的4.1 为什么不买现成控制器非要折腾 Arduino市面上有专门的列车控制器但它们的逻辑大多是固定的前进、后退、调速。我想要的是进站自动减速、停车时车厢灯变暗、站台灯亮起、出站后恢复这些联动逻辑用现成控制器很难做而用 Arduino 就是写几行 if 的事。选型上我用了 Arduino Nano原因很朴素便宜、资料多、5V 供电正好和 DC-DC 模块匹配还有足够的 PWM 引脚。如果你手里只有 Uno也可以就是体积大一点车壳里要塞得下得动点脑筋。4.2 电机驱动选型TB6612 比 L298N 强在哪不少人一上来就买 L298N 那块蓝板子便宜是便宜但压降太大12V 进去电机端只剩 9V 多而且模块体积大塞进 HO 车头非常费劲。我换成了 TB6612FNG同样 12V 输入输出压降不到 0.5V体积只有 L298N 的零头还自带电流检测。这个模块是 SparkFun 那类板子常用的淘宝上很多成品板直接插杜邦线就行。接线这样走TB6612 的 VM 接轨道取电 12VVCC 接 5V这个引脚是给模块内部逻辑供电的GND 和系统共地PWMA 接 Arduino D5控制 A 通道电机速度AIN1 接 D6AIN2 接 D7控制方向。轨道取电是滑轨上的两根导线我在轨道两端焊了铜鼻子一路引到车头内部。这个环节要特别注意极性DCC 轨道的供电方式和我们这个 DC 方案不一样别混着接。4.3 控制代码状态机让列车“知道”自己在干什么控制逻辑我写成简单的状态机避免一个 if 套一个 if 把自己绕晕。状态包括加速、巡航、进站、停车、出站。基础框架大致是这个样子enum TrainState { ACCELERATE, CRUISE, SLOWDOWN, STOP, DEPART }; TrainState state ACCELERATE; const int motorPWM 5; const int motorDir1 6; const int motorDir2 7; const int cabinLightPin 9; // PWM 调光 const int stationLightPin 10; const int sensorPin A1; // 进站检测传感器 unsigned long lastTime 0; int speed 0; void setup() { pinMode(motorPWM, OUTPUT); pinMode(motorDir1, OUTPUT); pinMode(motorDir2, OUTPUT); pinMode(cabinLightPin, OUTPUT); pinMode(stationLightPin, OUTPUT); analogWrite(cabinLightPin, 255); } void loop() { int sensorValue analogRead(sensorPin); switch (state) { case ACCELERATE: speed min(speed 5, 180); setMotor(speed, true); if (speed 180) state CRUISE; break; case CRUISE: if (sensorValue 500) { state SLOWDOWN; } break; case SLOWDOWN: speed max(speed - 3, 0); setMotor(speed, true); analogWrite(cabinLightPin, map(speed, 0, 180, 80, 255)); if (speed 0) state STOP; break; case STOP: analogWrite(stationLightPin, 255); delay(5000); state DEPART; break; case DEPART: speed min(speed 8, 180); setMotor(speed, true); if (speed 120) { analogWrite(stationLightPin, 0); analogWrite(cabinLightPin, 255); state CRUISE; } break; } } void setMotor(int spd, bool forward) { digitalWrite(motorDir1, forward ? HIGH : LOW); digitalWrite(motorDir2, forward ? LOW : HIGH); analogWrite(motorPWM, spd); }这个代码不是最终版只是为了演示主干。实际跑的时候我加了一个 500ms 的非阻塞延时防止状态在同一个位置连续触发还加了进站传感器的去抖逻辑。传感器我用的是反射式红外装在进站前轨道旁边车轮经过时反射信号变化输出到 Arduino 的 A1 引脚。4.4 PWM 频率那些事为什么电机调到某个速度会“嘶嘶”叫直流电机驱动 PWM 频率和电机本体会产生共振这个几乎每个做模型的人都遇到过。Arduino 默认 PWM 频率D5 和 D6 引脚大约是 980Hz其他引脚是 490Hz。980Hz 对直流电机来说其实有点低容易产生明显的电流杂音。TB6612 没问题但电机本身会啸叫。解决方法是改定时器把 PWM 频率提到 1kHz 以上。代码里在 setup 加两行寄存器配置或者简单点把速度引脚放在支持高频 PWM 的引脚上再配合系统函数调整。这里我不展开写寄存器细节了网上搜“Arduino 高频率 PWM”有现成方案照着抄就行。LED 调光也要注意PWM 频率太低会有肉眼可见的闪烁。我用 D9 做的车厢灯调光要保证频率不低于 500Hz否则相机拍出来一道一道的黑条纹。实际用手机录像测试调到 1kHz 左右基本就干净了。5. 弯道、坡道、隧道运行调试里最难啃的三块骨头5.1 弯道跳轮先量轨道再动车身Part 1 遗留的弯道跳轮问题我一直拖着没处理。这次终于硬着头皮排查。现象是列车在 R216 弯道、速度偏快时动力车后轮会轻轻跳一下偶尔直接脱轨。按照“先轨道后车身”的原则我先拿轨距规量了一遍弯道轨距。HO 比例标准轨距是 16.5mm结果弯道处有两处轨距偏大到了 17.0mm明显是轨道接缝处没对齐。用尖嘴钳把轨距纠正回 16.5mm 之后重新试车跳轮频率小了一大半。剩下的偶发跳轮来自车身重心。车壳是塑料的很轻加上 Arduino 和电池盒被我固定在车头后部导致整个车重心后移过弯时后轮有被离心力甩起来的趋势。解决办法是在动力车中部加 5g 配重我用的是环氧树脂把铅块粘在底盘上。这个操作不影响原车配重设计只是把重心压到转向架中心附近。还有个细节弯道外侧轨道可以稍微抬高一点形成类似公路的“超高”但别过头1mm 到 1.5mm 就够了太高反而容易在弯道内侧脱轨。5.2 坡道动力不足4% 坡度对 HO 沙盘来说太大了刚开始设计轨道时我想着 4% 的坡度应该没什么问题实际拖着三节车厢爬坡速度直线下降PWM 给到 200 依然明显吃力。查了下资料HO 比例模型的常规坡度最好控制在 2% 到 3% 以内4% 属于模块化沙盘的极限但前提是列车短、车厢轻。我的坡道是用 2mm 厚的泡沫板垫起来的坡度等于抬升高度除以坡道长度。如果要把坡度从 4% 降到 2.8%抬升高度不变的情况下坡道长度要增加大概 43%。这意味着要重新铺一大段轨道。我对比了一下还是改了因为不解决这个问题以后挂满五节车厢基本上是爬不动的。改完坡度后PWM 170 就能稳定爬坡速度均匀电机声音也顺了。另外顺手给电机齿轮箱滴了半滴专用的模型润滑油这东西不能多多了会甩到电刷上碳刷打火是另一个灾难。5.3 隧道内灯光闪超级电容加上了为什么还闪按理说加了大电容隧道内短暂的断电应该能扛过去可实际测试时车厢灯还是偶尔闪一下。这让我挺郁闷因为前面计算过1F 超级电容能维持 1.6 秒左右的灯光电流完全够用了。后来用万用表一测才发现问题根本不在供电维持上而在于我加在输入和超级电容之间的那颗二极管是普通整流二极管 1N4007压降就有 1V 左右5V 过来到超级电容正极只剩 4V如果轨道电压再稍微波动灯光后端电压就跌到 LED 能维持的阈值以下了。换成了压降只有 0.3V 的 1N5819 肖特基二极管之后隧道内灯光立刻就稳定了。这个排查过程给我一个教训很多“玄学故障”其实都是器件选型不仔细导致的小压降加上波动累积出来的。别小看一颗二极管它的选型直接影响整个系统的裕量。5.4 灯光亮度不一致同一批 LED 也有个体差异车厢灯接好后三节车厢亮度肉眼能看出区别。虽然我每颗都串了同样的 150Ω 电阻但 SMD LED 的 VF正向电压在相同批次里也会有 0.1V 到 0.2V 的偏差反映到亮度上就是一颗亮一颗暗。要解决这个一个办法是挑选 VF 值接近的 LED用纽扣电池逐个点亮比较把亮度一致的放一起用另一个办法是改用恒流驱动但这么小体积的恒流芯片在车壳里不好塞。我最后选了最土的办法拿一节旧手机电池拆出来的电芯给每颗 LED 单独供电肉眼挑亮度一致的用。慢是慢了点但效果稳定。如果实在无法挑也可以在电阻上进行微调比如把亮的那颗的限流电阻从 150Ω 换成 180Ω稍微降低电流压压亮度但这个方法操作起来很费焊点不如焊前挑灯省事。故障排查最后整理成了一张表照着顺序查比瞎猜快得多现象可能原因检查顺序解决办法弯道跳轮轨距偏大、重心偏移、超高不足轨距规量轨距 → 查重心 → 查超高纠正轨道接缝加配重微调外侧轨道爬坡无力坡度太陡、电机缺油、电压不足量坡度 → 空载测速度 → 检查轨道取电降低坡度给齿轮箱润滑清洁轨道隧道灯闪超级电容容量不足、二极管压降大、接触不良测电容电压 → 换二极管 → 查轨道接缝加/换 1F 电容换 1N5819灯亮度不均同一批 LED 的 VF 离散、电阻不一致逐个测 VF → 检查电阻挑选同亮度 LED微调电阻Arduino 重启供电被倒灌、接地不良查二极管方向 → 查共地加防倒灌二极管确保系统共地6. 场景联动站台、信号灯与雪景让沙盘真的“活”起来6.1 站台灯光让列车每一次停靠都有“仪式感”站台灯光我最想要的效果是列车快要进站的时候站台灯保持昏暗列车停稳的那一刻站台灯亮起像在迎接乘客车一开走站台灯灭恢复夜色中的安静。实现起来不算复杂。我在站台轨道下方隐藏了一个反射式红外传感器当列车停稳在站台位置时传感器输出的电平变化传给 Arduino。这个传感器的型号很常见就三个引脚VCC、GND、OUTOUT 直接接 A2 引脚。代码里的逻辑很简单当传感器检测到列车到位信号就把站台灯引脚拉高并且同时把车厢灯 PWM 调到 80 左右模拟乘客下车后车内光线调暗出站时恢复。站台灯用的是一排 3mm 暖白 LED装在一根长条形的磨砂亚克力灯罩里亮度均匀不会出现一颗一颗的光珠看起来很舒服。整个灯条只用一个 150Ω 电阻限流因为 5V 供电且串联连接电流被控制得很小。6.2 信号灯电路红绿切换不能靠手拨开关沙盘里的信号灯如果每次都得手动拨开关那还不如不装。我用的是红绿双色 LED共阴三个引脚红色阳极、绿色阳极、公共阴极。红色阳极接 Arduino D11绿色阳极接 D12公共阴极接 GND。Arduino 控制这两个引脚的高低电平就能实现红绿切换甚至还能同时点亮出黄光效果。进站信号和站台停靠信号用同一个传感器触发这样逻辑可以保持同步。列车驶入进站轨道范围时传感器给出信号我把红灯点亮列车停车列车重新启动并驶离传感器检测范围后信号灯切回绿灯。一个小的设计细节信号灯不能和列车灯光用同一个电源支路否则列车电机大电流启动瞬间会造成信号灯闪一下。我单独给信号灯走了一路 5V虽然只是多一根线但稳定性好很多。6.3 雪景制作别让塑料泡沫毁掉你一下午的功夫雪景是极地特快沙盘的重头戏。常见的雪景材料有石膏、白乳胶、雪花粉、闪粉等。我的做法是先在需要铺雪的区域涂一层白乳胶然后把小苏打和白色闪粉按大概 3:1 混合后撒上去用喷壶轻微喷水让它固定。小苏打便宜闪粉负责在灯光下产生细碎的反射看起来就像雪地里的冰晶。要注意的是不要直接用泡沫板当雪地再喷漆很多喷漆里的溶剂会瞬间把泡沫腐蚀出一个坑。如果非要泡沫做底先在表面刷一层白乳胶打底等完全干了再上其他材料。隧道口的“冰柱”我用的热熔胶拉丝趁热快速拉出细丝冷却后自然垂下再撒一点银粉在上面。这个操作很考验手感但失败成本低多拉几次就有经验了。最后在冰柱根部点一点白乳胶粘上闪粉灯光一照还挺像那么回事。6.4 整体效果调试灯光氛围要回到相机里看灯光装完以后不要只靠肉眼满意。沙盘上肉眼看起来柔和的灯光换到手机相机里经常会出现过曝或者条纹。我的调试习惯是把房间灯关掉只用沙盘灯光用手机手动模式ISO 100快门 1 秒拍一张照片看整体亮度分布。如果车厢内部过曝就减小 LED 电流或者把 PWM 调光值降下来如果光线不够优先检查是不是导光纤维端面太脏或没对齐。最终我调整到车厢内灯光亮度在照片中呈现出一种“暖黄但仍有细节”的状态快门 1 秒 ISO 100 的情况下不会过曝又不至于太暗。这个状态肉眼看上去就是电影里那种大雪夜里列车车窗透过温暖灯光的画面感。四条验收标准最后全部通过车厢灯光无频闪隧道全程不闪弯道不脱轨进站自动减速且站台灯联动正常。列车满载电流实测 0.85A在 1A 的设计目标以内。7. Part 2 跑完我最想让你避开的四个坑整个项目做完如果只让我总结四条经验那就是第一热熔胶这东西能不用就不用。固定灯珠、贴电路板看似方便一旦车壳内部温度升高或者老化它就会变软流到不该去的地方。UV 胶或者白乳胶慢是慢点但不会在事后给你找麻烦。第二LED 别图省事并联共用一个电阻。灯珠之间的压降差异是真实存在的并联后的后果就是亮度不均、寿命缩短。每颗灯单独一个电阻多焊几个点换回的是几十个小时不用返工。第三共地问题。只要系统里同时有电机驱动、单片机、传感器就一定要理清共地关系。我这次遇到的 Arduino 重启、传感器误触发好几个都是因为地线没有可靠连接。建议在车壳里找一块铜箔或者焊盘作为星型接地中心所有 GND 都汇集到这一个点上。第四坡度不要拍脑袋定。4% 在图纸上看着没问题车厢一多就原形毕露。留足余量坡度 2%~3% 之间会让整个系统轻松很多。这项修改虽然让我重新铺了几段轨道但跑车的心情完全不一样了。项目做到这儿离完整的极地特快氛围还差最后一步声音。我已经在计划给这台车加一个 DFPlayer Mini 模块播放一段柔和的圣诞乐进站时音量自动调低出站再恢复。那不是 Part 3也算不上新项目就是临睡前摆弄沙盘时想给自己找个再折腾一会儿的理由罢了。
返回列表