発行済み 2026-05-06
このような状況に遭遇したことがありますか?
サーボを電源に接続しても応答がありません。プログラムを書いた後、ランダムなジッターが発生しました。もちろん指示に従いましたが、回すことができませんでした。
慌てないで。あなた一人じゃありません。
今回は51マイコンを使ってサーボの制御を徹底解説していきます。複雑な数学的内容や理解できないレジスタ テーブルはなく、最も直接的なアイデアと最も実用的なコード フレームワークだけが存在します。
この重要な点を覚えておいてください。サーボが静止したままである場合、それは主にタイミングの問題が原因です。サーボがランダムに動く場合は、電源不足が原因である可能性があります。
準備はできたか?
01 ステアリングギアとは何ですか?
多くの人は初めてサーボを手に入れ、それをモーターだと思います。電気を入れると点灯可能です。
間違っている。
ステアリングギアは普通のモーターではありません。それはむしろ「頭脳」を持った小さなロボットのようなものです。
コマンドを与えると、指定した角度に回転します。それからやめてください。立ち止まってください。
内部の小さなポテンショメータと制御基板を使ってこれをどのように実現しているのでしょうか?パルスを送信すると、いくつかのジェスチャーが行われ、その位置に到達するとロックされます。
したがって、ステアリング ギアを制御するために、PID を書き込んだり、閉ループ計算を実行したりする必要はありません。学ぶ必要があるのは 1 つだけです。パルスを送信することです。
02 基本原則: 1 つの数字で角度を変えることができる
データシートを開きます。この文を見つけてください: 高レベルのパルス幅は角度に対応します。
簡単に言うと、0.5 ミリ秒の高レベルは 0 度に回転し、1.5 ミリ秒続くと 90 度回転し、2.5 ミリ秒続くと 180 度回転します。
周期は 20 ミリ秒に固定されています。
明らかですか?サーボを制御するということは、実際には IO ポートを制御し、ポートを引き上げて一定時間待機し、その後引き下げて残りの時間を待機することを意味します。
それはとても簡単です。
たとえば、90 度回転するパルスは次のようになります。
まず、上向きのプルアップ操作を実行し、次に 1.5 ミリ秒の遅延を実行し、次に下向きのプルダウン操作を実行し、次に 18.5 ミリ秒の遅延を実行し、上記の手順を無限ループで繰り返します。
これは完全な制御サイクルです。
03 プログラムを書く前に環境を整える
豪華な装備は必要ありません。
51 マイクロコントローラー (STC89C52 で十分)

