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

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

この記事では、ArduinoでマイクロサーボモータSG90の使い方を解説します。SG90は定番のマイクロサーボモータです。他の種類のサーボモータでも動かし方は基本、同じになります。

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

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

SG90の詳細は秋月電子通商のデータシートをご確認ください。 マイクロサーボSG-90データシート

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

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

普通のピンヘッダーですと短すぎるので、ピンの長さが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信号については、 オペアンプ1個でつくる!PWMジェネレータ をご覧ください。 サーボモータでは、PMW信号のパルス幅を、0.5ミリ秒から2.4ミリ秒の間にすることで、サーボモータの角度を0度から180度の間で固定できます。ちなみに、サーボモータへ送るPWM信号のパルスの1周期は20ミリ秒です。周波数であらわすと、50Hzとなります。

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

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

cpp
#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度の動作をさせてみました。

cpp
/*
  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の使い方の説明を終わります。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事