micro:bit Makecodeでサーボモータ(SG92R)の動作テスト

2021.8.15 Coskx Lab  

1 はじめに

micro:bitにRCServo(SG92R 4.8V駆動)を接続して動作させます。



サーボモータは指定した角度に軸角度が追従するモータです。0から180度の範囲で動作します。
ブロックプログラムでは角度(単位は度)を指令値として直接与えることができます。
舞台裏で,角度指定にはPWM信号が用いられ,PWM周期20msecで,正のパルス幅で角度指令を与えます。
パルス幅-角度の関係は一次関数で表されます。
パルス幅0.5msecのとき0度,パルス幅2.4msecのとき180度となります。

注意 動作範囲が360度となっているサーボモータは,同じサーボモータという名前ですが,指令値に応じた角速度で回転しますので,全く別の種類のモータです。
注意 一般的に「サーボモータ」という言葉は,もっと広い意味で使われています。
   ここではラジオコントロール模型用サーボモータ(RCサーボ)のことを「サーボモータ」と呼んでいます。

2 使用環境

3 端子の割り付け

サーボモータはPWM信号のみで制御するのでmicro:bitの端子を1つだけ使用します。 ここではP0を使うことにします。これ以外でも他のセンサなどに使用されていない端子であればどこでもよい(例えばP2など)です。この段階でどの端子を使うか決めておき,ケーブル接続においても,プログラムにおいてもP0を使うことで一貫している必要があります。 参考 micro:bit端子一覧

4 接続

サーボモータは電源電圧4.8Vが指定されていますが,4V以上であれば動作します。ここでは4.5Vを使います。信号レベルについては何も指定されていませんが,電源電圧と考えます。micro:bitの信号レベルは3.3Vですので,レベルシフタを用いて3.3V信号を4.5V信号に変換しています。(実際は3.3Vのままでも動作していますが,ノイズマージンは小さくなります。)
そのため,次のようにつなげることを目指せばよいことになります。
複数の電圧の電源が出てくる回路では,グランドを共通にするため,必ず全てのグランドどうしを接続します。(ここでは電池のグランドとmicro:bitのグランドとサーボモータのグランド)


micro:bit端子に直接はんだ付けしてしまってもよいのですが,そのようなことはしたくないため,micro:bitの端子を引き出して扱いやすくなっているブレイクアウトボードなどを使います。細工が必要な場合もあります。

ブレイクアウトボード KITRONIK-5601Bなどを使う場合
レベルシフタ回路はブレッドボード上に作ります。ヘッダピンから線を引き出せるように片側メスのジャンパ線を使います。



5 プログラム

MakeCodeを使います。
最初に簡単なデモをします。60度と120度の指令を500msごとに交互に与えます。指令を与える端子はP0です。
(PWM周期は20000μsec=20msecですが,micro:bitのPWM周期のデフォルトが20msecなので初期化でPWM周期を設定する必要はありません。)
  簡単なデモプログラム



次のプログラムでは,無限ループにてパルス幅(Hを出力する時間)0.5,1.0,1.5,2.0,2.5msecをそれぞれ2000msec出力します。
サーボモータは,2秒ごとに,角度が変化する動きをするはずです。

  動作テスト用プログラム



コピペする場合は,次のソースコードをPythonソースとして貼り付ければ完了です。

durations = [500, 975, 1450, 1925, 2400]
index = 0

def on_forever():
    global index
    pins.servo_set_pulse(AnalogPin.P0, durations[index])
    index += 1
    if index == 5:
        index = 0
    basic.pause(2000)
basic.forever(on_forever)

6 micro:bit P0での信号をオシロスコープで観察

PWM周期20msecで,パルス幅が0.5msecのときと2.4msecの時を示します。
これらの信号は,生のP0の信号で,レベルシフタを通す前の段階ですので3.3V信号です。

(1) パルス幅 0.5msecのときの端子P0(測定パルス長は0.488msecでした)


(2) パルス幅 2.4msecのときの端子P0(測定パルス長は2.368msecでした)


パルス幅の指定は,パルス幅を時間で直接指示する方法と,角度で指示する方法があります。
比較してみました。
時間で指示[μs]角度で指示[deg]測定パルス幅[μs]
 0488
 1802480
500 488
2400 2368
2500 2480

180度指示は2500μsec指示と同じになります。SG92Rの仕様では2400μsecが180度になるので,時間指示の方がよさそうです。


7 動作の様子

2秒間隔で回転角が0,45,90,135,180度に変化します。



8 まとめ

レベルシフタで駆動信号の電圧を調整し,サーボモータSG92Rの動作を確認しました。


9 サーボモータの応用

サーボモータにレーザ距離センサを載せて周囲をスキャンして物体認識 
サーボモータに超音波距離センサを載せて周囲をスキャンして物体認識 



補足 レベルシフタの働き

レバルシフタは3.3Vの信号を5Vの信号に変換するなど,信号レベルの異なる回路をつなぐ役割をします。(主に昇圧の場面で使われます。)
レベルシフタは次のような回路で作成できます。
(使用しているNPN型トランジスタは2SC1815)
この図では5Vに変換しているところですが,5Vのところを4.5Vなどに変更すると4.5Vへの変換になります。


レベルシフタの動作をオシロスコープで観察しているところです。
上段の緑がレベルシフタの3.3V入力で,下段の黄がレベルシフタの5V出力です。
HとLの時間的関係は変化せず,Hも時の電圧だけが変化していることがわかります。