Arduino 連続回転サーボ


20160425_arduino_servo

一般的なサーボ は、180度くらいの可変範囲を持っています。
連続回転サーボ (Continuous Rotation Servo) は、360度以上の可変範囲を持ち、連続して回転することができます。
モータの代わりに使用することができます。

今回は、SpringRC SM-S4303R を使用しました。
国内では扱っているところがなかったので、米国の Pololu から購入しました。

制御信号
制御信号は、周期的なパルスで、周期 20ms、パルス幅 1.0ms – 2.0ms です。
パルス幅 1.5ms で停止、1.0 – 1.5ms で時計周り、1.5 – 2.0ms で反時計周りです。
停止の 1.5ms から離れるに従い回転数が増えます。
20160425_servo_control_2

Arduino で制御する
サーボには3本の線があります。
赤を+5v、黒をGND、白を制御ピンに接続します。

(1) digitalWrite
制御信号を digitalWrite で生成します。
width を 1000、1400、1500、1600、2000 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

servo-digitalwrite.ino

 
int PIN = 13;
int width = 1500;
void setup() {
 	pinMode(PIN, OUTPUT);
}
void loop() {
	digitalWrite(PIN, HIGH);
	delayMicroseconds(width);
	digitalWrite(PIN, LOW);
	delayMicroseconds(3000 - width);
	delay(17); // wait 17 ms
}

(2) Servo クラス
Arduino には、サーボ制御のためのクラス Servo が用意されています。ハードウェア・タイマーを利用しています。
Servo#write で、回転のスピードを設定します。0にするとフルスピードで回転し、180にすると、反対方向にフルスピードで回転します。90のときは停止します。

speed を 0、80、90、100、180 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

servo-test.ino

 
#include <Servo.h>
Servo myservo;
int PIN = 13;
int speed = 90;
void setup() { 
	myservo.attach(PIN);
	myservo.write(speed);
} 
void loop() {}

(3) コマンド
パラメータを変えるたびに、プログラムを書き換えるのは面倒です。
シリアルモニタからコマンドを送って、変更できるようにしました。
servo_command.ino

コマンドの形式は、s + 3桁の数字です。

s000 : 時計周り 高速
s090 : 停止
s180 : 反時計周り 高速

参考
Pololu SM-S4303R
SM 33R/43R/81R Datasheet
Servo#write : Arduino日本語リファレンス


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です