タンクの 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 によって制御
だから私の質問は:
インストラクタブルのシールドが PWM にピン 10 と 11 を使用するのはなぜですか? それらは 2 つの異なるタイマーに対応します。なぜ9と10ではないのですか?
モーター シールドと共に IR を使用するには、どのタイマーを IR ライブラリで使用するように構成する必要がありますか?
答えが 2 の場合は、行のコメントを解除する必要があります
IRremoteInt.h
。else
timer1 と timer2 しかありませんが、68 行目でUno が分岐すると思います。なぜ timer0 を Uno に使用できなかったのだろうか。
最後の選択肢として、切断痕を残して再はんだ付けしたいのですが、シールドが使用するピンを変更するという別の可能性もありますが、どれですか? また、これはデフォルト以外のピンでタイマーを PWM に設定することとペアになると推測していますが、タイマー/割り込みについては何も知らず、Arduino と C の知識は限られています。
問題を解決するだけでなく学びたいので、これを長い質問にしました。質問されたこと以上のことを自由に説明してください。
解決策を探しているときに、PWMまたはタイマーを使用するときに留意すべき他の競合も見つかりました。
- Timer0は8 ビット タイマーで、最大値 255 を保持できます
delay()
。millis()
- Timer1は 16 ビット タイマーで、最大 65535 (符号なし 16 ビット整数) を保持できます。Arduino サーボ ライブラリは、このタイマーを使用します。
- Timer2
tone()
は、Arduino関数で使用される 8 ビット タイマーです。
そしてもちろん、IRremoteライブラリは を使用するTIMER_RESET
ため、使用するタイマーによっては、関連するピンと競合する可能性があります。