注釈

こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Raspberry Pi、Arduino、ESP32について、仲間と一緒に深掘りして学びましょう。

なぜ参加するべきか?

  • 専門家のサポート: 購入後の問題や技術的な課題を、コミュニティやチームのサポートで解決できます。

  • 学びと共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行公開にいち早くアクセスできます。

  • 特別割引: 最新製品に対する独占的な割引を楽しめます。

  • 祝祭プロモーションやプレゼント: プレゼント企画やホリデープロモーションに参加できます。

👉 一緒に探求し、創造を楽しみたいですか?[こちら] をクリックして、今すぐ参加しましょう!

3.7 サーボモーターの動作

このレッスンでは、Raspberry Pi Pico 2を使って サーボモーター を制御する方法を学びます。サーボモーターは、0°から180°の間で特定の角度に回転することができるデバイスです。リモートコントロール玩具やロボット、精密な位置制御が必要なその他の用途に広く使用されています。

それでは、サーボを前後に揺らしてみましょう!

必要なもの

このプロジェクトでは、以下の部品が必要です。

セットで購入するのが便利です。こちらがリンクです:

名前

セット内容

リンク

Newton Lab Kit

450+

Newton Lab Kit

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

番号

部品

数量

リンク

1

Raspberry Pi Pico 2

1

購入

2

Micro USBケーブル

1

3

ブレッドボード

1

購入

4

ジャンパーワイヤー

数本

購入

5

サーボモーター

1

購入

回路図

sch_servo

配線図

wiring_servo

  • オレンジの線は信号線で、GP15に接続します。

  • 赤の線はVCCで、VBUS(5V)に接続します。

  • 茶色の線はGNDで、GNDに接続します。

サーボは負荷がかかるとかなりの電流を消費することがあります。今回使用するのは小型のサーボで負荷も軽いため、PicoのVBUSピンから給電することで、この簡単な実験は問題なく動作します。大きなサーボや複数のサーボを使う場合は、外部電源の使用を検討してください。

サーボアームの取り付け

  • サーボアーム(またはホーン)をサーボの出力シャフトに取り付けます。

  • 必要に応じて、サーボに付属している小さなネジで固定します。

コードの作成

サーボが0°から180°まで前後に動くように、MicroPythonのプログラムを書きます。

注釈

  • 3.7_swinging_servo.pynewton-lab-kit/micropython フォルダから開くか、コードをThonnyにコピーして「実行」をクリックするか、F5を押して実行します。

  • 正しいインタープリタ(MicroPython(Raspberry Pi Pico).COMxx)が選択されていることを確認してください。

import machine
import utime

# GP15ピンでPWMを初期化
servo = machine.PWM(machine.Pin(15))
servo.freq(50)  # 周波数を50Hzに設定

# 角度をデューティサイクルに変換する関数
def angle_to_duty(angle):
    min_duty = 1638  # 0.5msのパルス(0°)
    max_duty = 8192  # 2.5msのパルス(180°)
    duty = int(min_duty + (angle / 180) * (max_duty - min_duty))
    return duty

while True:
    # サーボを0°から180°に動かす
    for angle in range(0, 181, 1):
        servo.duty_u16(angle_to_duty(angle))
        utime.sleep_ms(20)
    # サーボを180°から0°に戻す
    for angle in range(180, -1, -1):
        servo.duty_u16(angle_to_duty(angle))
        utime.sleep_ms(20)

コードが実行されると、サーボはスムーズに0°から180°の間を前後に動きます。

コードの理解

  1. モジュールのインポート:

    • machine: ハードウェア関連の機能にアクセスします。

    • utime: 遅延など、時間関連の機能を提供します。

  2. PWMの初期化:

    GP15ピンでPWMを設定します。サーボの標準周波数である50Hzに設定します。

    servo = machine.PWM(machine.Pin(15))
    servo.freq(50)
    
  3. angle_to_duty 関数の定義:

    • この関数は、角度(0°〜180°)をサーボのデューティサイクルに対応する値に変換します。

    • min_dutymax_duty は、サーボ制御信号の最小と最大のパルス幅に対応します。

    • 計算によって、角度を適切なデューティサイクルにスケーリングします。

    def angle_to_duty(angle):
        min_duty = 1638  # 0.5msパルス幅
        max_duty = 8192  # 2.5msパルス幅
        duty = int(min_duty + (angle / 180) * (max_duty - min_duty))
        return duty
    
  4. メインループでサーボを動かす:

    • サーボは0°から180°まで、1°ずつ角度を増加させます。

    • その後、180°から0°に戻ります。

    • utime.sleep_ms(20) は、動作をスムーズにするための小さな遅延を追加します。

    while True:
        for angle in range(0, 181, 1):
            servo.duty_u16(angle_to_duty(angle))
            utime.sleep_ms(20)
        for angle in range(180, -1, -1):
            servo.duty_u16(angle_to_duty(angle))
            utime.sleep_ms(20)
    

コードのさらなる理解

サーボは、特定のパルス幅を持つPWM信号を送ることによって制御されます。 サーボの標準は50HzのPWM信号(周期20ms)です。 各周期内のパルス幅がサーボの角度を決定します:

  • 0.5msのパルス幅は0°に対応。

  • 1.5msのパルス幅は90°に対応。

  • 2.5msのパルス幅は180°に対応。

PWM信号のデューティサイクルを調整することによって、パルス幅を変更します。

duty_u16() 関数は0から65535までの値を受け付けます。 パルス幅に対応するデューティサイクルを計算するためには:

Duty cycle = (Pulse Width / Period) * 65535

例えば、0.5msのパルス幅の場合:

Duty cycle = (0.5ms / 20ms) * 65535 ≈ 1638

さらなる実験

  • 速度の変更: utime.sleep_ms(20) の遅延を調整して、サーボの動作速度を速くしたり遅くしたりできます。

  • 特定の角度に設定: コードを変更して、サーボを特定の角度に動かすことができます。

    servo.duty_u16(angle_to_duty(90))  # 90°に移動
    
  • 入力による制御: ポテンショメーターやボタンを接続して、サーボの角度をインタラクティブに制御できます。

重要な注意点

  • 電源供給: サーボに十分な電力が供給されていることを確認してください。ジッターや不安定な動作が見られる場合は、外部の5V電源を使用してください。

  • 過負荷を避ける: サーボを物理的な限界(通常0°〜180°)を超えて強制的に動かさないようにしてください。サーボが損傷する原因となります。

結論

このレッスンでは、Raspberry Pi Pico 2を使ってサーボモーターを制御する方法を学びました。PWM信号を使ってサーボの角度を設定し、スムーズに動かす方法を理解しました。このスキルは、精密な動きが必要なロボティクスやオートメーションプロジェクトにおいて非常に重要です。