Arduino 自制 DCC 命令站:蓝牙控制模型铁路,免费 App 支持 CV 读写
项目亮点
- 极简硬件:Arduino Pro Mini + LMD18200 H 桥 + HC-06 蓝牙,成本约 ¥150。
- App 端生成包:Android App “LocoMotive” 在手机侧构造完整 NMRA DCC 数据包,Arduino 仅负责波形输出,大幅降低单片机负载。
- 功能完整:1~20 号机车控制、128 速度等级、F1~F8 功能键、道岔/配件控制、CV1 地址编程、CV 1~255 读写(付费版)、过流保护、电流回传。
- 即插即用:PCB 板载螺丝端子、电源稳压、天线加长接口,组装即用。
系统架构

数据流向:
- App 通过 HC-06 发送 ASCII 指令串,如
DD,3,63,12,48,(机车 3、速度步数、速度值、XOR 校验)。 - Arduino 解析指令,填充 DCC 报文结构体(前导码 + 数据字节 + 分隔符 + XOR)。
- Timer2 中断以 58 µs/116 µs 交替翻转 D5/D6 引脚,生成标准 DCC 双极性方波。
- LMD18200 接收 DIR(D5)/PWM(D6) 信号,向轨道输出 ±14 V / 2 A 轨道电压。
硬件清单与 PCB 关键参数
| 器件 | 规格 | 关键参数 |
|---|---|---|
| Arduino Pro Mini | 5 V / 16 MHz | 焊接 12Pin 排针 |
| LMD18200T | 3 A H 桥 | 需散热片,DIR/PWM 接 D5/D6 |
| HC-06 | 从机模块 | Tx↔Tx, Rx↔Rx(非交叉),波特率 9600 |
| 7805 | 5 V 稳压 | 输入 12~20 V,配合 220 µF/10 µF 滤波 |
| 采样电阻 | 0.1 Ω / 2 W | A0 采样,1.08 mV/步 @ 1.1 V 内部基准 |
| 齐纳二极管 | 3.6 V / 0.5 W | 保护 HC-06 RX 端 |
| PCB | 双层 1.6 mm | eBay/PCBWay 购买,预留 4/6/12Pin 座 |
天线增强改造
HC-06 板载天线增益低,建议在天线焊盘焊接 31.2 mm 单股铜线(2.4 GHz 1/4 波长),并套热缩管绝缘,通讯距离可从 5 m 提升至 15 m 以上。
固件核心:Timer2 精确波形生成
中断服务程序 (ISR) 逻辑
ISR(TIMER2_OVF_vect) {
if (every_second_isr) { // 每两次中断翻转一次电平
PORTD = B01100000; // D5=1(DIR), D6=1(PWM) → 正脉冲
TCNT2 = latency + last_timer; // 补偿延迟
} else {
PORTD = B01000000; // D5=1, D6=0 → 负脉冲/间隔
// 状态机推进:前导码→分隔符→数据位→下一字节
switch(state) {
case PREAMBLE: /* 发送 16/24 个 '1' */ break;
case SEPERATOR: /* 发送单个 '0' */ break;
case SENDBYTE: /* 按位发送数据字节 */ break;
}
}
every_second_isr ^= 1;
}
关键常量:TIMER_SHORT=0x8D (58 µs)、TIMER_LONG=0x1B (116 µs),严格符合 NMRA S-9.1 标准。
指令解析与报文组装
string()解析逗号分隔 ASCII,存入int a[5]。- 3 字节指令(功能/配件)→
assemble_3_byte(),自动计算 XOR。 - 4 字节指令(速度/编程)→
assemble_4_byte()。 - CV 编程使用 24 个前导码(
preamble_type=1),符合 NMRA 编程轨要求。
过流保护与电流回传
void current() {
int val = 0;
for (int i=0;i<5;i++) { val += analogRead(A0); delay(1); }
sensorValue = val/5;
C = 10.8 * sensorValue; // mA,内部 1.1 V 基准下 1 步≈10.8 mA
if (C > 2000) { // 2 A 触发保护
digitalWrite(6, LOW); // 关 DCC 波形
digitalWrite(13, HIGH); // 拉高 Brake 引脚短路输出
bluetooth.println("Short!");
}
}
App 每秒请求电流值(发送 G),实时显示轨道负载,过流自动锁定需 App 发送 C 复位。
App 功能对比
| 功能 | LocoMotive (免费) | LocoMotive DCC (¥45) |
|---|---|---|
| 机车数量 | 1~20 | 1~20 |
| 速度等级 | 128 步 | 128 步 |
| 功能键 F1~F8 | ✅ | ✅ (可编辑名称/瞬时/锁存) |
| 道岔控制 | 8 对 | 8 对 (可编辑名称) |
| CV1 编程 | ✅ | ✅ |
| CV 1~255 读写 | ❌ | ✅ |
| 最大速度预设 | ❌ | ✅ |
组装与调试步骤
- 焊接 PCB:按 BOM 顺序焊接电阻、电容、IC 座、端子、排针,最后插入 Pro Mini、LMD18200、HC-06。
- 上传固件:
locomotive_dcc_sep19.ino(含 CV 读写版)。 - 接线:轨道接 2Pin 端子,电源接 14 V 笔记本适配器(外径 5.5/内径 2.1 mm)。
- 手机安装 App,蓝牙配对 HC-06(密码 1234),App 点击连接。
- 新机车首次使用:编程轨模式写入 CV1 地址,或主线编程(需隔离)。
- 实测电流:App 主界面显示实时 mA,确认无短路后正常运行。
常见问题 FAQ
- 机车不走、灯不亮
- 检查轨道极性、LMD18200 散热片是否短路、电源电压是否 ≥12 V。
- 蓝牙搜不到 HC-06
- 模块未上电或天线短路;检查 3.6 V 齐纳二极管焊接方向。
- CV 读写失败
- 确认机车解码器支持 CV 读回(需编程轨或 RailCom);调整
Cs = C+50灵敏度阈值。 - 多机车控制冲突
- DCC 协议本身支持多机车,App 切换机车号即可;同一地址机车会同步动作。
扩展建议
- 替换 LMD18200 为 BTS7960B(43 A)驱动 O/G 标大比例模型。
- 集成 RailCom 反馈模块,实现真正的 CV 读回与机车位置检测。
- 移植固件至 ESP32,增加 Wi-Fi 控制、固件 OTA 升级、Web 界面。
- 开发 iOS 版 App(需 MFi 认证或使用 BLE 模块如 HM-10)。
制造工艺
- MrRobot:Ubuntu移动端控制Rapiro机器人,支持语音、触控与摇晃交互
- Arduino驱动的六发鸡尾酒自动调配站 – 打造你的专属智能调酒机
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- 智能自系鞋带鞋:内置压电发电与计步功能
- Arduino 声纳实时测距与 Processing 可视化
- Pixel Chaser:Arduino Nano 单键 NeoPixel 追逐小游戏
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- 自制 10 美元便携 Arduino 气象站 - Nano + DHT22 + BMP180 + LCD
- Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
- eDOT:基于 Arduino 的精密时钟与气象站,内置红外遥控