Raspberry Piと赤色LEDでホタルのような点滅を試すの記事までで、パルス幅変調(PWM)が何なのか?についてを触れてきた。

PWMの内容を見てみると、サーボモータではパルス幅 τ の小さい値を利用してモータを動かすという記載を時々見かけるので、今回はPWMでサーボモータを制御してみることにする。



今回使用するサーボモータはGeekServo 9G Servo-Grayで仕様は下記の通り

回転角:-45〜225°

電圧は3.3Vか5Vのどちらでも良い。


早速回路図を載せると、

こんな感じ。

ただし、実際のジャンパー線の色は回路図と異なり、+極の赤は同じで、GND(ー)の黒は実際は茶色、GPIO 12に繋いだ黄色は実際はオレンジになっている。


サーボモータを制御する場合、周波数は50Hz(20ms)にする。

サーボモータに送る信号の最小のデューティ比(D)は2.5%、

中間のデューティ比(D)は7.25%

最大のデューティ比(D)は12%になり、

D値が2.5が-45°、7.25が90°、12が225°になる。


上記の内容が確認できるコードを作成してみる。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

pin = 12
GPIO.setup(pin, GPIO.OUT)

servo = GPIO.PWM(pin, 50)
servo.start(0)

# 90度
servo.ChangeDutyCycle(7.25)
time.sleep(2)

# -45度
servo.ChangeDutyCycle(2.5)
time.sleep(2)

# 90度
servo.ChangeDutyCycle(7.25)
time.sleep(2)

# 225度
servo.ChangeDutyCycle(12)
time.sleep(2)

# 90度
servo.ChangeDutyCycle(7.25)
time.sleep(2)

servo.stop()
GPIO.cleanup()

上記のコードを実行してみると、



意図通りの動作になった。