
1. 模型火车自动运行的起点先搞清楚“无人值守”到底要解决什么一次模型展上我站在一列HO比例的货运列车边上看着它在没有一个人伸手的情况下自动进站、停车然后又缓缓启动离站整个过程连续十五分钟没人碰过遥控器。旁边一个第一次玩模型的小朋友问守台老师傅“这火车是不是自己认识路”老师傅笑了一下“它不认识路它认识传感器。”这句回答让我印象很深也成了我后来折腾模型火车自动运行的起点。先说清楚一个概念模型火车自动运行英文圈子里叫“Running Model Trains Without Human Input”中文更常说的说法是“自动运行”“无人值守运行”或者“自助运转”。它不像很多人想象的那样需要多高深的技术本质上就是用传感器感知列车位置用逻辑电路或程序决定怎么给电、怎么减速、怎么停车、什么时候再走。它能做的事很明确让一列或多列模型火车在轨道上按照预定的方式独立运行不需要人不停地扭调速器、拨方向开关。这篇文章不是教科书是我基于自己折腾模型火车自动运行的完整经验整理出来的一套内容。适合三类人看一是刚接触模型火车、想知道“自动跑”到底怎么实现的入门玩家二是已经把轨道铺好、想给场景加入自动列车却不知道从哪里下手的进阶玩家三是做创客教育、想用模型火车讲解传感器和控制逻辑的老师和爱好者。其中不少结论来自实际运行的调整过程不是纸上谈兵所以后面也会有不少“我当时就是没注意这个所以翻车了”的教训。1.1 从“遥控跑车”到“让它自己跑”一次认知转变平时大家玩模型火车多半是手持DCC控制器或者传统DC控制器调速。火车走得快慢、什么时候停、什么时候换向全靠人手操作。这种玩法有一个隐藏问题你的注意力被一架小车绑住了整个场景里的车站、信号机、道岔、装卸货物全成了背景板。而自动运行的真正价值是把“驾驶员”解放出来让你变成“调度员”甚至“观众”。从技术角度讲“无人值守”这四个字听起来唬人实际上拆开就三件事感知、决策、执行。感知用传感器知道列车在哪个位置。常见的做法有磁簧管、光电对射、红外反射、轨道电流检测以及摄像头视觉识别。决策根据列车位置决定下一步动作。这一步可以用继电器搭建的硬逻辑完成也可以用Arduino、ESP32这类单片机跑程序甚至用树莓派接摄像头跑视觉算法。执行改变轨道供电状态给列车加速、减速、停车或者换向。最底层的执行对象就是继电器、MOS管或者DCC解码器。这三件事形成一个闭环传感器告诉控制器“车到站了”控制器让执行器“断电”执行器停住火车。这个闭环越稳定自动运行就越成熟。1.2 自动运行的三种典型形态不是所有“自动运行”都是同一种玩法。我习惯把常见的需求分成三个层次这样和爱好者聊起来效率高得多第一层单机自动循环。一列火车在一个环形线路或者点对点线路上反复跑进站减速、停准、停一会儿、再出发。这是最简单也是最解压的形态适合咖啡店摆一个、客厅角落做一个展示场景。它不需要复杂的逻辑两三个传感器加一个控制器就能搞定。第二层多机时间表运行。两列或更多列火车按照各自的时间表在轨道上跑在会让线、侧线里避让。这个层次开始涉及“占用检测”必须知道某一段轨道上有没有车否则两列车就会撞在一起。这是自动运行从“玩具”走向“小系统”的关键一步。第三层场景联动的自动运转。列车进站自动触发信号机变化、道岔转换、站台灯光亮起、车厢里的灯光开启甚至配合车站广播和车厢上下客的动画。这一层已经不只是让车跑而是让整个沙盘“活”起来。很多博物馆和公开沙盘展示使用的就是这层技术。这篇文章主要覆盖前两个层次第三个层次我会顺带讲一部分因为它依赖的传感器和逻辑底座和前两个是共通的。1.3 真正的核心只有一个闭环如果你去看火车模型论坛上那些失败的案例会发现一个共同点很多人以为自动运行的关键是编程于是先把代码写好结果硬件上一堆问题——传感器位置不对、轨道分压不足、车轮接触不良——导致火车时而停不下来时而根本检测不到。这其实搞反了顺序模型火车自动运行的核心从来不是程序而是“传感-决策-执行”这个闭环在地面上是否可靠。打个比方一个人闭着眼睛走路能走直线是因为脚底能感知地面耳朵能听声音大脑能修正步幅。如果让他穿上完全隔音的耳机、戴上眼罩他走不出十步就会歪。模型火车也是同样道理传感器就是它的“眼睛”轨道就是它的“地面”控制逻辑就是它的“大脑”。这三者缺一不可而任何一个环节出问题最终的故障表现往往都落在“火车跑得不对”上让人误以为是电机或控制器坏了。所以这篇文章我会花不少篇幅讲轨道和传感器的物理布置因为那才是自动运行真正的地基。2. 轨道与传感器自动运行能否成功七成由这些“地面设施”决定我在各个模型社区里见过不少自动运行翻车现场最后排查下来绝大多数问题不在程序而在轨道和传感器。这一节的内容是我认为是整个自动运行项目里最值得反复读的部分。2.1 供电分段与压降宁可多分区不要长单线模型火车的运转离不开供电而自动运行对供电稳定性的要求比手动遥控高得多。为什么因为手动遥控时你眼睛看到火车减速会下意识认为是轨道阻力然后加大油门但自动运行系统里如果供电电压在某个位置跌落火车快到停车点了却因为电压不足提前停下传感器没有触发系统就会认为火车“失踪了”整个逻辑链条就崩了。所以第一件事是重新审视你的供电布局。常见的错误是用一根细的轨道接线夹从控制器引出电源绕着整个沙盘一圈沿途的每个轨段都靠轨道连接器传导。问题在于轨道本身是金属条有电阻而且轨道连接处还有接触电阻。电流从电源端流到远端沿途电压会越来越低尤其在大环形沙盘上远端轨道的电压可能比电源端低不少。我的建议是给轨道做多点供电power feed。每间隔一米半左右从电源线上并接一对轨道接线夹到轨底。DCC系统因为要传输数字信号更需要注意这一点直流DC系统虽然没那么敏感但是自动运行要求精确停位电压稳定同样重要。我用的是18AWG的铜线做主线环绕沙盘一圈然后在多个点接入轨道实测远端和近端的电压差可以控制在0.2V以内这对自动停车来说是完全够用的。有条件的还建议把沙盘分成多个供电区power district每个区由独立的电子断路器保护。这样一旦某个区发生短路不会让整个沙盘全部断电。自动运行系统里某个道岔摆错导致小车出轨碰线短路在无人值守的情况下是大概率事件——我第一套自动运行系统就是在深夜无人看管的时候发生短路的结果整个电路烧了第二天早上才发现。从那以后我所有沙盘都加装了分区保护。2.2 传感器选型和安装位置每个方案都有脾气传感器是自动运行的“眼睛”。我把常见的传感器方案列成一张表方便对比传感器类型检测原理优点缺点典型应用磁簧管火车底部磁铁接近磁簧管触点闭合便宜、耐用、无需供电触点抖动、需要火车加装磁铁、无法检测车厢位置停车点、进站触发光电对射IR break beam火车通过时遮断红外光束响应快、非接触、可检测列车长度需要两侧安装支架、容易受灰尘遮挡出站检测、列车完整性检测红外反射传感器检测轨道上方的反射物安装方便、单侧安装受环境光影响、需要调阈值进站预告、车厢检测霍尔传感器火车底部磁铁靠近时输出信号无触点、寿命长、响应快需要磁铁和传感器间距小精确停位轨道电流检测block detection检测某段轨道是否有车占用无需火车加装任何部件、可检测整段占用需要断电分区、调试复杂多车避让、区段占用摄像头视觉图像识别列车位置灵活、可检测复杂状态成本高、调试难度大、光线敏感实验项目、视觉避让如果只做单机自动循环我推荐磁簧管或者红外反射因为简单可靠。如果做多车避让轨道电流检测几乎是必备的因为你需要知道“整段轨道”是不是有车而不只是某个点有没有车。安装位置有一个通用原则传感器的安装位置应该是“再晚一点发现就来不及”的最晚点往前推一个安全距离。举个例子一列HO比例的火车最高速度设为每秒0.4米减速到停车需要2秒那就是说从开始减速到停车列车会滑行约0.4到0.8米。如果你希望列车最终停在站台中央那么用来触发减速的传感器必须安装在站台中央往前约0.6米的位置。这个距离需要实测调整每个车的制动特性不一样。2.3 绝缘段与停止点标记轨道切割和电气隔离的细节当你想让一列火车在某一段轨道上自动停下最直接的做法是把这段轨道做成绝缘段isolated section也就是和主轨道在电气上隔离开单独开关它的供电。列车进入绝缘段后控制器切断该段供电列车就会停在里面。等要放行时再恢复供电列车从绝缘段起步继续跑。听起来简单做起来有几个坑。第一绝缘段必须在轨道上切缝否则电流会绕过继电器从连接器里穿过去。我见过有人只在一边切了缝另一边靠绝缘尼龙接头结果列车通过时转向架两边的轮子同时接触带电和不带电的轨条形成“桥接”导致绝缘段一直带电怎么都停不下来。正确的做法是绝缘段的两根轨道都要和主轨断开而且断开点的两个接头都要使用绝缘尼龙接头或者在轨道上切缝。第二绝缘段的长度必须大于列车中最长的车否则列车前后两个转向架分别落在绝缘段和主轨上会形成跨接。具体多长合适我一般建议绝缘段做成整列火车长度的1.2到1.5倍。太短会造成停车不准太长则浪费轨道空间。第三停车点的物理标记。自动运行系统里机车停了之后系统需要知道它“确实停到位了”。我的做法是在绝缘段尾端设置一个“停车确认磁簧管”只有当列车触发这个传感器并且绝缘段断电系统才认为停车成功才允许进行下一阶段逻辑比如开信号灯或者启动另一列车。3. 三代自动控制方案实测对比继电器、单片机、机器视觉方向明确了就可以动手选择控制方案。我按自己的实践和理解把自动运行控制方案分成三代每一代都有自己的定位和适应场景。3.1 第一代磁簧管 继电器硬逻辑也能跑得很好老一辈模型火车爱好者很喜欢用继电器搭建自动运行逻辑。原理很直接磁簧管作为传感器列车底部装小磁铁磁簧管在轨道下固定。列车经过时磁簧管闭合闭合的信号驱动继电器动作继电器再切换轨道供电。这套方案最吸引人的地方是不需要写任何代码。比如你想实现“列车进站停车后5秒再发车”可以这样设计进站传感器触发后一个带延时的继电器time delay relay切断整段轨道供电列车停车延时结束后另一个继电器恢复供电列车重新启动。两个继电器的组合就能实现完整的“进站-停车-等待-发车”逻辑。它的局限性也很明显。第一逻辑变更特别麻烦改一个停站时间要去拧延时继电器的旋钮第二复杂逻辑无法实现比如“A车先过B车等A车过了才发车”这种会车逻辑用继电器搭也可以但继电器数量会爆炸式增长第三继电器的触点寿命和抖动是隐患。所以我更推荐把继电器方案用在纯模拟DC的小型展示场景里或者作为入门教学的第一课。3.2 第二代单片机Arduino / ESP32作为调度大脑这是目前模型火车自动运行的主流做法。用Arduino或ESP32作为中央控制大脑传感器信号进入单片机的GPIO口单片机根据预设逻辑控制MOS管或继电器来切换轨道的电源。用单片机的好处是逻辑灵活。你不需要改硬件就能调整停车时间、修改运行次序甚至可以实现一个简单的时刻表系统。比如你想让列车A在站台停20秒列车B在会让线停45秒在代码里改一个数字就行。另一个好处是可以通过串口输出调试信息实时看到当前哪个传感器被触发、哪个继电器被打开。这个调试能力在继电器方案里几乎不可能做到。我自己的自动运行沙盘就是用ESP32搭的。选ESP32而不是Arduino Uno主要是因为ESP32自带Wi-Fi和蓝牙后续可以加手机控制面板如果你完全不需要联网Arduino Uno甚至Nano就够了价格还便宜。不过要注意单片机输出的是低压小电流信号不能直接驱动轨道供电必须通过MOS管或者继电器模块接中间层。很多人第一次就栽在这个地方直接把GPIO接到轨道上结果单片机瞬间烧掉。3.3 第三代机器视觉与深度学习的尝试树莓派加摄像头加OpenCV是目前一些项目用来做列车位置识别和避让的前沿玩法。它的核心思路是摄像头俯视沙盘程序识别出列车在图像中的位置再通过图像坐标换算成轨道坐标从而做出决策。这套方案听起来比传感器方案“高级”但也更“娇气”。光线一变、镜头一点点积灰、列车颜色和背景颜色接近识别就可能出问题。我试过在沙盘上方固定一个广角摄像头用颜色阈值识别列车白天晚上效果差很多。后来又尝试了基于深度学习的检测模型准确率是上去了但模型训练数据得不停喂改一个场景就要重新标注。我的建议是除非你的目标就是研究机器学习否则别把机器视觉作为自动运行的主体方案。它更适合用在一个传感器不好铺设的特殊场景里比如列车在某个位置需要做非常规动作、或者你想做“列车自动识别信号灯颜色并停车”的实验项目。对绝大多数沙盘来说磁簧管和电流检测已经足够。3.4 怎么选一张表把方案拉平我自己面对不同场景时通常会快速对号入座需求形态推荐方案理由小型展示台一辆车循环跑磁簧管 延时继电器成本低、免编程、稳定中型场景自动停车、自动发车Arduino/ESP32 光电/磁簧可编程、调试方便多车会让、区间占用检测Arduino/ESP32 电流检测可感知整段轨道占用避让逻辑可实现沙盘场景联动信号机、道岔、灯光ESP32 DCC解码器组合除了控制列车还能联动沙盘其他设备实验性视觉识别树莓派 摄像头属于进阶玩法适合有编程经验的人4. 从零搭建一套“无人值守单线会让”系统可复现这一节直接给出一个可以照着做的项目。我选择了“单线会让”作为例子因为它是多车自动运行里最典型、也最容易出成就感的一个场景两个方向各有一列车在单线区间上相向而行需要在中间会车区的侧线上避让。整个过程中没有人干预。4.1 项目目标与场景定义先定义清楚项目边界轨道布局是“主线 中间会让站”。主线全程用电中间会让站有两段侧线一股让上行列车避让一股让下行列车避让外加一个正线区段。两列车初始时分别在左右两个终点站向对方方向出发系统必须保证它们不会在单线区间迎面相遇。为了方便你复现我把轨道参数列成参考值轨距比例HO1:87布局环形会让站的点对点模式总长度约8米两列机车型号Kato SD40-2 和 Atlas GP38-2长度均为约20cm不含车厢单节车厢长度约15cm一列挂6节全长约110cm车速巡航0.4m/s低速进站0.15m/s4.2 硬件清单与接线这是我实际用下来的一套配置每一件的用途我都会注明ESP32开发板 x1控制大脑负责读取传感器状态并输出继电器控制信号4路继电器模块 x1切换各轨道区段供电必须使用带光耦隔离的模块磁簧管传感器 x6用于列车到达检测和停车确认小磁铁 x2粘贴在机车底部使磁簧管能感知列车通过轨道电流检测模块如BOD模块x2用于检测主线两个区段的占用状态12V直流电源 x1给轨道供电5V/3.3V电源模块 x1给ESP32和传感器供电注意传感器和逻辑电路的地必须隔离轨道绝缘接头和轨道切缝工具接线方面有一个容易忽略的点继电器模块的公共端应该接轨道供电的正极常开端接被控轨道区段。千万别把公共端接到负极了这样会导致即使继电器不动作电流也能通过DCC解码器或者其他回流路径灌入轨道区段。我第一次组装时没仔细看继电器引脚正负极接反导致绝缘段无法断电列车一路冲到沙盘尽头撞上了缓冲器。4.3 控制逻辑代码与关键参数下面给一段ESP32的示意代码实现的是“A车出发到达会让站后停车若B车未占用该区间则放行”的逻辑。这只是核心结构的一部分跑通后你可以继续扩展。// ESP32 自动会让站控制 - 核心逻辑示例 // 传感器定义 const int sensorA_approach 26; // A车进会让站接近传感器 const int sensorA_stop 27; // A车停车确认传感器 const int sensorB_approach 14; // B车进会让站接近传感器 const int sensorB_stop 12; // B车停车确认传感器 // 继电器输出定义 const int relayMainA 33; // 控制会让站正线A侧供电 const int relayMainB 25; // 控制会让站正线B侧供电 const int relaySidA 32; // 控制A车避让侧线供电 const int relaySidB 13; // 控制B车避让侧线供电 const int relayMainBlock 23; // 控制中央区间断电或供电 unsigned long stopUntilA 0; unsigned long stopUntilB 0; void setup() { Serial.begin(115200); pinMode(sensorA_approach, INPUT_PULLUP); pinMode(sensorA_stop, INPUT_PULLUP); pinMode(sensorB_approach, INPUT_PULLUP); pinMode(sensorB_stop, INPUT_PULLUP); pinMode(relayMainA, OUTPUT); pinMode(relayMainB, OUTPUT); pinMode(relaySidA, OUTPUT); pinMode(relaySidB, OUTPUT); pinMode(relayMainBlock, OUTPUT); // 初始状态允许A车和B车同时进入会让站两侧 digitalWrite(relayMainA, LOW); digitalWrite(relayMainB, LOW); digitalWrite(relaySidA, HIGH); digitalWrite(relaySidB, HIGH); digitalWrite(relayMainBlock, HIGH); } void loop() { // 如果A车接近会让站且B车还没到达就让A车进入正线 if (digitalRead(sensorA_approach) LOW) { // A车进入给A车侧线断电正线通电 digitalWrite(relaySidA, LOW); digitalWrite(relayMainA, HIGH); Serial.println(A approaching, waiting for A to stop); } // 如果A车触发停车确认则记录停车时间 if (digitalRead(sensorA_stop) LOW) { if (stopUntilA 0) { stopUntilA millis() 10000UL; // 停车10秒后自动放行 digitalWrite(relayMainA, LOW); // 切断正线供电强制A车停止 Serial.println(A stopped at station, waiting 10s...); } } // 停车时间到恢复A侧正线供电A车发出 if (stopUntilA ! 0 millis() stopUntilA) { digitalWrite(relayMainA, HIGH); stopUntilA 0; Serial.println(A released); } // B车的逻辑与A车对称但需要增加区间占用检测避免撞车 if (digitalRead(sensorB_approach) LOW) { // 只有当中央区段没有检出A车时才允许B车进入 if (digitalRead(relayMainBlock) HIGH) { digitalWrite(relaySidB, LOW); digitalWrite(relayMainB, HIGH); Serial.println(B approaching, block free, B enters main); } else { Serial.println(B blocked: main section occupied by A); } } delay(50); }这段代码不是完整工程但核心逻辑已经能体现出来每个传感器触发后都要打印串口日志方便你在电脑上实时观察事件顺序。有一点要特别提醒代码里的延时停车时间10秒只是一个初始值必须根据列车实际制动性能调整。我的做法是先设一个很长的停车时间比如30秒在电脑上观察串口日志确认列车确实停稳了再缩短到目标值。如果停车还没停稳就恢复供电列车会带着惯性冲出去越过停车点触发后面的传感器逻辑就彻底乱套了。4.4 测试流程与第一次运行后的校准写完代码插上电先把两列车放在轨道上不要急着让它们跑全自动。我建议分三步测试第一步手动模式验证传感器。用手机或遥控器控制列车分别经过每个传感器观察串口日志里是否每个传感器都有正确的触发记录。这一步能发现接线错误、传感器位置偏移等问题。第二步单列自动跑通。让A车先单独跑一遍自动进站、停车、自动发车的循环。反复跑几次直到每次停车位置偏差控制在2厘米以内。如果停车位置偏差大通常是传感器安装位置不对或者断电瞬间列车还有速度需要把减速传感器的位置再往站台外挪一点。第三步双车会车测试。两列车同时相向而行观察它们是否会车成功。这一步最容易暴露逻辑漏洞比如A车还在正线B车已经进入会让站的情况。我第一轮测试时就发现B车因为传感器触发太快在A车还没完全让开时已经冲进正线两台车撞了个正着。为了解决这个问题我给会让站的进站区间增加了传感器延时去抖和“安全确认”机制B车只有在确认中央区段没有占用后才会被放行如果中央区段被占用B车会一直等在会让站外。5. 持续运行200小时后的故障清单与调优记录我的自动运行沙盘从第一次点亮到现在已经连续运行了大约200小时。这段时间里出的问题比我在搭建阶段遇到的还要多。把它记录下来或许能帮你少走不少弯路。5.1 传感器误触发的真凶第一个让我头疼的问题是列车明明还停在站台上系统却莫名其妙认为列车已经出站了。排查了一阵子才发现是磁簧管触点抖动造成的。磁簧管的原理是两片簧片在磁场作用下吸合如果磁铁靠近的速度很慢或者磁力很弱簧片会“若即若离”产生高速通断的抖动信号。单片机对这种抖动非常敏感一个瞬间的低电平就能触发一次停车逻辑。解决办法是两件套硬件上在传感器输出端并联一个0.1微法的电容做低通滤波软件上在读取传感器时做20到50毫秒的去抖判断。两层叠加之后传感器误触发率基本降到了零。另外一个容易被忽视的问题是环境光干扰。如果你的沙盘靠近窗户阳光直射到红外传感器上会导致接收器一直高电平传感器永远不触发。后来我把所有传感器的安装位置都调整到有遮挡的位置或者在传感器外部加了一圈黑色热缩管当遮光罩。5.2 轮轨接触不良导致的“幽灵占用”轨道电流检测模块在使用中会有一个经典问题某一段轨道明明没有车系统却报“占用”。我排查了很久才发现原因是轨道上的真实占用已经结束但电流检测模块的灵敏度设置太高把轨道的微小漏电流也算成了占用信号。又或者一节车厢停在绝缘段和通电段的交界处轮子跨接了两段轨道导致两段轨道同时检测到占用信号。这类问题我管它叫“幽灵占用”。解决方案有两个方向。一是在软件里增加占用计时器只有占用信号持续超过1秒才认为是真的占用避免瞬时信号干扰二是把电流检测模块的灵敏度调到合适档位不要一味调到最灵敏。如果你用的是自制的电流检测器记得在采样电阻两端并联一个合适的电容可以有效滤掉轨道上的杂散脉冲。5.3 潮湿、氧化与轨道清洁周期模型轨道用久了轨面会有氧化层和灰尘这会显著影响电气接触。在自动运行系统里列车停稳的瞬间轮子和轨道之间的接触电阻如果过大电流检测模块会误判轨道为“无车”进而提前给轨道送电列车就会在还没到发车时间时突然启动。我的经验是自动运行的沙盘轨道清洁频率要比手动玩的时候高一倍。每运行20到30小时就要用轨道清洁块或者轨道清洁布擦一遍主要行驶线每50小时要用干净的棉签蘸少量轨道清洁液擦一遍然后等它完全挥发再通电。这套维护流程听起来繁琐但是200小时运行记录里绝大多数电气故障都发生在轨道清洁周期临近结束的时候。5.4 参数调优的实际记录调优是一个反复试错的过程。我把自己调过的几组参数完整记录下来可以当作参考。注意这是基于我的特定机车和轨道长度得出的数据只能作为起点不能照搬。参数项初始值调整后调整原因减速传感器到停车位距离60cm45cm原值导致列车在减速段末段时速太低停不到中心点停车等待时间10s8s车站侧有装卸动画8秒刚好配合动画循环低速进站速度0.15m/s0.1m/s0.15m/s仍在停车点前滑行过远0.1m/s更稳传感器去抖时间0ms30ms消除磁簧管抖动误触发轨道电流检测灵敏度最高档中间档减少幽灵占用调参时的核心原则是一次只调一个变量。如果同时改了距离、速度和等待时间出了问题根本不知道是哪一个参数引起的。我一开始犯了这个错误把几个参数一起改结果系统行为变得完全不可预测浪费了好几天才把问题定位到速度参数上。做自动运行做到现在我最大的体会是这套系统的难点不在于某一项技术有多深而在于把每个环节的细节都照顾到。传感器间距差两厘米看起来不碍事实际运行中可能就是一次虚惊继电器供电正负极接反看起来是小问题却能让整个逻辑瞬间崩溃。所以如果你也想让模型火车“自己跑”起来我建议从最简单的单机自动循环开始先让一列车在环形线上自己进站出站等它每次都精准停位、稳定跑上一周之后再考虑多车会让、信号联动这些更复杂的玩法。那个过程比一次成功要有趣得多也扎实得多。