e-DIY
ノウハウ

ラズパイでサーボモータ:SG90をPWM制御する方法

ラズパイでサーボモータを制御

Raspberry Pi Picoを使ってサーボモータ:SG90をPWMで制御してみました。
MicroPythonのプログラムと、角度制御の計算方法について解説していきます。

SG90サーボモーター

サーボモータ:SG90の仕様

サーボモータSG90
まずはSG90の仕様を確認していきましょう。

項目 スペック
動作電圧 3.3V~6.0V
PWM周波数 50Hz
オン時間 0.5ms~2.5ms
制御角 0°~180°
トルク 1.8 kgf·cm
重さ 9g

データシートによっては動作電圧が4.8V~6.0Vと書かれているものもありましたが、3.3Vでも動作しました。

オン時間はPWMの1周期の間でオン(High)となっている時間で、0.5msのときの角度を0°とすると、2.5msで180°となります。
つまりDUTYを制御することで角度制御ができるようになります。

DUTYと回転角の関係

Pythonでサーボモータを角度制御するプログラム

Raspberry Pi PicoでPWM制御するため、MicroPythonで記述します。

from machine import Pin, PWM
import utime

pwm = PWM(Pin(22))
pwm.freq(50)
pwm.duty_u16(1638)
utime.sleep(5)

while True:
  for arg in range(0, 181, 5):
    ton = 2 * arg / 180 + 0.5
    dc = ton * 50 / 1000
    dc_conversion = dc * 65535
    pwm.duty_u16(int(dc_conversion))
    utime.sleep(1)

  for arg in range(180, -1, -5):
    ton = 2 * arg / 180 + 0.5
    dc = ton * 50 / 1000
    dc_conversion = dc * 65535
    pwm.duty_u16(int(dc_conversion))
    utime.sleep(1)

Raspberry Pi PicoでPWM制御

MachineモジュールのPWMクラスを使います。

4行目で使用する端子を指定。
5行目でPWM周波数を50Hzに設定しています。

DUTYは0~216-1の範囲で設定します。
216-1 = 65535です。

6行目でDUTYを1638に設定しているので、
\[
D = \frac{1638}{65535} = 0.025
\]
よって初期値のDUTYは2.5%です。

角度制御の計算

PWMのオン時間(High期間)とサーボの回転角の関係は次のようになります。

\[
\begin{eqnarray}
&θ& = \frac{T_{on} – 0.5}{2.5-0.5} \times 180 \\
&T_{on}& = \frac{2 \times θ}{180} + 0.5
\end{eqnarray}
\]

DUTYとオン時間の関係は、
\[
D = {T_{on}} \times f_{pwm}
\]
で計算できます。
fpwmはPWM周波数で、ここでは50Hzになります。

これに65535を掛けることで、PWMクラスで使うDUTYに変換しています。

ここまでの計算が11行目~13行目です。

実行結果

こんな感じで動きました。
負荷が無いからか、DUTYが低い領域ではやや震えて不安定な動作になっていました。

このプログラムを応用して、サーボで加湿器を湿度コントロールしてみました。

関連キーワード

フリーワード検索