« 西の魔女が死んだ/梨木香歩 (感想:よい作品だ) | トップページ | NHK平清盛(24)清盛の大一番:相撲節会(すまい・せちえ)に勝った清盛 »

2012年6月17日 (日)

鉄道模型のPC制御:(12) DCC自動運転・図書館パイクでのポイント制御と往復制御

承前:鉄道模型のPC制御:(11) 閉塞区間の構成:BDL168とRX4との配線について


↑レイアウト:配置

12-00 概要
 表題下の動画は、鉄道図書館列車が図書館駅を出発し2周回のあと、ポイント制御によって一旦車庫(ないし近隣博物館)に向かいそこで停車し、再び図書館駅に戻る様子を繰り返すモデルである。このレイアウトを「図書館パイク(30x60cm)」と名付けた。パイクとは極めて小型のジオラマ(レイアウト)の意味である。
 パイク上でのDCC自動運転は移動距離が小さいので、先回配線の紹介をしたBDL168などの列車位置検知装置を使わなくても、動力車を秒単位で前進停止後進させることで、図書館駅に停車させるなどの意図したモデル走行ができる。
 この記事は、JMRI/Jythonによる自動運転アルゴリズムの実験をまとめる意図があるので、ここでは列車位置検知を行わず、比較的単純な時間制御方式を紹介する。

12-01 図書館パイクの全体
 小型のNゲージ動力車を自由に扱えるように、デコーダ非搭載のDCC制御手法を取り入れた。具体的にはレール・レイアウト全体にデコーダから給電制御し、ポイントは選択式のままで、デコーダ番号は標準的な3番にした。この手法は以前に紹介した。ただし、この条件は、下記のプログラムとは無関係と言える。プログラムでは動力車の番号を3(付録の006行)と指定しているので、DCC給電方式(注記)などの物理的な条件は考えなくてもよい。
 
12-02 ポイント制御
Mudsc00020
↑DCCポイントマシン:DS52

 図書館パイクは30X60センチの小さな空間に引き込み線を設定し、建物もいくつか載せている。このために半径が小さいTOMIXのレールとポイントを使った。
 このポイントをDCC制御するためにKATOで販売しているデジトラックス社のDS52デコーダを使った。
 このDS52の取り扱いは単純明快で使い勝手がよい。2台のポイントを個別に制御できるので、それぞれの電動ポイントからのコードの被覆を剝がし、所定の箇所にネジ留めするだけでよい。ただし給電配線は、一般にDCCではレールの左右に接続すればレールが給電や制御の役割を果たすのだが、この図書館パイクに限っては、DCC制御を行う配線の根元に接続する必要がある。つまり、このパイクではレールの電流がデコーダ通過後の給電なので、アナログ運転と同じく直流になっているからである。

12-03 プログラムの概要
 付録に載せたクラス・ToutBackAndForthTimedは、付記したようにJMRIのサンプルを改編したものである。プログラム全体は順次手法だけの単純明快な流れでできている。しかし実際にはJMRI Library APIを使っているので、それぞれの機能を理解する必要がある。
 クラスの中心になるのは、初期化のための(付録の005行)init関数と、操作のための(008行)handle関数で出来ている。
 そのうちhandle関数がアルゴリズムの中心で、この関数は最後に[return 1]と常に真を返すので無限ループを形成している。(実行停止は、JMRIパネルのスロットモニターでKILLし、スロットルで給電をオフにする)

 def handleの流れを概括するならば、
 1.ポイントを初期化し(1番ポイントをTHROWN指示で分岐)。
 2.動力車3番の方向を前進
 3.速度を適度にし、数秒間走行(2周回)
 4.ポイント1番をCLOSED指示で直進
 5.車庫に入った頃、速度をゼロで停止
 6.動力車3番の方向を後進
 7.図書館前まで行ける数秒間の逆進
 8.停止
 9.繰り返す

 という、単純な順次制御アルゴリズムである。

12-04 JMRI特有メソッドの解説
 JythonはPythonのJAVA系実装システムと考え、私はPythonの教科書をもとにこのスクリプト言語についていろいろ確認している。付録に今回のプログラムを掲載したので順次それに随って解説し、固有のメソッドについてはJMRIのソースへリンクを付けておく。
 Jython/Pythonは一風変わったところもあるインタープリーターで、しばらく触った感触ではオブジェクトPascal、Delphi などと似通っている。その近似の事情はまだ正確には言えないが、扱い安いスクリプト言語だと思う。Modula3などと親しい言語なのかもしれない。
 特徴は、関数などを含め、段付(インデンテーション)がプログラムの構造自体を表すので、ブロックを形作るのは標準的に1段付を4半角スペースで表現する書式になれる必要がある。
 またselfという言葉が頻出する。これはある程度使い込まないとこの用法の意味や意義を理解できないので、私も現段階では、サンプル用法をそのまま使っている。
 以下にいくつかの解説を付す。

*プログラムの準備段階
  002 import jarray
    ↑import句によって、JythonでJava言語の配列機能(jarray)をつかうために取り入れている。
  003 import jmri
    ↑import句によって、JMRI制御に特有の機能をまとめて取り入れている。

