ラズパイピコを使って、サーボモーター(SG92R)を制御する方法について説明します。制御には、PWM(Pulse Width Modulation:パルス幅変調)という制御方法を使います。
SG92Rについて
SG92Rは500円程度の安価なマイクロサーボモーターです。
サーボというのは「言いつけどおりに忠実に働く」という意味で、仕組みに関わらず回転位置や回転速度などを制御できればサーボモーターと呼ばれます。サーボモーターには通常、回転検出器とコントローラーが内蔵されていて、回転位置を検出しズレがある場合は正しい位置に補正します。
SG92Rの主な仕様は下記の通りです。動作電圧が約5Vなので、ラズパイピコのVBUS(40番のピン)から電源を取ります。VBUSからはマイクロUSBから供給される5V電源が取れます。
- PWMサイクル:20mS
- 制御パルス:0.5ms~2.4ms
- 制御角:±約90°(180°)
- トルク:2.5kgf・cm
- 動作速度:0.1秒/60度
- 動作電圧:4.8V
PWM制御について
PWMというのは周期的なパルス信号を出力して、その周波数やパルスの長さを情報として伝える制御方法です。パルスの長さはデューティー比として指定します。

SG92RではPWMサイクル(周期)が20msなので周波数は50Hzとなります。制御パルスは0.5msから2.4msで指定しますので、デューティー比としては0.5/20×100から2.4/20×100の範囲で指定することになります。
ラズパイピコでは指定したGPIOピンからPWM信号を出力することができます。
配線とソースコード
配線は下記の通りです。オレンジ色の配線は電源で、VBUSから取っています。黄色の配線は制御線で、どのGPIOピンでも良いです。抵抗には1kΩのものを使っています。茶色の配線はGNDです。

ソースコードは下記の通りです。
from machine import Pin, PWM
import time
freq = 50 #20ms = 50Hz
duty_offset = 0.5 / 20 #制御パルスが0.5~2.4msのため、オフセットを設定
duty_coef = (2.4 - 0.5) / 20 / 180 #角度をデューティ比に変換する係数
servo = PWM(Pin(28))
#角度を受け取ってサーボモータを回転させる関数
def set_angle(angle):
degree = angle + 90
duty = int((duty_offset + duty_coef * degree) * 65535)
servo.freq(freq)
servo.duty_u16(duty)
#45度に回転し1秒停止
set_angle(45)
time.sleep(1)
#-45度に回転し1秒停止
set_angle(-45)
time.sleep(1)
#PWM出力を無効化
servo.deinit()
配線してプログラムを走らせてみると、サーボモーターが45度、-45度と動くかと思います。他のセンサーやプログラムと組み合わせれば、ちょっとした玩具などが作れそうですね。
コメント