【PR】この記事には広告が含まれています。

ラズベリーパイでサーボモーターを制御する方法について解説します。

サーボモーターは一般的なモーターとは異なり、あらかじめ指定した角度まで回転できるモーターです。
今回使用するマイクロサーボ9g SG-90は秋月電子で購入できます。小型・軽量ながら約180度の回転が可能で、電子工作やロボット制御によく使われている定番のサーボモーターです。

サーボモーターとラズパイの接続には、ジャンパーワイヤーを3本使用します。片端がオス(サーボモーター側)、もう片端がメス(Raspberry Pi GPIOピン側)のタイプを3本使用します。
接続方法

サーボモーターのコネクタは上記のようになっており、ラズパイのGPIOに接続するためにジャンパーワイヤーを取り付けます。

下記のようにラズパイのGPIOピンに接続します。

赤線を②5Vピンに接続
茶線を⑥GNDピンに接続
オレンジ線を⑫GPIO18ピンに接続します。
サーボモーターを指定した角度に動かすコード
以下のコードはRaspberry PiのGPIO18番ピンに接続されたサーボモーターを90度の位置に動かすものです。
from gpiozero import Servo
import time
import warnings
warnings.filterwarnings("ignore")
servo = Servo(18, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000)
def move_servo(angle, hold_time=0.5):
if angle < -90 or angle > 90:
raise ValueError("Angle must be between -90 and 90")
servo.value = angle / 90.0
time.sleep(hold_time)
servo.detach()
move_servo(90)
SG90はパルス幅によって角度を制御します。データシートによると、パルス幅が約0.5ミリ秒のときは左端(-90度)、約2.4ミリ秒のときは右端(+90度)に動きます。この範囲内でPWM信号の長さを変えることで、おおよそ180度の範囲を動かすことができます。

「Servo(18, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000)
」はサーボモーターの設定を行うコードです。GPIOピンとサーボモーターに送るパルスの長さの範囲(パルス幅)を指定しています。min_pulse_width
は最小角度(-90度)に対応するパルスの長さで0.5ミリ秒、max_pulse_width
は最大角度(90度)に対応する長さで2.4ミリ秒に設定しています。
move_servo
関数では、角度を -90 から 90 の範囲で指定できるようになっており、範囲外の数値を入力した際にメッセージを出力します。
servo.value = angle / 90.0
は、サーボモーターを動かす命令です。入力された角度を -1.0 から 1.0 の範囲に変換し、その値を Servo
クラスに渡すことでモーターの位置を指定しています。
sleep(hold_time)の部分は、モーターが目標の角度まで動き終わるのを待つために、0.5秒の待機時間を入れています。その後、 detach()
を呼び出し、サーボへの信号出力を止めます。これは動作後に起こる細かな振動やノイズを防ぐためです。
最後の行のmove_servo(90)でmove_servo
関数を実行します。

カッコの中の数値を変えると、動かす角度を自由に指定できます。
サーボモーターの活用
サーボモーターを利用して「アナログメーター」を作ることもできます。