発行済み 2026-04-01
このガイドでは、標準を制御するためのパルス幅変調 (PWM) コードについて完全かつ実践的な説明を提供します。サーボモーター。正確なコード、配線手順、およびタイミング原理を探している場合は、サーボ正確な角度に移動すると、正しい場所に到達します。この記事では、広く受け入れられている標準に焦点を当てます。サーボ制御 (1 ms ~ 2 ms のパルス幅を持つ 50 Hz PWM 信号) を提供し、ハードウェアに依存しない実用的なコード例を提供するため、あらゆるマイクロコントローラー プラットフォームに適用できます。
標準アナログ サーボの制御の核心は、複雑なデータ パケットを送信することではなく、特定の繰り返し電気パルスを生成することです。サーボの内部回路はこのパルスの幅を解釈して、出力シャフトの目標位置を決定します。
標準制御信号は、次の 2 つの主要なパラメータによって定義されます。
1. 周期 (周波数):信号は 20 ミリ秒 (ms) ごとに繰り返されます。これは、周波数 50 Hz (1 / 0.02 s = 50 Hz) に相当します。
2. パルス幅 (デューティ サイクル):20 ms 期間内で信号が High (ロジック 1) である期間。この値はサーボの角度に直接マッピングされます。
パルス幅と角度の間のマッピングは重要な情報です。標準サーボの大部分では、関係は線形であり、次の業界標準仕様に従います。
1.0msパルス:サーボを 0 度 (反時計回りにいっぱい) まで回転させます。
1.5msパルス:サーボを90度(中心位置)に回転させます。
2.0msパルス:サーボを 180 度 (時計回りに完全に) 回転させます。
多くのサーボはこの規格に準拠していますが、一部の高トルクまたは特殊なサーボではエンドポイントがわずかに異なる場合があるため (たとえば、0.9 ミリ秒から 2.1 ミリ秒)、特定のモデルの正確な範囲を確認することが重要です。以下のコード例は、これらの最小および最大パルス幅定数を簡単に調整できるように構成されています。
コード ロジックはすべてのプラットフォームで一貫しています。タイマー/カウンターを初期化して 50 Hz 信号を生成し、その信号の「オンタイム」を変調してサーボ角度を設定します。次の疑似コードは、あらゆるプログラミング環境に適応できるコア ロジックを示しています。
// --- 設定定数 --- #define PWM_FREQUENCY_HZ 50 #define PERIOD_MS (1000 / PWM_FREQUENCY_HZ) // 20 ms に計算 #define PULSE_MIN_MS 1.0 // 0 度のパルス幅 #define PULSE_MAX_MS 2.0 // 180 度のパルス幅#define ANGLE_MIN 0 #define ANGLE_MAX 180 // --- 角度をパルス幅にマップする関数 --- float angleToPulseWidth(int angle_degrees) { // 角度を有効な範囲に制限する if (angle_degrees ANGLE_MAX) angle_degrees = ANGLE_MAX; // 角度範囲からパルス幅範囲への線形マッピング floatpulse_width = PULSE_MIN_MS + ( (float)(angle_degrees - ANGLE_MIN) / (ANGLE_MAX - ANGLE_MIN) )(PULSE_MAX_MS - PULSE_MIN_MS);パルス幅を返す; } // --- メイン制御ループの概念 --- // 実際の実装では、以下はハードウェア タイマーによって処理されます。 // 1. 出力ピンを HIGH に設定します。 // 2. 計算されたパルス幅 (例: 1.5 ms) の間待機 (遅延) します。 // 3. 出力ピンを LOW に設定します。 // 4. 20 ミリ秒期間の残り (PERIOD_MS - パルス幅) を待ちます。
これをすぐに実行できるようにするために、最も一般的な 2 つの開発プラットフォームの具体的な実装を次に示します。原理は同じであり、50 Hz、1 ~ 2 ms 標準の移植性を示しています。
これは愛好家にとって最も一般的な入り口です。 Arduinoサーボライブラリはハードウェア タイマーの複雑さを抽象化し、クリーンなインターフェイスを提供します。この例は、サーボの信号線を PWM 対応デジタル ピンに接続する標準的な方法に基づいています。
#含む// サーボ オブジェクト Servo myServo を作成します。 // サーボの信号線に接続するピンを定義 const int servoPin = 9; void setup() { // サーボ オブジェクトをピンに接続します // ライブラリは 50 Hz 信号を自動的に設定します myServo.attach(servoPin); // --- 一般的なシナリオ: 起動時にサーボを中心に置く --- // 多くのロボット アプリケーションでは、機械的負担を避けるために、 // 既知の安全な位置から起動することが重要です。 // 90 度でセンタリングすることは普遍的なベスト プラクティスです。 myServo.write(90); // 中心位置に移動する遅延(1000); // 位置に到達するまでの時間を待ちます } void loop() { // 0 度から 180 度までスイープします for (int angle = 0; angle = 0; angle--) { myServo.write(angle);遅延(15); } }
注:書く()機能は角度 (0 ~ 180) を正しいパルス幅 (1 ~ 2 ms) に自動的に変換します。
Raspberry Pi では通常、ソフトウェアで PWM 信号を生成しますが、これには正確なタイミングが必要です。のRPi.GPIOライブラリは、より正確な信号を実現するために、特定のピンにハードウェア バックアップの PWM インターフェイスを提供します。この例は、Linux ベースのシングルボード コンピューターでのシングル サーボ制御の標準的なアプローチを反映しています。
import RPi.GPIO as GPIO import time # ピン定義 servo_pin = 18 # GPIO 18 などのハードウェア PWM をサポートするピンを使用 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # PWM セットアップ: 50 Hz 周波数 pwm = GPIO.PWM(servo_pin, 50) pwm.start(0) # 0% デューティ サイクルで開始def set_angle(angle): """角度 (0-180) を 50 Hz 信号のデューティ サイクルに変換します。""" # 角度の制限 angle = max(0, min(180, angle)) # 角度 (0-180) をパルス幅 (1-2 ms) にマップします # 20 ms 期間 (50 Hz) の場合、デューティ サイクル = (pulse_width_ms / 20) 100パルス幅ミリ秒 = 1.0 + (角度 / 180.0)1.0 # 1.0 ~ 2.0 ms のデューティサイクルにマップ = (pulse_width_ms / 20.0)100.0 pwm.ChangeDutyCycle(duty_cycle) # --- 一般的なシナリオ: 新しいサーボのキャリブレーション --- # サーボを初めて統合するときは、 # 真の機械的限界を検証することが重要です。以下のコードは、安全なキャリブレーション ルーチンを示しています。 try: # 中心位置のテスト print("90 度への移動...") set_angle(90) time.sleep(2) # 0 度の位置のテスト (1.0 ms パルス) print("0 度への移動...") set_angle(0) time.sleep(2) # 180 度の位置のテスト (2.0 ms パルス) print("180 度への移動...") set_angle(180) time.sleep(2) # 中央に戻ります print("中央に戻ります。") set_angle(90) time.sleep(1) KeyboardInterrupt を除く: print("ユーザーによる停止") 最終的に: pwm.stop() GPIO.cleanup()
注: この方法ではデューティ サイクルの計算が使用されます。 50 Hz 信号の場合、1 ms パルスは (1/20) のデューティ サイクルに相当します。100 = 5%。 2 ms パルスは (2/20)100 = 10%.
コードが正しい場合でも、いくつかのハードウェア関連の問題により、サーボが機能しなくなる可能性があります。これらの一般的なシナリオを理解すると、問題を迅速に診断して解決するのに役立ちます。
1. 電力供給が不十分です:これは最も頻繁に発生する問題です。一般的なサーボは、移動時に 200 ~ 500 mA を消費し、さらに高いストール電流が発生する可能性があります。マイクロコントローラーの USB ポート (通常は 500 mA) では、特に複数のサーボの場合、不足することがよくあります。
解決:専用の外部電源 (例: バッテリー パックからの 5V または安定化されたベンチ電源) を使用します。マイコンのグランド(GND)が外部電源のグランドに接続されていることを確認してください。
2. 間違ったタイミング値:サーボがジッターしたり、ブザー音を立てたり、フルレンジに移動しない場合は、パルス幅の制限がサーボの仕様と一致していない可能性があります。
解決:正確なパルス幅範囲については、サーボのデータシートを参照してください。一般的な変動は 0.9 ミリ秒から 2.1 ミリ秒です。を調整します。PULSE_MIN_MSそしてPULSE_MAX_MSそれに応じてコード内の定数を変更します。
3. ソフトウェアPWMの周波数ドリフト:専用のハードウェア PWM ピンを持たない Raspberry Pi のようなプラットフォームでは、ソフトウェアで生成された PWM は、オペレーティング システムのマルチタスクによりタイミングの不一致が発生する可能性があります。
解決:クリティカルなアプリケーションや高速アプリケーションの場合は、タイミングを専用のハードウェア チップにオフロードする専用のサーボ コントローラ ボード (PCA9685 など) を使用して、安定した 50 Hz の生成を保証します。
PWM コードでサーボを正常に駆動するには、次の 3 つの基本原則を覚えておいてください。
1. 信号を標準化します。常に正確な 50 Hz 信号を生成するようにしてください。パルス幅は位置を制御する唯一の変数です。
2. 角度をパルスにマッピング:1.0 ms (0°) から 2.0 ms (180°) までの線形マッピングをベースラインとして使用します。この式は標準サーボの 90% 以上で機能します。
3. 電力を優先する:電源が必要な電流を供給できることを確認してください。サーボが不規則に動く場合は、コードの問題ではなく、ほとんどの場合電源の問題です。
アクションステップ:単一のサーボを使用して、選択したプラットフォームで単純なスイープ コードから始めます。スイープが機能したら、ハードコーディングされた角度をセンサー入力、ジョイスティック値、または計算された位置に置き換えて、サーボをより大きなプロジェクトに統合します。 50 Hz 規格を遵守し、電源を検証することで、あらゆるモーション コントロール アプリケーションのための堅牢な基盤を構築できます。
更新時間:2026-04-01