2021年07月30日 更新

Raspberry Piでサーボモーター動作

どうも、クラゲです。
RaspberryPiでサーボモーターを動かすサンプルコードなどを紹介します。

必要な電子部品

  • サーボモーター
    SG90という型番のサーボモーターを使います。

  • ジャンパー線
     オスーメスのジャンパー線が3本必要です。

SG90の仕様

項目 仕様
PWMサイクル 20ms
制御パルス 0.5ms~2.4ms
制御角 ±約90°(180°)
動作速度 0.1秒/60°
動作電圧 4.8V(~5V)

色々書いてありますが、重要なことは回転角度が -90°~+90°まで指定できるってことです。

結線図

  • サーボモーターの茶色がGND
  • サーボモーターの赤色が5V
  • サーボモーターのオレンジ色がGPIO4

ソースコード1

2.512.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)

DutyCyle を Degree に変換

先のサンプルでは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 )

ソースコード2

実行すると、-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上で様々な応用例がありますので、参考にしてみてはいかがでしょうか?

以上、ラズパイでサーボモーター動作でした!