Lesson 9
サーボ
サーボモーターを使用したデータシートの読み方とPWM制御の学習。
使用する機器
- (1) x Elegoo Uno R3
- (1) x Servo (SG90)
- (3) x M-M wires (Male to Male jumper wires)
SERVO MOTOR SG90
サーボモーターといえば名前は聞いたことあるが普通のモーターと何が違うのか。
- モーター:電力をかけるとひたすら回転
- サーボモーター:信号に応じて0度からN度の範囲で回転
- ステッピングモーター:信号に応じてモーターを制限なく制御可能
- ブラシレスモーター:安定した回転速度などの制御が可能
サーボモーターは PWM 利用して制御する。
サーボには3本のワイヤーがあり、茶色のワイヤーはグランドワイヤーで、UNO の GND ポートに接続する必要があり、赤色のワイヤーは電源ワイヤーで、5v ポートに接続し、オレンジ色のワイヤーは信号ワイヤー #9 ポートに接続する必要があります。
ELEGOO のスターターキットには各モジュールや機器のデータシートが付随している。
セットに入っているサーボモーターは SG90 というもので、下記のようなデータシートを公開しているサイト等でも同様のものを確認できる。
DatasheetsPDF.com - SG90 Datasheet PDF
サーボモーターは」 DC モーター、ポテンションメーター、それらを制御回路で組み合わせた形で構成されている。
このサーボモーターは最大180度まで制御できるもので、データシートを見てみると「Power ansd Signal」、主電圧が 5V で、 PWM の 周期 20ms のパルスにおいて「Duty Cycle」 が 0.5 のとき 0度動き、2.4 ms のとき180度動くということがわかる。
構成
サーボモーターの PWM 対応のオレンジ を Arduinoの PWM 対応 9ピンに、
GROUND(ー) 対応の 茶色は GND ピンに、
赤は 電源の 5V ピンに。
サンプルコードを見ると Lesson8 同様にライブラリを呼び出しているため、ライブラリを追加してデプロイするとモーターが動き出す。上記のように PWM を詳細に制御することでサーボモーターを制御することは可能だが、 Arduino では簡易に制御できるよう Servoライブラリ が標準で提供されている。
デプロイすると交互に進んだり、戻ったりするように羽が動くのを確認できる。
※本製品はトイキットという面もあり、正確に180度内の指定で動くわけではない点に注意。
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
Serial.begin()
シリアル通信を行う際に指定する通信のデータ転送レート指定。このレッスンでは特にシリアルコンソールを開いてという操作は不要。
myservo.attach()
では呼び出したライブラリの関数から、PWMによりサーボ制御するピンを指定しています。
int pos = 0;
で現在のモーター位置を原点設定し、その後 for()
文で pos
値を 0~180
つまり 0度~180度 まで 1度 ずつ増減させながらループさせている。 Lesson4 時と違い、PWM の間隔を調整するような記述は無く、Servo ライブラリの関数 myservo.write()
を利用することで簡単に角度を制御できるようになっている。
※サンプルプログラム上 Servo ライブラリの関数を myservo
にして呼び出している。