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 IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
Arduino互換機のSeeeduino XIAOを使用しましが、もちろんお好きなArduinoで構いません。デジタルピンがPWM信号に対応していれば、どのArduinoでも大丈夫です。
▼ まだArduinoをお持ちでない方はこちら。
Arduinoとサーボモータの配線
それでは、Arduinoとサーボモータを配線していきましょう。今回はSeeduino XIAOを使いましたが、他のArduinoをお使いの場合は、PWMに対応しているデジタルピンをご使用ください。
Arduino | サーボモータ |
---|---|
GND | GND |
D1 | Signal |
5V | 5V |
サーボモータのPWM制御信号について
サーボモータの角度を制御するためには、PWM(パルス幅変調)信号を入力に与えます。PWM信号については、 オペアンプ1個でつくる!PWMジェネレータ をご覧ください。 サーボモータでは、PMW信号のパルス幅を、0.5ミリ秒から2.4ミリ秒の間にすることで、サーボモータの角度を0度から180度の間で固定できます。ちなみに、サーボモータへ送るPWM信号のパルスの1周期は20ミリ秒です。周波数であらわすと、50Hzとなります。
サーボモータを制御する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ライブラリを使ったサーボモータの制御
次に示すのが、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_minとpulse_maxの値を調整してください。デフォルト設定でよければ、minとmaxは省略することが可能です。servo.attach(pin)のような書き方ができます。
最後に、write(角度)で角度を指定すれば、サーボモータの位置を固定できます。
以上で、ArduinoでマイクロサーボモータSG90の使い方の説明を終わります。