発行済み 2026-03-02
書くことに関して言えば、サーボコードを始めたばかりの多くの友人がここでつまづいています。舵は操作しやすそうに見えますが、実際に制御するコードを書いてみると、回転が不正確だったり、ジッターが発生したり、応答が遅かったりするなど、さまざまな問題が発生します。実際には、サーボ制御はそれほど神秘的ではありません。原理とよくある落とし穴を理解していれば、滑らかな制御コードを書くこともできます。
ステアリング ギアの動作の核となる秘密は、20 ミリ秒の周期信号にあります。簡単に言えば、内部にリファレンス回路があります。サーボ, 常にパルス信号を待っています。このパルスの幅によって、サーボ シャフトが停止する位置が決まります。
通常、90 度の中間位置に対応する 1.5 ミリ秒、0 度に対応する 0.5 ミリ秒、180 度に対応する 2.5 ミリ秒のパルスを使用します。なぜ 20 ミリ秒ごとに送信する必要があるのかと疑問に思うかもしれません。これは実際には業界標準であり、サーボに十分な応答と安定化時間を与えます。
これを理解すると、コードを書くことの本質がわかります。コードを書くことは、20 ミリ秒ごとに特定の幅のパルスをサーボに送信するだけではないでしょうか。あまり複雑に考えないでください。これはタイマーの繊細な仕事です。
最も直接的な方法は、マイクロコントローラーに付属の PWM モジュールを使用することです。これはこれを行うために生まれました。正確に 20 ミリ秒ごとにオーバーフローするように、タイマーの周波数分割とカウント期間を設定するだけで済みます。
次に、比較レジスタの値を対応する角度のパルス幅に設定します。たとえば、サーボを 0 度に回転させたい場合は、PWM ハイレベル時間を 0.5 ミリ秒に設定します。このプロセスは、目覚まし時計を設定するのと似ており、いつ、どのくらいの時間鳴らすかを設定します。
️ 具体的な操作手順は、実際には次の 3 つのステップです。
1. タイマーを初期化し、50Hz の周波数で実行させます。
2. PWM 出力チャネルを構成し、極性を設定します
3. 0 ~ 180 度を 0.5 ~ 2.5 ミリ秒にマッピングする角度変換関数を作成します。
マイクロコントローラーに PWM モジュールが搭載されていない場合でも、慌てる必要はありません。通常の IO ポートを使用し、遅延機能を追加することで実現できますが、CPU は常にビジー状態でなければならず、他の作業を行うことができません。
ふるいのように震えるサーボに遭遇したとき、自分の人生を疑ってはいけません。おそらく、コード内のパルスが不安定です。最も一般的な落とし穴は、割り込みが PWM 生成に干渉することです。
たとえば、シリアルポートの割り込みをオンにして数マイクロ秒間データを受信すると、1.5ミリ秒送信されるはずのパルスが1.6ミリ秒になり、サーボが振れてしまいます。解決策は、PWM に最高の優先順位を与えるか、ハードウェア PWM を使用して周辺機器によって完全に管理され、CPU に依存しないようにすることです。
電力供給が不十分な場合も揺れの原因となります。サーボの始動電流は、特に負荷がかかっている場合に非常に大きくなります。サーボが回転するとすぐにマイクロコントローラーがリセットされたり、サーボが勝手に震えたりする場合は、電源をすぐに確認し、十分な電源アダプターと交換してください。
この問題は実際には非常に一般的です。 1.5 ミリ秒が 90 度に相当すると明確に計算しましたが、サーボは 85 度まで回転しただけで動きを停止しました。ここには細かい点があります。サーボのブランドが異なると、同じパルス幅に対応する角度が異なる場合があります。
これは、ギアギャップが大きく、ポテンショメータの精度が平凡な安価なサーボの場合に特に顕著です。解決策は、コードに微調整を追加することです。プログラム内で各角度のパルス幅値を微調整できるキャリブレーション関数を作成します。
機械的な限界の問題もあります。サーボが所定の位置に到達していません。何かが引っかかっている可能性があります。この時、無理にパルス幅を大きくして押し通すとサーボが焼き付くだけです。コード内のパルス幅を必ず制限し、コマンド値がサーボの物理制限を超えないようにしてください。
ロボットまたはロボット アームを作成したい場合は、複数のステアリング ギアが必要です。各サーボが個別の PWM チャネルを使用する場合、マイクロコントローラーのピンでは十分ではありません。このとき、サーボコントロールパネルまたはソフトウェアシミュレーション方法を使用する必要があります。
このような専用のサーボドライバチップを使用するのが最も安心です。 1 つの I2C インターフェイスで 16 チャンネルのサーボを制御できます。コードもシンプルです。ライブラリ関数を記述するだけで角度を直接調整できます。タイマーを使用して自分でシミュレートする場合は、一度に 1 つのサーボ パルスを順番に処理するように時限割り込みを設定できます。
複数のサーボを同時に動作させる場合、電源圧力が大きくなりますのでご注意ください。大電流サーボがすべて同時に回転しないように、時間をずらして開始するようにコードで開始シーケンスを設計できます。これにより、電圧降下を効果的に回避できます。
書いたコードを入れてみると舵は動きましたが、やはり違和感を感じました。このとき、ただ見るだけではダメで、データを使って語らなければなりません。最も簡単な方法は、シリアルポートを出力し、毎回送信されるパルス幅値を出力して、理論値とどの程度異なるかを確認することです。
ロジック アナライザーを使用して PWM 波形をキャプチャすることもできます。パルス幅が正確か、周期が安定しているかが一目でわかります。パルスの不具合や周期の長短など、波形を見れば一目で分かる問題も多くあります。
サーボをデバッグするもう 1 つの愚かな方法は、セクションごとにテストすることです。最初に 0 度の位置を個別にテストし、次に 90 度、最後に 180 度の位置をテストして、各点の位置が正しいかどうかを確認します。特定の点が不正確である場合、基本的にはそのパルス幅に対応する計算に何か問題があります。
そういえば、ステアリングの前進速度と後進速度が異なる状況に遭遇したことはありませんか?落とし穴の経験をコメント欄で共有してください。役に立ったと思ったら、「いいね」を押してサポートして、サーボをプレイするより多くの友達がこの記事を見てもらえるようにしてください~
更新時間:2026-03-02