サーボ(一般的なSG90またはMG995で十分です)
デュポン製ワイヤー数本
5 V 電源があるため、マイクロコントローラーからの電力供給を期待しないでください。重要なことを 3 回言いますが、マイクロコントローラーで動作することを期待しないでください。
サーボが揺れてうまく回らない人も多いです。プログラムエラーではなく、電力不足です。
サーボが起動する瞬間、電流は 1A 以上に達する可能性があり、USB から引き出される少量の電力では完全に供給できません。
何をするか?外部電源。共通点。共通点。共通点。
電源のプラス端子は VCC、電源のマイナス端子は GND にしてください。マイコンのGNDも電源GNDに接続し、信号線をマイコンのIOポートに接続する必要があります。
回路は繋がっていますか?おめでとう。最も難しい半分が完了しました。
04 実践的なコーディング: 最も単純なものから始める
私たちはフェイクはしません。実行できるコードを直接指定します。
ポイント: タイマを使用して20ms周期の割り込みを発生させ、割り込み時のHレベルの継続時間を柔軟に制御します。。
アイデア:
現在必要な高レベルの時間を格納する変数を定義します (例: 15)。この 15 は 1500 マイクロ秒 (1.5 ミリ秒) を表します。。
各 20ms 期間の開始時に、まず IO ポートを High に引き上げます。
ハイレベル時間を遅らせます。
IOポートをプルダウンします。
残り時間を遅らせる。
疑似コードとして記述すると次のようになります。
void main() { タイマーを初期化します (20ms 割り込みを設定します); while(1) { // 何もせず、割り込みに依存します } } void timer Interrupt () Interrupt 1 { Pull High;遅延 (ハイレベル時間);低く引く。遅延 (20ms - ハイレベル時間); }
重要: マイクロ秒レベルの正確な遅延を実現するには、遅延関数を使用する必要があります。 51 マイクロコントローラーのメイン周波数が 11.0592MHz の場合、1 nop は約 1.085 マイクロ秒に相当します。 late_us 関数を作成するには、関数はマイクロ秒数を渡し、while ループを通じてそれを減算することで実装する必要があります。
トラブルを恐れないでください。この種の逐次比較デバッグは、組み込みシステムでは標準的です。
05 舵を動かしてみましょう:前進、後進、任意の角度
ここで、次のことを達成する必要があります。ボタン 1 を押し、0 度に回転します。ボタン2を押して90度回転します。ボタン3を押して180度回転させます。
疑似コードにキー検出を追加します。
(ボタン 1 が押された場合) ハイレベル時間 = 500; // 0.5ms -> 0 度 (ボタン 2 が押された場合) ハイレベル時間 = 1500; // 1.5ms -> 90 度 (ボタン 3 が押された場合) ハイレベル時間 = 2500; // 2.5ms -> 180 度

重要: 高レベルの時間単位はマイクロ秒です。 500、1500、2500。
1、2、3 は書かないでください。これはミリ秒です。 1000倍悪い。
じゃあ何?すると、サーボは対応する角度に素直に回転します。
信じられないですか?試してみてください。
06 踏んでしまったかもしれない落とし穴(Q/A)
Q: サーボが回らず、ブザー音が鳴るだけですか?
まず、A、電源電流が不足しているか、パルス幅が不正確です。電源を5V/2A以上の電源に変更し、ハイレベル時間が500~2500usの間にあるかを確認する必要があります。
Q: サーボは回りますが、揺れがひどいのですが?
Aの場合、隣り合う2つの制御周期の差が大きすぎる、または電源にリップルがある場合は、サーボ電源の両端に大きなコンデンサ(値470uF)を追加してください。
Q: プログラムが焼き付けられているときは応答がありませんが、信号ケーブルを抜くと脇に戻りますか?
A: 初期のIOポートのレベル状態が不定、またはハイレベルの時間が規定の範囲を超えています。デバイスの電源を入れるときは、まず IO ポートのレベルを Low にしてから、初期値を与える必要があります。。
Q: 連続回転(360度サーボなど)を制御したいですか?
これで問題が解決しない場合は、360 度連続回転できるサーボに交換する必要があります。ハイレベルが1.5msになるとサーボは回転を停止します。 1.5msより大きい場合、サーボは正転します。 1.5ms未満だとサーボが逆回転してしまいます。
Q: オシロスコープが手元にない場合、パルスが正しいことをどうやって確認できますか?
1 秒ごとに 0 度から 90 度の間で切り替わるようにサーボをプログラムします。ロジックアナライザまたは簡単な LED メソッドを使用して、そのスイングが規則的であるかどうかを観察します。
07 アップグレード: 描いた曲線に従ってサーボを動かします
角度がハードコーディングされたプログラムは初歩的すぎます。
より高度な遊び方: サーボを 0 度から 180 度までゆっくりと動かし、その後ゆっくりと戻します。
やり方は?
angle というループ変数を使用して 0 から 180 まで増加させます。ステップ値は大きすぎてはなりません。たとえば、毎回 1 度ずつ増加します。。
1 度増加するごとに、高レベル時間を再計算します。
ハイレベル時間は、500 に角度を掛けた値に 2000 を掛け、それを 180 で割った値に等しくなります。
500 は 0 度に対応し、2500 は 180 度に対応し、合計範囲は 2000 マイクロ秒であり、180 等分に分割されることに注意してください。
その後、20ms 遅延します。もう一度やってください。
その効果はスムーズなスイングです。ロボットが手を振っているみたいに。
これを「サーボキネマティクス」と呼ぶこともできますが、その名前に怯える必要はありません。本質的には、これは一種の線形補間です。
08 さらに一歩前進: シリアルポートを使用してサーボをリモート制御します
シリアル通信を追加します。コンピューターが数値を送信すると、サーボが対応する角度に回転します。
たとえば、「0」と発音して 0 度回転します。 「90」と言って90度回転します。
重要なポイント:
マイコンのシリアルポート受信割り込みでは、文字列が解析されます。
注:一度にすべてを収集できない場合があります。改行文字を受信したかどうかを判断します。
完全な番号を受け取った後、範囲は 0 ~ 180 に制限されます。
上位レベルの時刻に変換し、変数を更新します。
このようにして、サーボはプログラム可能なアクチュエーターになります。 Bluetooth モジュールに接続すると、携帯電話でも制御できます。
09 まとめ:ステアリングギアを制御する3つの要素
電源。十分な電流を供給し、共通グランドへの電圧を安定させます。
タイミング。周期 20ms、高レベル 500 ~ 2500us。
ブロック操作を実行せず、待機し続ける遅延を使用する代わりにタイマー割り込みを使用します。そうしないと、何もできなくなります。
これら 3 つをマスターすれば、市販されているサーボの 99% を制御できるようになります。
プログラムを作成するときは、「プログラムがスムーズに実行できれば十分」ではなく、「電源が突然不安定になったらどうなるか」をもう一歩考えてください。
10 さあ、あなたが行動する番です
この記事を単なるコレクションと見なさないでください。 Keil の電源を入れ、開発ボードを適切に接続し、上記のコードを 1 回入力します。
最初の3回は回らない可能性が高いです。急いではいけません。マルチメータで電圧を測定し、ロジック アナライザを使用して波形をキャプチャします。どうしてもどうしようもない場合はサーボを交換してみてください。
問題を解くたびに、組み込み性についての理解が深まります。
数年後に振り返ると、ステアリングギアをマスターしたその日が、「コードによる物理世界の制御」を真に理解するための出発点だったことがわかります。。
あなたの手の中でブンブン音を立てる小さなサーボが、ロボットの世界への最初の鍵です。
もう待たないでください。今すぐパワーアップしてください。
試してみてください。
更新時間:2026-05-06