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()
「ギュイッ!」的なモータ駆動音さえなければ、何かのディスプレイに使えそうな予感。いや、「ギュイッ!」がマジでうるさくて、このままではダメだけど。
[ ツッコむ ]
以上です。