3.7 サーボの振動

このキットには、LEDやパッシブブザーに加えて、PWM信号で制御されるデバイス、サーボも含まれています。

サーボは、位置(角度)制御が可能なデバイスであり、一定の角度変更が必要な制御システムに適しています。高級リモコン玩具、例えば飛行機、潜水艦モデル、リモコンロボットなどで広く利用されています。

それでは、サーボを振動させてみましょう!

必要なコンポーネント

このプロジェクトには以下のコンポーネントが必要です。

一式をまとめて購入するのは非常に便利です。リンクはこちら:

名称

このキットに含まれるアイテム

リンク

ケプラーキット

450+

Kepler Kit

以下のリンクから個別に購入することもできます。

SN

コンポーネント

個数

リンク

1

Raspberry Pi Pico W

1

BUY

2

Micro USBケーブル

1

3

ブレッドボード

1

BUY

4

ジャンパーワイヤー

数本

BUY

5

サーボ

1

BUY

回路図

sch_servo

配線

wiring_servo

  • オレンジ色のワイヤーは信号で、GP15に接続されています。

  • 赤色のワイヤーはVCCで、VBUS(5V)に接続されています。

  • 茶色のワイヤーはGNDで、GNDに接続されています。

コード

注釈

  • kepler-kit-main/micropython のパス下にある 3.7_swinging_servo.py ファイルを開くか、このコードをThonnyにコピペして、「Run Current Script」をクリックまたはF5キーを押して実行します。

  • 右下角にある「MicroPython(Raspberry Pi Pico)」インタープリターをクリックして選択してください。

  • 詳細なチュートリアルは、 コードを直接開いて実行する を参照してください。

import machine
import utime

servo = machine.PWM(machine.Pin(15))
servo.freq(50)

def interval_mapping(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def servo_write(pin, angle):
    pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5)
    duty = int(interval_mapping(pulse_width, 0, 20, 0, 65535))
    pin.duty_u16(duty)

while True:
    for angle in range(180):
        servo_write(servo, angle)
        utime.sleep_ms(20)
    for angle in range(180, -1, -1):
        servo_write(servo, angle)
        utime.sleep_ms(20)

プログラムが実行中のとき、サーボアームが0°から180°まで前後に振動するのが見えます。

while True ループによってプログラムは絶えず動作していますので、プログラムを終了するにはStopボタンを押す必要があります。

動作原理は?

サーボを動かすために servo_write() 関数を定義しました。

この関数には二つのパラメーターがあります:

  • pin 、サーボを制御するGPIOピン。

  • Angle 、軸の出力角度。

この関数内で、 interval_mapping() が呼び出され、角度範囲0~180をパルス幅範囲0.5~2.5msにマッピングします。

pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5)

なぜ0.5~2.5なのか?これはサーボの動作モードによって決定されます。

次に、パルス幅を周期からデューティに変換します。 duty_u16() は小数点を持つことができない(値は浮動小数点型であってはならない)ので、 int() を用いてデューティを整数型に強制変換します。

duty = int(interval_mapping(pulse_width, 0, 20, 0, 65535))

最後に、デューティ値を duty_u16() に書き込みます。