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()
上記のコードを実行してみると、
意図通りの動作になった。