3Dプリンタ スマートロック編(2) ソフト作成

ソフト編

いよいよ実際にサーボを使って施錠や開錠を行う動作試験を実施する。まずはサーボを動かす処理を作成。 以前実施していたサーボテストでは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でサーボを動かすことはできたので、きちんと配線して動かすようにすれば問題ないはずだ。

3Dプリンタ スマートロック編一覧

3Dプリンタ スマートロック編(1) ハード作成
3Dプリンタでスマートロックを作ってみる
3Dプリンタ スマートロック編(2) ソフト作成
3Dプリンタでスマートロックを作ってみる
3Dプリンタ スマートロック編(3) 状態検知
3Dプリンタでスマートロックを作ってみる
3Dプリンタ スマートロック編(4) obniz
3Dプリンタでスマートロックを作ってみる
3Dプリンタ スマートロック編(5) 取付中
3Dプリンタでスマートロックを作ってみる
3Dプリンタ スマートロック「2」編(1) 改善検討
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「2」編(2) 交換取付
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「2」編(3) 2台目
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「2」編(4) ガタつき
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「2」編(5) シンプルに
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「2」編(6) 配線整理
3Dプリンタでスマートロック「2」を作ってみる
3Dプリンタ スマートロック「3」編(1) 再作成
3Dプリンタでスマートロック「3」を作ってみる
3Dプリンタ スマートロック「3」編(2) APIサーバ
3Dプリンタでスマートロック「3」を作ってみる