夏休みは終わってしまいましたが,もう1回だけ続けさせてください。今回は,第3回で扱った「車両のオブジェクト化」を進めて,ポイントの制御も組み合わせてみたいと思います。まずは簡単に復習しておきましょう。
第1回では,制御コマンドをプログラム中に直接書いていました。第2回ではコマンドの対象となる「レール」をオブジェクトにし,レールに対してdriveメソッドやsenseメソッドを呼びだすように変更しました。これらのやり方では,複数の車両を同時に動かすことは可能でしたが,すべての車両の移動が完了するまで,次の移動を開始することはできませんでした。
そこで第3回では車両をオブジェクトにして,それぞれのstepメソッドを,メインループから順に呼びだすだけにしました。それぞれの車両のstepメソッドの中で,次のレールが空いていたらそこまで進み,空いていなかったら何もせずにリターンすることで,他の車両の移動が完了していなくても,別の車両が動きだせるようにしました。他の車両がいるレールに入ってしまうのを避けるため,各レールにlockメソッドを用意し,レールが使用中かどうかがわかるようにしました。
今回使うポイントも,基本的にはlockしてから切り替えれば問題ありません。ただ,特殊なポイントでは,これだけでは特性を生かしきれない場合があります。
複線レイアウト
今回のレイアウトは,3つの駅があり,それぞれに上りと下りのホームがあるというものです。よくある折り返しの駅の形で,両端の駅はどちらのホームにも入れるように,交差/平行を切り替えられるポイントを使用しています。このポイントは回路を2つ使うので,14回路すべてを使う形になりました(当初は2つを並列にしようと考えていたのですが,2つで4A程度流れるので,今回使用したピーク3.5AのドライバICでは駆動できませんでした)。
リスト1 複線ポイント制御のrailconf.txt
# 10 20 35 45 60 70
# 06 05 03 01 00
# 10 |--------|--------|--------|--------|--------|
# p9><p4 pb><p2
# 12 |--------|--------|--------|--------|--------|
# 07 08 0a 0c 0d
R00,7010,6010
R0d,7012,6012
p0201,6010,5210
p020c,6012,5212
p0b01,5210,4510
p0b0c,5212,4512
P0201,6010,5311
P020c,6012,5211
P0b01,5211,4510
P0b0c,5311,4512
R03,4510,3510
R0a,4512,3512
p0405,3510,2810
p0408,3512,2812
p0905,2810,2010
p0908,2812,2012
P0405,3510,2811
P0408,3512,2711
P0905,2711,2010
P0908,2811,2012
R06,2010,1010
R07,2012,1012
TA,6010,7010,50
TB,6012,7012,50
TC,1010,2010,50
TD,1012,2012,50
S0000,AApApAAAApApAA
ここで期待するのは,平行モードのときは上りと下りに別々の車両が通れ,交差モードのときは1つの車両しか通れないという動作です。ポイントそのものをlockしてしまうと,平行モードのときも上りと下りが片方ずつしか通れなくなってしまいます。また,このポイントの2つの回路は,片方だけを切り替えてもうまく働かないため,必ず2つを同時に切り替える必要があり,1回路ずつ別のlockにすることもできません。どうするのがよいでしょうか。
モード付き排他
いくつか考え方はあると思うのですが,今回はポイントの切り替えのlockと,ポイント上のレールのlockを別々に持つようにしました。そして,ポイントの向き(交差/平行)が同じであれば,ポイントは何重にでもlockできるようにしました。車両がまっすぐ入るときは,片方のレールだけをlockした上で,ポイントを平行側にlockします。この状態では,他の車両が他方のレールをlockし,さらにポイントを平行側に2回目のlockをすることができます。一方,車両が交差して入るときは,両方のレールをlockした上で,ポイントを交差側にlockします。この状態では,他の車両は一切ポイントに入ることができないことになります。
また細かい点ですが,中央の駅を出たことが確認できたら,最後まで進む前に,中央の駅の線路のlockを解除しています。こうしないと,次の車両が駅に入ってこれず,ポイントの上下線を同時に通過するというシチュエーションが永遠に訪れないことになってしまいます。

