mieki256's diary



2016/07/20(水) [n年前の日記]

#1 [raspberrypi] Raspberry Pi3でサーボモータを制御。その2

Raspberry Pi3 + マイクロサーボモータ SG92R で、Python + 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 として実行。こんな感じに。



動いた。かつ、ガクブルしてない。

一応ソース内の説明を少しだけ。
上記のソースでは、念のために、サーボモータにパルス幅を送ってから 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()

「ギュイッ!」的なモータ駆動音さえなければ、何かのディスプレイに使えそうな予感。いや、「ギュイッ!」がマジでうるさくて、このままではダメだけど。

以上です。

過去ログ表示

Prev - 2016/07 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project