あそびっと

back index next

2015年6月9日
[DCC]

Arduino で2列車交換運転

ArduinoとDCC/MM2 シールドとCDS(光センサー)を使って、自動運転システムを作ってみた.
エンドレスの線路で3種類の運転を考える.

asoY5299934-s

まず線路にCDSを埋め込む.
駅の手前に設置するのが原則だが、検知後に減速/停止するまでの距離は、SPEED_DOWNやSPEED_CONTのパラメータによっても変わるので、試しながら位置を決める.


「1輌走行・2ヶ所で停止」

ar_1

1図のように、エンドレス線路にCDSが2ヶ所あって、ロコAは、CDSを検知するたびに停止し、再発進する.
ロコを図と反対向きに置いても動作は同じである.

○車輌データをまとめる
車輌を変えるたびにロコのアドレスを書き換えるのはめんどうなので、このプログラムでは、あらかじめ登録した車輌はどれでも動くようにした.
loco_d[HMT][17]、というのがそのデータで、1行に1台づつ、任意の車輌番号、12個のファンクション番号、DCCアドレス、等を記入する.
ロコのDCCアドレスは2桁でも4桁でもいい.
0項目Loco_Number, 13項目DCC_Address, 15項目Normal_Speed は必須.
Normal_Speed はロコの通常速度で、最大値1024.
12個のファンクション番号を並べたのは、メーカーによって番号に異同があるものを統一するためである.
走行中、1〜7,9〜12のファンクションをランダムにONしているので、鳴らしたくない音があれば、その項に13以上の値を入れる.
車輌数=行数を増減したら、
#define HMT ??
の値も変える.
また、コメント行に「***」の付いているデータは、各自書き換えること.

このプログラムは、loco_dデータ内の全ロコに、0.1秒おきに制御信号を出す.
経験的に10輌(10行)程度なら問題ないが、登録ロコ数があまり多いと、全体の反応が遅くなる.
さらに、Soundtraxxの古いデコーダーは処理が追いつかないらしく、正しく応答しないので、その場合は登録台数を減らす.

○エンドレスの大きさ
ロコは発進・加速後(シリアルモニタに「Continue」が表示されたあと)、センサーの検知を開始するので、この時すでにCDSを通過していると正しく機能しない.
パラメーターSPEED_UPとSPEED_CONTを修正して加速を早めることはできるが、減速にも時間がかかるので、あまり小さなエンドレスではぎくしゃくした動きになる.


「2輌走行・2ヶ所で停止」

ar_2

1図と同じCDSの配置で、2輌のロコが同方向に走り、それぞれCDSで停止する.
スタート時、ロコAはCDS_Aを目指し、ロコBはCDS_Bを目指す.
2台のロコが停止したあと、目指すCDSをチェンジして同じ方向に再出発する.

出発は同時だが、停止は同じタイミングと限らないので、2輌は別々に減速する必要があり、プログラムが複雑になった.
2輌のロコは、
#define LOCO_A ??
#define LOCO_B ??
で、loco_d[HMT][17]の中から指定する.
ここでの指定間違いを防ぐため、最初の行に、
{ 9999, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 9999, 0, 0, 0 },
というダミーデータが入っている.

2輛のロコとCDSの位置は関係しているので、上2図のように、最初にロコを正しい位置に置く必要がある.

ar_34

3図はロコの向きが逆の場合、4図はABロコの位置が逆の場合である.
ロコAはCDS_Aを目指し、ロコBはCDS_Bを目指して走るので、自分が通過したCDSで相手のロコが停止することになる.
これらの場合、ロコを正常な状態に戻して再起動するか、プログラム中の、
#define SETTING 1
を、
#define SETTING 0
に変えれば、目指すCDSが逆にセットされるので、正常に走行する.


「2輌走行・2ヶ所で停止・列車交換」

ar_56

5図と6図は、側線のあるエンドレスで、列車交換の動きを示す.
CDSは全部で4ヶ所、右側通行を前提にA列車とB列車が交換駅で停車したあと、ポイントを切り替えて発車する.
ポイントは4ヶ所あり、pointAとpointC及びpointBとpointDは同じアドレスで連動しているので、実際にはpointAとpointBのみを制御している.
ポイント切り替えを確実にするため、Gateway.SetTurnout()関数で、一旦true/false反対向きの信号を出してから、目的の信号を出すようにしている.

5図ではなく、6図の状態からスタートする場合は、
#define SETTING 1
を 0 に変える.

exchange

On30のレイアウトで動作中のようす.
(QuickTime動画 1分35秒 33.6MB)

列車の検知センサーは、磁石が必要なリードスイッチよりCDSのほうが使いやすい.
停止制御は本来割込みを使うべきだろうが、Arduino UNOは割込端子が2つしかなく、しかもアナログのCDSは割込端子に使えない.
それで結局このような、順次処理のプログラムになった.
ともあれ、列車が勝手に行ったり来たりするのは、自分が操作するのと違って「動く模型を眺める」面白さがある.


asoIMG_1805-s

ArduinoとDCC/MM2 シールドは、基盤むきだしで愛想がないので、箱に入れた.
ボタンを押すことがあるので、フタはなし.
端子に0.8mmの真鍮線を差し込んで、リード線をつないでいる.

back home next