発行済み 2026-02-24
で遊ぶサーボ: 51 MCU の入門から実戦まで、この記事が役立ちます!
あなたの革新的な製品に、正確にスイングできる「ジョイント」を追加することを考えていますか?ステアリングギアというと非常に専門的に聞こえますが、実際は思っているほど難しくありません。特に、クラシック 51 マイクロコントローラーとの接続は、初心者レベルのメーカーにとって優れた方法です。多くの友人が初めてそれに触ったとき、最大の頭痛の種は、それがどのように動くのか、そしてコードを使用してどのように制御できるのかが理解できないことでした。心配しないでください。今日はそれについて徹底的に説明します。読んだ後は必ず自信を持っていただけるようにします。
率直に言って、サーボ特に従順な「小さな回転警備員」のようなものです。モーター、減速機、制御回路を一体化しています。どの角度に曲がるかを指示すると、その位置に到達して着実に停止するように一生懸命働きます。
このコマンドは、PWM (パルス幅変調) と呼ばれる信号を通じて伝えられます。これは、高レベルと低レベルのパルスが繰り返されるものと考えることができ、パルスの幅、つまり高レベルの期間がステアリング ギアの「動作信号」となります。
一般サーボSG90 などの小型サーボは、20 ミリ秒周期のパルスを認識します。このうち、ハイレベル時間約1.5ミリ秒が中間位置(90度)に相当する。パルス幅が0.5ミリ秒から2.5ミリ秒の間で変化すると、サーボ軸は0度から180度の範囲で回転します。与えるパルス幅が正確であればあるほど、より正確に回転します。
51 マイクロコントローラー自体は、そのような正確なパルス幅信号を直接出力しませんが、プログラミングを通じてそれを「シミュレート」することができます。これには、非常に正確な「タイマー」であるマイクロコントローラー内のタイマーを使用する必要があります。
10 マイクロ秒または 100 マイクロ秒ごとに割り込みを生成するようにタイマーを設定できます。割り込みサービスプログラムでは変数を使ってカウントし、このカウンタの値に応じてサーボに接続されているIOポート(P1.0など)のレベルを変更します。
たとえば、1.5 ミリ秒間ハイ レベルを出力するには、タイマーが 100 マイクロ秒に 1 回割り込む場合、15 回の割り込みの間ハイ レベルを維持する必要があります。このようにして、サーボが認識できる PWM 波形を「つなぎ合わせる」ことができます。初めてコードを書き始めるときは少し戸惑うかもしれませんが、自分でデバッグに成功すると、その達成感は格別です。
市場には多くの種類のサーボがあります。 51 マイクロコントローラーの「パートナー」の選択は、主に動作電圧と信号要件の 2 つの点によって決まります。最も一般的に使用されるのは、SG90 などのアナログ サーボです。信号要件は上で述べた標準 PWM であり、非常に使いやすいものです。
これらのサーボは通常、5V 電圧で動作します。これは、51 マイクロコントローラーの標準動作電圧と正確に一致します。マイコンのIOポートドライバーを直接使用できますか?サーボが動作しているときの電流は比較的大きく、マイクロコントローラーのピンが損傷する可能性があるため、行わないことをお勧めします。
より安全なアプローチは、絶縁に三極管または専用のレベル変換チップを使用することです。マイクロコントローラーの IO ポートは駆動回路に制御信号を出力し、駆動回路はステアリング ギアの回転を「命令」します。このようにして、マイクロコントローラーは「頭脳」命令の出力のみを担当し、ハードワークはドライバー部分に任せることになり、システムの安定性と信頼性が向上します。
多くの友人は、初めてサーボを回すと、サーボが激しく震えたり、反応が半拍遅くなったりすることに気づくかもしれません。これはおそらく電源の問題です。サーボの始動時およびロック時の電流への影響は過小評価できません。電源が不足すると電圧がプルダウンされ、マイコンがリセットしたり、サーボが異常動作したりすることがあります。
解決策は簡単です。サーボに個別に電力を供給します。より高品質の 5V 電源を使用し、電源グランド (GND) とマイクロコントローラのグランドを一緒に接続して、それらが共通の基準電位を持つようにします。そうすれば、マイクロコントローラーの電源とサーボの電源を分離して、干渉を効果的に回避できます。
また、PWM 周期が 20 ミリ秒で厳密に安定していることを確認してください。他のタスクによりプログラムがブロックされ、パルス周期が不正確になると、サーボも振動します。安定した信号を生成するには、タイマー割り込みの優先順位を十分に高くすることが重要です。
サーボを 0 度から 180 度までゆっくりと回転させ、また元に戻すようにしたいと考えています。コードはどのように書けばよいのでしょうか?角度とパルス幅のマッピング関数を定義できます。たとえば、0 度は 0.5 ミリ秒の高レベルに対応し、180 度は 2.5 ミリ秒に対応します。すると90度は1.5msです。
メインループでは、for ループを使用して角度変数を 0 から 180 まで増分し、1 度変化するたびに PWM 比較値をリセットします。サーボが物理的に回転するために、各角度の間に少しの時間を置く必要があることに注意してください (15 ~ 20 ミリ秒の遅延など)。こうすることで、アクションが一貫してスムーズに見えます。
より柔軟にするために、サーボの制御を次のような関数にカプセル化できます。void (文字角)、角度値を渡すと、PWM パラメータが関数内で自動的に計算され、更新されます。このようにして、後で腕を上げる、カメラを回すなどの動作を制御したい場合、この関数を呼び出すだけで済み、メイン プログラムが非常にすっきりします。
多自由度ロボット アームの作成など、プロジェクトで複数のサーボを同時に制御する必要がある場合、状況は少し複雑になります。 51 マイクロコントローラーのリソースは限られているため、各サーボに独立したハードウェア PWM を装備することは不可能です。
ただし、心配しないでください。ソフトウェア シミュレーションは引き続き使用できます。中心となるアイデアは、依然としてタイマー割り込みで「タイム スライス」の概念を使用することです。たとえば、10ミリ秒の周期を設定し、この周期内で各サーボが必要なパルス幅を順番に出力します。最初のサーボのパルスを処理した後、すぐに 2 番目のサーボのパルス出力に切り替えます。
これには、タイマー割り込み処理関数が非常に効率的であり、遅延や複雑な計算を実行できないことが必要です。通常のアプローチは、各サーボの現在のターゲット パルス幅を保存する配列を作成することです。割り込みでは、テーブルを確認して、現在使用中のサーボのシリアル番号に従って IO ポートを設定し、正確に時間を計測します。このようにして、1 つのタイマーで複数のサーボを「個別に」管理できます。それらを同時に完全に動かすことはできませんが、人間の目はこのわずかな時間差を感知することができません。
これを見て、51 マイコンを使用してサーボを制御する方法についてはすでに明確に理解できましたか?原理から選択、コードの実装に至るまで、どのステップも実際には非常に興味深いものです。もし今手元にアイデアがあるなら、コンピュータの電源を入れ、マイクロコントローラ開発ボードを取り出し、自分で接続してみるのもいいかもしれません。初めてコード通りにサーボが正確に回転した時の感動は創作の喜びです。
聞きたいのですが、サーボとマイコンを使って最も組み立ててみたいガジェットは何ですか?それは太陽光を自動的に追跡するガジェットでしょうか、それとも絵を描くことができる小さなロボットでしょうか?コメント欄にメッセージを残してご意見を共有してください。一緒にコミュニケーションをとり、より良い火花を生み出すことができるかもしれません。この記事が役に立った場合は、忘れずに「いいね」を押して、それを必要とするさらに多くの友達と共有してください。
更新時間:2026-02-24