2017-06-06 127 views
0

我正在研究一个涉及红外信号处理和控制舵机的Arduino Mega 2560项目。但下面的简单草图会产生一个错误,说一些字段被定义了多次。如何解决“__vector_32'的多重定义”错误?

参与的图书馆:ServoIRremote

代码重现错误:

#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; 

这样会导致更多的错误,因为枚举不再完整......如果您想要做同样的事情,只需注释掉试图编译草图时弹出错误的代码行。然后重新编译,一切都应该没问题。

现在一切工作正常,超声波传感器,舵机和红外接收。谢谢。

回答

1

Servo.h和IRremote.h都试图使用Timer1。他们不能都拥有它,因此错误。您可以尝试使用ServoTimer2库从定时器2运行舵机,但请确保您阅读了它的文档,因为它不像舵机一样工作。

+0

感谢您的回答。帮助我解决问题。 IIRC,IRremote库在Mega 2560上使用定时器2作为默认值。伺服库为前12个舵机使用定时器5。 – salocinx

+0

在我的初始问题中添加了一些解释和解决方案。谢谢你的帮助! – salocinx

+0

对不起,我错过了这是一个2560.我为328P写了答案。 –

相关问题