ラズパイでサーボモータ:SG90をPWM制御する方法
Raspberry Pi Picoを使ってサーボモータ:SG90をPWMで制御してみました。
MicroPythonのプログラムと、角度制御の計算方法について解説していきます。
サーボモータ: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を制御することで角度制御ができるようになります。
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が低い領域ではやや震えて不安定な動作になっていました。
ラズピコでサーボを動かせました。
あとは湿度一定になるようにPID制御で加湿器のツマミを動かせばいけるはず pic.twitter.com/NmdWJKBUVb
— りょうのすけ (@ryo_analog) November 23, 2022
このプログラムを応用して、サーボで加湿器を湿度コントロールしてみました。