前回に引き続き、ラズパイで鉄道模型をコントロールする連載の第3回目はポイントの制御です。鉄道模型のポイントを切り替える方法はさまざまあるようですが、筆者が持っているトミックス製の電動ポイントの場合は、電磁石に電流を流し、ポイントを動作させる部品に付いている磁石を瞬間的に移動させて切り替えています。特にアナログ的な動作は必要ないので、GPIOのHighとLowで信号を出せば切り替えられそうです。
では実際にどのようにして切り替えの指示を出せばいいのでしょうか。電圧や電流量が高い場合はリレーなどを使う必要がありますが、今回はそれほど大電流を必要としていないので、モーターを動かすのにも使った、秋月電子通商で販売されている「TB6612使用 Dual DCモータードライブキット」(以下、TB6612)を使用します。TB6612には制御する端子が2つ付いていますので、それぞれをGPIOにつないで短時間だけ電流を流し、ポイントを切り替えるようにします。
ポイントに電流を流すのは同じくPWMを使います。模型を走らせるときはハードウェアPWMを使いましたが、ポイントの制御はそれほど精度が必要ないので、RPi.GPIOに用意されているソフトウェアPWMを使います。ソフトウェアPWMを使うと、GPIOのどのピンでもPWMが使えます。
具体的な操作方法ですが、デューティー比を100にして電流を流したあと、0.05秒の間隔を置いてデューティー比を0にして電流を止めます。瞬時に切り替わるためこの程度の秒数で問題ありません。あまり長くすると電磁石が熱せられてしまいますので気をつけましょう。
テストとして2本のポイントを接続します。これを踏まえて作ったプログラムが以下のようになります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # ポイント1 straight_1 = 27 # pin11 curve_1 = 22 # pin13 pwm_1 = 17 # ポイント2 straight_2 = 24 # pin11 curve_2 = 25 # pin13 pwm_2 = 23 # ポイント1 GPIO.setup(straight_1, GPIO.OUT) GPIO.setup(curve_1, GPIO.OUT) GPIO.setup(pwm_1, GPIO.OUT) pwm1 = GPIO.PWM(pwm_1, 100) pwm1.start(0) # ポイント2 GPIO.setup(straight_2, GPIO.OUT) GPIO.setup(curve_2, GPIO.OUT) GPIO.setup(pwm_2, GPIO.OUT) pwm2 = GPIO.PWM(pwm_2, 100) pwm2.start(0) # 初期設定 GPIO.output(straight_1,0) GPIO.output(curve_1,0) GPIO.output(straight_2,0) GPIO.output(curve_2,0) time.sleep(1) # ポイント1の切換え GPIO.output(straight_1,1) GPIO.output(curve_1,0) print("Point1 Straight") pwm1.ChangeDutyCycle(100) time.sleep(0.05) pwm1.ChangeDutyCycle(0) time.sleep(2) # ポイント1の切換え逆方向 GPIO.output(straight_1,0) GPIO.output(curve_1,1) print("Point1 Curve") pwm1.ChangeDutyCycle(100) time.sleep(0.05) pwm1.ChangeDutyCycle(0) time.sleep(2) # ポイント2の切換え GPIO.output(straight_2,1) GPIO.output(curve_2,0) print("Point2 Straight") pwm2.ChangeDutyCycle(100) time.sleep(0.05) pwm2.ChangeDutyCycle(0) time.sleep(2) # ポイント1の切換え逆方向 GPIO.output(straight_2,0) GPIO.output(curve_2,1) print("Point2 Curve") pwm2.ChangeDutyCycle(100) time.sleep(0.05) pwm2.ChangeDutyCycle(0) time.sleep(2) pwm1.stop() pwm2.stop() print("End") time.sleep(1) GPIO.output(straight_1,0) GPIO.output(curve_1,0) GPIO.output(straight_2,0) GPIO.output(curve_2,0) GPIO.cleanup()
プログラムを走らせると、1つのポイントが切り替わったあと、もう1つのポイントが切り替わります。これでポイントの操作ができるようになりました。次回はこれまでのやり方を応用して、ポイントを切り替えながら線路を回って走るようにしてみます。
Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR