Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き


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例。

行きと帰りで少し計算方法を変えている。気持ち程度、上記スケッチよりスムーズに動く。

#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);
	}
}

コメントを残す

メールアドレスが公開されることはありません。


*

CAPTCHA