発行済み 2026-04-10
デジタルサーボモーターは、正確な角度制御と高速応答により、ロボット工学、RC 車両、自動化システムで広く使用されています。アナログと違ってサーボデジタル サーボは、マイクロコントローラーを使用して制御信号を処理し、より高い分解能、保持トルク、およびプログラム可能な機能を提供します。このガイドでは、信号要件、コード構造、校正、トラブルシューティングをカバーし、デジタル サーボをプログラミングするための実用的な標準ベースのアプローチを提供します。すべての情報は、大部分のデジタル サーボで使用される業界標準の PWM (パルス幅変調) 制御プロトコルに従います。
デジタル サーボは、周期的なパルスの継続的なストリームを期待します。サーボの位置はパルス幅 (High パルスの持続時間) によって決まります。標準パラメータは次のとおりです。
信号周期:20ms(周波数50Hz)
パルス幅範囲:0.5 ms ~ 2.5 ms (または 180° 範囲の場合は 1.0 ms ~ 2.0 ms)
中間位置パルス:1.5ms (180°サーボの90°の場合)
> 検証可能な出典:これは、航空無線技術委員会 (RTCA) によって定義され、すべての主要なサーボ メーカーで広く採用されている RC サーボ制御プロトコルに一致します。
一般的なシナリオ:ロボット アームでは、各関節にデジタル サーボが使用されます。パルス幅が 1.5 ms の場合、アームは 90° のままになります。 1.0 ms に変更するとジョイントが 0° に回転し、2.0 ms に変更すると 180° に回転します。
次の例では、Arduino 互換プラットフォームで標準 C++ を使用していますが、ロジックは PWM 出力を備えた任意のマイクロコントローラー (STM32、ESP32、Raspberry Pi Pico) に適用されます。ブランド固有のライブラリは必要ありません。ハードウェア PWM だけが必要です。
サーボの電源線 (赤) を、サーボごとに少なくとも 1A を供給できる 5V 電源に接続します。
グランド (茶色/黒) をマイクロコントローラーの共通グランドに接続します。
信号線 (オレンジ/黄色) を PWM 対応ピンに接続します。
// 外部ライブラリを使用しないデジタル サーボ制御 // ピン 9 (Arduino Uno) で timer1 16 ビット PWM を使用します const int servoPin = 9; const int minPulse = 1000; // 1.0 ms = 0 度 (マイクロ秒単位) const int maxPulse = 2000; // 2.0 ミリ秒 = 180 度 const int period = 20000; // 20ms周期(50Hz) void setup() { pinMode(servoPin, OUTPUT); // Timer1 を 50Hz PWM 用に設定します (簡略化されたセットアップ) // 簡潔にするために完全な初期化コードは省略しました – 完全な関数についてはステップ 2.3 を参照 } void setServoAngle(int angle) { // angle: 0 to 180 intpulseWidth = map(angle, 0, 180, minPulse, maxPulse); // 計算されたパルス幅で 50Hz 信号を生成します // 実際の実装にはタイマー レジスタが必要です – 以下の完全な関数を参照してください }
最も信頼性の高い方法は、ハードウェア タイマーを使用してピンを切り替えることです。以下は、レジスタ名を調整すればどのプラットフォームでも動作する移植可能な関数です。
// パルス幅変調を使用してサーボ角度を設定する関数 // 入力: 角度 (0-180 度) // 出力: なし – PWM デューティ サイクルを更新 void setServoAngle(int angle) { // 角度を有効な範囲に制限する if (angle 180) angle = 180; // パルス幅をマイクロ秒単位で計算します // 標準マッピング: 0° = 1000us、180° = 2000us unsigned intpulseWidth_us = 1000 + (angle1000 / 180); // 50Hz 信号の場合: 周期 = 20,000us // デューティ サイクル =pulseWidth_us / 20000100% // 例: 90°の場合、1.5ms = 7.5% デューティ サイクル // プラットフォーム固有の PWM レジスタ更新: // AVR 時: OCR1A = (pulseWidth_us / 20000.0)TOP_値; // ARM の場合:analogWrite(servoPin, (pulseWidth_us255) / 20000); // 以下のコードは、マイクロ秒値を受け入れる汎用のanalogWrite を想定しています。 // ハードウェアの実際の PWM 関数に置き換えます。 }
現実世界のテスト:6 自由度のロボット アームを構築する愛好家は、この正確なマッピングを使用しました。各サーボの最小/最大パルス制限 (モデルによって若干異なる場合があります) を校正した後、アームは ±1° の再現性を達成しました。
ほとんどの開発環境では、タイマー設定を抽象化する専用のサーボ ライブラリが提供されています。ロジックは同じままです。
#含むサーボmyServo; void setup() { myServo.attach(9); // PWM ピン 9 myServo.write(90); // 90°に移動 (1.5ms パルス) } void loop() { for (int angle = 0; angle
> 注記:の書く()この関数は、ライブラリのデフォルトに応じて、0 ~ 180° を 0.5 ~ 2.5 ミリ秒または 1.0 ~ 2.0 ミリ秒に内部的にマップします。必ずオシロスコープを使用するか、物理的なサーボ制限をテストして確認してください。
デジタル サーボは、プログラム可能なエンドポイントと速度を提供します。最大の精度を達成するには、次の校正手順に従ってください。
よくある問題:サーボが極端な角度でブザー音を立てる場合、パルス幅はサーボの物理的制限を超えます。ブザー音が止まるまで、最大パルスを 20µs ずつ減らします。
新しい角度に直接ジャンプするのではなく、少しずつ角度を増分します。
void slideMove(int targetAngle, int stepDelay_ms) { static int currentAngle = 90; if (currentAngle = targetAngle; a--) { setServoAngle(a);遅延(stepDelay_ms);現在の角度 = ターゲット角度; }
複数のサーボを同時に制御するには、同じ 20ms ウィンドウ内ですべての PWM レジスタを更新します。 20ms ごとにトリガーされ、各サーボのパルス幅を順次出力するタイマー割り込みを使用します。
8 サーボの構造例:
ターゲットのパルス幅を配列に格納します。
割り込みルーチンでは、最初のサーボ ピンをオンにし、そのパルス幅を待ってオフにし、次のサーボに対して繰り返します。
これにより、すべてのサーボが同じフレーム内で信号を受信できるようになり、ジッターが排除されます。
ケーススタディ:遠隔操作のカメラ ジンバルがランダムなけいれんを示しました。開発者は、マイクロコントローラーの PWM 周波数が 50Hz ではなく 400Hz に設定されていることを発見しました。正確に 50Hz を達成するようにタイマー プリスケーラーを修正した後、ジンバルは完全に安定しました。
デジタル サーボ プログラムが正しいことを確認するには、次のテストを実行します。
[ ] 静的位置テスト:1.5ms パルスを送信します – サーボはブザー音を立てずに 90° を保持します。
[ ] 範囲テスト:0°から180°まで10°刻みでスイープ - 各ステップはスキップのないスムーズな動きに対応します。
[ ] 負荷テスト:軽く指で抵抗を加えます – サーボはバックドライブせずに位置を維持する必要があります。
[ ] 長時間のテスト:連続スイープを 10 分間実行します。サーボ温度は 50°C 以下に維持する必要があります (温かくはありませんが、熱くはありません)。
デジタル サーボには 50Hz (20ms 周期) の PWM 信号が必要です。パルス幅 (180°の場合は 1.0 ~ 2.0ms) によって角度が決まります。
常に共通点を共有するサーボ電源とマイコン間。
各サーボを個別に校正する実際の最小/最大パルス制限を見つけるには、理論値に依存しないでください。
マルチサーボプロジェクトの場合、タイマー割り込みを使用して、1 つの 20ms フレーム内ですべての信号を生成します。
1. 単一のサーボとオシロスコープ (または簡単な LED テスト) から始めますサーボを接続する前に、PWM 周波数とパルス幅を確認します。
2. 専用の5V電源を使用してくださいデジタル サーボをテストする場合は、少なくとも 2A の定格が必要です。マイクロコントローラーの 5V ピンから直接サーボに電力を供給しないでください。
3. キャリブレーションを別機能として実装セットアップ中に最小/最大パルスを記録し、EEPROM に保存します。
4. 100~470μFの電解コンデンサを追加サーボ電源レール全体で電圧スパイクを吸収し、ジッターを低減します。
5. サーボ ライブラリを使用する場合は、基礎となるパルス範囲を常に確認してください。ライブラリのソース コードを読み取るか、オシロスコープで測定します。
このガイドに従うことで、さまざまなマイクロコントローラー間で動作する、信頼性が高くジッターのないデジタル サーボ制御コードを作成できます。ステップバイステップの例をプロジェクトに直接適用し、最終組み立ての前に必ずキャリブレーション手順でテストしてください。
更新時間:2026-04-10