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

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

ただいまの
回答率

88.76%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,217

osaru777

score 11

赤外線リモコンから決まったデータを受信するとモーターが回るようにプログラムしたつもりですが、回りません。原因が分かる方教えて欲しいです。
まず、モーターを制御するために、東芝製のモータードライバ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);//逆回転
     }
   }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

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/05 08:18

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

    キャンセル

  • 2019/03/06 01:56

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

    キャンセル

  • 2019/03/08 15:49

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/04 10:09

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

    キャンセル

  • 2019/03/04 10:24

    いちど、オシロスコープを電源につないで波形を見てみてはどうでしょう。
    スイッチをつないで動作確認と言っても、リセットされているのを気が付かないだけってこともあります。

    モータは電圧がドロップしようと関係ないですが、CPUはそういうわけには行きませんからねー

    キャンセル

  • 2019/03/04 10:56

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

    キャンセル

  • 2019/03/04 11:18

    電池はだめですよw

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/05 09:24

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

    キャンセル

  • 2019/03/05 09:44

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

    キャンセル

  • 2019/03/06 01:07

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

    キャンセル

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

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

関連した質問

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