Arduinoで作る模型鉄道DCCコマンドステーション 〜Bluetooth制御・無料アプリ付き〜
プロジェクト概要
市販のDCCコマンドステーションは高価ですが、Arduino Pro Mini+LMD18200 Hブリッジ+HC-06 Bluetoothモジュールで、スマホアプリから操作できる低コスト・高機能なDCCシステムを自作できます。最大の特徴は「DCCパケット生成の重い処理をスマホ側(Androidアプリ)で行い、Arduinoはクロック信号生成とHブリッジ駆動に専念」するアーキテクチャです。
システムアーキテクチャ
- スマホアプリ(LocoMotive/LocoMotive DCC):NMRA DCCパケットを組み立て、Bluetooth経由で送信
- HC-06 Bluetoothモジュール:シリアル通信でアプリとArduinoを接続(スレーブ専用)
- Arduino Pro Mini:受信パケットをデコード→NMRA規格のプリアンブル・セパレータ・データビットをタイマー割り込みで精密生成→LMD18200へ出力
- LMD18200 Hブリッジ: 3Aピーク、2A連続。DCC信号をレール電圧(12〜20V)に増幅
必要な部品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Pro Mini 328 5V/16MHz | 1 | クロック精度重視で16MHz版 |
| LMD18200T Hブリッジ | 1 | TO-220パッケージ、ヒートシンク必須 |
| HC-06 Bluetoothモジュール | 1 | スレーブ専用、Rx↔Rx, Tx↔Tx直結 |
| 7805 5Vレギュレーター | 1 | レール電圧からArduino用5V生成 |
| 3.6V 0.5W ツェナーダイオード | 1 | HC-06電圧レベルシフト用 |
| 0.1Ω 2W 金属皮膜抵抗 | 1 | 電流検知用(LMD18200 Current Sense) |
| コンデンサ各種 | - | 220µF/16V, 10µF/16V, 0.1µF×3 |
| 抵抗各種 | - | 10kΩ×2, 4.7kΩ×1 |
| スクリューターミナル・ピンヘッダー等 | - | 基板実装用 |
| PCB(eBay等で入手可) | 1 | 専用設計基板推奨 |
回路設計のポイント
電源系
- レール給電電圧(12〜20V DC)を7805で5V降圧→Arduino/HC-06電源
- LMD18200のVSピンに直接レール電圧供給
- 0.1Ω検知抵抗で負荷電流監視(A0でADC、内部1.1V基準使用)
Bluetooth接続
HC-06は3.3Vロジックだが5Vトレラント。ただしArduino Tx(5V)→HC-06 Rxには分圧推奨。本設計ではツェナーダイオード(3.6V)でクランプ。
アンテナ延長(通信距離改善)
HC-06基板上のチップアンテナにλ/4(2.4GHzで約31.2mm)の単線銅線をハンダ付けし、熱収縮チューブで絶縁。通信安定性が大幅向上。
過電流保護
LMD18200のCurrent Sense出力(0.1Ω抵抗両端電圧)をA0で監視。2A超過でArduino D13からBrakeピンにHIGH出力し、Hブリッジ出力を強制遮断。電流値は毎秒Bluetoothでアプリへ通知。
DCCパケット生成とタイミング制御
NMRA DCC規格の要点
- プリアンブル:14ビット以上の「1」(アイドル時16ビット、CV書込時24ビット)
- セパレータ:単一の「0」
- データバイト:8ビット+「0」セパレータ
- 最終バイト後:XORチェックバイト+「1」セパレータ→プリアンブルへ
- ビット「1」:58µs HIGH + 58µs LOW(半周期58µs)
- ビット「0」:116µs HIGH + 116µs LOW(半周期116µs)
Timer2割り込みによる精密波形生成
// Timer2設定:16MHz/8分周 = 2MHz (0.5µs/count)
#define TIMER_SHORT 0x8D // 141count = 70.5µs ≒ 58µs (補正込み)
#define TIMER_LONG 0x1B // 27count = 13.5µs → 実装上は半周期切替で対応
ISR(TIMER2_OVF_vect) {
// 毎回割り込みで出力トグル
// フラグに応じて次回タイマー値をSHORT/LONG切替
// ステートマシン:PREAMBLE → SEPARATOR → SENDBYTE × N
}
ステートマシンでプリアンブル→セパレータ→データバイト送信を管理。メッセージキュー(アイドル、速度、機能、CV読書き)をラウンドロビンで送出。
Androidアプリ:LocoMotive / LocoMotive DCC
無料版(LocoMotive)
- Google Play Storeで無料ダウンロード
- 基本機能:1〜20両制御、速度バー、方向、ライト(F0)、ファンクションF1〜F8
- ポイント/アクセサリー制御(最大8組)
- 車両名・機能名カスタマイズ、最高速度プリセット
- CV1(アドレス)書き込み
有料版(LocoMotive DCC、約5ポンド)
- CV1〜255 の読み書きフルサポート
- 最大28機能、モーメンタリ/トグル切替、表示/非表示設定
- 最大4両同時速度バー表示
- アクセサリーアドレス自由追加
アプリからの送信データ形式
テキストベースのカンマ区切り、改行終端:
- 速度指令(4バイト):
DD,3,63,12,48,→ Loco3, 128速度ステップ, 速度値, XOR - 機能指令(3バイト):
DD,1,129,128,→ Loco1, F1 ON, XOR - CV読書き・緊急停止・電流値要求等も専用プレフィックスで送信
Arduinoスケッチの核心部分
メインループ(受信・ディスパッチ)
void loop() {
if (bluetooth.available()) {
inString = bluetooth.readStringUntil('\n');
}
if (inString.startsWith("D")) { string(); } // DCCパケット受信
else if (inString.startsWith("C")) { digitalWrite(6,HIGH); digitalWrite(13,LOW); } // 過電流復帰
else if (inString.startsWith("G")) { current(); bluetooth.println(C); } // 電流値要求
else if (inString.startsWith("A")) { get_cv_data(); cv1_prog(); } // CV1書込
else if (inString.startsWith("get")) { get_cv_num(); cv_read(); } // CV読取
else if (inString.startsWith("add")) { get_cv_new_val(); repeat_cv_write(); } // CV書込
else if (inString.startsWith("V")) { bluetooth.print("CV1 updated"); } // 完了通知
else if (inString.startsWith("E")) { digitalWrite(6,LOW); digitalWrite(13,HIGH); } // 非常停止
inString = "";
}
CV読み取り(レールコム/ACK検出)
NMRA S-9.2.3準拠。ビット操作モードでビットごとに検証パケットを送信し、デコーダーからのACK(負荷電流変化≒50mA以上)を電流検知抵抗で検出。8ビット分繰り返してCV値を再構成。
CV書き込み(検証付き)
書き込みパケット送信→検証パケット(bit=1/0両方)送信→ACK検出で成功判定。失敗時はリトライ。完了時アプリへ結果通知。
実装のコツとトラブルシューティング
| 症状 | 原因・対策 |
|---|---|
| 機関車が動かない | レール電圧確認(12V以上)、デコーダーアドレス一致確認、LMD18200出力確認 |
| Bluetoothすぐ切れる | アンテナ延長未実施、電源ノイズ(7805近傍に0.1µF追加)、HC-06初期化不良 |
| 過電流すぐ発生 | レールショート確認、検知抵抗値確認(0.1Ω)、閾値調整(2000mA→必要に応じ変更) |
| CV読み書き失敗 | プログラミングトラック分離未実施、デコーダー非対応、ACK検知閾値(Cs)調整 |
| 速度不安定 | プリアンブル長不足、Timer2割り込み遅延、他の割り込み競合 |
コスト内訳(概算)
- Arduino Pro Mini:約300円
- LMD18200T:約800円
- HC-06:約400円
- PCB(eBay):約500円
- その他部品:約500円
- 合計:約2,500円(市販DCCシステムの1/10〜1/20)
まとめ
「重い処理はスマホ、リアルタイム波形生成はArduino」という役割分担により、少ない部品点数でフル機能DCCシステムを実現。オープンソースのアプリとスケッチで、CV読み書き・複数機関車制御・アクセサリー制御までカバー。模型鉄道愛好家のエントリーシステムとして、またDCCプロトコル学習教材として最適です。
製造プロセス
- MrRobot: Ubuntu Mobile で操作する Rapiro ロボット – 音声、タッチ、シェイクインタラクション
- Arduino制御の6連ショット・ドリンクミキシングステーション – 自作カクテル自動製造機
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- スマート自動靴紐シューズ:発電機能内蔵で実用性抜群
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
- Python 3からArduino UNOを制御 – シリアル通信でLED点滅デモ