我正在研究一个涉及红外信号处理和控制伺服系统的Arduino Mega 2560项目。但是下面的简单草图会产生错误,说某些字段是多次定义的。
重现错误的代码:
#include <Servo.h>
#include <IRremote.h>
void setup() { }
void loop() { }
错误说明:
libraries\IRremote\IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)':
(.text+0x0): multiple definition of `__vector_32'
libraries\Servo\avr\Servo.cpp.o (symbol from plugin):(.text+0x0): first defined here
c:/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.
如何解决此问题?
UPDATE /溶液
伺服库在ServoTimers.h
中有以下定义:
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;
基本上,前12个伺服系统由timer 5
控制。如果您需要更多伺服系统,伺服13-24等也可以参考timer 1
。在Arduino Mega 2560(每个定时器12个)上,标准伺服库可以控制多达48个伺服系统。
IRremote库使用定时器2接收IR信号。这基本上不与Servo库冲突。但是我已经改变了IRremoteInt.h以使用timer 3
而不是timer 2
,因为我还使用了中断驱动的超声波传感器(在timer 2
上)。这就是我遇到上述问题的原因。
由于我没有为我的项目使用超过12个伺服器,我只是在伺服库中禁用了定时器1,3,4,产生了以下行(与上面的原始行相同):
typedef enum { _timer5, _Nbr_16timers } timer16_Sequence_t;
这会导致更多错误,因为枚举不再完整...如果你想做同样的事情,只需注释掉在你尝试编译草图时弹出错误的代码行。然后重新编译,一切都应该没问题。
现在一切正常,超声波传感器,伺服系统和红外接收。感谢。
答案 0 :(得分:2)
Servo.h和IRremote.h都试图使用Timer1。他们不能拥有它,因此错误。您可以尝试使用ServoTimer2库来运行定时器2的伺服器,但请务必阅读它的文档,因为它不像Servo那样工作。