前回は時間制で車両の速度を変えていたので停止する場所を調整するのはとても大変です。またトラブルで止まってしまった場合はそのずれを修正できません。
ということで、今回はTCSセンサーの使い方で作った、TCSセンサーの情報をLocoNetに送出する回路を利用し、(市販のBDL168でも代用可能、というよりこっちが本家)目的の場所に停止させようと思います。

センサーとモボ621
ハードウエア
今回はエンドレスの直線部分に停止させることを目標とします。そのためにTCSセンサーを停止させる場所の少し手前に設置しました。
これは急停車させずに徐々に停止させるためです。
またTCSセンサーはTCSセンサーの使い方で紹介した回路とプログラムを用いLocoNetに接続します。
ソフトウエア
前回のPythonによる自動制御 第2回とほぼ同じですが、加速後、停止までのwaitMsec関数の代わりにself.waitSensorActive関数を利用します。この関数は引数で指定したセンサーがアクティブ(検知状態)になるまで待機するものです。センサーは車両のスロットルと同様に初期化時にインスタンスを生成しておきます。
不明な点はコメントに質問していただければ可能な限り回答させていただきます。
import jmri
class SensorSample1(jmri.jmrit.automat.AbstractAutomaton) :
# 初期化
def init(self):
# 列車アドレスからスロットを取得
# 第1引数はアドレス。第2引数をTrueにするとロングアドレス、Falseならショートアドレス
self.throttle = self.getThrottle(3, False) # ショートアドレス3番のスロットを取得
# センサー1を取得
self.Sensor = sensors.provideSensor("1")
return
# 初期化ここまで
# 実際の制御
# returnでTrueを返すと再度実行される
def handle(self):
print u"5秒待機"
self.waitMsec(5000);
print u"前進に設定"
self.throttle.setIsForward(True)
# 徐々に0.7のスピードまで加速
print u"加速中"
for x in xrange(70):
self.throttle.setSpeedSetting(0.01*x)
self.waitMsec(85)
# 加速終わり
print u"運転中"
# センサーの検出まで待機
self.waitSensorActive(self.Sensor)
print u"センサー検知/減速中"
for x in xrange(70):
self.throttle.setSpeedSetting(0.01*(70-x))
self.waitMsec(75)
print u"停止"
self.throttle.setSpeedSetting(0)
print "サイクルの終わり"
# 1を返すと再度実行、0を返すと終了
return 1
# クラスの定義終了
#初期化および実行
SensorSample1().start()
ビデオ
動作確認中のJMRIのScript Outputウインドウと列車のビデオです。
ブレッドボード上にTCSセンサーの情報をLocoNetに送信する回路が載っています。LEDは左がセンサー情報、右がLocoNetの確認LED(LocoNet上にパケットがある時と、AVRのLocoNet送信禁止期間に点灯)です。