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の動作電源は4.8V(~5V)なので外部電源が必要です。レベルコンバータを介して接続しました。
GP21をpwm出力、GP22をpulse-width測定用にしています。
スクリプト
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サーボモータの動作を確認しました。