稼働中

Raspberry Pi Pico(s_30)FS90R サーボモーター 用モジュール

FS90R FS90Rc.py

FS90R(FEETECH製)は連続回転(360°)サーボモータです。※詳細はFS90Rのデータシートを参照ください。
Raspberry Pi PicoでFS90Rサーボモータを使う自作の’FS90Rc.py’を作成しました。
記事(d_32)を元に作成しています。’FS90Rc.py’は末尾にあります。
使い方だけを記載します。

使い方

■ ファイル転送
Raspberry Pi Picoへ’FS90Rc.py’を送った後でimportして使います。
※FS90Rc.pyの末尾に、使用例(FS90Rc_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘FS90Rc’をimportすると「fs_90、de_init」のメソッドが使えるようになります。
FS90R(pw_pin=21)で初期化します。
PWM出力は50Hz(20msec)です。
pw_pin:PWM出力で使うGPIOの番号です。デフォルトはGP21です。
(01)fs_90(dat)
FS90RにPWM出力します。
dat:Ton時間を与えます。msecx100で与えます。
FS90RのカタログではCW(700~1500us) STOP(1500±45us) CCW(1500~2300us)です。
fs_90(700)、fs_90(1500)、fs_90(2300)のように与えます。
(02)de_init()
PWM出力を無効にします。

使用例

FS90RをSTOP > CW > STOP > CCW > STOP 動作させています。
各動作時にTon時間を測定しています。


FS90Rc_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#FS90R 360° Servo Motor
from machine import Pin
import time
from FS90Rc import FS90R

## 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(f'Ton={d}usec')
    return d

# instance
a=FS90R()

# CW(700~1500us) STOP(1500±45us) CCW(1500~2300us)
a.fs_90(1500)   #STOP
time.sleep(1)
m_Ton()

a.fs_90(700)    #CW
time.sleep(1)
m_Ton()

a.fs_90(1500)   #STOP
time.sleep(1)
m_Ton()

a.fs_90(2300)   #CCW
time.sleep(1)
m_Ton()

a.fs_90(1500)   #STOP
time.sleep(1)
m_Ton()

a.de_init()     #pwm.deinit
time.sleep_ms(10)
m_Ton()

実行結果

実行すると指定の動作をしました。
Ton時間だけThonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
Ton=1500usec
Ton=700usec
Ton=1500usec
Ton=2300usec
Ton=1500usec
Ton=-2usec      # pwmを無効にしたのでTimeoutで-2が返っている
>>> 

FS90R 用モジュール


FS90Rc.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, PWM
#FS90R 360° Servo Motor
class FS90R:
    def __init__(self,pw_pin=21):
        self.s_pwm=PWM(Pin(pw_pin)) #
        self.s_pwm.freq(50)         #50Hz 20msec
        
    # CW(700~1500us) STOP(1500±45us) CCW(1500~2300us)
    def fs_90(self,dat):
        self.s_pwm.duty_ns(dat*10**3)
    
    # pwm deinit
    def de_init(self):
        self.s_pwm.deinit()