Arduinoでサーボモーターを制御する方法――角度指定の書き方から電源設計まで

プログラミング・電子工作






Arduinoでサーボモーターを制御する方法――角度指定の書き方から電源設計まで。|YOFUKASI AI




Arduino / 電子工作

Arduinoでサーボモーターを制御する方法――角度指定の書き方から電源設計まで。

Servo.write()の基本構文から、PWM信号の仕組み、電源をArduino本体から取るか外部に用意するかの判断基準までを解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約13分

Chapter 01 — Introduction

01なぜサーボモーターは電源設計でつまずきやすいのか

結論から言えば、Arduinoでサーボモーターを動かすコード自体は非常にシンプルである。Servo.write()に0〜180の角度を渡すだけで軸を指定した位置に動かせる。つまずきやすいのはコードではなく、電源の取り方の方である。サーボは負荷を受けて動きにくくなった瞬間に消費電流が急増する性質があり、Arduino本体の電源供給能力を超えると、動作が不安定になったり、最悪の場合マイコンボード側にも影響が及んだりする。

実例として、Arduinoやその互換ボードでサーボモーターを動かす際、これまでマイコンの5Vピンから直接給電していたが問題はなかったか、という質問がQ&Aサイトに寄せられている。Arduinoやespでサーボモータを動かす際の電源供給に関する質問(Yahoo!知恵袋)では、サーボがロックした場合に大きな電流が流れることが指摘され、質問者はこれまでマイコンボードの5Vピンから直接給電していたが、今後は別に電源を用意したいと考えるに至ったというやり取りが記録されている。

編集部見解:サーボモーターは「配線して角度を指定すればすぐ動く」という手軽さの一方で、電源設計を軽視すると原因の切り分けが難しい不具合につながりやすい部品だと考えられる。コードよりも先に、電源をどこから取るかを決めておく順序が結果的に近道になりやすい。
― YOFUKASI AI編集部

本記事では、Arduinoにおけるサーボ制御の基本構文から、PWM信号の仕組み、そして電源をArduino本体から取るか外部に用意するかの判断基準までを、初心者から中級者を対象に体系的に解説する。



Chapter 02 — Background

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のコードの書き方の基礎はこちらの記事で詳しく解説している

Chapter 03 — Mechanism

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対応ピンの位置や仕様の基礎知識がまとまっている。



Chapter 04 — Comparison

04電源の取り方の比較と選択肢

サーボモーターの電源をどこから取るかは、サーボの数と用途によって最適解が変わる。以下に3つの選択肢を整理する。

項目 A. Arduino本体の5Vピン B. 外部電源(GND共通) C. サーボドライバボード(PCA9685等)
向いている規模 マイクロサーボ1個程度の動作確認 サーボ数個〜、動作の安定性重視 多数のサーボを同時制御
配線の手軽さ 高い(追加配線不要) 中程度(GND共通化が必須) やや低い(モジュール追加が必要)
電源容量のリスク 負荷時に不足しやすい 外部電源の容量次第で余裕を持たせやすい 専用ICで電流を安定供給

※各方式の適用範囲は編集部見解を含む。サーボモーターへの外部電源供給の必要性についてはArduinoでモータ再入門(その1)サーボモータの基本(DEVICE PLUS)を参照。同記事では、Arduinoから取り出せる電圧や電流だけではサーボの駆動に不足する場合がほとんどであり、外部から電源を取り、角度の制御信号のみArduinoから送る構成が案内されている。

動作確認レベルであればA案でも問題になりにくいが、実際にプロジェクトへ組み込む段階になったら、B案かC案への切り替えを検討するのが安全である。

Chapter 05 — Practice

05実践:サーボモーターを角度指定で動かす5ステップ

