Arduinoで電子工作をはじめる時、サーボモーターは基本的な学習内容の一つになっていると思う。
簡単に制御出来、かつ実用性が高い。
Arduinoのサーボ用サンプルスケッチSweepは以下の様なスケッチになっている(delayだけ増やしてピンをA5に変更している)
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(A5);
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(100);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(100);
}
}
これはこれで良いのだが、ゆっくり動かしたり細かく動かしたい場合に180分割ではカクカクしすぎる場合がある。
サーボの制御は write(角度) 以外にも、writeMicroseconds(時間) の関数でも出来る。サーボモーターは角度を情報として制御している訳ではなく、信号のパルスを見てモーターを調整している。このパルス幅を直接指定できるのがwriteMicroseconds関数である。この関数を使えばより細かくサーボモーターの位置を制御できる。
Arduinoの公式サイトではwriteMicrosecondsに渡す値は1000~2000で1500が中央で製品により幅が異なる、と書かれている。手持ちのTowerPro MG996Rは1000~2000では幅が足りなかったので、700~2300にしている。下記スケッチはwriteMicrosecondsの関数を利用したSweep例。
行きと帰りで少し計算方法を変えている。気持ち程度、上記スケッチよりスムーズに動く。
※別のサーボでは500~2400の範囲だった
#include <Servo.h>
#define MIN_PULSE 700
#define MAX_PULSE 2300
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(A5);
}
void loop() {
for (int pos = MIN_PULSE; pos <= MAX_PULSE; pos += 1) {
myservo.writeMicroseconds(pos);
delay(10);
}
for (float pos = 180; pos >= 0; pos -= 0.02) {
myservo.writeMicroseconds(map(pos,0,180,MIN_PULSE,MAX_PULSE));
delay(1);
}
}