発行済み 2026-04-18
このガイドは、標準の制御のための完全で実践的なチュートリアルを提供します。サーボRaspberry Pi シングルボード コンピューターを使用したモーター。実際のテストと公式のハードウェア ドキュメントに基づいて、正確な角度制御を実現するために必要な正確な配線、Python コード、PWM 設定を学びます。
Raspberry Pi (GPIO ピンを備えた任意のモデル (例: 3B+、4B、または 5))
Raspberry Pi OS を搭載した MicroSD カード (Bookworm 以降)
標準5Vサーボモーター (ホビーロボットで一般的に使用されます)
外部 5V 電源 (2A 以上) – ほとんどのサーボ大電流が流れる
ジャンパー線 (メス-メス)
小型ポテンショメータ (オプション、手動制御の例)
> 現実世界のメモ: 典型的な教室や趣味のセットアップでは、ユーザーは 5V ピンから直接サーボに電力を供給することで Raspberry Pi を損傷することがよくあります。このガイドでは、正しい電源絶縁方法を示します。
標準的なサーボモーターは連続回転しません。代わりに、PWM (パルス幅変調) 信号に基づいて特定の角度 (通常は 0° ~ 180°) に移動します。 Raspberry Pi は、GPIO ピンでこの信号を生成します。
重要なパラメータ (サーボ データシートおよび Raspberry Pi の公式ドキュメントから):
信号周波数:50Hz(周期=20ms)
0°のパルス幅: 0.5 ms (デューティサイクル = 2.5%)
90°のパルス幅: 1.5 ms (デューティサイクル = 7.5%)
180°のパルス幅: 2.5 ms (デューティサイクル = 12.5%)
これらの値は、ほとんどのアナログおよびデジタル サーボの業界標準です。常にサーボのデータシートで確認してください - 小さな差異が存在します。
Raspberry Pi の 5V ピンから直接サーボに電力を供給しないでください。一般的なサーボは動作中に 200 ~ 800 mA を消費する可能性があり、ピーク電流は 1A を超えます。 Raspberry Pi の 5V ピンは USB 入力に直接接続されており、確実に供給できる電流は約 500 mA のみです (古いモデルではこれより少ない)。より多くの電流を引き出すと、電圧降下、システムのフリーズ、または永久的な損傷が発生する可能性があります。
正しい配線 (一般的なセットアップでテスト済み):
共通点が必須である理由:サーボの制御信号 (Pi からの 0 ~ 3.3 V) とサーボの電源 (外部電源からの 5 V) は基準電圧を共有する必要があります。共通のグランドがないと信号が不定になり、サーボがジッターしたり動かなくなったりします。
Raspberry Pi OS には Python がプリインストールされています。正確な PWM 信号を生成するための信頼できる方法が 2 つあります。初心者に推奨される方法は、RPi.GPIO特定のピンでハードウェア PWM を使用します。
Raspberry Pi 40 ピン ヘッダー上のハードウェア PWM 対応 GPIO ピン:
GPIO12 (ピン 32) – PWM チャネル 0
GPIO13 (ピン 33) – PWM チャネル 1
GPIO18 (ピン 12) – PWM チャネル 0 (最も一般的に使用される)
GPIO19 (ピン 35) – PWM チャネル 1
![]()
PWM インターフェイスを有効にします (ハードウェア PWM を使用している場合)。追加の手順は必要ありません。ハードウェア PWM はいつでも利用できます。ソフトウェア PWM (任意のピン) の場合、設定は必要ありませんが、タイミングが不安定になる可能性があります。
以下は、サーボを 2 秒の一時停止を挟んで 3 つの角度 (0°、90°、180°) に移動させる、テスト済みの完全な Python スクリプトです。このコードは、RPi.GPIO の公式ドキュメントに従っています。
import RPi.GPIO as GPIO import time # BCM ピン番号付けを使用 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # GPIO18 を PWM 出力として設定 servo_pin = 18 GPIO.setup(servo_pin, GPIO.OUT) # 50 Hz で PWM インスタンスを作成 pwm = GPIO.PWM(servo_pin, 50) pwm.start(0) # デューティ サイクル 0% で開始します def set_servo_angle(angle): """ 角度 (0 ~ 180) をデューティ サイクル (2.5 ~ 12.5) に変換します 式: デューティ = (角度 / 180)10 + 2.5 角度 180 の場合、複数のサーボ データシート """ で検証: 角度 = 180 デューティ = (角度 / 180.0)10.0 + 2.5 pwm.ChangeDutyCycle(duty) # サーボが位置に到達できるようにします time.sleep(0.5) # ジッターを減らすために信号の送信を停止します (オプション) pwm.ChangeDutyCycle(0) time.sleep(0.1) try: while True: print("0°への移動") set_servo_angle(0) time.sleep(2) print("移動中90°まで") set_servo_angle(90) time.sleep(2) print("180°への移動") set_servo_angle(180) time.sleep(2) KeyboardInterruptを除く: print("ユーザーによる停止") pwm.stop() GPIO.cleanup()
主要な詳細:各位置の後、コードはデューティ サイクルを 0% に設定し、0.1 秒待機します。これにより、継続的な電力消費が防止され、サーボのジッターが軽減されます。多くのオンライン例ではこれが省略されており、不必要な電流の浪費が発生します。
スクリプトを次の名前で保存しますサーボコントロール.py。ターミナルで次を実行します。
python3 サーボコントロール.py
予想される動作:サーボシャフトは 0°まで回転し、2 秒間停止し、90°まで移動し、一時停止し、180°まで移動し、これを繰り返します。
サーボが動かない場合:
共通点を確認 – 最もよくある間違い
外部電源がオンになっていて、少なくとも 5V が供給されていることを確認します。
GPIO ピン番号を確認します (BCM 18 = 物理ピン 12)
その後の睡眠時間を減らすデューティサイクルの変更?いいえ – サーボが位置に到達するまでに約 300 ~ 500 ミリ秒必要です
インタラクティブなプロジェクトの場合、MCP3008 ADC を使用してアナログ ポテンショメータを読み取ることができます (Raspberry Pi にはアナログ入力がないため)。ただし、より簡単なテスト方法は、キーボード入力を使用することです。
GPIOインポート時間としてRPi.GPIOをインポート GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) pwm = GPIO.PWM(18, 50) pwm.start(0) def angle_to_duty(angle): return (angle / 180.0) * 10.0 + 2.5 try: while True: cmd = input("角度(0-180)を入力または'q' で終了: ") if cmd == 'q': ブレーク試行: angle = float(cmd) if 0
核心点を繰り返します:Raspberry Pi でサーボを安全かつ正確に制御するには、(1) サーボに外部 5V 電源を使用し、(2) Pi、サーボ、電源の間に共通アースを接続し、(3) 0.5 ~ 2.5 ms のパルスに対応するデューティ サイクルを持つ 50 Hz の PWM 信号を生成し、(4) ジッターと電力消費を削減するために各動作後に PWM 信号を停止します (デューティ 0%)。
このガイドを適用するためのアクション ステップ:
1. 上記のコンポーネントを集めます。特定のブランドは必要ありません。標準的な 5V サーボであればどれでも動作します。
2. 共通アース接続を再確認して、図のように正確に配線します。
3. Python スクリプトをコピーして実行します。サーボが 0°、90°、180° に移動するのを観察します。
4. プロジェクトのニーズに合わせてスクリプト内の角度の値を変更します。
5. 実稼働プロジェクトまたは長期にわたるプロジェクトの場合は、常にハードウェア PWM を使用し、電圧スパイクを平滑化するためにサーボ電源ラインの両端に 100 ~ 470 µF の電解コンデンサを追加します。
さらなる検証のための信頼できる情報源:Raspberry Pi の公式ドキュメント (/documentation/computers/os.html#gpio-and-the-40-pin-header)、およびサーボ モーターのデータシート (通常はメーカーの Web サイトから入手可能)。特定のサーボのパルス幅範囲を常に参照してください。標準は 0.5 ~ 2.5 ms ですが、一部のサーボは 0.7 ~ 2.3 ms を使用します。サーボをスイープして実際の限界を記録する簡単なキャリブレーション スクリプトにより、完璧な精度が得られます。
更新時間:2026-04-18