Arduinoでサーボモーターを制御する方法――角度指定の書き方から電源設計まで。
Servo.write()の基本構文から、PWM信号の仕組み、電源をArduino本体から取るか外部に用意するかの判断基準までを解説します。
目次
01なぜサーボモーターは電源設計でつまずきやすいのか
結論から言えば、Arduinoでサーボモーターを動かすコード自体は非常にシンプルである。Servo.write()に0〜180の角度を渡すだけで軸を指定した位置に動かせる。つまずきやすいのはコードではなく、電源の取り方の方である。サーボは負荷を受けて動きにくくなった瞬間に消費電流が急増する性質があり、Arduino本体の電源供給能力を超えると、動作が不安定になったり、最悪の場合マイコンボード側にも影響が及んだりする。
実例として、Arduinoやその互換ボードでサーボモーターを動かす際、これまでマイコンの5Vピンから直接給電していたが問題はなかったか、という質問がQ&Aサイトに寄せられている。Arduinoやespでサーボモータを動かす際の電源供給に関する質問(Yahoo!知恵袋)では、サーボがロックした場合に大きな電流が流れることが指摘され、質問者はこれまでマイコンボードの5Vピンから直接給電していたが、今後は別に電源を用意したいと考えるに至ったというやり取りが記録されている。
編集部見解:サーボモーターは「配線して角度を指定すればすぐ動く」という手軽さの一方で、電源設計を軽視すると原因の切り分けが難しい不具合につながりやすい部品だと考えられる。コードよりも先に、電源をどこから取るかを決めておく順序が結果的に近道になりやすい。
― YOFUKASI AI編集部
本記事では、Arduinoにおけるサーボ制御の基本構文から、PWM信号の仕組み、そして電源をArduino本体から取るか外部に用意するかの判断基準までを、初心者から中級者を対象に体系的に解説する。
02Arduinoにおけるサーボ制御の基礎知識
サーボモーター(servo motor)とは、指定した角度に軸を正確に動かせるモーターのことである。一般的なDCモーターが「回転させ続ける」のに対し、サーボモーターは「特定の角度で止める」ことに特化している。Arduinoでは標準ライブラリのServoを使うことで、この角度指定を簡単なコードで実現できる。
Servoライブラリの公式ページでは、Arduino公式「Servo」ライブラリページにおいて、このライブラリがArduinoボードにRC(ホビー用)サーボモーターを制御させるものであり、サーボにはギアと軸が内蔵されていて精密に制御できると説明されている。最小構成のコードは次のようになる。
#include <Servo.h>
Servo myservo; // サーボ制御用のオブジェクトを作成
void setup() {
myservo.attach(9); // 9番ピンにサーボを割り当て
myservo.write(90); // 中央(90度)の位置に動かす
}
void loop() {
}
用語の整理
- attach():Servoオブジェクトを、PWM対応のデジタルピンに割り当てる関数。
- write():0〜180の角度を指定して、サーボの軸をその角度に動かす関数。
- PWM(パルス幅変調):一定周期のパルスの幅(ON時間)を変化させることで、擬似的にアナログ的な制御を行う信号方式。サーボの角度制御に使われている。
Arduino公式の学習コンテンツでも、サーボモーターの基本的な使い方が紹介されている。Arduino公式「Servo Motor Basics with Arduino」では、一般的なサーボモーターの例として、待機時にはおよそ4.8〜6ボルト・5〜6ミリアンペア程度の電力しか必要としないが、動き始めるとより多くのエネルギーを消費し、電源からより多くの電流を引き込むようになると説明されている。この特性が、後述する電源設計の重要性につながっている。
サーボ制御を学ぶ前に、Arduinoの基礎文法や関数の作り方をまだ体系的に学んでいない場合は、先に基礎を押さえておくとこの先の理解がスムーズになる。Arduinoのコードの書き方の基礎はこちらの記事で詳しく解説している。
03サーボ制御の仕組みと技術的背景
サーボモーターは、約20ミリ秒周期のパルス信号を受け取り、そのパルスの幅(ON時間)に応じて軸の角度を変える。一般的に、約1.5ミリ秒(1500マイクロ秒)のパルスで中央(90度)の位置になり、パルス幅が短くなるほど一方向へ、長くなるほど反対方向へ動く。
この関係を実際にオシロスコープで可視化した実例がある。SG90サーボモータの使い方|ArduinoのPWM制御をオシロスコープで可視化(electwork.net)では、配線時にサーボの電源をArduino本体の5Vピンからではなく外部5V電源から取り、GNDのみをArduinoと共通にする構成が紹介されており、信号線はできるだけ短くし、信号線とGNDをツイスト(ねじる)し、電源線と信号線を離すといったノイズ対策が有効であると説明されている。
write()とwriteMicroseconds()の違い
Servo.write()は0〜180の「角度」を指定するのに対し、Servo.writeMicroseconds()はパルス幅そのものをマイクロ秒単位で直接指定する。サーボの個体差により、0度・180度に対応する実際のパルス幅がメーカーごとに微妙に異なることがあり、より精密な調整をしたい場合はこちらを使う。
同じ「180度」という指定でも、サーボの個体によって実際に動く物理的な角度範囲が微妙にずれることがある。複数のサーボを組み合わせるロボットアームのようなプロジェクトでは、writeMicroseconds()を使って個体ごとにパルス幅の上限・下限を調整し、動作範囲を揃える工夫が必要になる場合がある。
PWM対応のピンはArduinoのボードによって位置が決まっている。ピン配置をもう一度確認したい場合は、以下の記事も参考になる。
Arduinoメインボード徹底解説はこちらの記事で紹介している。PWM対応ピンの位置や仕様の基礎知識がまとまっている。
04電源の取り方の比較と選択肢
サーボモーターの電源をどこから取るかは、サーボの数と用途によって最適解が変わる。以下に3つの選択肢を整理する。
| 項目 | A. Arduino本体の5Vピン | B. 外部電源(GND共通) | C. サーボドライバボード(PCA9685等) |
|---|---|---|---|
| 向いている規模 | マイクロサーボ1個程度の動作確認 | サーボ数個〜、動作の安定性重視 | 多数のサーボを同時制御 |
| 配線の手軽さ | 高い(追加配線不要) | 中程度(GND共通化が必須) | やや低い(モジュール追加が必要) |
| 電源容量のリスク | 負荷時に不足しやすい | 外部電源の容量次第で余裕を持たせやすい | 専用ICで電流を安定供給 |
※各方式の適用範囲は編集部見解を含む。サーボモーターへの外部電源供給の必要性についてはArduinoでモータ再入門(その1)サーボモータの基本(DEVICE PLUS)を参照。同記事では、Arduinoから取り出せる電圧や電流だけではサーボの駆動に不足する場合がほとんどであり、外部から電源を取り、角度の制御信号のみArduinoから送る構成が案内されている。
動作確認レベルであればA案でも問題になりにくいが、実際にプロジェクトへ組み込む段階になったら、B案かC案への切り替えを検討するのが安全である。
05実践:サーボモーターを角度指定で動かす5ステップ
ここでは「可変抵抗(ポテンショメータ)を回した量に応じて、サーボの角度を連動させる」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。
-
STEP1. サーボと可変抵抗を配線する
サーボの信号線をPWM対応のデジタルピンへ、可変抵抗の出力をアナログ入力ピンへ接続する。
配線手順(テキスト版)- サーボの信号線(オレンジ)をArduinoのデジタルピン9番に接続する
- サーボの電源線(赤)をArduinoの5Vピンに、GND線(茶)をGNDピンに接続する
- 可変抵抗の両端をArduinoの5VとGNDに接続する
- 可変抵抗の中央端子(出力)をArduinoのアナログ入力A0に接続する
実例:動作確認レベルのため、まずはArduino本体の5Vからサーボに給電する構成で組んだ。 -
STEP2. Servoライブラリをインクルードし、オブジェクトを作成する
スケッチの冒頭で
#include <Servo.h>とし、Servo型の変数を宣言する。実例:#include <Servo.h>とServo myservo;を追加した。 -
STEP3. setup()でattach()する
setup()内で、サーボを接続したピン番号を指定してattach()を呼び出す。実例:void setup() { myservo.attach(9); }を記述した。 -
STEP4. 可変抵抗の値をmap()で角度に変換する
analogRead()で取得した0〜1023の値を、map()関数を使って0〜180の角度範囲に変換する。実例:int val = analogRead(A0); int angle = map(val, 0, 1023, 0, 180);という変換処理を追加した。 -
STEP5. write()で角度を反映し、動作を確認する
変換した角度を
write()に渡し、少し待機時間を入れてから次の読み取りに移る。実例:myservo.write(angle); delay(15);を追加。可変抵抗を回すとサーボが滑らかに追従することを確認した。負荷をかけて動きにくくした状態でつまみを大きく動かすと、一瞬動作が乱れる現象が見られたため、次のステップとして外部電源への切り替えを検討することにした(編集部想定シナリオ)。
ブレッドボード上での部品配置や配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。
06注意点・よくある誤解
動作確認レベルでは問題が出にくいが、サーボが負荷を受けて動きにくくなった瞬間には消費電流が急増する。この電流をArduino本体の電源供給能力が賄いきれないと、動作不良やボードの不安定化につながるおそれがある。複数のサーボや、負荷のかかる用途では外部電源の用意が推奨される。
外部電源を使う場合でも、Arduino側のGNDと外部電源側のGNDは必ず共通にする必要がある。GNDが共通になっていないと、信号線の電圧基準がずれてしまい、サーボが正しく反応しない、あるいは誤動作する原因になる。
write()で指定する0〜180という数値は、あくまでソフトウェア上の角度指定であり、サーボの個体差によって実際に動く物理的な範囲は多少前後する。精密な角度制御が必要な場合は、writeMicroseconds()でパルス幅を直接調整し、個体ごとのズレを補正することが必要になる。
07FAQ
参考文献
- Arduino公式ドキュメント編集チーム「Servo」Arduino Documentation, ライブラリページ. https://docs.arduino.cc/libraries/servo/
- Arduino公式ドキュメント編集チーム「Servo Motor Basics with Arduino」Arduino Documentation. https://docs.arduino.cc/learn/electronics/servo-motors
- DEVICE PLUS編集部「第57回 Arduinoでモータ再入門(その1)サーボモータの基本」DEVICE PLUS, 2022年再編集. https://deviceplus.jp/arduino/entry057
- electwork.net「SG90サーボモータの使い方|ArduinoのPWM制御をオシロスコープで可視化」electwork.net, 2026年. https://electwork.net/posts/arduino-servo-motor-pwm/
- Yahoo!知恵袋「arduinoやespでサーボモータを動かす際、サーボ用に別に電源供給用意することが推奨されているらしいですが」Yahoo!知恵袋, 2025年. https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12318809647
- 本文中の具体的な動作乱れの再現・原因特定エピソードは、断りのない限り編集部想定シナリオに基づく想定であり、実測データではありません。
関連記事(内部リンク)
- Arduinoのコードの書き方|基礎から応用まで全てがわかる初心者の手引き ― https://yofukasi-lab-wp.com/2025/03/07/arduino-cord/
- Arduinoメインボード徹底解説 ― 初心者からプロまで、これだけ読めば全てがわかる! ― https://yofukasi-lab-wp.com/2025/03/07/mainboard/
- 電子工作 ブレッドボード完全攻略ガイド ― これだけ読めば全てがわかる!(2026年更新版) ― https://yofukasi-lab-wp.com/2026/07/18/breadboard/
コメント