ここでは「可変抵抗(ポテンショメータ)を回した量に応じて、サーボの角度を連動させる」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。

  1. STEP1. サーボと可変抵抗を配線する

    サーボの信号線をPWM対応のデジタルピンへ、可変抵抗の出力をアナログ入力ピンへ接続する。

    配線手順(テキスト版)

    1. サーボの信号線(オレンジ)をArduinoのデジタルピン9番に接続する
    2. サーボの電源線(赤)をArduinoの5Vピンに、GND線(茶)をGNDピンに接続する
    3. 可変抵抗の両端をArduinoの5VとGNDに接続する
    4. 可変抵抗の中央端子(出力)をArduinoのアナログ入力A0に接続する
    実例:動作確認レベルのため、まずはArduino本体の5Vからサーボに給電する構成で組んだ。
  2. STEP2. Servoライブラリをインクルードし、オブジェクトを作成する

    スケッチの冒頭で#include <Servo.h>とし、Servo型の変数を宣言する。

    実例:#include <Servo.h>Servo myservo;を追加した。
  3. STEP3. setup()でattach()する

    setup()内で、サーボを接続したピン番号を指定してattach()を呼び出す。

    実例:void setup() { myservo.attach(9); }を記述した。
  4. STEP4. 可変抵抗の値をmap()で角度に変換する

    analogRead()で取得した0〜1023の値を、map()関数を使って0〜180の角度範囲に変換する。

    実例:int val = analogRead(A0); int angle = map(val, 0, 1023, 0, 180);という変換処理を追加した。
  5. STEP5. write()で角度を反映し、動作を確認する

    変換した角度をwrite()に渡し、少し待機時間を入れてから次の読み取りに移る。

    実例:myservo.write(angle); delay(15);を追加。可変抵抗を回すとサーボが滑らかに追従することを確認した。負荷をかけて動きにくくした状態でつまみを大きく動かすと、一瞬動作が乱れる現象が見られたため、次のステップとして外部電源への切り替えを検討することにした(編集部想定シナリオ)。

ブレッドボード上での部品配置や配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。

電子工作ブレッドボード完全攻略ガイドはこちらの記事で詳しく解説している

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. サーボの電源はArduino本体の5Vから取れば常に問題ない

動作確認レベルでは問題が出にくいが、サーボが負荷を受けて動きにくくなった瞬間には消費電流が急増する。この電流をArduino本体の電源供給能力が賄いきれないと、動作不良やボードの不安定化につながるおそれがある。複数のサーボや、負荷のかかる用途では外部電源の用意が推奨される。

!誤解2. 外部電源を使えばGNDの接続は省略できる

外部電源を使う場合でも、Arduino側のGNDと外部電源側のGNDは必ず共通にする必要がある。GNDが共通になっていないと、信号線の電圧基準がずれてしまい、サーボが正しく反応しない、あるいは誤動作する原因になる。

!誤解3. write(180)を指定すれば必ず物理的に180度回転する

write()で指定する0〜180という数値は、あくまでソフトウェア上の角度指定であり、サーボの個体差によって実際に動く物理的な範囲は多少前後する。精密な角度制御が必要な場合は、writeMicroseconds()でパルス幅を直接調整し、個体ごとのズレを補正することが必要になる。



Chapter 07 — FAQ

07FAQ

Q.Arduinoでサーボモーターの角度を指定するにはどうすればよいですか。
A.Servoライブラリをインクルードし、Servo型の変数をattach()でピンに割り当てた後、write()関数に0から180までの角度を渡すことで指定できます。例えばmyservo.write(90);と書くと、サーボの軸が中央(90度)の位置に動きます。

Q.サーボモーターはArduinoのどのピンに接続すればよいですか。
A.信号線(多くの場合オレンジまたは黄色の線)はPWM対応のデジタルピンに接続します。電源線(赤)はサーボの動作電圧に応じて5Vまたは外部電源に、GND線(茶または黒)はArduinoのGNDと外部電源のGNDの両方に共通で接続する必要があります。

Q.サーボモーターをArduinoの5Vピンから直接給電しても問題ありませんか。
A.小型のマイクロサーボ1個程度であれば動作することもありますが、サーボが負荷を受けて動きにくくなった際には大きな電流を消費するため、Arduino本体の電源供給能力を超えるおそれがあります。複数のサーボを扱う場合や、動作の安定性を重視する場合は、外部電源を用意し、GNDをArduinoと共通にする配線が推奨されます。

Q.Servo.write()とServo.writeMicroseconds()の違いは何ですか。
A.Servo.write()は0から180までの「角度」を指定する関数です。一方、Servo.writeMicroseconds()はサーボに送るパルス幅そのものをマイクロ秒単位で直接指定する関数で、より細かい制御や、角度の範囲がメーカーごとに微妙に異なるサーボの調整に使われます。

Q.サーボモーターが小刻みに震える(ジッター)場合、原因は何が考えられますか。
A.主な原因として、電源電圧の不安定さ(電圧降下やノイズ)、信号線が長くノイズを拾っていること、複数のサーボを1つの電源で賄っていて容量が不足していることなどが考えられます。信号線を短くする、電源線と信号線を離して配線する、電源にコンデンサを追加するといった対策が有効な場合があります。

Q.1台のArduinoで複数のサーボモーターを同時に制御できますか。
A.Servoライブラリ自体は多くのボードで複数のサーボオブジェクトを同時に扱えるように設計されています。ただし、サーボの数が増えるほど消費電流も増えるため、電源容量が不足しないよう外部電源やPCA9685のようなサーボドライバボードの利用を検討することが推奨されます(編集部見解)。

参考文献

関連記事(内部リンク)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE