熊おふし五郎が行く

主にマイコンボードを動かした記録を書いています

Micro:bit、Micropythonで、マイクロサーボを動かす

マイクロサーボ

マイクロサーボは、受信したパルスのデューティ比で回転角度を制御するモーターです。マイコンがマイクロサーボを動かすとき、PWMを使うのが一般的です。

f:id:bear_9973:20201116185754p:plain:w500
マイクロサーボの動かし方

用意するマイクロサーボ

ここでは、KEYESTUDIO製BBC Micro: bitのスターターキットにあるマイクロサーボを使用します。

f:id:bear_9973:20201116185543j:plain:w300
マイクロサーボ

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

インターフェース

マイクロサーボは、アナログ信号(PWM)を入力します。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。

  1. Micro:bitの初期化
  2. サーボの初期化、1秒待ち
  3. 45°に移動、1秒待ち
  4. 90°に移動、1秒待ち
  5. 135°に移動、1秒待ち
  6. 180°に移動、1秒待ち
  7. 0°に移動、1秒待ち
  8. 3~7を繰り返す

接続

接続表と接続図(写真)を示します。

Micro:bit リレー
P0 PWM(オレンジ色線)
5V +(赤色線)
GND -(茶色線)

f:id:bear_9973:20201116190459p:plain:w400
構成図

コード

MicroPythonのwrite_analogは、デューティ比に応じて1~1023の数値(write_analog入力値)を入力します。 ここでは、角度からwrite_analog入力値に変換する関数を使用しています。 この関数は、次のように求めます。

  • マイクロサーボの仕様からPWMのパルス幅(ms)を確認
  • PWMのパルス幅(ms)から、パルス幅÷20(周期)でデューティ比を求める
  • デューティ比から、1023×デューティ比でwrite_analog入力値を求める

こうして以下の表ができます。さらに、角度とwrite_analog入力値で一次方程式関数を作成します。この一次方程式関数が、コードのconv1関数になります。

サーボの角度(°) PWMのパルス幅(ms) デューティ比 write_analog入力値
0 0.5 0.025 26
180 2.5 0.125 128
from microbit import *

def conv1(kakudo):
    k = 23 + 0.566666*kakudo
    return(k)

# Micro:bitを初期化
pin0.set_analog_period(20)  # PWMの周期を20 msに設定
# LEDディスプレイを初期化
display.clear()
# サーボの初期化
up_kakudo = 0t
pin0.write_analog(conv1(up_kakudo))
sleep(1000)

while True:
    pin0.write_analog(conv1(45))
    sleep(1000)

    pin0.write_analog(conv1(90))
    sleep(1000)

    pin0.write_analog(conv1(135))
    sleep(1000)

    pin0.write_analog(conv1(180))
    sleep(1000)

    pin0.write_analog(conv1(0))
    sleep(1000)

結果

サーボホーンが、0°を基準に45°、90°、135°、180°、0°の移動を繰り返しました。

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。