Table of Contents
この記事で学習できること
- サーボモータの仕組み、Arduinoとの接続方法、操作方法を、標準サーボモーター(SG90)、連続回転サーボモーター(SG90-HV)を使って学習します。
サーボモータの仕組みは?
- 標準サーボモーター(SG90)は、位置フィードバックを使用してその動作と最終位置を制御するクローズドループのシステムです。シャフトの位置を正確に制御できる特徴があります。
- 連続回転サーボモーター(SG90-HV)は、速度と回転方向を変えて回転できます。
サーボモータの操作方法は?
- 標準サーボモーターは、サーボの信号線に PWM (パルス幅変調) 信号を送信することによって制御されます。 パルス幅によって出力軸の位置が決まります。 パルス幅 1500usec の信号をサーボに送ると、サーボモーターは90 度の位置 に移動します。 最小 (0 度) と最大 (180 度) の位置は通常、それぞれ 1000usec と 2000usec のパルス幅に対応します。 これは、サーボ モーターの種類やブランドによって若干異なる場合があるります。 (例えば: 最小パルス幅が500usecで最大パルス幅が 2500usecであったりします。) 多くのサーボモータの中間位置はほとんど常に 1500usecです。
- 連続回転サーボモーターは、モータが連続で回転し続けます。パルス幅1500usec のPWM信号をサーボに送ると回転が止まります。パルス幅1000usec~1500usecとパルス幅1500usec~2000usecで回転方向が変わり、PWM変調の度合いで回転速度が変わります。
- ライブラリによっては、角度を指定してサーボモータを回転させることができます。たとえば、<Servo.h>を使えば、write(90)で角度90度の指定ができます。またPWM (パルス幅変調) 信号のパルス幅での指定ができます。writeMicroseconds(1500)は中立点の動作です。write(90)と同じ意味です。ライブラリの中のコードを読むと解りますが、write()関数は、引数の角度をusecに変換してwriteMicroseconds()関数を呼んでいます。

学習に必要な部品は?
| 部品 | 個数 | 備考 |
| SG90 | 1個 | 標準サーボモーター |
| SG90ーHV | 1個 | 連続回転サーボモーター |
| Arduino UNO R3 | 1個 | |
| ブレッドボード、接続用線材 | 1式 |
部品の購入先
Arduinoの電子工作をはじめようと思ったらスターターキットを購入するのが便利です。別途SG90-HVを購入すれば、その他のこの記事に必要な部品はArduino UNO R3を含めて全て付属しています。
(広告) Arduino スターターキットと電子部品の購入先
| 購入先 | 製品 | 備考 |
| Amazon | Arduino用のUNO R3 最終版スタータキット | Arduino UNO R3を含み、ブレッドボード、IC、センサなどが含まれています |
| 秋月電子通商 | 各種電子部品 | 各種電子部品を少量から注文できます |
Arduinoとサーボモータの接続は?
- 電源、アース、信号の 3 本のワイヤを接続するだけなので、サーボ モータの配線はとても簡単です。 電源線は通常赤で、5 V に接続する必要があります。 SG90 のようなマイクロ サーボは、アイドル時に約 10 mA、回転時に約 100 ~ 250 mA を消費するため、Arduino の 5 V 出力で直接電力を供給することができます。 ただし、複数台以上のサーボモータを使用する場合は注意が必要です。 モーターが 300 mA 以上を消費する場合、Arduino の損傷を避けるために、外部電源を使用する必要があります。

- サーボ モータを制御するのにArduino UNO R3ボードを使っています。このボードはサーボモータを制御用のPWM出力ができるポートがあらかじめ決められています。ピン番号の前に”~”の記号が付いている、3, 5, 6, 9, 10, 11ピンがPWM出力に使えます。
サーボモータ用のライブラリはどう使うの?
- サーボ モーターを制御するには、Arduino IDE にプリインストールされている Servoライブラリを使用します。
- Servo.h をインクルードします。
#include <Servo.h>- Servoのインスタンスを作成します。
Servo myservo;- サーボ信号を出力するPin番号を指定します。(9番ピンを指定した例です。)
myservo.attach(9);- サーボモータ-を回転する度数を指定します。(90度の位置を指定した例です。)
myservo.write(90);- サーボモータ-の回転位置はパルス幅でも指定できます。(1500usecを指定した例です。) write()関数は内部で、角度をパルス幅に変換しwriteMicroseconds()関数を呼び出しています。
myservo.writeMicroseconds(1500);サーボモータを操作するスケッチは?
- 標準サーボモーター(SG90)を90度->45度->90度->0度->90度->135度->90度->180度の順番で回転させます。
- 連続回転サーボモーター(SG90-HV)は同じスケッチで動作しますが動きが異なります。90度の設定で回転が止まり、角度設定がが90以下と90度以上で回転方向が変わり、90度からのずれ量に従って回転速度が変わります。(角度を90度に近い、80度や100度に設定すると回転速度の違いが良くわかります。)
//サーボモータの回転制御
#include <Servo.h>
Servo myservo;
void setup(){
myservo.attach(9);
myservo.write(90);// move servos to 90°
delay(5000);
}
void loop(){
myservo.write(90);// move servos to 90°
delay(5000);
myservo.write(45);// move servos to 45°
delay(2000);
myservo.write(90);// move servos to 90°
delay(2000);
myservo.write(0);// move servos to 0°
delay(2000);
myservo.write(90);// move servos to 90°
delay(2000);
myservo.write(135);// move servos to 135°
delay(2000);
myservo.write(90);// move servos to 90°
delay(2000);
myservo.write(180);// move servos to 180°
delay(2000);
}- 連続回転サーボモーター(SG90-HV)のスケッチの設定と回転数の関係を調べて記事にしました。
(参考) 連続回転サーボモーター(SG90-HV)の回転数を測定する記事
回転しない場合は?
● 回転しない場合は関連しそうな箇所を調べます。
- PWM ピンではないピンに接続している
- 配線ミス(茶=GND、赤=5V、橙=信号)
- サーボの初期不良
- コードの書き間違い
サーボモーター固定治具を作りました
- Ardunoにサーボモータ-を接続して操作する時に、サーボモータ-を固定しないとモーターが回転時にサーボモータ-が振れて動きの観察が難しい場合があります。動作確認時にサーボモータ-を固定する治具を3Dプリンタで作成しました。

(参考) 3Dプリンタの関連記事
学習の参考にしたサイトは?
- How to Control Servo Motors with Arduino
- Servo Motor: Diagram, Definition, Types, Working & Applications
- How to Control Servo Motors with Arduino – Complete Guide
まとめ
- サーボモータを回転させる基本的な知識を得られました。モーターの駆動は消費電流を考慮しないといけないので注意しないといけません。サーボモータに連続回転サーボモータがあることも知りました。
- 連続回転サーボモータの動作については[Arduinoの割込み関数を使って連続回転サーボモーターの回転速度を測定しました。]で学習しました。
ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。

