我正在研究一个涉及红外信号处理和控制舵机的Arduino Mega 2560项目。但下面的简单草图会产生一个错误,说一些字段被定义了多次。如何解决“__vector_32'的多重定义”错误?
代码重现错误:
#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
控制。如果您需要更多的舵机,timer 1
也可用于伺服13-24等。Arduino Mega 2560上的标准伺服库(每个定时器12个)最多可控制48个舵机。
IRremote库使用定时器2接收IR信号。这基本上与伺服库不冲突。但我已经改变了IRremoteInt.h使用timer 3
而不是timer 2
,因为我也使用中断驱动的超声波传感器(在timer 2
上)。这就是我遇到上述问题的原因。
由于我不使用我的项目超过12个伺服系统,我简单地禁用在伺服库中的定时器1,3,4,从而导致以下行(CP到上述原线):
typedef enum { _timer5, _Nbr_16timers } timer16_Sequence_t;
这样会导致更多的错误,因为枚举不再完整......如果您想要做同样的事情,只需注释掉试图编译草图时弹出错误的代码行。然后重新编译,一切都应该没问题。
现在一切工作正常,超声波传感器,舵机和红外接收。谢谢。
感谢您的回答。帮助我解决问题。 IIRC,IRremote库在Mega 2560上使用定时器2作为默认值。伺服库为前12个舵机使用定时器5。 – salocinx
在我的初始问题中添加了一些解释和解决方案。谢谢你的帮助! – salocinx
对不起,我错过了这是一个2560.我为328P写了答案。 –