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);
}
}

Не могли бы вы посоветовать мне, как решить эту проблему и, если необходимо, другую библиотеку или способ создания звука или приема ИК-сигналов?

, 👍5

Обсуждение

Я думаю, что ваша проблема связана с 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


1 ответ


Лучший ответ:

6

Как и написал @MichelKeijzers, проблема вызвана тем, что "IRremote" использует тот же таймер, что и "Tone", и решение этой проблемы немного грязное.

Поскольку Tone включен в ArduinoCore (и скомпилирован), мы не можем легко изменить его, поэтому единственное, что мне помогло, это изменить файл boarddefs.h библиотеки IRremote. Поскольку его код легко доступен после его загрузки с помощью «Диспетчера библиотек», включенного в ArduinoIDE.

В своих тестах я использовал настройки ATmega328P.

настройка платы arduino

Отредактируйте C:\Users\youruser\Documents\Arduino\libraries\IRremote\boarddefs.h и найдите номер своего процессора.

Для ATmega328 это определение #define IR_USE_TIMER2

boarddefs.h code

Я просто изменил его, чтобы использовать #define IR_USE_TIMER1

boarddefs.h обновлен

И компиляция прошла успешно.

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);
  }
}
,