工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoで作る模型鉄道DCCコマンドステーション 〜Bluetooth制御・無料アプリ付き〜

プロジェクト概要

市販のDCCコマンドステーションは高価ですが、Arduino Pro Mini+LMD18200 Hブリッジ+HC-06 Bluetoothモジュールで、スマホアプリから操作できる低コスト・高機能なDCCシステムを自作できます。最大の特徴は「DCCパケット生成の重い処理をスマホ側(Androidアプリ)で行い、Arduinoはクロック信号生成とHブリッジ駆動に専念」するアーキテクチャです。

システムアーキテクチャ

必要な部品

部品数量備考
Arduino Pro Mini 328 5V/16MHz1クロック精度重視で16MHz版
LMD18200T Hブリッジ1TO-220パッケージ、ヒートシンク必須
HC-06 Bluetoothモジュール1スレーブ専用、Rx↔Rx, Tx↔Tx直結
7805 5Vレギュレーター1レール電圧からArduino用5V生成
3.6V 0.5W ツェナーダイオード1HC-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専用設計基板推奨

回路設計のポイント

電源系

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規格の要点

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)

有料版(LocoMotive DCC、約5ポンド)

アプリからの送信データ形式

テキストベースのカンマ区切り、改行終端:

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」という役割分担により、少ない部品点数でフル機能DCCシステムを実現。オープンソースのアプリとスケッチで、CV読み書き・複数機関車制御・アクセサリー制御までカバー。模型鉄道愛好家のエントリーシステムとして、またDCCプロトコル学習教材として最適です。

製造プロセス

  1. MrRobot: Ubuntu Mobile で操作する Rapiro ロボット – 音声、タッチ、シェイクインタラクション
  2. Arduino制御の6連ショット・ドリンクミキシングステーション – 自作カクテル自動製造機
  3. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  4. DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
  5. Arduino UNOで作るLCDアニメーション&ゲーム入門
  6. スマート自動靴紐シューズ:発電機能内蔵で実用性抜群
  7. Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
  8. Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
  9. Bolt IoTとArduino UNOでLED輝度をシームレス制御
  10. 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
  11. Python 3からArduino UNOを制御 – シリアル通信でLED点滅デモ