2021年07月30日 更新
どうも、クラゲです。
RaspberryPiでサーボモーターを動かすサンプルコードなどを紹介します。
サーボモーター
SG90という型番のサーボモーターを使います。
ジャンパー線
オスーメスのジャンパー線が3本必要です。
項目 | 仕様 |
---|---|
PWMサイクル | 20ms |
制御パルス | 0.5ms~2.4ms |
制御角 | ±約90°(180°) |
動作速度 | 0.1秒/60° |
動作電圧 | 4.8V(~5V) |
色々書いてありますが、重要なことは回転角度が -90°~+90°まで指定できるってことです。
2.5
~12.0
を入力すると、それに応じた角度へ回転します。
import time
#GPIOの初期設定
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
#GPIO4を出力端子設定
GPIO.setup(4, GPIO.OUT)
#GPIO4をPWM設定、周波数は50Hz
p = GPIO.PWM(4, 50)
#Duty Cycle 0%
p.start(0.0)
while True:
print("input Duty Cyle (2.5 - 12)")
dc = float(input())
#DutyCycle dc%
p.ChangeDutyCycle(dc)
#最大180°回転を想定し、0.3sec以上待つ
time.sleep(0.4)
#回転終了したら一旦DutyCycle0%にする
p.ChangeDutyCycle(0.0)
先のサンプルではPWMのDuty Cycleである2.5
%~12
%を指定して回転させていました。
分かりやすくするために角度(Degree)で指定するための計算方法を紹介します。
先程の仕様を詳しく見てゆきます。
PWMサイクル:20ms
これは周波数にすると 1 / 0.02 = 50Hz です。
制御パルス:0.5ms~2.4ms
Duty Cycleにすると 0.5 × 50 / 1000 ~ 2.4 × 50 / 1000 、つまり 0.025 ~ 0.12 でパーセントを単位にすると 2.5% ~ 12% という意味です。
制御角:±約90°(180°)
制御パルスに対し、制御角が決まります。
つまり、2.5% で -90° 回転、12% で +90° 回転 ということです。
これらを考慮すると、DutyCycleは次の計算式でDegreeから求まります。
DutyCycle = 2.5 + ( 12.0 - 2.5 ) / 180 × ( degree + 90 )
実行すると、-90°の位置へすぐに移動し、その後ゆっくりと+90°の位置まで回転して終了します。
先程の計算式を活用しています。
import time
#GPIOの初期設定
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
#GPIO4を出力端子設定
GPIO.setup(4, GPIO.OUT)
#GPIO4をPWM設定、周波数は50Hz
p = GPIO.PWM(4, 50)
#Duty Cycle 0%
p.start(0.0)
#-90°の位置へ移動
p.ChangeDutyCycle(2.5)
time.sleep(1.0)
#少しずつ回転
for degree in range(-90, 91):
dc = 2.5 + (12.0-2.5)/180*(degree+90)
p.ChangeDutyCycle(dc)
time.sleep(0.03)
p.ChangeDutyCycle(0.0)#一旦DutyCycle0%にする
Web上で様々な応用例がありますので、参考にしてみてはいかがでしょうか?
キャラクターの腕を動かす
https://www.youtube.com/watch?v=UjV1oy0o7qU
キャラクターを載せて動かす
https://www.youtube.com/watch?v=xDxv_ow_Ilw
キャラクター全体を動かす
https://kkooddoommoo.work/entry/bird/
キータッチ
https://qiita.com/anzaitetsu/items/a66213c97fdb04d9baa7
以上、ラズパイでサーボモーター動作でした!