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台接続してみた。
270°サーボ向けのブロック(API)では0〜270のパラメータを渡すことで角度を変えることができる。 これは、パラメータに0を渡したとき。0度。あれ?意外と微妙な角度。 サーボの軸が十字になっているのだけど、その十字の方向がいまいち。
次の写真は、パラメータに55を渡したとき。正面(上?)から見て反時計回りに動く。 軸の十字がちょうどいい方向になっている。
次の写真は、パラメータに155を渡したとき。 動きを見る限り、角度=パラメータというわけではない。
次の写真は、パラメータに255を渡したとき。
次の写真は、パラメータに270を渡したとき。うーん。この角度も微妙。
270°動くことになっているけど、パラメータに55〜255の値を指定して、180°サーボとして扱うのが理解しやすそう。 もう少し稼働させたくても、せいぜい225°(=180°+45°)くらいまでかな。
結果に関する注意点
あくまで、Super:bitとgeek servoを組み合わせた場合の結果です。そのため、別の機材と組み合わせた場合には別の結果になると思います。
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)