稼働中

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()