14

タンクの 2 つのモーターを制御するために、 L298Nチップに基づいてこのモーター シールドを作成しました。一方のモーターにはピン 5 と 6 を使用し、もう一方のモーターにはピン 10 と 11 を使用します。

IR リモートでタンクを制御するためにTSOP 4838を追加しようとしているときに、ピン 10/11 のモーターを逆方向に動かすと、全速力、つまりピン 11 の HIGH (255) 値でしか機能しないことに気付きました。その値を下回ると、ピン 11 には何も出力されません (これらのピンで測定された電圧は 0 V です)。

リモートには、このライブラリを使用します。IRレシーバーはピン 2 に接続されています(ピンは関係ありません)。問題は、ライブラリ コード自体です。IR リスニングを有効にする回線がirrecv.enableIRIn();問題の原因です。内部ArduinoタイマーとシールドによるPWMに使用されるピンの競合があることを知りました。

これは、逆にモーターに電力を供給するコードです。

#include <IRremote.h>

// IR receiver configuration
const int irPin = 2;
IRrecv irrecv(irPin);

// Motors configuration
const int mLeftPin1  = 10;
const int mLeftPin2  = 11;
const int mRightPin1 = 5;
const int mRightPin2 = 6;

void setup()
{
  // Start IR
  irrecv.enableIRIn();

  // Setup motors
  pinMode(mLeftPin1, OUTPUT);
  pinMode(mLeftPin2, OUTPUT);
  pinMode(mRightPin1, OUTPUT);
  pinMode(mRightPin2, OUTPUT);

  // Move left motor in reverse, slower speed
  analogWrite(mLeftPin2, 100); // This works only with 255 instead of 100
  digitalWrite(mLeftPin1, LOW);
}

ここで、 Arduino Unoのタイマーで使用されるピンが次のとおりであることがわかりました。

  • ピン 5 と 6: Timer0 によって制御
  • ピン 9 と 10: Timer1 によって制御
  • ピン 11 と 3: Timer2 によって制御

だから私の質問は:

  1. インストラクタブルのシールドが PWM にピン 10 と 11 を使用するのはなぜですか? それらは 2 つの異なるタイマーに対応します。なぜ9と10ではないのですか?

  2. モーター シールドと共に IR を使用するには、どのタイマーを IR ライブラリで使用するように構成する必要がありますか?

  3. 答えが 2 の場合は、行のコメントを解除する必要がありますIRremoteInt.helsetimer1 と timer2 しかありませんが、68 行目でUno が分岐すると思います。なぜ timer0 を Uno に使用できなかったのだろうか。

最後の選択肢として、切断痕を残して再はんだ付けしたいのですが、シールドが使用するピンを変更するという別の可能性もありますが、どれですか? また、これはデフォルト以外のピンでタイマーを PWM に設定することとペアになると推測していますが、タイマー/割り込みについては何も知らず、Arduino と C の知識は限られています。

問題を解決するだけでなく学びたいので、これを長い質問にしました。質問されたこと以上のことを自由に説明してください。

解決策を探しているときに、PWMまたはタイマーを使用するときに留意すべき他の競合も見つかりました。

  • Timer0は8 ビット タイマーで、最大値 255 を保持できますdelay()millis()
  • Timer1は 16 ビット タイマーで、最大 65535 (符号なし 16 ビット整数) を保持できます。Arduino サーボ ライブラリは、このタイマーを使用します。
  • Timer2tone()は、Arduino関数で使用される 8 ビット タイマーです。

そしてもちろん、IRremoteライブラリは を使用するTIMER_RESETため、使用するタイマーによっては、関連するピンと競合する可能性があります。

4

3 に答える 3

1

使用するボードに注意してください。Arduino Uno を使用する場合、コードは次のようになります。 = ピン 3 endif

于 2014-03-25T20:31:22.897 に答える
0

組み立て済みのL298 V2モーター シールドでも同じ問題が発生しました。

ピンはシールド上で次のようにマークされていました。

Motor1: ピン 3 と 5 Motor2: ピン 6 と 9

3 の代わりに PIN10 を使用し、小さな回避策を使用します。PIN10 から SHIELD の PIN3 へのワイヤを配置します。私のプロジェクトは、SAMSUNG TV のリモコンでロボットを制御することでした。

于 2014-03-15T14:31:00.577 に答える