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

 

Seeeduino XIAOとサーボモータ
Seeeduino XIAOとサーボモータ

この記事では、ArduinoでマイクロサーボモータSG90の使い方を解説します。

SG90は定番のマイクロサーボモータです。他の種類のサーボモータでも動かし方は基本、同じになりますので、ぜひこの記事をご参考になさってみてください。

マイクロサーボモータSG90について

SG90はひとつ数百円程度で購入できる小型のマイクロサーボモータです。大きさは22.2x11.8x31mm、重量わずか9gと軽くて小ぶりです。可動範囲は180°、動作速度は0.12s/60°です。また、トルクは1.8kgf・cmと小さいながらにもなかなか力強いです。電源電圧は3.3V〜6Vの間で動作し、PWM信号を入力することで回転角度を決定します。

SG90の詳細は秋月電子通商のデータシートをご確認ください。

ところで、サーボモータから伸びているケーブルは端子がメスなため、そのままではブレッドボードに挿せません。ピンヘッダーを使ってメスをオスに変換する必要があります。

ピンヘッダーでメスをオスに変換
ピンヘッダーでメスをオスに変換

普通のピンヘッダーですと短すぎるので、ピンの長さが15mm以上ある長めのピンヘッダーの使用をオススメします。Amazonで探すならこちらの商品が良さそうです。

また、サーボモータの延長ケーブルがあるとロボットづくりなどに便利かと思います。ご参考になさってみてください。

開発環境

今回、使った開発環境はこちらになります。

項目バージョン
ArduinoボードSeeeduino XIAO
サーボモータSG90
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

Arduino互換機のSeeeduino XIAOを使用しましが、もちろんお好きなArduinoで構いません。デジタルピンがPWM信号に対応していれば、どのArduinoでも大丈夫です。

▼ もしまだArduinoをお持ちでないようでしたら、こちらの記事をご参考になさってみてください。

Arduinoとサーボモータの配線

それでは、Arduinoとサーボモータを配線していきましょう。今回はSeeduino XIAOを使いましたが、他のArduinoをお使いの場合は、PWMに対応しているデジタルピンをご使用ください。

Arduinoサーボモータ
GNDGND
D1Signal
5V5V

Seeduino XIAOとサーボモータの配線図
Seeduino XIAOとサーボモータの配線図

Seeduino XIAOにおける各ピンの役割図
Seeduino XIAOにおける各ピンの役割図

ワンポイントアドバイス
サーボモータは消費電流が大きいので、複数台のサーボモータを使用する場合は、マイコンとは別の電源から供給するようにしましょう。

サーボモータのPWM制御信号について

サーボモータの角度を制御するためには、PWM(パルス幅変調)信号を入力に与えます。PWM信号については、PWMジェネレータをオペアンプ1個でつくろう!をご覧ください。

サーボモータでは、PMW信号のパルス幅を、0.5ミリ秒から2.4ミリ秒の間にすることで、サーボモータの角度を0度から180度の間で固定できます。ちなみに、サーボモータへ送るPWM信号のパルスの1周期は20ミリ秒です。周波数であらわすと、50Hzとなります。

PWM信号によるサーボモータの角度の違いを解説
PWM信号によるサーボモータの角度の違いを解説

サーボモータを制御するPWM信号のプログラム例を次に示します。ここでは、サーボモータの角度を90度の位置に固定させています。

#define SIG_PIN 1 // D1

void setup() {
  Serial.begin(115200);
  pinMode(SIG_PIN, OUTPUT);
  digitalWrite(SIG_PIN, LOW);
  delay(2);
}

int duration_H = 1450; // (2.4ms - 0.5ms) / 2 + 0.5ms
int duration_L = 20000 - duration_H; // 20ms - 1.45ms

void loop() {
  Serial.println(duration_H);
  digitalWrite(SIG_PIN, HIGH);
  delayMicroseconds(duration_H);
  digitalWrite(SIG_PIN, LOW);
  delayMicroseconds(duration_L);
}

90°の角度するためには、(2.4ms - 0.5ms) / 2 + 0.5msの計算より、PWM信号の1周期の中で1.45msの間だけHIGHにします。それ以外の20ms-1.45msの時間はLOWにします。

ただし、角度を決めるために、いちいち時間を計算するのは面倒です。

そこで、もっと直感的にわかりやすくプログラミングできるように、Servoライブラリを使うことにします。Servoライブラリは、Arduino IDEにデフォルトで付属されているサーボモータ用のライブラリです。Arduino IDEをお使いであれば、とくにインストール作業の必要はありません。

Servoライブラリを使ったサーボモータの制御

Arduinoでサーボモータを制御しているようす
Arduinoでサーボモータを制御しているようす

次に示すのが、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
  myservo.attach(SIG_PIN, pulse_min, pulse_max);
}
 
void loop() {
  myservo.write(0);
  delay(2000);
  myservo.write(90);
  delay(2000);
  myservo.write(180);
  delay(2000);
  myservo.write(90);
  delay(2000);
}

プログラム内容をカンタンに解説しておきます。

attach関数は、PWM信号を出力するピンを指定する関数です。attach(pin, min, max)のような形で指定できます。minには、サーボの角度が0度のときのパルス幅を設定します。maxには、サーボの角度が180度のときのパルス幅を設定します。

minのデフォルトは544マイクロ秒で、maxのデフォルトは2400マイクロ秒です。

サーボモータの種類によっては、デフォルトの値だと位置がズレる場合があります。その時は、プログラム中のpulse_minpulse_maxの値を調整してください。デフォルト設定でよければ、minmaxは省略することが可能です。servo.attach(pin)のような書き方ができます。

最後に、write(角度)で角度を指定すれば、サーボモータの位置を固定できます。

以上で、ArduinoでマイクロサーボモータSG90の使い方の説明を終わります。次の記事もご参考になさってみてください。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事