Tone() конфликтует с библиотекой IRremote (множественное определение `__vector_7')
Я только начал работать с Arduino и C++, поэтому прошу прощения, если мой вопрос слишком простой. Я пытаюсь использовать тон() с пассивным зуммером для создания звука, а также использую библиотеку IRremote для пульта дистанционного управления. Однако всякий раз, когда они используются вместе, возникает эта ошибка:
Tone.cpp.o (символ из плагина): В функции `timer0_pin_port':
(.text+0x0): множественное определение `__vector_7'
libraries\IRremote\IRremote.cpp.o (символ из плагина):(.text+0x0): впервые определено здесь
collect2.exe: ошибка: ld вернул 1 статус выхода
статус выхода 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Это код, необходимый для воссоздания этой ошибки:
#include "IRremote.h"
#include "pitches.h"
int melody[] = {NOTE_C5, NOTE_E6};
void setup() {}
void loop() {
for (int thisNote = 0; thisNote < 2; thisNote++) {
tone(3, melody[thisNote], 300);
}
}
Не могли бы вы посоветовать мне, как решить эту проблему и, если необходимо, другую библиотеку или способ создания звука или приема ИК-сигналов?
@rgiller, 👍5
Обсуждение1 ответ
Лучший ответ:
Как и написал @MichelKeijzers, проблема вызвана тем, что "IRremote" использует тот же таймер, что и "Tone", и решение этой проблемы немного грязное.
Поскольку Tone включен в ArduinoCore (и скомпилирован), мы не можем легко изменить его, поэтому единственное, что мне помогло, это изменить файл boarddefs.h библиотеки IRremote. Поскольку его код легко доступен после его загрузки с помощью «Диспетчера библиотек», включенного в ArduinoIDE.
В своих тестах я использовал настройки ATmega328P.
Отредактируйте C:\Users\youruser\Documents\Arduino\libraries\IRremote\boarddefs.h
и найдите номер своего процессора.
Для ATmega328 это определение #define IR_USE_TIMER2
Я просто изменил его, чтобы использовать #define IR_USE_TIMER1
И компиляция прошла успешно.
Sketch uses 2746 bytes (8%) of program storage space. Maximum is 30720 bytes.
Global variables use 242 bytes (11%) of dynamic memory, leaving 1806 bytes for local variables. Maximum is 2048 bytes.
Мой код:
#include "IRremote.h"
#define NOTE_C5 523
#define NOTE_E6 1319
int melody[] = {NOTE_C5, NOTE_E6};
void setup() {}
void loop() {
for (int thisNote = 0; thisNote < 2; thisNote++) {
tone(3, melody[thisNote], 300);
}
}
- Ошибка загрузки Arduino IDE
- Использование VS1838B с Arduino
- Wire.h не найден!
- Может ли плагин Arduino Eclipse использовать библиотеки, установленные Arduino IDE?
- Где параметры avrdude определяются в Arduino IDE?
- Как остановить вращение сервопривода?
- Arduino IRremote перестает работать
- Несколько void loop() с ESP8266
Я думаю, что ваша проблема связана с https://forum.arduino.cc/index.php?topic=165675.0, где две библиотеки используют один и тот же таймер., @Michel Keijzers
Я просматриваю Tone.cpp и думаю, что можно заставить его использовать другой таймер, определив USE_TIMER1. Я проверю это как можно скорее., @Filip Franik
@FilipFranik, спасибо. Где найти файл .cpp? Я скачал Arduino IDE из Магазина Windows., @rgiller
@MichelKeijzers Форум, на который вы ссылаетесь, похоже, не объясняет, как решить проблему, с которой я столкнулся, хотя я думаю, что это та же проблема., @rgiller
https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Tone.cpp, @Filip Franik
@rgiller Я знаю, поэтому я просто публикую это как комментарий, а не как ответ., @Michel Keijzers
@FilipFranik Вы имеете в виду, что я должен изменить
#define USE_TIMER2
на другое число, отличное от ИК-пульта?, @rgiller