2016/07/20(水) [n年前の日記]
#1 [raspberrypi] Raspberry Pi3でサーボモータを制御。その2
Raspberry Pi3 + マイクロサーボモータ SG92R で、Python + pigpio を使って制御してみたり。
_servo_pwm3.py
sudo python servo_pwm3.py として実行。こんな感じに。
動いた。かつ、ガクブルしてない。
一応ソース内の説明を少しだけ。
上記のソースでは、念のために、サーボモータにパルス幅を送ってから 0.5秒後に、該当ピンに 0 を送ってサーボモータの制御をオフにしている。この処理は必要なのか不要なのか、ちょっと分かってない。
どうして0.5秒かと言うと…。SG92R のスペックは「0.1s/60度」のはずなので、180度動かすとしても0.3秒で足りるはず。故に、0.5秒も経過すれば、目的の角度に到達してるだろうと踏んでいる。が、ホントにそうなってくれるのかどうかは分かってない。スペック上はそうなるはずだけど…。
_pigpio library を眺めると、pigpio を使えば他にも色々できる模様。
_servo_pwm3.py
#!/usr/bin/python # -*- coding: utf-8 -*- import pigpio import time SERVO_X = 18 # GPIO START_V = 500 # us END_V = 2400 # us def get_pulsewidth(ang): ang += 90.0 if ang < 0.0: ang = 0.0 if ang > 180.0: ang = 180.0 w = (END_V - START_V) * (float(ang) / 180.0) + START_V return w pi1 = pigpio.pi() try: for ang in [0, -90, 0, 90, 0, -90, -45, 0, 45, 90, 45, 0]: w = get_pulsewidth(ang) print "ang = %f , pulse width = %f" % (ang, w) pi1.set_servo_pulsewidth(SERVO_X, w) time.sleep(0.5) pi1.set_servo_pulsewidth(SERVO_X, 0) time.sleep(2.5) except KeyboardInterrupt: pass print "Done." pi1.stop()
sudo python servo_pwm3.py として実行。こんな感じに。
動いた。かつ、ガクブルしてない。
一応ソース内の説明を少しだけ。
- 事前に、sudo pigpio で、pigpioのデーモンを起動しておく。
- import pigpio で、pigpio用のモジュールをインポート。
- pi1 = pigpio.pi() で、pigpio と接続。
- pi1.set_servo_pulsewidth(GPIOピン番号, パルス幅) で、サーボモータ制御用のパルス幅を送信。パルス幅の単位はマイクロ秒(us)。
- pi1.set_servo_pulsewidth(GPIOピン番号, 0) で、該当ピンのPWM制御を切る。
- pi1.stop() で、pigpioとの接続を切る。
上記のソースでは、念のために、サーボモータにパルス幅を送ってから 0.5秒後に、該当ピンに 0 を送ってサーボモータの制御をオフにしている。この処理は必要なのか不要なのか、ちょっと分かってない。
どうして0.5秒かと言うと…。SG92R のスペックは「0.1s/60度」のはずなので、180度動かすとしても0.3秒で足りるはず。故に、0.5秒も経過すれば、目的の角度に到達してるだろうと踏んでいる。が、ホントにそうなってくれるのかどうかは分かってない。スペック上はそうなるはずだけど…。
_pigpio library を眺めると、pigpio を使えば他にも色々できる模様。
◎ ランダムに動く版を書いてみたり。 :
_servo_pwm3_2.py
「ギュイッ!」的なモータ駆動音さえなければ、何かのディスプレイに使えそうな予感。いや、「ギュイッ!」がマジでうるさくて、このままではダメだけど。
#!/usr/bin/python # -*- coding: utf-8 -*- import pigpio import time import random SERVO_X = 18 # GPIO START_V = 500 # us END_V = 2400 # us def get_pulsewidth(ang): ang += 90.0 if ang < 0.0: ang = 0.0 if ang > 180.0: ang = 180.0 w = (END_V - START_V) * (float(ang) / 180.0) + START_V return w pi1 = pigpio.pi() try: old_ang = 0 for i in range(10): while True: ang = random.randint(0, 18) * 10 - 90 if ang != old_ang: break w = get_pulsewidth(ang) print "ang = %f , pulse width = %f" % (ang, w) pi1.set_servo_pulsewidth(SERVO_X, w) time.sleep(0.4) pi1.set_servo_pulsewidth(SERVO_X, 0) time.sleep(0.1) old_ang = ang except KeyboardInterrupt: pass time.sleep(1) pi1.set_servo_pulsewidth(SERVO_X, get_pulsewidth(0)) time.sleep(0.5) pi1.set_servo_pulsewidth(SERVO_X, 0) time.sleep(1) print "Done." pi1.stop()
「ギュイッ!」的なモータ駆動音さえなければ、何かのディスプレイに使えそうな予感。いや、「ギュイッ!」がマジでうるさくて、このままではダメだけど。
[ ツッコむ ]
以上です。