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

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

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

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

Q&A

3回答

9151閲覧

サーボモーターが動かない

msyk23p2

総合スコア14

Arduino

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

0グッド

1クリップ

投稿2016/09/20 17:28

編集2017/02/09 01:21

以下のプログラムを作成したのですがサーボモーターが動きません。逆運動学で角度を求めてその位置まで動いて元の位置に戻るプログラムを作りたいです。どこように改善したらよいでしょうか?回答お願いします。
#include<stdio.h>
#include<math.h>
#include<Servo.h>
Servo servo;
int A=0;
void setup(){

servo.attach(9);
double a,b,c.A;
a=10;
b=20;
c=30;

A=acos((bb+cc-aa)/2bc);
degree = A
180.0/PI;
}
void loop()
{
servo.write(A);
delay(1000);
servo.write(0);
delay(1000);
}

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

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

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

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

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

tnd-.-b

2016/09/20 23:20

サーボモータということは何かしらPWM制御をするのだろうと思いますが、Servoが その機能を担っているように見えます。 Servoの持つ関数とその役割(API仕様、とか呼びます)を教えてもらえますか? あと、「```」で囲むとソースコードが見やすくなります。
tnd-.-b

2016/09/20 23:29 編集

もうひとつdouble a,b,c.A; ここってピリオド(.)ですか?カンマ(,)ではなくて?
kei344

2016/09/23 10:22

回答が付いた質問の編集は慎重に行ってください。タイプミス程度なら修正する事もありますが、本文を削除するのはやめましょう。
guest

回答3

0

すみません。ちょこちょこ訂正してます。

C

1a=10; 2b=20; 3c=30;

なのだから、(b*b+c*c-a*a)/2*b*c)は360000、なのでA=acos((b*b+c*c-a*a)/2*b*c); は普通は正しく計算できないのでは。

動作確認したいのであれば、動いているのがはっきりわかるようにloop()関数を

C

1void loop() 2{ 3 servo.write(90); // サーボの角度を90°に設定 4 delay(1000); 5 servo.write(0); // サーボの角度を0°に設定 6 delay(1000); 7}

こんな風に90度動くようにしてみてはどうでしょう。

これで動かないのであれば、

  1. サーボモーターがつながっているピンが9番ではない
  2. サーボモーターの結線まちがい
  3. サーボモーターが壊れている、もしくは断線

等々、プログラム以外のところもチェックしてみてください。

投稿2016/09/21 00:34

編集2016/09/21 00:54
imutakaoru

総合スコア356

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

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

guest

0

すみませんわかりました。ServoはArduinoのライブラリなんですね。

すくなくともwriteの引数は0-180[度]なので、アークコサイン(acos)の戻り値であろう[ラジアン]から変換した値を与える必要があります。つまりservo.writeにはdegreeを与えるのが正しいです。

servo.write(degree);

あとはjm1156さんの回答どおり、ちゃんと変数のスコープを意識してプログラムを書けば動作すると思います。
Aを求める式がただしいのかどうかは判断しかねますが、正しくないように感じます。
このあたりももう一度みなおしてみて下さい。

なお、math.hをincludeしているのでacosは使える、でいいんじゃねえかと思います。おそらく。
http://forum.arduino.cc/index.php?topic=41124.0

投稿2016/09/21 05:04

tnd-.-b

総合スコア247

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

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

guest

0

そのプログラムの内容がよくわからないけど、
予想で答えます。

C

1Servo servo; 2 3double a,b,c,A,degree; 4 5void setup(){ 6 7 servo.attach(9); 8 9 a=10; 10 b=20; 11 c=30; 12 13 A=acos((b*b+c*c-a*a)/2*b*c); 14 degree = A*180.0/PI; 15 loop() ; 16 17} 18void loop() 19{ 20 servo.write(A); 21 delay(1000); 22 servo.write(0); 23 delay(1000); 24}

投稿2016/09/21 00:09

jm1156

総合スコア866

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問