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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

4894閲覧

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

msyk23p2

総合スコア14

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2016/10/11 07:50

目標座標へ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(xx+yy);
pos1=((bb+cc-aa)/(2bc));
radian1=acos(pos1);
A=radian1
180/M_PI;//M_PI(円周率)
B=180-A;//二個目のモーターの角度
pos2=(y/x);
pos5=((bb+aa-cc)/(2ba));
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);
}
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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); } }

投稿2016/10/11 09:17

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問