質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

サーボモーターをループさせて動かしたい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,551

msyk23p2

score 14

目標座標へ2つのサーボを動かし、元の座標地までもどして、また目標座標へサーボを動かしてを繰り返すプログラムを作りたいのですが目標座標へ動いて止まってしまいます。どのように改善したら良いでしょうか?回答お願いします。

include<stdio.h>

include<math.h>

include<Servo.h>

Servo servo1,servo2;
double a,b,c,x,y,pos1,pos2,pos3,pos4,pos5,A,B,C,D,radian1,radian2;
void setup(){
servo1.attach(9);
servo2.attach(7);
y=5;
b=5;
c=5;

a=sqrt(x*x+y*y);
pos1=((b*b+c*c-a*a)/(2*b*c));
radian1=acos(pos1);
A=radian1*180/M_PI;//M_PI(円周率)
B=180-A;//二個目のモーターの角度
pos2=(y/x);
pos5=((b*b+a*a-c*c)/(2*b*a));
D=acos(pos5);
radian2=atan(pos2);
C=radian2*180/M_PI-D;//一つ目のモーターの角度
}
void loop(){
for ( x = 0; x < 5; x += 1 ) {
servo1.write(C);
delay(1000);
servo2.write(B);
delay(1000);
}  
for ( x = 5; x > 0; x -= 1 ) {
servo1.write(C);
delay(1000);
servo2.write(B);
delay(1000);
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/10/11 16:55

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

0

「目標座標へ2つのサーボを動かし、元の座標地までもどして、また目標座標へサーボを動かしてを繰り返すプログラムを作りたい」
これには、少なくとも以下の4つの値が必要です。
1つ目のサーボの元の座標
1つ目のサーボの目標座標
2つ目のサーボの元の座標
2つ目のサーボの目標座標

しかし、質問に書かれた繰り返し(loop)のコード(下に整形して引用)には、2つの値(BとC)しか使われていません。そして、loopの中でBとCの値は変わりません。
「1つ目のサーボをCの位置へ動かす、1秒待ち、2つ目のサーボをBの位置に動かす、1秒待ち」を同じB、Cで繰り返すのですから、サーボは同じ位置に止まってしまって当然です。

void loop(){ 
    for ( x = 0; x < 5; x += 1 ) { 
        servo1.write(C); 
        delay(1000); 
        servo2.write(B); 
        delay(1000); 
     }   
     for ( x = 5; x > 0; x -= 1 ) { 
        servo1.write(C); 
        delay(1000); 
        servo2.write(B); 
        delay(1000); 
     } 
}

ここからは私の推測ですが、質問者がやりたいのは、loopの中でxの値を差分1で0->5->0という変化をさせ、xの値が変わるたびにBとCの値をsetup関数で計算して、2つのサーボを動かすということでしょう。
この推測が正しいとすれば、loopのコードを以下のように変更すれば良いはずです。

void loop(){ 
    for ( x = 0; x < 5; x += 1 ) { 
        setup(); // B,Cの値を再計算
        servo1.write(C); 
        delay(1000); 
        servo2.write(B); 
        delay(1000); 
     } 
     for ( x = 5; x > 0; x -= 1 ) { 
        setup(); // B,Cの値を再計算
        servo1.write(C); 
        delay(1000); 
        servo2.write(B); 
        delay(1000); 
     } 
}

但し、上記のコードでは、サーボ1とサーボ2が代わる代わる動くので、カクカクとした動きになってしまいます。
サーボ1の動作とサーボ2の動作の間にある時間待ちを無くした下記のコードのほうが、質問者の望むものかもしれません。

void loop(){ 
    for ( x = 0; x < 5; x += 1 ) { 
        setup(); // B,Cの値を再計算
        servo1.write(C); 
        servo2.write(B); 
        delay(1000); 
     } 
     for ( x = 5; x > 0; x -= 1 ) { 
        setup(); // B,Cの値を再計算
        servo1.write(C); 
        servo2.write(B); 
        delay(1000); 
     } 
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る