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

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

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

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

Q&A

解決済

3回答

2519閲覧

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

band20010518

総合スコア14

Arduino

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

0グッド

0クリップ

投稿2018/04/25 09:24

編集2018/04/25 14:42

ロボットをまず一メートルまっすぐ進ませ、左に曲がって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
}

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

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

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

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

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

ozwk

2018/04/25 14:16 編集

左に曲がるというのは、右輪が停止しているのか逆転しているのか回転数に差があるのかどれですか?
band20010518

2018/04/25 14:31

回転数に差がありますね
ozwk

2018/04/25 14:38

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

2018/04/25 14:44

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

2018/04/25 16:29

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

回答3

0

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

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


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

C

1void loop() 2{ 3 digitalWrite(rightMotorDirectionPin, HIGH); // right motor ON 4 digitalWrite(leftMotorDirectionPin, HIGH); // left mortor ON 5 delay(10000); //wait for 10 seconds 6 7 digitalWrite(rightMotorDirectionPin, LOW); // right mortor OFF 8 digitalWrite(leftMotorDirectionPin, LOW); // left mortor OFF 9 delay(10000); //wait for 10 seconds 10}

投稿2018/04/25 13:58

編集2018/04/25 14:15
y_waiwai

総合スコア87747

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

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

band20010518

2018/04/25 14:01

コンパイルはできます。
y_waiwai

2018/04/25 14:20

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

2018/04/25 14:21

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

2018/04/25 14:27

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

2018/04/25 14:40

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

2018/04/25 16:02

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

2018/04/26 00:43

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

2018/04/27 02:40

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

2018/04/27 02:47

ってゆーか、デバッガか何かで、それぞれのピンを単独で操作して、そのピンが想定してるような動作をするのかをまず見てみようよ。 MotorDirectionPinなら、(おそらく)モータの回転方向の切り替えだろうし、 speedPinなら、(おそらく)モータの回転停止の切り替えだろうから、 それぞれどう動作するか確認してみよう #って、回路図やメカ図面がないので、上のピンがそう想定されてるかどうかさえこっちにはわからんのだがw
guest

0

自動制御は

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

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

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

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

投稿2018/04/25 23:58

ozwk

総合スコア13521

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

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

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度回って結果として右に曲がってしまうかもしれません。実験を繰り返して、適切な時間を探す努力が必要であると思います。

投稿2018/04/27 03:00

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問