Pythonによる自動制御 第2回

今回は列車を往復運転させる簡単なスクリプトを通して、基本的なスクリプトの書き方、実行の流れを解説します。

一般的なPythonの構文については省略する部分もあります。どれを説明しどれを省略するべきかの判断がつかないのでわからない部分があれば遠慮なくコメントで質問していただけたら回答できるように努力します。

スクリプトは初期化と実際の制御の部分に分かれています、それぞれ次のような流れになります。

スクリプトの流れ

初期化

  1. 車両アドレス3の列車のスロットルを取得

制御内容

  1. 一定時間待機
  2. 前進に設定
  3. 加速
  4. 一定時間待機
  5. 減速
  6. 停止
  7. 一定時間待機
  8. 後退に設定
  9. 加速
  10. 一定時間待機
  11. 減速
  12. 停止
  13. 繰り返し

センサーを使わない場合完全に人が手動で操作するのとなんらかわりないので簡単にスクリプトが書けます。

これを実際にスクリプトにすると次のようになります。

スクリプト

適当な場所にTimerStop.pyというファイル名で保存しておきます。Pythonではタブ文字も重要な構文の一つですので注意してください。
文字コードはUTF-8で保存してください。

クリップボードにコピー

クリップボードにコピー


このアイコンをクリックするとクリップボードにコピーできます。

# JMRI関連のモジュールを読み込む
# これにより、スロット等の操作が簡単にできる
import jmri

class TimerStop(jmri.jmrit.automat.AbstractAutomaton) :

	# 初期化
	def init(self):
		# 列車アドレスからスロットを取得
		# 第1引数はアドレス。第2引数をTrueにするとロングアドレス、Falseならショートアドレス
		self.throttle = self.getThrottle(3, False)  # ショートアドレス3番のスロットを取得

		return
	# 初期化ここまで

	# 実際の制御
	# returnでTrueを返すと再度実行される
	def handle(self):
		print u"5秒待機"
		self.waitMsec(5000);

		print u"前進に設定"
		self.throttle.setIsForward(True)

		# 徐々に0.7のスピードまで加速
		print "加速中"
		self.throttle.setSpeedSetting(0.1)
		self.waitMsec(500)
		self.throttle.setSpeedSetting(0.2)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.3)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.4)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.5)
		self.waitMsec(400)
		self.throttle.setSpeedSetting(0.6)
		self.waitMsec(300)
		self.throttle.setSpeedSetting(0.7)
		# 加速終わり

		print u"8秒間惰性運転中"
		self.waitMsec(8000)

		print u"減速中"
		self.throttle.setSpeedSetting(0.7)
		self.waitMsec(300)
		self.throttle.setSpeedSetting(0.6)
		self.waitMsec(400)
		self.throttle.setSpeedSetting(0.5)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.4)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.3)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.2)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.1)
		self.waitMsec(500)

		print u"停止"
		self.throttle.setSpeedSetting(0)

		print u"5秒待機"
		self.waitMsec(5000);

		print u"後退に設定"
		self.throttle.setIsForward(False)

		# 徐々に0.7のスピードまで加速
		print "加速中"
		self.throttle.setSpeedSetting(0.1)
		self.waitMsec(500)
		self.throttle.setSpeedSetting(0.2)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.3)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.4)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.5)
		self.waitMsec(400)
		self.throttle.setSpeedSetting(0.6)
		self.waitMsec(300)
		self.throttle.setSpeedSetting(0.7)
		# 加速終わり

		print u"8秒間惰性運転中"
		self.waitMsec(8000)

		print u"減速中"
		self.throttle.setSpeedSetting(0.7)
		self.waitMsec(300)
		self.throttle.setSpeedSetting(0.6)
		self.waitMsec(400)
		self.throttle.setSpeedSetting(0.5)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.4)
		self.waitMsec(700)
		self.throttle.setSpeedSetting(0.3)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.2)
		self.waitMsec(600)
		self.throttle.setSpeedSetting(0.1)
		self.waitMsec(500)

		print u"停止"
		self.throttle.setSpeedSetting(0)

		print "サイクルの終わり"

		# 1を返すと再度実行、0を返すと終了
		return 1

		# クラスの定義終了

#初期化および実行
TimerStop().start()

実行方法

JMRIを起動し、LocoNet等でDCCに接続しておきます。
そしてあらかじめメニューの「Panel」の「Script Output」を開いておきます。ここにはスクリプトを実行したときの出力(printによる出力)や、エラー情報が表示されます。

そして、メニューの「Panel」の「Run Script…」をクリックし、保存したTimerStop.pyを開きます。開くと同時に実行が開始されます。

あるいは、「Script Entry」から直接スクリプトを入力し実行しても構いません。

構文に間違いが無ければ、出力に「5秒待機」等の文字が表示されスクリプト通りに制御が進むはずです。

このスクリプトは無限に繰り返すので停止するには、「Panel」の「Thread Monitor」を開き、該当のスレッド(スクリプト)のKillボタンで終了させてください。

ビデオ

この記事はPythonによる自動運転に投稿されました タグ: , , , , . このパーマリンクをブックマークする。 コメントを投稿するか、トラックバックをどうぞ: トラックバック URL.

コメントする

あなたのメールは 絶対に 公開されたり共有されたりしません。 * が付いている欄は必須項目です

*
*

次の HTML タグと属性が使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>