*初期化関数 def init(self):
  005   def init(self):
  006    self.throttle = self.getThrottle(3, False) # 動力車番号=3
  007    return

 ↑005番のdef init(self):は、全体を初期化するための関数。returnで正常終了するので、一回だけ実行される。
 006行は明示的に、動力車番号(アドレス)を3番に設定している。これは以下のメソッドが使われている。
 getThrottle(int address, boolean longAddress)
 このメソッドは、引数に1~127番までのアドレス(動力車番号)を渡したならFalse、それ以上のロングアドレス(128~9999)ならTrueを返す。結果としてアドレスで指定された動力車のスロットルに下記(def handle)の命令が指示される。

*操作主体関数 def handle(self)
 次に012や015行の、provideTurnout(String name)
 このメッソドは引数に、あらかじめ利用者がその転轍機(ポイント)に与えた番号を文字列として渡す。番号が1番なら"1"となる。そのポイントの状態は.SetStateによって制御され、この引数は定数のTHROWN(分岐・カーブ)あるいはCLSED(直進・ストレート)がJMRIで決めてある。

 次に018行の、setIsForward(boolean)は、スロットルを扱うメッソッドの一つで、動力車の進行方向を定める。引数がTRUEならば順行で、FALSEなら逆行になる。

 おなじ種族である021行の、setSpeedSetting(float)は動力車の速度を指定するメソッドで、引数は通常0~1の小数をつかい、たとえば0で停止、0.5で半速、1で全速である。

 他に頻出する011行の、waitMsecは時間待ちメソッドで、1000が1秒となるので、1分間だとwaitMsec(60000)を指示する。付録のプログラム中で頻繁に使われているのは、CPUの論理が外界(列車を走らせる)制御に及んだときは、人間が頭で考えたように動かず、大抵は「間」を置かないと失敗するからである。ウェイトをかけるのは現実との調和を図ると考えて良い。これはCPUがナノセカンド以下の高速度で動いても、現実界のポイントの切り替えはよっこらしょっと秒単位になることを考えるとよくわかる。

12-05 まとめ
 JMRIはDCCのための貴重で大量の資源をもっている。Jython/Pythonというスクリプト言語に習熟し、そして鉄道模型制御専用のさまざまなメソッドを使いこんでいくと、真のDCC世界が広がってくる。本稿では、単純素朴な時間制御による往復運転とポイント開閉とを組み合わせてみた。本格的には在線検知や信号制御が必要になるが、その前段階として表題動画に示したモデルを作ることができた。Jythonによるポイント制御の事始めとしてここに掲載した。
 次は先回にまとめた複雑怪奇な在戦検知システムをJythonで動かしてみる。

注記:使用したDCCシステム
 この実験では、レールにデコーダを直結したり、また普段見かけるKATO(デジトラックス社)のDCS50Kを使わず、SNJPM DP1を使っている。この事情は別途パイク用の小型制御装置の運用を考えてのことである。しかし付録掲載したプログラムを動かすには、それは普通の手法(DCS50KとPC)で行っても結果に変わりはない。
 なおPCやOSは選ばないのだが、今回のものはWindows7上で実験した。

付録:自動・ポイント制御付往復運転
 オリジナルはJMRI:Scripting Examples より、BackAndForthTimed.py 

001 # 改編 谷口敏夫 2012/06/01~
002 import jarray
003 import jmri
004 class ToutBackAndForthTimed(jmri.jmrit.automat.AbstractAutomaton) :

005   def init(self):
006    self.throttle = self.getThrottle(3, False) # 動力車番号=3
007     return

008  def handle(self):
009    # 以下は「この」handle() が真の限り繰り返す。
010    Sokudo = 0.3
011    self.waitMsec(1000)  # 1秒待機
012    turnouts.provideTurnout("2").setState(THROWN) # T:反位・分岐
013     # ↑2番ポイントは常に進入不可とする。
014    self.waitMsec(1000)  # 1秒待機
015    turnouts.provideTurnout("1").setState(THROWN) # T:反位・分岐
016    #↑1番ポイントは、しばらく進入不可とする。
  
017  # 前進設定
018    self.throttle.setIsForward(True)
019    self.waitMsec(1000)
020    # 速度設定
021    self.throttle.setSpeedSetting(Sokudo)
022    self.waitMsec(5000) # 5秒 しばらく前進
023    turnouts.provideTurnout("1").setState(CLOSED) # C:定位・直進
024    # 1番ポイント進入可によって、車庫
025    self.waitMsec(4500) # 4.5秒
026    # 停止設定
027    self.throttle.setSpeedSetting(0)
028    self.waitMsec(1000) # 慣性走行
  
029  # 後進設定
030    self.throttle.setIsForward(False)
031    self.waitMsec(5000)
032    # 速度設定
033    self.throttle.setSpeedSetting(Sokudo)
034    self.waitMsec(4500) # 4.5秒 しばらく後進
035    # 停止設定
036    self.throttle.setSpeedSetting(0)
037    self.waitMsec(1000) # 慣性走行
  
038  # 周回終了 繰り返し
039    return 1  
040    # 完全終了はスレッドモニターでKILL。スロットルで電源をオフ
041 # クラス終了の行
042 ToutBackAndForthTimed().start()

|

« 西の魔女が死んだ/梨木香歩 (感想:よい作品だ) | トップページ | NHK平清盛(24)清盛の大一番:相撲節会(すまい・せちえ)に勝った清盛 »

DCC」カテゴリの記事

Jython・Python」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 鉄道模型のPC制御:(12) DCC自動運転・図書館パイクでのポイント制御と往復制御:

« 西の魔女が死んだ/梨木香歩 (感想:よい作品だ) | トップページ | NHK平清盛(24)清盛の大一番:相撲節会(すまい・せちえ)に勝った清盛 »