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

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

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

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

Q&A

解決済

3回答

5625閲覧

Arduinoで赤外線モータ制御をしたいのですが、、、

osaru777

総合スコア11

Arduino

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

0グッド

0クリップ

投稿2019/03/04 00:45

赤外線リモコンから決まったデータを受信するとモーターが回るようにプログラムしたつもりですが、回りません。原因が分かる方教えて欲しいです。
まず、モーターを制御するために、東芝製のモータードライバTA7291Pを使用しています。スイッチを使いHIGHなら正回転、LOWなら逆回転というプログラムを組んで動作確認済みです。
赤外線モジュールが信号を受信するとモータ制御とLEDが点灯する回路を組み、信号が来ているかどうかの判断をしようと考え、実行してみました。結果としては、LEDは点灯しましたがモーターは回りませんでした。
同じプログラムで出力などは変えましたが、サーボモータを制御することには成功しています。そのため、どこに問題があるか見当が付きません。解答よろしく御願いします。

#include <IRremote.h> #define PIN_IN1 5 #define PIN_IN2 4 #define PIN_VREF 3 int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); // Start the receiver pinMode(PIN_IN1,OUTPUT); pinMode(PIN_IN2,OUTPUT); pinMode(13,OUTPUT); } void loop() { analogWrite(PIN_VREF,127); if (irrecv.decode(&results)) { irrecv.resume(); // Receive the next value if(results.value == 0x00FF18E7) { digitalWrite(13,HIGH); digitalWrite(PIN_IN1,HIGH); digitalWrite(PIN_IN2,LOW);//回転 } else if(results.value == 0x00FF4AB5) { digitalWrite(13,LOW); digitalWrite(PIN_IN1,LOW); digitalWrite(PIN_IN2,HIGH);//逆回転 } } }

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

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

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

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

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

guest

回答3

0

ベストアンサー

analogWrite(PIN_VREF,127); // Arduino 電源電圧 5V がPWM出力されます

Vref≦VS の規定があります Vs:モーター電源電圧

Vrefピンを使わないなら VrefピンはVsに接続して下さい 

Vrefピンを使うなら モーター電源を5V以上に設定する必要があります(TA7291Pは、内部ロスが2V程度ある)

正転/逆転 切り換え時は 停止状態 100µs が必要です

データシート
https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/ta7291.pdf
接続参考
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html

リモコン受信データ確認 、モーター停止 追加

#include <IRremote.h> #define PIN_IN1 5 #define PIN_IN2 4 #define PIN_VREF 3 int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver pinMode(PIN_IN1,OUTPUT); pinMode(PIN_IN2,OUTPUT); pinMode(13,OUTPUT); } void loop() { analogWrite(PIN_VREF,127); if (irrecv.decode(&results)) { irrecv.resume(); // Receive the next value Serial.println( results.value , HEX ); // if(results.value == 0x00FF18E7) { if(results.value == 0x2107807F) { // 1 digitalWrite(13,HIGH); digitalWrite(PIN_IN1,HIGH); digitalWrite(PIN_IN2,LOW);//回転 } // else if(results.value == 0x00FF4AB5 ) { else if(results.value == 0x2107C03F ) { // 3 digitalWrite(13,LOW); digitalWrite(PIN_IN1,LOW); digitalWrite(PIN_IN2,HIGH);//逆回転 } else if(results.value == 0x210740BF ) { // 2 digitalWrite(PIN_IN1,LOW); digitalWrite(PIN_IN2,LOW);//停止 } } // IF } // LOOP

投稿2019/03/04 02:15

編集2019/03/05 17:01
koujikuu

総合スコア401

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

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

osaru777

2019/03/04 02:38

VrefピンをVsに接続したら動作確認できました。しかし、次の信号を受け付けてくれません。これに関して何か分りますでしょうか?
koujikuu

2019/03/04 02:51

正転/逆転 切り換え時の 停止状態 100µs が入ってないのでは? 例 正転、逆回転も同様 digitalWrite(13,HIGH); digitalWrite(PIN_IN1,KOW); digitalWrite(PIN_IN2,LOW);//停止 delay(1); digitalWrite(PIN_IN1,HIGH);//回転
koujikuu

2019/03/04 02:52

訂正 digitalWrite(PIN_IN1,KOW); ↓ digitalWrite(PIN_IN1,LOW);
osaru777

2019/03/04 05:23

入れていますが変わりませんでした。 試していて分りましたが、モーターの回転を手で止めた状態で信号を切り替えると動作してくれました。しかし、話してしまうとそこから動きません。
koujikuu

2019/03/04 07:21

TA7291P で 2V 程度電圧低下するので 3V では実質1V程度になります モーター電源を 4.5V にしてみては?
osaru777

