サーボモーター
「モーター」というとミニ四駆やラジコンの心臓を連想します。
電源をONにすると走行する玩具ですが、今回利用するのは「サーボモーター」と言われる電材です。
「モーター」と付くだけあって、通電すると軸が回ります。普通のモーターとの違いは、角度付けができる点でしょう。 右45度、左90度のように、決められた角度へ回転させる事が可能です。 この電材の使い道ですが、私はカメラの台座に取り付けて、撮影時のカメラの首振りに使ってみました。
Raspberry で良く利用されているサーボモーターと言えば、安くて、パワーが無くて、低電力で動作する「SG-90」でしょう。
SG-90
仕様は概ね同じだと思うのですが、購入時のデータシートは大事に保管しましょう。
① 赤:電源電圧:3.3~6.0v (5v電源を利用しましょう)
② 茶:GND
③ 黄:DATA(PWM)
の3本が用意されているはずです。 それぞれ、
① 2番:5V電源
② 9番:Ground
③ 11番:GPIO17
で、RaspberryのGPIOへ接続します。
データシートで重要な情報は、
・可動域(180度)
・ニュートラルポジション(1.45ms)
・周波数(50Hz)
・周期時間(20ms)
・サーボに指定可能な最小&最大時間(0.5ms~2.4ms)
の把握が必要です。
角度付けの計算方法
<0度に角度付けする場合> = 2.5
可動域(180度)に対する割合 = 0度 / 180度 = 0
サーボに指定可能な時間範囲(2.4-0.5) = 1.9 ms
※ この二つをかける = 0 * 1.9 ms = 0
更に、サーボに指定可能な最小時間を足す = 0.5 ms + 0 = 0.5 ms
周期時間との割合を計算します = ( 0.5 ms / 20 ms) * 100 = 2.5
<180度に角度付けする場合> = 12
可動域(180度)に対する割合 = 180度 / 180度 = 1
サーボに指定可能な時間範囲(2.4-0.5) = 1.9 ms
※ この二つをかける = 1 * 1.9 ms = 1.9
更に、サーボに指定可能な最小時間を足す = 0.5 ms + 1.9 = 2.4 ms
周期時間との割合を計算します = ( 2.4 ms / 20 ms) * 100 = 12
以上の計算から、0度(2.5)~ 180度(12)の間で値を指定して角度付けしましょう。
プログラムなどの準備
Raspberry PI 4 を OS Lite で準備しました。
sudo apt-get update
sudo apt-get upgrade
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # GPIOモード設定
servo_pin = 17 # GPIOピン番号
GPIO.setup(servo_pin, GPIO.OUT) # GPIO出力モード
pwm = GPIO.PWM(servo_pin, 50) # 周波数50Hz
pwm.start(1.45) # パルス幅1.45ms=ニュートラルポジション
try:
while True:
pwm.ChangeDutyCycle(12) # パルス幅12msで、角度は約180度
time.sleep(2)
pwm.ChangeDutyCycle(2.5) # パルス幅2.5msで、角度は約0度
time.sleep(2)
except KeyboardInterrupt:
# Ctrl+Cで終了(PWMを停止)
pwm.stop()
プログラムが出来たら実行してみましょう。
python test.py
サーボモーターが、180度行ったり来たりしたら完了です。
お疲れさまでした~
注意点
サーボモーターの角度付けですが、微妙に角度がずれる事があるようで、そんな時はプルプルとモーターが震えます。
カメラの角度付けに使った時は、このプルプルでピンボケ画像が大量作成されて参りました…(笑)