ArduinoでマイクロサーボモータSG90の使い方

この記事では、ArduinoでマイクロサーボモータSG90
の使い方を解説します。SG90
は定番のマイクロサーボモータです。他の種類のサーボモータでも動かし方は基本、同じになります。
マイクロサーボモータSG90について
SG90
はひとつ数百円程度で購入できる小型のマイクロサーボモータです。大きさは22.2x11.8x31mm
、重量わずか9g
と軽くて小ぶりです。可動範囲は180°
、動作速度は0.12s/60°
です。また、トルクは1.8kgf・cm
と小さいながらにもなかなか力強いです。電源電圧は3.3V〜6V
の間で動作し、PWM
信号を入力することで回転角度を決定します。
SG90の詳細は秋月電子通商のデータシートをご確認ください。 https://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf
ところで、サーボモータから伸びているケーブルは端子がメスなため、そのままではブレッドボードに挿せません。ピンヘッダーを使ってメスをオスに変換する必要があります。
開発環境
今回、使った開発環境はこちらになります。
項目 | バージョン |
---|---|
Arduinoボード | Seeeduino XIAO |
サーボモータ | SG90 |
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
Arduino互換機のSeeeduino XIAO
を使用しましが、もちろんお好きなArduinoで構いません。デジタルピンがPWM信号に対応していれば、どのArduinoでも大丈夫です。
Arduinoとサーボモータの配線
それでは、Arduinoとサーボモータを配線していきましょう。今回はSeeduino XIAOを使いましたが、他のArduinoをお使いの場合は、PWMに対応しているデジタルピンをご使用ください。
Arduino | サーボモータ |
---|---|
GND | GND |
D1 | Signal |
5V | 5V |


ワンポイントアドバイス サーボモータは消費電流が大きいので、複数台のサーボモータを使用する場合は、マイコンとは別の電源から供給するようにしましょう。
サーボモータのPWM制御信号について
サーボモータの角度を制御するためには、PWM(パルス幅変調)信号を入力に与えます。PWM信号については、 をご覧ください。 サーボモータでは、PMW信号のパルス幅を、0.5ミリ秒から2.4ミリ秒の間にすることで、サーボモータの角度を0度から180度の間で固定できます。ちなみに、サーボモータへ送るPWM信号のパルスの1周期は20ミリ秒です。周波数であらわすと、50Hzとなります。

サーボモータを制御するPWM信号のプログラム例を次に示します。ここでは、サーボモータの角度を90度の位置に固定させてます。
#define SIG_PIN 1 // D1
void setup() {
.begin(115200);
Serial(SIG_PIN, OUTPUT);
pinMode(SIG_PIN, LOW);
digitalWrite(2);
delay}
int duration_H = 1450; // (2.4ms - 0.5ms) / 2 + 0.5ms
int duration_L = 20000 - duration_H; // 20ms - 1.45ms
void loop() {
.println(duration_H);
Serial(SIG_PIN, HIGH);
digitalWrite(duration_H);
delayMicroseconds(SIG_PIN, LOW);
digitalWrite(duration_L);
delayMicroseconds}
90°の角度するためには、(2.4ms - 0.5ms) / 2 + 0.5ms
の計算より、PWM信号の1周期の中で1.45ms
の間だけHIGHにします。それ以外の20ms-1.45ms
の時間はLOWにします。
ただし、角度を決めるために、いちいち時間を計算するのは面倒です。
そこで、もっと直感的にわかりやすくプログラミングできるように、Servoライブラリ
を使うことにします。Servoライブラリは、Arduino
IDEにデフォルトで付属されているサーボモータ用のライブラリです。Arduino
IDEをお使いであれば、とくにインストール作業の必要はありません。
Servoライブラリを使ったサーボモータの制御

次に示すのが、Servoライブラリ
を使った場合のプログラムです。上記の映像のように、2秒おきに0度 → 90度 → 180度 → 90度 → 0度
の動作をさせてみました。
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-servo.html
*/
#include <Servo.h>
#define SIG_PIN 1 // D1 pin
;
Servo myservo
void setup() {
int pulse_min = 544; // default 544us
int pulse_max = 2400; // default 2400us
.attach(SIG_PIN, pulse_min, pulse_max);
myservo}
void loop() {
.write(0);
myservo(2000);
delay.write(90);
myservo(2000);
delay.write(180);
myservo(2000);
delay.write(90);
myservo(2000);
delay}
プログラム内容を簡単に解説します。
attach
関数は、PWM信号を出力するピンを指定する関数です。attach(pin, min, max)
のような形で指定できます。min
には、サーボの角度が0度のときのパルス幅を設定します。max
には、サーボの角度が180度のときのパルス幅を設定します。
min
のデフォルトは544マイクロ秒で、max
のデフォルトは2400マイクロ秒です。
サーボモータの種類によっては、デフォルトの値だと位置がズレる場合があります。その時は、プログラム中のpulse_min
とpulse_max
の値を調整してください。デフォルト設定でよければ、min
とmax
は省略することが可能です。servo.attach(pin)
のような書き方ができます。
最後に、write(角度)
で角度を指定すれば、サーボモータの位置を固定できます。
以上で、ArduinoでマイクロサーボモータSG90の使い方の説明を終わります。
関連記事
- 【XYペンプロッター制作⑦】サーボモータでペンを上下させる(仮完成)
- 超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説
- Arduinoと可変抵抗でLEDの明るさ制御
- ESP32のマルチスレッドで複数のサーボモータを同時に動かす方法
- ESP32でMOSFETを使ったPWM制御 (IRF520)