複数サーボを別々にスピード調整や角度調整
Posted: 2014年7月14日(月) 12:18
複数サーボの同時制御について困っております。
(角度指定は、servoライブラリでも、パルス派を20msで並べるやり方もマスターできました。
何が困っているかというと、「複数サーボのスピードの調整」です。
単独のサーボであれば、for文の中で、delay()を使いながら、パルス波の長さをだんだん増やしたり減らしたりしていく事で実現はできました。
しかし、複数サーボで、それぞれの「基本角」「目標角」「速度」を設定して、それぞれを同時に動かすのはとても難しく、困っております。
よいアイデアがあれば教えて頂ければと思います。
ちなみに、パルス派でサーボを複数制御するコードを載せます。(自作なので見づらいかもしれません。loopが早すぎて、一気に目的のパルス波の長さになるので、うまくいっていません。)
ご教授、アドバイスをよろしくお願い致します。
(角度指定は、servoライブラリでも、パルス派を20msで並べるやり方もマスターできました。
何が困っているかというと、「複数サーボのスピードの調整」です。
単独のサーボであれば、for文の中で、delay()を使いながら、パルス波の長さをだんだん増やしたり減らしたりしていく事で実現はできました。
しかし、複数サーボで、それぞれの「基本角」「目標角」「速度」を設定して、それぞれを同時に動かすのはとても難しく、困っております。
よいアイデアがあれば教えて頂ければと思います。
ちなみに、パルス派でサーボを複数制御するコードを載せます。(自作なので見づらいかもしれません。loopが早すぎて、一気に目的のパルス波の長さになるので、うまくいっていません。)
ご教授、アドバイスをよろしくお願い致します。
- コード: 全て選択
int out1 = 2; //サーボ1=2PIN
int out2 = 3; //サーボ2=3PIN
int in1 = 8; //ポイント1スイッチ=8PIN
int in2 = 9; //ポイント2スイッチ=9PIN
int s1off = 600; //サーボ1のOFF位置設定
int s1on = 1500; //サーボ1のON位置設定
int s2off = 1500; //サーボ2のOFF位置設定
int s2on = 2100; //サーボ2のON位置設定
void setup(){
//パルス出力ピンの設定
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
// デジタル入力のプルアップ抵抗を有効にする
pinMode(in1, INPUT_PULLUP);
pinMode(in2, INPUT_PULLUP);
int s1cnt;
int s2cnt;
}
void loop(){
//パルス:LOWを出力 4000Microseconda/1サーボごとにタイミング
digitalWrite(out1,LOW);
digitalWrite(out2,LOW);
if (digitalRead(in1)==HIGH){ //1番ピンのスイッチ押された時の動作 こちらはスピード調整を導入(未完)
static int s1cnt = s1off; //パルス波を段々変化させるために使用するcnt変数にoff時の波を代入
if(s1cnt<s1on){目標のs1on角に満たないとき
digitalWrite(out1,HIGH);
delayMicroseconds(s1cnt); //cnt変数分波をつくる
digitalWrite(out1,LOW);
delayMicroseconds(4000-s1cnt); //動いた残りをディレイ
s1cnt=s1cnt+1; //波長を1長くする・・・ここが速過ぎて効果無し。
}
}
else { //1番ピンのスイッチ押されていない時の波(s1off分)を生成
digitalWrite(out1,HIGH);
delayMicroseconds(s1off);
digitalWrite(out1,LOW);
delayMicroseconds(4000-s1off);
}
if (digitalRead(in2)==HIGH){ //2番ピンの動作 こちらは通常のパルス波生成
digitalWrite(out2,HIGH);
delayMicroseconds(s2on);
digitalWrite(out2,LOW);
delayMicroseconds(4000-s2on);
}
else {
digitalWrite(out2,HIGH);
delayMicroseconds(s2off);
digitalWrite(out2,LOW);
delayMicroseconds(4000-s2off);
}
delayMicroseconds(12000); //2つのサーボ合計8000microsecondsなので残り12000
}