稼働中

Raspberry Pi Pico(d_32)FS90R 連続回転サーボモータ

FS90R continuous servo

Raspberry Pi PicoでFS90R(FEETECH製)連続回転サーボ(360°サーボ)を使ってみました。
記事(d_31)のFS90Rと違い正転、逆転して回ります。(以後はFS90Rと記載します)

FS90Rを動作させるにはPWM出力をT=20msecでTon=1500~2300usでCCW(反時計回り)、700us~1500usでCW(時計回り)、1500±45usでSTOP(停止)になります。※仕様、電気特性などの詳細はデータシートなど参照ください。
※micro:bitの記事(e_36)からRaspberry Pi Picoで使えるように追記、修正等をしました。

外観

FS90Rの外観写真です。
FS90R サーボモータ

接続例

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

スクリプト

FS90Rの動作を確認します。単純にCCW、STOP、CW動作をするだけです。
各動作のTon時間を測定表示します。スクリプトは以下のようにしました。

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


pico_pwm_fs90r_01.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, PWM
import time
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'Ton={d}(usec)')
    return d

CW=700_000     #CW   700us~1500us
STP=1_500_000  #STOP 1500±45us
CCW=2_300_000  #CCW  1500~2300us

# 周波数設定 50hz(20msec) 
pwm21.freq(50) 

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

print('STOP---')
pwm21.duty_ns(STP)
time.sleep(1)
mes_pls()

print('CW---')
pwm21.duty_ns(CW)
time.sleep(1)
mes_pls()

print('STOP---')
pwm21.duty_ns(STP)
time.sleep(1)
mes_pls()

print('CCW---')
pwm21.duty_ns(CCW)
time.sleep(1)
mes_pls()

print('STOP---')
pwm21.duty_ns(STP)
time.sleep(1)
mes_pls()

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

部分説明

machine class ‘PWM’の使い方は記事(s_28)を参照ください。
PWM出力をT=20msec(50Hz)に設定して、カタログにあるCW(時計回り)、STOP(停止)、CCW(反時計回り)の位置、Ton時間(duty_ns)それぞれ700us、1500us、2300usを
nsec単位にしてduty_ns(value)を与えています。
■mes_pls()
GP22のTonのパルス幅(usec)を測定して返します。ここではThonnyのシェルに表示します。

■FS90Rの調整
Thonnyのshellで以下のようにして確認します。PWM出力 Ton=1500usec で停止しない場合は、写真右にあるように裏面ネジで調整します。
>>> from machine import Pin, PWM
>>> pwm21=PWM(Pin(21))
>>> pwm21.duty_ns(1500_000) # 1500usec STOP

実行結果

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


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

get freq=50hz
STOP---
Ton=1498(usec)
CW---
Ton=698(usec)
STOP---
Ton=1498(usec)
CCW---
Ton=2298(usec)
STOP---
Ton=1498(usec)
>>> 

動作確認の動画です。

以下のようにTon時間を可変して回転数を変えてみました。動画だけ掲載します。


#pico_pwm_fs90r_02.py
from machine import Pin, PWM
import time

# PWM pin 
pwm21=PWM(Pin(21)) #pwm3a pwm21 
print(pwm21)

CW=700_000   #CW   700us~1500us  L
STP=1_500_000 #STOP 1500±45us
CCW=2_300_000 #CCW  1500~2300us  R

#pwm.freq 50hz(20msec) 
pwm21.freq(50) 

time.sleep(1)

#Left
for s in range (1500,600,-100):
    cw=s*1000
    print(s)
    pwm21.duty_ns(cw)
    mes_pls()
    time.sleep(1)

#Right
for s in range (1500,2400,100):
    ccw=s*1000
    print(s)
    pwm21.duty_ns(ccw)
    mes_pls()
    time.sleep(1)
    
pwm21.deinit()

結果は以下のようになりました。Thonnyのshellにdutyの設定値(usec)が表示されます。


>>> %Run -c $EDITOR_CONTENT

1500
1400
1300
1200
1100
1000
900
800
700
1500
1600
1700
1800
1900
2000
2100
2200
2300
>>>

動作確認の動画です。

まとめ

Raspberry Pi PicoのPWM出力でFS90R 360°サーボの動作を確認しました。