Таймер Arduino кажется сбой?
Для выставки с некоторыми интерактивными установками мне нужно создать систему, которая считывает данные с трех ультразвуковых датчиков PING и имеет диммер DMX, подключенный к одному выходу.
Поэтому я взял свою плату Arduino Mega, собрал вокруг нее некоторые аппаратные средства (инвертор сигналов для DMX) и протестировал диммер DMX, используя библиотеку DmXSimple. Работает нормально!
Следующий шаг: тестирование датчиков PING. Я использовал библиотеку NewPing, и подключил датчики. Работает нормально!
Теперь оба вместе, в одной программе: импортируем обе библиотеки, используя одинаковые коды. Это не работает!
Таймер столкновения? Ну... во всяком случае - я понятия не имею, как это решить. Что я должен делать? Если это проблема таймера (то есть обе библиотеки вызывают один и тот же таймер), я действительно не знаю, как изменить библиотеки, чтобы он работал.
1 ответ
На Arduino есть два таймера, и вы можете сделать обе работы в стороне. DmxSimple явно говорит, что использует таймер #2, тогда как для NewPing это не ясно. Но библиотека NewPing может работать без использования таймера. Вы можете заставить DmxSimple работать, используя его таймер (который является обязательным для взаимодействия с его шиной в реальном времени), тогда как вы можете обрабатывать эхолот в функции цикла:
void loop() {
int dst = sonar.ping_cm();
delay(50);
DmxSimple.write(1, dst);
}
Там у вас не должно быть конфликтующих таймеров.
Глядя на исходный код NewPing, он использует Timer2, если вы используете timer_us()
/ timer_ms()
функции, но нет таймера в противном случае. Но если вы запустите его на Arduino Leonardo (или Arduino Micro или любом другом микроконтроллере на базе ATmega32U4), он будет использовать Timer4, который не конфликтует с DmxSimple.
Если вы хотите исправить библиотеку NewPing для использования Timer3, вы можете заменить это в NewPing.cpp:
OCR2A = 249;
TIMSK2 |= (1 << OCIE2A);
с
OCR3A = 640;
TIMSK3 |= (1 << OCIE3A);
и в stop_timer:
TIMSK2 &= ~(1 << OCIE2A);
с
TIMSK3 &= ~(1 << OCIE3A);