micro:bitの拡張ボードからgeek servo(オタクサーボ)を動かしてみた

スポンサーリンク

geek servo(別名オタクサーボ)動きを理解してなかったので調べてみた。

材料

micro:bit
Yahboom Super:bit(micro:bit拡張ボード)
geek servoと書かれたレゴに接続できる灰色のサーボ

サーボの仕様

Amazonの商品ページに記載されていた仕様

タイプ:グレーサーボ
色:グレー
動作電圧:3.3V〜6V
定格電圧:4.8V
定格電流:200ma
ストール電流:700ma
スライド電流:450ma
最大トルク:500g・cm
回転範囲:270°
パルス幅:600us(-45°)、1500us(90°)、2400us(225°)。

接続

micro:bitでより簡単に複数台のサーボを扱うためにSuper:bitというmicro:bit拡張ボードを使った。 この拡張ボードには270°サーボの専用ブロック(API)も用意されているので簡単に動かせた。 他のPWM制御サーボの使用経験がほぼ無いので、他のサーボとの違いはよくわからない。

結果

こんな感じでサーボを4台接続してみた。

f:id:sato_susumu:20200910005140j:plain

270°サーボ向けのブロック(API)では0〜270のパラメータを渡すことで角度を変えることができる。 これは、パラメータに0を渡したとき。0度。あれ?意外と微妙な角度。 サーボの軸が十字になっているのだけど、その十字の方向がいまいち。

次の写真は、パラメータに55を渡したとき。正面(上?)から見て反時計回りに動く。 軸の十字がちょうどいい方向になっている。

f:id:sato_susumu:20200910005143j:plain

次の写真は、パラメータに155を渡したとき。 動きを見る限り、角度=パラメータというわけではない。

f:id:sato_susumu:20200910005146j:plain

次の写真は、パラメータに255を渡したとき。

f:id:sato_susumu:20200910005149j:plain

次の写真は、パラメータに270を渡したとき。うーん。この角度も微妙。

f:id:sato_susumu:20200910005153j:plain

270°動くことになっているけど、パラメータに55〜255の値を指定して、180°サーボとして扱うのが理解しやすそう。 もう少し稼働させたくても、せいぜい225°(=180°+45°)くらいまでかな。

MakeCode用プログラム(python)

動作確認に使用したプログラム。Super:bitを扱うので、予め拡張機能 https://github.com/lzty634158/SuperBit の追加が必要。

無線通信を使って、ジョイスティック付きコントローラーキットから操作する前提。コントローラー側プログラムはこちら参照。

def update_servo_value():
    global lx, ly, rx, ry
    # lx = Math.map(joy_lx, -100, 100, 0, 270)
    ly = Math.map(joy_ly, -100, 100, 0, 270)
    # rx = Math.map(joy_rx, -100, 100, 0, 270)
    # ry = Math.map(joy_ry, -100, 100, 0, 270)
    
    SuperBit.servo2(SuperBit.enServo.S1, ly)
    SuperBit.servo2(SuperBit.enServo.S2, ly)
    SuperBit.servo2(SuperBit.enServo.S3, ly)
    SuperBit.servo2(SuperBit.enServo.S4, ly)
    SuperBit.servo2(SuperBit.enServo.S5, ly)
    SuperBit.servo2(SuperBit.enServo.S6, ly)
    SuperBit.servo2(SuperBit.enServo.S7, ly)
    SuperBit.servo2(SuperBit.enServo.S8, ly)

def on_received_value(name, value):
    global joy_lx, joy_ly, joy_rx, joy_ry
    if name == "LX":
        joy_lx = value
    if name == "LY":
        joy_ly = value
    if name == "RX":
        joy_rx = value
    if name == "RY":
        joy_ry = value
    update_servo_value()
radio.on_received_value(on_received_value)

lx = 0
ly = 0
rx = 0
ry = 0
joy_lx = 0
joy_ly = 0
joy_ry = 0
joy_rx = 0
radio_ch = 9
radio.set_group(radio_ch)
basic.show_string("" + str((radio_ch)))

def on_forever():
    basic.pause(1000)
    # serial.write_value("LX", lx)
    serial.write_value("LY", ly)
    # serial.write_value("RX", rx)
    # serial.write_value("RY", ry)
basic.forever(on_forever)