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

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

ただいまの
回答率

90.76%

  • Arduino

    493questions

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

ロボットがうまく進みません。コード修正お願いします

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 279

band20010518

score 8

ロボットをまず一メートルまっすぐ進ませ、左に曲がって50センチ進んで、その後逆転してまっすぐ進むにはどうすればいいでしょうか?コードは考えたのですが、なぜか最初に左に曲がってしまいます
これがコードです。違っていたら教えて欲しいです
写真のところを押すとどのようなロボットかわかるので見てください
写真

reversePinではありませんでした。私が使ってるのはMotorDirectionPinとspeedPinですのでコードは違います

// Set pins for motor A
int rightMotorDirectionPin = 12;
int rightMotorReversePin = 3;     // Needs to be a PWM pin to be able to control motor speed.  
// The PWM function works on pins 3, 5, 6, 9, 10, and 11

// Set pins for motor B
int leftMotorDirectionPin = 13;
int leftMotorReversePin = 11;

void setup() 
{
//set pins to output
pinMode(rightMotorDirectionPin,OUTPUT);
pinMode(rightMotorReversePin,OUTPUT);
pinMode(leftMotorDirectionPin,OUTPUT);
pinMode(leftMotorReversePin,OUTPUT);
}

void loop() 
{  
void forward();

digitalWrite(rightMotorDirectionPin, HIGH);   // right motor ON
digitalWrite(leftMotorDirectionPin, HIGH);    // left mortor ON
delay(10000); //wait for 10 seconds

digitalWrite(rightMotorDirectionPin, LOW); // right mortor OFF
digitalWrite(leftMotorDirectionPin, LOW); // left mortor OFF
delay(10000); //wait for 10 seconds

void turnleft();

digitalWrite(rightMotorDirectionPin, HIGH);   //   right Motor ON
digitalWrite(leftMotorDirectionPin, LOW);   //   left Motor OFF
delay(5000);               // wait for  5 seconds

digitalWrite(rightMotorDirectionPin,LOW);   // right Motor OFF
digitalWrite(leftMotorDirectionPin, LOW);   // left Motor OFF
delay(5000);   // wait for  5 seconds

void reverse();

digitalWrite(rightMotorReversePin, HIGH);   // right Motor ON
digitalWrite(leftMotorReversePin, HIGH);   // left Motor ON
delay(2000);               // wait for a 2 seconds

digitalWrite(rightMotorReversePin, LOW);   // right Motor Off
digitalWrite(leftMotorReversePin, LOW);   // left Motor OFF
delay(2000);               // wait for a 2 seconds

void allstop();

digitalWrite(rightMotorReversePin, LOW);   // right Motor OFF
digitalWrite(leftMotorReversePin, LOW);   // left Motor OFF
delay(10000);               // wait for  10 seconds

digitalWrite(rightMotorDirectionPin,LOW);   // right Motor OFF
digitalWrite(leftMotorDirectionPin, LOW);   // left Motor OFF
delay(10000);    // wait for  10 seconds
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • ozwk

    2018/04/25 23:38

    持ち上げるなどして空転させても差が出ますか?

    キャンセル

  • band20010518

    2018/04/25 23:44

    ごめんなさい。まず使っているPInとコードのPinが違っていたのでコードが間違っていました

    キャンセル

  • band20010518

    2018/04/26 01:29

    おそらく私のパソコンに問題があると思うので、一周回転するコードを教えて欲しいです。後スピードPinは関係あるでしょうか?

    キャンセル

回答 3

+1

コードだけを見せられても、そのロボットの回路構成や回路図、実際のメカの図面などを見ないと、どー動くか判断できません。

で、その提示されたコードはちゃんとコンパイルできるんでしょうか
なんかいろいろ間違ってそうに見えますが。


追記
なら、loop 関数のナカミを下のコードのとおりに変更して、
ロボットがちゃんと直進するのかをみてみれ

void loop() 
{  
    digitalWrite(rightMotorDirectionPin, HIGH);   // right motor ON
    digitalWrite(leftMotorDirectionPin, HIGH);    // left mortor ON
    delay(10000); //wait for 10 seconds

    digitalWrite(rightMotorDirectionPin, LOW); // right mortor OFF
    digitalWrite(leftMotorDirectionPin, LOW); // left mortor OFF
    delay(10000); //wait for 10 seconds 
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 23:01

    コンパイルはできます。

    キャンセル

  • 2018/04/25 23:20

    で、追記の修正したらどう動く?

    キャンセル

  • 2018/04/25 23:21

    写真やコードだけを見せられても、そのロボットの回路構成や回路図、実際のメカの図面などを見ないと、どー動くか判断できません。 (再

    キャンセル

  • 2018/04/25 23:27

    やっぱり左に曲がってしまいます

    キャンセル

  • 2018/04/25 23:40

    なら、回路が間違ってるか配線が間違ってるか、メカが間違ってるかのどれかだw

    キャンセル

  • 2018/04/26 01:02

    ごめんなさい。reversePinではありませんでした。私が使ってるのはMotorDirectionPinとspeedPinですのでコードは違います

    キャンセル

  • 2018/04/26 09:43

    追記の修正した時にマイコンボードに書き込むとエラーが出ます

    キャンセル

  • 2018/04/27 11:40

    y_waiwaiさんのコードの前に、質問に書かれているコードの最初の17行("pinMode(leftMotorReversePin,OUTPUT);"の次の"}"の行まで)を付け加えて、試してみてください。

    キャンセル

  • 2018/04/27 11:47

    ってゆーか、デバッガか何かで、それぞれのピンを単独で操作して、そのピンが想定してるような動作をするのかをまず見てみようよ。
    MotorDirectionPinなら、(おそらく)モータの回転方向の切り替えだろうし、
    speedPinなら、(おそらく)モータの回転停止の切り替えだろうから、
    それぞれどう動作するか確認してみよう

    #って、回路図やメカ図面がないので、上のピンがそう想定されてるかどうかさえこっちにはわからんのだがw

    キャンセル

+1

自動制御は

  • フィードフォワード
  • フィードバック

の二種類の方法があります。
それぞれ雑に説明すると、
フィードフォワードは事前に実験しておいて、
「このぐらいの制御量を実現するにはこのぐらいの操作をすればいい」というのを決めて制御する方法です。
センサーが不要で、制御コードも単純という利点がありますが、精度は出ません。

一方フィードバックは何かしら制御対象を観測できるセンサーを使って、
それの観測データを使って操作を調整する方法です。
利点と欠点はフィードフォワードの逆です。

開発しているロボット、要件にあった制御方法を選んでください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

すごく多くの誤解があるように思われます。
1)ピンについて
*ピンの種類

// Set pins for motor A
int rightMotorDirectionPin = 12;
int rightMotorReversePin = 3;     // Needs to be a PWM pin to be able to control motor speed.  
// The PWM function works on pins 3, 5, 6, 9, 10, and 11

// Set pins for motor B
int leftMotorDirectionPin = 13;
int leftMotorReversePin = 11;


の部分は、そのロボットに付随して提供されているプログラムから取ったものだと思います。

xxMoterReversePin(正しくはxxMotorSpeedPin?)は、PWM信号を出力するピン(アナログ出力ピン)ですから、

digitalWrite(leftMotorSpeedPin, HIGH);


ではなく

analogWrite(leftMotorSpeedPin, 255);


のように使うはずです。
2つ目の引数が出力値で、0で最低(パルス幅が0)、255で最高(パルス幅が100%)になります。

2)コードについて
* 悪いですが、まったくなってないです。

loop()の中にある

void forward();

digitalWrite(rightMotorDirectionPin, HIGH);   // right motor ON
digitalWrite(leftMotorDirectionPin, HIGH);    // left mortor ON
delay(10000); //wait for 10 seconds

digitalWrite(rightMotorDirectionPin, LOW); // right mortor OFF
digitalWrite(leftMotorDirectionPin, LOW); // left mortor OFF
delay(10000); //wait for 10 seconds


の部分は、loop()の外側(setupのコードの後辺り)にあって、以下のようにサブルーチンの定義にするべきものと思います。(turnleft,reverse,allstopも同様)

void forward()
{
digitalWrite(rightMotorDirectionPin, HIGH);   // right motor ON
digitalWrite(leftMotorDirectionPin, HIGH);    // left mortor ON
delay(10000); //wait for 10 seconds

digitalWrite(rightMotorDirectionPin, LOW); // right mortor OFF
digitalWrite(leftMotorDirectionPin, LOW); // left mortor OFF
delay(10000); //wait for 10 seconds
}


そしてloopは、そうしたサブルーチンを使った以下のようなコードになるのではないでしょうか。

void loop()
{
  forward(); // 前進
  turnleft(); // 左折
  reverse(); // 後退
  allstop(); // 停止
}


これだと、"まっすぐ進ませ"、"左に曲がって"、"その後逆転してまっすぐ進む" という動作のプログラムになっていることが容易に理解できるかと思います。

こうしたこと(サブルーチンの定義、loopの中でサブルーチンを使う事などなど)はArduinoのスケッチの基礎的なところなので、Arduinoのプログラミングについて書かれた本や雑誌に目を通されることを強くお勧めいたします。

*左に曲がる
ozwkさんも指摘していらっしゃいますが、"右側のモーターだけ5秒間回す"というコードではロボットの向きがどのぐらい変わるのかが判りません。左方向に270度回って結果として右に曲がってしまうかもしれません。実験を繰り返して、適切な時間を探す努力が必要であると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Arduino

    493questions

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