物づくりの小部屋

個人で活躍するクリエーターになりたい現役エンジニアの行動記録

【ラズパイ】Raspberry Pi4でサーボモータを回してみる(SunFounder SF3218MG )

f:id:zaloha8:20220321154005j:plain

こんにちは。alohaです。

 

Raspberry Pi4で模型用のサーボモータを回すテストを行ったので、結果を書き残しておきます。

 

模型用のサーボモータは、ラジコンの舵やロボットの関節などを動かすのに使われており、以下の特徴があります。

  • 回転軸が連続回転しない(1回転以内の◯°〜◯°の範囲で動作)
  • 指定した角度まで動いた後、その角度を維持する様に振る舞う
  • モータに入力するパルス信号のデューティ比を変えると回転軸の角度も変わる

サーボモータの使い方を覚えておくと、今後の工作の際に役立ちそうです。

それでは早速、テストを開始します。

 

<必要部品(Raspberry Pi4以外に必要なもの)>

  • サーボモータ(SunFounder SF3218MG)   1個
  • DCアダプタ(5 [V], 2.3 [A])         1個
  • ジャンパー線                 数本

f:id:zaloha8:20220321151149j:plain

 

<SunFounder SF3218MGの仕様>

メーカで公表している仕様は以下の通りです。

  • ストールトルク:20.5 [kg・cm] 〜 22.8 [kg・cm]
  • 無負荷速度:0.18 [sec/60°] 〜 0.14 [sec/60°]
  • 動作電圧:4.8 [V] 〜 7.2 [V]
  • 回転角度:270 [°]
  • 不感帯幅:5 [μs]
  • 重さ:56 [g]

ただ、これだけだとモータにどの様なパルス信号を入力すれば良いか分からないため、

試行錯誤して、以下の条件でパルス信号を入力するとうまく制御できる事が分かりました。

  • 入力周波数:100 [Hz]
  • デューティ比:5 [%](回転軸角度0 [°]の時)
  • デューティ比:24.5 [%](回転軸角度270 [°]の時)

 

【デューティ比:5 [%](回転軸角度0 [°])の場合の入力信号】

f:id:zaloha8:20220321151814p:plain

 

【デューティ比:24.5 [%](回転軸角度270 [°])の場合の入力信号】

f:id:zaloha8:20220321152320j:plain

 

<回路図>

Qt-BSchで回路図を書くと、下図の様になります。

Raspberry Pi4側からは、パルス信号を出す線が1本あれば良いので回路としてはシンプルになります。

f:id:zaloha8:20220321155114j:plain

 

回路図の通りに配線し、ハードウェアとしては完成です。

f:id:zaloha8:20220321152906j:plain

 

<動作プログラム>

動作プログラムとして、回転軸の角度を0 [°]〜270 [°]まで45 [°]刻みで回転させるプログラムを作成しました。0 [°]〜270 [°]の間を計2往復します。

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#ピン番号の割当方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
SVM=8

#8番ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(SVM,GPIO.OUT,initial=GPIO.LOW)

#SF3218MGのスペック
#周波数
freq = 100
#最小回転角度
dg_min = 0.0
#最大回転角度
dg_max = 270.0
#最小デューティ
dc_min = 5.0
#最大デューティ
dc_max = 24.5

#回転角度をデューティに変換する関数
def conv_dc(dg):
    return((((dc_max - dc_min) / (dg_max - dg_min)) * (dg - dg_min)) + dc_min)

#PWMオブジェクトのインスタンスを作成
#出力ピン:8番、周波数:100Hz
p=GPIO.PWM(SVM,freq)

#PWM信号を出力
p.start(0)


#0deg~270degまで回転
for deg in range(0,271,45):
    dc = conv_dc(float(deg))

    #現在角度とデューティを表示
    print("angle=",deg, "dyty=",dc)

    #デューティ比を設定
    p.ChangeDutyCycle(dc)
    time.sleep(2.0)

#270deg~0degまで回転
for deg in range(270,-1,-45):
    dc = conv_dc(float(deg))
    
    #現在角度とデューティを表示
    print("angle=",deg, "duty=",dc)

    #デューティ比を設定
    p.ChangeDutyCycle(dc)
    time.sleep(2.0)
        

#270degまで回転
p.ChangeDutyCycle(conv_dc(float(270)))
time.sleep(3.0)

#0degまで回転
p.ChangeDutyCycle(conv_dc(float(0)))
time.sleep(3.0)

    
#メッセージを表示
print("End of program")

#PWMを停止
p.stop()

#GPIOを開放
GPIO.cleanup()

 

<まとめ>

という訳で、Raspberry Pi4でサーボモータを回転させるテストを行いました。

サーボモータ1個につき、必要なGPIO端子が1個で済むので、多数のサーボモータを同時に制御することもできそうです。

 

応用例として、多関節ロボットの作成などにもトライしてみたいですね。

それでは、また。