2019/03/04 23:18

電源は変えてみましたが関係ないようです。 初回の信号を受信した後、次の信号を受信できないようです。また、ラジコンのようにボタンを押している間のみ回転するようにしたいのですが、今のプログラムではずっと回転し続けます。break;で抜けるなどの処理で解決するのでしょうか?
koujikuu

2019/03/05 16:56

ブレッドボードで試験してみました、 TA7291P と 赤外線受光モジュール を同じボード上に実装した時 受信データが0になり コントロール不能になりました 受光モジュールを別ボードに移しモーターから離したら正常に戻りました モーターノイズの影響と思われます またリモコンキーは長押しするとリピートコードが送信されます 0xFFFFFFFF リモコンコードを1秒以上受信しない場合、モーターを停止させる処理が必要と思われます
osaru777

2019/03/08 06:49

試した結果解決することができました。ありがとうございます。
guest

0

analogWriteの位置がまずいのが原因かなと思います。
一瞬で終わるループの中に入っているので連続で実行され続けます。
出力がゼロになっていませんか?

投稿2019/03/04 01:13

ikadzuchi

総合スコア3047

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

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

osaru777

2019/03/04 01:55

位置を変えて行ないましたが動きませんでした。具体的にどこに入れればいいか教えていただけますか?
ikadzuchi

2019/03/04 11:47

どこに変えましたか? loop()の中でなくsetup()の中に移すという意味で言いました。 また、現状のコードで出力はゼロになっていますか?
osaru777

2019/03/04 23:12

loop()の中で別のプログラムであれば動くのですが、赤外線を加えただけでダメになるものなんでしょうか? 出力はdigitalWriteの部分は正しく動作していることを確認できています。
ikadzuchi

2019/03/05 00:24

その「別のプログラム」がどのようなものか分からないので分かりません。 そして言葉が足りなかったかも知れませんが見ていただきたかったのはdigitalWriteでなくanalogWriteの出力電圧です。
osaru777

2019/03/05 00:44

失礼しました。赤外線なしで、正回転と逆回転をただ繰り返す処理をおこなったものになります。このプログラムの中ではloop()の中でanalogWrite処理をおこなっていますが、正常に動作しています。analogWrite(PIN_VREF,127);で出力電圧半分になるようPWM制御し、analogWrite(PIN_VREF,255);で出力MAXなのをしっかりと動作することが確認できています。
ikadzuchi

2019/03/05 16:07

> 正回転と逆回転をただ繰り返す ということはおそらくループは一瞬で終わらないのでしょうから、条件が違います。 > analogWrite(PIN_VREF,127);で出力電圧半分になるようPWM制御し、analogWrite(PIN_VREF,255);で出力MAXなのをしっかりと動作することが確認できています。 いまいち文章がはっきりしませんが、これは質問のプログラムでですか? それとも正逆繰り返す正常に動作するプログラムでですか? また、255については今回聞いていません。そして「出力電圧半分になるようPWM制御し」と言いますが、私が知りたいのは半分になるようにした結果です。 私は、質問のプログラムを走らせた時に、analogWriteの出力電圧が実際に計ってどのような値が得られるかが知りたいのです。それによって私の考えが合っているか間違っているかが分かります。
guest

0

モータを回す、と一口に言ってもいろいろと考慮しなければいけないところがあります
まず、そのモータの電源はなにを使ってるでしょうか。
モータは周り出しのときには、通常回転時の数十倍の電流が流れます。
このとき、貧弱な電源であれば、電圧がドロップしてしまい、一緒にそこにCPUが繋がっていれば、そのときにリセットしてしまいます

まずは、しっかりとした電源を用意し、それでモータを駆動するようにしてみましょう

投稿2019/03/04 01:04

y_waiwai

総合スコア87749

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

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

osaru777

2019/03/04 01:09

ミニ四駆などで使うモーターに3Vの電池を繋いでいます。赤外線通信を行なわなければ動作するので電源は関係ないのではないでしょうか?
y_waiwai

2019/03/04 01:24

いちど、オシロスコープを電源につないで波形を見てみてはどうでしょう。 スイッチをつないで動作確認と言っても、リセットされているのを気が付かないだけってこともあります。 モータは電圧がドロップしようと関係ないですが、CPUはそういうわけには行きませんからねー
osaru777

2019/03/04 01:56

オシロスコープが今手元にはないので、電池を9V電池に交換してみましたがダメでした。
y_waiwai

2019/03/04 02:18

電池はだめですよw せめて、すまほの充電器で2A以上とかそういうもんもってきましょう。 そんでも、モータによってはだめかも
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問