4.3 スイングサーボ

サーボは位置ベースのデバイスの一種で、特定の角度を維持し、正確な回転を行う能力で知られています。これにより、一貫した角度調整を必要とする制御システムに非常に望ましいものとなっています。サーボが、飛行機モデルから潜水艦のレプリカ、洗練されたリモートコントロールロボットに至るまで、高級遠隔制御玩具に広く使用されているのは驚くことではありません。

この魅力的な冒険では、サーボを独自の方法で操作することに挑戦します - スイングさせることによってです!このプロジェクトは、サーボのダイナミクスをより深く掘り下げ、正確な制御システムのスキルを磨き、その操作に関するより深い理解を得る絶好の機会を提供します。

サーボを自分の曲に合わせて踊らせる準備はできましたか?このエキサイティングな旅に出発しましょう!

必要な部品

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

キット全体を購入することは非常に便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

ESP32 Starter Kit

320+

ESP32 Starter Kit

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

コンポーネントの紹介

購入リンク

ESP32 WROOM 32E

BUY

ESP32カメラ拡張ボード

-

ジャンパーワイヤ

BUY

サーボ

BUY

利用可能なピン

このプロジェクトのESP32ボードに利用可能なピンのリストです。

利用可能なピン

IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23

回路図

../../_images/circuit_4.3_servo.png

配線図

  • オレンジ色の線はシグナルで、IO25に接続されています。

  • 赤色の線はVCCで、5Vに接続されています。

  • 茶色の線はGNDで、GNDに接続されています。

../../_images/4.3_swinging_servo_bb.png

コード

注釈

  • esp32-starter-kit-main\micropython\codes パスにある 4.3_swinging_servo.py ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。

  • 右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。

import machine
import time

# Create a PWM (Pulse Width Modulation) object on Pin 25
servo = machine.PWM(machine.Pin(25))

# Set the frequency of the PWM signal to 50 Hz, common for servos
servo.freq(50)

# Define a function for interval mapping
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

# Define a function to write an angle to the servo
def servo_write(pin, angle):

    pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5) # Calculate the pulse width
    duty = int(interval_mapping(pulse_width, 0, 20, 0, 1023))     # Calculate the duty cycle
    pin.duty(duty) # Set the duty cycle of the PWM signal

# Create an infinite loop
while True:
    # Loop through angles from 0 to 180 degrees
    for angle in range(180):
        servo_write(servo, angle)
        time.sleep_ms(20)

    # Loop through angles from 180 to 0 degrees in reverse
    for angle in range(180, -1, -1):
        servo_write(servo, angle)
        time.sleep_ms(20)

このコードを実行すると、サーボは0度から180度までの間を絶えず往復するようにスウィープします。

どのように動作するのか?

  1. マイクロコントローラーのハードウェアを制御するための machine ライブラリと、遅延を追加するための time ライブラリをインポートします。

    import machine
    import time
    
  2. ピン25にPWM(パルス幅変調)オブジェクトを作成し、サーボに一般的な50 Hzにその周波数を設定します。

    # Create a PWM (Pulse Width Modulation) object on Pin 25
    servo = machine.PWM(machine.Pin(25))
    
    # Set the frequency of the PWM signal to 50 Hz, common for servos
    servo.freq(50)
    
  3. ある範囲から別の範囲に値をマッピングする interval_mapping 関数を定義します。これは、角度を適切なパルス幅とデューティサイクルに変換するために使用されます。

    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
    
  4. PWMオブジェクトと角度を入力として受け取る servo_write 関数を定義します。与えられた角度に基づいてパルス幅とデューティサイクルを計算し、それに応じてPWM出力を設定します。

    def servo_write(pin, angle):
    
        pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5) # Calculate the pulse width
        duty = int(interval_mapping(pulse_width, 0, 20, 0, 1023))     # Calculate the duty cycle
        pin.duty(duty) # Set the duty cycle of the PWM signal
    
    • この関数では、 interval_mapping() を呼び出して、角度の範囲0〜180をパルス幅の範囲0.5〜2.5msにマッピングします。

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

    • 次に、パルス幅を周期からデューティに変換します。

    • duty() は使用時に小数を持つことができない(値がfloat型であってはならない)ため、 int() を使用してデューティをint型に変換しました。

  5. 二つのネストしたループを持つ無限ループを作成します。

    while True:
        # Loop through angles from 0 to 180 degrees
        for angle in range(180):
            servo_write(servo, angle)
            time.sleep_ms(20)
    
        # Loop through angles from 180 to 0 degrees in reverse
        for angle in range(180, -1, -1):
            servo_write(servo, angle)
            time.sleep_ms(20)
    
    • 最初のネストしたループは0度から180度までの角度を反復し、二番目のネストしたループは180度から0度までの角度を逆順で反復します。

    • 各反復で、 servo_write 関数が現在の角度で呼び出され、20ミリ秒の遅延が追加されます。