ソフト編
いよいよ実際にサーボを使って施錠や開錠を行う動作試験を実施する。まずはサーボを動かす処理を作成。 以前実施していたサーボテストではpythonで動かしていたので、それにならってpython動作させてみる。 サーボとの接続は以下。ラズパイから5VとGNDをとり、GPIO18をシグナルとして使用する。

#!/usr/bin/python
# coding: utf-8
import RPi.GPIO as GPIO
import time
import signal
import sys
def exit_handler(signal, frame):
# Ctrl+Cが押されたときにデバイスを初期状態に戻して終了する。
print("\nExit")
servo.ChangeDutyCycle(7.25)
time.sleep(0.5)
servo.stop()
GPIO.cleanup()
sys.exit(0)
# 終了処理用のシグナルハンドラを準備
signal.signal(signal.SIGINT, exit_handler)
GPIO.setmode(GPIO.BCM)
# GPIO 18番を使用
gp_out = 18
GPIO.setup(gp_out, GPIO.OUT)
# pwm = GPIO.PWM([チャンネル], [周波数(Hz)])
servo = GPIO.PWM(gp_out, 50)
# 初期化
servo.start(0.0)
val = [2.5,3.6875,4.875,6.0625,7.25,8.4375,9.625,10.8125,12]
servo.ChangeDutyCycle(val[0])
time.sleep(0.5)
servo.ChangeDutyCycle(val[8])
time.sleep(0.5)
servo.ChangeDutyCycle(val[0])
time.sleep(0.5)
while True:
for i, dc in enumerate(val):
servo.ChangeDutyCycle(dc)
print("Angle:" + str(i*22.5)+" dc = %.4f" % dc)
time.sleep(0.5)
for i, dc in enumerate( reversed(val) ):
servo.ChangeDutyCycle(dc)
print("Angle:" + str(180 - i*22.5)+" dc = %.4f" % dc)
time.sleep(0.5)簡単に左右最大90度まで回転させるデモ用プログラムだ。 ラズパイ3で動かすと問題ないが、ラズパイZEROで動かすと少しジジ音が多い。処理能力不足でよいタイミングのパルスが出ていないのかも。 とはいえ、おおむね問題なく動作し、左右とも90度の回転が可能だ。
ドアの錠に手で固定して取り付けてみて、動かしてみる。 電源が玄関に確保できなかったので、モバイルバッテリーで動かす。 変な引っ掛かりがあると、途中停止してしまうことが考えられるのだが、動作させてみると、とりあえず問題なく動いた。 基本動作としては大丈夫そうだ。

上記プログラムだと、30度ずつ変化させるようにしたので、今度はガツンと90度動かしてみる。 また、動作後はDuty比を0にして、サーボがジジジと言わないようにしている。
#!/usr/bin/python
# coding: utf-8
import RPi.GPIO as GPIO
import time
import signal
import sys
def exit_handler(signal, frame):
# Ctrl+Cが押されたときにデバイスを初期状態に戻して終了する。
print("\nExit")
servo.ChangeDutyCycle(7.25)
time.sleep(1.0)
servo.stop()
GPIO.cleanup()
sys.exit(0)
# 終了処理用のシグナルハンドラを準備
signal.signal(signal.SIGINT, exit_handler)
GPIO.setmode(GPIO.BCM)
# GPIO 18番を使用
gp_out = 18
GPIO.setup(gp_out, GPIO.OUT)
# pwm = GPIO.PWM([チャンネル], [周波数(Hz)])
servo = GPIO.PWM(gp_out, 50)
# 初期化
servo.start(0.0)
val = [2.5,3.6875,4.875,6.0625,7.25,8.4375,9.625,10.8125,12]
while True:
# デフォルト位置
servo.ChangeDutyCycle(val[4])
time.sleep(0.5)
# クロックoff
servo.ChangeDutyCycle(0.0)
print("Angle:0 (default)")
time.sleep(3)
# 施錠
servo.ChangeDutyCycle(val[8])
print("Angle:90 (Lock)")
time.sleep(1.0)
# デフォルト位置
servo.ChangeDutyCycle(val[4])
time.sleep(0.5)
# クロックoff
servo.ChangeDutyCycle(0.0)
print("Angle:0 (default)")
time.sleep(3)
# 開錠
servo.ChangeDutyCycle(val[0])
print("Angle:-90(UnLock)")
time.sleep(1.0)
これで、pythonでサーボを動かすことはできたので、きちんと配線して動かすようにすれば問題ないはずだ。