複数サーボを別々にスピード調整や角度調整

Arduino に関するご質問などはこちらへ。

複数サーボを別々にスピード調整や角度調整

投稿記事by nas.iron » 2014年7月14日(月) 12:18

複数サーボの同時制御について困っております。
(角度指定は、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
}
nas.iron
 
記事: 9
登録日時: 2014年7月10日(木) 20:45

Re: 複数サーボを別々にスピード調整や角度調整

投稿記事by yamaguch » 2014年7月14日(月) 15:18

こんにちは、

問題は二つあるわけですね。
欲張らず、ひとつずつ解決するのがいいと思います。
順番としては、
(1) 角度や速度を指定する
(2) 複数扱えるようにする
の順がいいでしょう。

また、一つ前のトピックで、Servo クラスを使うと見通しが良くなることが分かったわけですから、まずは、このクラスを利用して、(1) を実現することを考えてはいかがでしょう。

山口

細かいことかもしれませんが、ポストする時には文章に誤字脱字がないかを、チェックすることをおすすめします ;)
後からでも編集ボタンを押すと直せますよ。
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 複数サーボを別々にスピード調整や角度調整

投稿記事by nas.iron » 2014年7月15日(火) 10:08

山口さん 前回に続きありがとうございます。
サーボライブラリはとても便利ですよね・・・これを使用してスピード調整・・・となると、値を徐々に変化させるという事ですね。
ひとまずやってみます。ありがとうございます。
nas.iron
 
記事: 9
登録日時: 2014年7月10日(木) 20:45

Re: 複数サーボを別々にスピード調整や角度調整

投稿記事by yamaguch » 2014年7月15日(火) 15:34

そうです。
角度を変化させる速さ(角速度)を表す変数と、サーボに信号を送る頻度を表す変数を使うとスッキリすると思います。
例えば、ループで1秒間に10回信号を送るようにした場合は、一回あたりの角度の変化量は、角速度 × 0.1 になります。
0.1 = 1 / 10 です。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37


Return to Arduino 質問箱

cron