発行済み 2026-04-04
この記事は、標準のプログラムを制御するプログラムを作成するための完全で実践的なガイドを提供します。サーボモーター。正確なコード構造、重要な PWM 信号パラメーター、および一般的なマイクロコントローラーを使用して実際のサンプルを実装する方法を学びます。ブランド固有のプラットフォームや独自のプラットフォームは必要ありません。原則は普遍的に適用されます。
あサーボモーターの位置は、繰り返しパルス (パルス幅変調、PWM) の幅によってのみ決定されます。サーボ制御プログラムを作成するには、50 Hz 信号 (周期 = 20 ミリ秒) を生成し、High パルス幅を 1.0 ms ~ 2.0 ms の間で変更する必要があります。この 1 つのルールが、すべての標準サーボ プログラミングの基礎となります。
1.0msパルス→0度(反時計回りいっぱい)
1.5msパルス→90度(センターポジション)
2.0msパルス → 180度(時計回りいっぱい)
このガイドに従うには、次のコンポーネントを準備します (一般的な説明、ブランド名は含まれません)。
標準 5V サーボモーター 1 台 (3 線: 電源、アース、信号)
1 つのマイクロコントローラー ボード (一般的な 5V ロジック ボード)
1 つの外部 5V 電源 (サーボが高電流を消費する場合)
ジャンパー線とブレッドボード
コードの前に、物理接続を確立します。
よくあるケースの例:初心者はサーボの電源をマイクロコントローラーの 5V ピンに直接接続することがよくあります。サーボが動くとサーボ電流により基板がリセットされます。解決策: グランドを共有した外部 5V 電源 (単三電池 4 本など) を使用します。
すべてのサーボ プログラムは、最初に PWM 信号パラメータを設定する必要があります。以下は一般的なコード構造です (C に似た環境に適応可能)。
// 1. 定数を定義します (これらの値は変更しないでください) #define SERVO_PIN 9 #define PWM_FREQUENCY_HZ 50 // 50 Hz = 20 ms 周期 #define PULSE_MIN_US 1000 // 0°の場合は 1.0 ms #define PULSE_MID_US 1500 // 90°の場合は 1.5 ms #define PULSE_MAX_US 2000 // 180°で 2.0 ミリ秒// 2. セットアップ関数 (電源投入時に一度実行)void setup() { // ピンを出力として設定 pinMode(SERVO_PIN, OUTPUT); // 50 Hz および 1.5 ms の初期パルス (中心位置) 用に PWM ハードウェアを構成します configurePWM(SERVO_PIN, PWM_FREQUENCY_HZ, PULSE_MID_US);遅延(1000); // サーボが安定するまで待ちます }// 3. ヘルパー: 角度 (0 ~ 180) をマイクロ秒単位のパルス幅に変換します。int angleToPulse(int angle) { // 線形マッピング: 角度 0 -> 1000us、角度 180 -> 2000us return PULSE_MIN_US + (angle(PULSE_MAX_US - PULSE_MIN_US) / 180); }
サーボを特定の角度に移動するメイン ロジック:
// サーボを指定の角度 (0 ~ 180) に移動し、その位置を保持しますvoid setServoAngle(int angle) { // 有効範囲内のクランプ角度 if (angle 180) angle = 180; intpulseWidthUs = angleToPulse(角度);// 指定された High パルスで単一の 20 ms サイクルを生成しますgeneratePulse(SERVO_PIN,pulseWidthUs); // パルス幅 Us マイクロ秒では High 遅延マイクロ秒(pulseWidthUs);デジタル書き込み(SERVO_PIN,LOW);遅延(20 - (pulseWidthUs / 1000.0)); // 20 ミリ秒期間の残り }
![]()
注記:の生成パルス()抽象化は、ハードウェア レジスタの直接操作を表します。実際の実装では、マイクロコントローラーの組み込み PWM ペリフェラルまたはソフトウェアのビットバンギング方式を使用します。
以下は、サーボを 0° から 180° までスイープし、またその逆にスイープし、動きを観察するための遅延を伴う完全なプログラムです。この例では、任意のデジタル ピンで機能する一般的なビットバンギング アプローチを使用します。
// 完全に動作するコード (ライブラリは不要、プラットフォームに依存しない) int servoPin = 9; unsigned longpreviousMicros = 0; int currentAngle = 0; int stepDirection = 1; // 1 = 角度を増加、-1 = 減少 void setup() { pinMode(servoPin, OUTPUT); // 90° (中心) から開始 currentAngle = 90; voidループ(){unsignedlong currentMicros = micros(); // 20 ms (50 Hz) ごとにサーボ位置をリフレッシュ if (currentMicros -PreviousMicros >= 20000) {PreviousMicros = currentMicros; // 現在の角度の PWM パルスを送信します intpulseWidth = 1000 + (currentAngle 1000 / 180); // 1000us ~ 2000usdigitalWrite(servoPin, HIGH);遅延マイクロ秒(パルス幅);デジタル書き込み(サーボピン、LOW); // スイープ効果の角度を変更します (オプション) currentAngle += stepDirection; if (currentAngle >= 180) { currentAngle = 180;ステップ方向 = -1;遅延(500); // 極端なところで一時停止します } else if (currentAngle
よくあるケースの例:ユーザーは、20 ミリ秒ではなく 5 ミリ秒ごとにパルスを送信するコードを作成します。サーボが信号を受信する速度が速すぎるため、過熱し、振動します。修正方法は、各パルスの開始間隔が正確に 20 ミリ秒になるようにすることです。
マルチタスク (サーボを動かしながらセンサーを読み取るなど) を行う必要があるプロジェクトの場合は、ステート マシンを使用せずにステート マシンを使用します。遅れ():
unsigned long lastPulseTime = 0; int targetAngle = 90; int currentPulseWidth = 1500; // 中心から開始 void updateServoNonBlocking() { unsigned long now = micros(); if (now - lastPulseTime >= 20000) { // 20 ミリ秒が経過しました lastPulseTime = now; // targetAngle からターゲット パルス幅を計算 int targetPulse = 1000 + (targetAngle * 1000 / 180); // ターゲットに徐々に移動します (スムーズな動き) if (currentPulseWidth targetPulse) currentPulseWidth--;デジタル書き込み(サーボピン、HIGH);遅延マイクロ秒(現在のパルス幅);デジタル書き込み(サーボピン、LOW); } }
電話updateServoNonBlocking()メインループ内で繰り返し実行します。
1. サーボ位置は高パルス幅のみに依存します– 1.0 ms (0°)、1.5 ms (90°)、2.0 ms (180°)。他に角度を変えるものは何もありません。
2. パルスは 20 ミリ秒ごとに繰り返す必要があります (50 Hz)– ずれがあると、ジッター、過熱、または動作不能の原因となります。
最小限のテスト プログラムから始めるサーボを90°に設定して保持するだけです。ホーンが中心にあることを分度器で確認します。これにより、スイープまたはセンサー ロジックを追加する前に、タイミングが正しいことが確認されます。
ロジックアナライザーまたはオシロスコープを使用する信号ピン上の実際の信号を測定します。測定されたパルス幅をコードの意図した値と比較します。これは最も信頼性の高いデバッグ方法です。
必ず別の電源を使用してください200 mA を超える電流を消費するサーボの場合。マイクロコントローラーと電力を共有すると、リセットや不安定な動作が発生します。すべてのアースを一緒に接続します。
100 ~ 470 µF の電解コンデンサを追加しますサーボの近くのサーボの電源端子とアース端子間に接続します。これにより電気ノイズが低減され、制御信号が安定します。
パルスのタイミング定数を文書化するコード内で直接マイクロ秒単位で指定します。これは、数か月後にプロジェクトを再検討するときに役立ちます。
このガイドに従うことで、既製のライブラリに依存せずに、任意のマイクロコントローラー プラットフォーム上で信頼性の高いサーボ制御プログラムを作成できます。コアとなる PWM 原理は、すべてのシステムで同じです。リアルタイム アプリケーション用にノンブロッキング サンプルを実装し、常に測定ツールを使用してパルス幅を検証します。
更新時間:2026-04-04