Raspberry Pi Pico(s_29)SG90 サーボモーター 用モジュール
SG90 Micro Servo Motor SG90c.py
SG90は制御角:±約90°(180°)のマイクロサーボモータです。※詳細はSG90のデータシートを参照ください。
Raspberry Pi PicoでSG90サーボモータを使う自作の’SG90c.py’を作成しました。記事d_31を元に作成しています。
‘SG90c.py’は末尾にあります。使い方だけを記載します。
使い方
■ ファイル転送
Raspberry Pi Picoへ’SG90c.py’を送った後でimportして使います。
※SG90c.pyの末尾に、使用例(SG90c_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘SG90c’をimportすると「sg_90、de_init」のメソッドが使えるようになります。
SG90(pw_pin=21)で初期化します。
PWM出力は50Hz(20msec)になります。
pw_pin:PWM出力で使うGPIOの番号です。デフォルトはGP21です。
(01)sg_90(dat)
SG90にPWM出力します。
dat:Ton時間を与えます。msec x100で与えます。
SG90のカタログではTon=2.4msecでポジション90°、Ton=1.45msecで0°、Ton=0.5msecで-90°になるそうです。その際は、sg_90(240)、sg_90(50)、sg_90(145)を与えます。
(02)de_init()
PWM出力を無効にします。
使用例
SG90を0° > -90° >0° > 90°> 0°動作させています。
先のカタログ値ではズレが大きかったので、240、55、135にしています。
各動作時にTon時間を測定しています。
SG90c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
import time
from SG90c import SG90
#SG90 Micro Servo Motor
## example
# measure pulse width time_pulse_us
dpin=Pin(22, Pin.IN) #mesure Ton
def m_Ton():
d=machine.time_pulse_us(dpin, 1, 1000000)
d=machine.time_pulse_us(dpin, 1, 1000000)
print('Ton(msec)=',d/1000)
return d
# instance
a=SG90()
# 0°(135) > -90°(55) >0°(135) > 90°(230)> 0°(135)
a.sg_90(135) #1.35msec 0° dat=1.35x100=135
time.sleep(1)
m_Ton()
a.sg_90(55) #0.55msec -90°
time.sleep(1)
m_Ton()
a.sg_90(135)
time.sleep(1)
m_Ton()
a.sg_90(230) #2.30msec +90°
time.sleep(1)
m_Ton()
a.sg_90(135)
time.sleep(1)
m_Ton()
a.de_init()
time.sleep_ms(10)
m_Ton()
実行結果
実行すると以下のようになりました。
Ton時間だけThonnyのshellに表示されます。
>>> %Run -c $EDITOR_CONTENT
Ton(msec)= 1.35
Ton(msec)= 0.55
Ton(msec)= 1.35
Ton(msec)= 2.3
Ton(msec)= 1.35
Ton(msec)= -0.002 # pwmを無効にしたのでTimeoutで-2が返っている
>>>
SG90 用モジュール
SG90c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, PWM
#SG90 Micro Servo Motor
class SG90:
def __init__(self,pw_pin=21):
self.s_pwm=PWM(Pin(pw_pin)) #pwm channel
self.s_pwm.freq(50) #50Hz 20msec
# pwm pos set dat=Ton(msec)*100
# +90°(2.40msec) 0°(1.45msec) -90°(0.50msec)
def sg_90(self,dat):
self.s_pwm.duty_ns(dat*10**4)
# pwm deinit
def de_init(self):
self.s_pwm.deinit()