稼働中

Raspberry Pi Pico(d_31)SG90 マイクロ サーボモータ

SG90 Micro Servo Motor

Raspberry Pi PicoでSG90 Micro Servo Motorを使ってみました。
SG90(OSOYOO製)は制御角:±約90°(180°)のマイクロサーボモータです。
(以後はSG90と記載します)
SG90を動作させるにはPWM出力をT=20msec、Ton=2.4msecでポジション90°、Ton=1.45msecで0°、Ton=0.5msecで-90°になるそうです。
※仕様、電気特性などの詳細はデータシートなど参照ください。
※micro:bitの記事e_54からRaspberry Pi Picoで使えるように追記、修正等をしました。

外観

SG90の外観写真です。(以後はSG90と記載します)
SG90 サーボモーター

接続例

SG90の動作電源は4.8V(~5V)なので外部電源が必要です。レベルコンバータを介して接続しました。
GP21をpwm出力、GP22をpulse-width測定用にしています。
SG90 接続図

スクリプト

SG90の動作を確認します。単純に90°、0°、-90°の位置に移動するだけです。
各動作のTon時間を測定表示します。スクリプトは以下のようにしました。

※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。
※Raspberry Pi Pico単独で動作させるには’main.py’としてRaspberry Pi Picoにuploadして使います。


pico_pwm_SG90_01.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, PWM
import time

# machine-freq
print(f'machine-freg={machine.freq()/(10**6)}Mhz')
# PWM pin 
pwm21=PWM(Pin(21)) #pwm3a pwm21 
print(pwm21)

# measure pulse width   time_pulse_us
dpin=Pin(22, Pin.IN) #mesure Ton
def mes_pls():
    d=machine.time_pulse_us(dpin, 1, 1000000) #1回目は不定
    d=machine.time_pulse_us(dpin, 1, 1000000)
    print(f'get Ton={d/1000}(msec)')
    return d
# SG90 position
pos_L=2_400_000   #2.40msec +90°  > 2.30
pos_N=1_450_000   #1.45msec   0°  > 1.35
pos_R=500_000     #0.50msec -90°  > 0.55

#pwm.freq 50hz(20msec) 周波数を50hzにする
pwm21.freq(50) 

#周波数設定と確認
f21=pwm21.freq()
print(f'get freq={f21}hz')

print('0°---')
pwm21.duty_ns(pos_N)
mes_pls()
time.sleep(1)

print('+90°---')
pwm21.duty_ns(pos_L)
mes_pls()
time.sleep(1)
print('0°---')
pwm21.duty_ns(pos_N)
mes_pls()
time.sleep(1)

print('+90°---')
pwm21.duty_ns(pos_R)
mes_pls()
time.sleep(1)

print('0°---')
pwm21.duty_ns(pos_N)
mes_pls()
time.sleep(1)

pwm21.deinit()          #PWM出力を無効

関数 部分説明

machine class ‘PWM’の使い方は記事s_28を参照ください。
PWM出力をT=20msec(50Hz)に設定して、カタログにある
90°、0°、-90°の位置、Ton時間(duty_ns)それぞれ2.4msec、0.5msec、1.45msecを
nsec単位にしてduty_ns(value)を与えています。

mes_pls()
GP22のTonのパルス幅(usec)を測定して返します。ここではThonnyのシェルに表示します。

実行結果

結果は以下のようになりました。Ton時間の測定結果です。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
machine-freg=125.0Mhz

get freq=50hz
0°---
get Ton=1.45(msec)
+90°---
get Ton=2.4(msec)
0°---
get Ton=1.449(msec)
+90°---
get Ton=0.499(msec)
0°---
get Ton=1.449(msec)
>>> 

動作確認の動画です。SG90の製品ばらつきでしょうか?やや位置がずれています。
動画

位置のTon時間を以下のように調整してみました。やや良くなったように思います。動画だけ掲載します。


pos_L=2_300_000   #2.40msec +90°  > 2.30
pos_N=1_350_000   #1.45msec   0°  > 1.35
pos_R=550_000     #0.50msec -90°  > 0.55

動画

まとめ

Raspberry Pi PicoのPWM出力でSG90サーボモータの動作を確認しました。