Я построил этот экран двигателя на основе чипа L298N для управления двумя двигателями бака. Он использует контакты 5 и 6 для одного двигателя, а штыри 10 и 11 для другого.
При попытке добавить TSOP 4838, чтобы управлять баком с ИК-пульта, я заметил, что перемещение двигателя на штырьках 10/11 в обратном направлении работает только на полной скорости, то есть значение HIGH (255) на выводе 11. Все, что ниже этого значения, не выводит ничего на вывод 11 (измеренное напряжение на этих контактах равно 0 V).
Для пульта я использую эту библиотеку. Приемник IR подключен к контакту 2 (но штырь не имеет значения). Проблема заключается в самом коде библиотеки. Линия, которая разрешает ИК-прослушивание irrecv.enableIRIn();
, вызывает проблемы. Я узнал, что существует конфликт внутренних таймеров Arduino и штырей, используемых для ШИМ щитом.
Это код для управления двигателем в обратном направлении:
#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: управляются таймером
- Штыри 9 и 10: управляются таймером
- Штыри 11 и 3: управляются таймером
Итак, мои вопросы:
-
Почему щит в инструктивных штифтах 10 и 11 для PWM? Они соответствуют двум разным таймерам. Почему не 9 и 10?
-
Чтобы использовать ИК вместе с экраном двигателя, какой таймер я должен настроить для использования библиотеки ИК?
-
Если ответ равен 2, строка должна быть раскомментирована в
IRremoteInt.h
. Я предполагаю, что Uno возьмет ветвьelse
в строке 68, хотя есть только таймер 1 и timer2. Интересно, почему timer0 нельзя использовать для Uno.
Хотя я бы хотел оставить режущие следы и регенерировать в качестве последнего варианта, другой возможностью было бы изменить штыри, используемые щитом, но что? И я предполагаю, что это также будет сопряжено с настройкой таймеров на PWM на других контактах, чем по умолчанию, но я ничего не знаю о таймерах/прерываниях, и мои знания о Arduino и C ограничены.
Я сделал этот длинный вопрос, потому что хочу научиться не просто решить проблему, поэтому не стесняйтесь объяснять больше, чем того, что задано.
При поиске решения я также нашел, что другие конфликты следует учитывать при использовании PWM или таймеров:
- Timer0 - это 8-битный таймер, он может содержать максимальное значение 255. Он используется
delay()
иmillis()
, поэтому есть последствия, когда он возится с ним - Timer1 - это 16-разрядный таймер, он может содержать максимум 65535 (неподписанное 16-битное целое число). Библиотека Arduino Servo использует этот таймер
- Timer2 - это 8-разрядный таймер, используемый функцией Arduino
tone()
И, конечно, библиотека IRremote использует TIMER_RESET
, поэтому в зависимости от того, какой таймер она использует, она может конфликтовать с связанными контактами.