多个arduino通信(1个主设备,n个从设备)


8

我想开发一个包含以下内容的主/从网络:

  • 1个Arduino主机,可读取传感器并根据传感器信号生成速度斜坡曲线,然后将这些斜坡发送给从机

  • 3个(或更多)Arduino从设备,它们按照主设备发送的斜坡控制12V伺服电机的速度

什么是实现此目的的良好通信协议?串行(SPI)?I2C?还有吗 如果是串行的,那么新的Arduino Leonardo是一个不错的选择吗?选择协议时应考虑哪些问题?

我在想类似的东西:

主:

void loop() {
    update_ramps()
    for(int i=0; i< num_slaves; i++) {
        send_to_all(i, ramps[i]);
    }
}

从站1:

const int id = 1;
int recived_id, recived_value;
void loop() {
    read_data();
    if(recived_id == id) { 
        do_motor_step(recived_value);
    }
}

串行通信,其中主机的RX / TX发送到所有从机。

这似乎是一个合理的解决方案吗?


您只想向所有奴隶发送完全相同的信息?奴隶根本不需要回应吗?
奥利·格拉瑟

不,他们不需要回应!
nkint 2012年

奴隶要走多远?
geometrikal

我认为不会再超过15米了
nkint 2012年

Answers:


12

据我了解,您希望向每个从站发送不同的数据,但是从站不必将数据发送回去。

I2C是寻址总线,因此,如果为每个从站分配不同的I2C地址,则只需要两条线即可发送数据。如果需要,您也可以要求数据。Arduino的AVR具有I2C兼容的串行总线。无需额外的硬件,您就可以扩展到3个以上的从站,最大数量为127个。

UART没有寻址,因此您将需要3个UART(AVR没有),或添加外部逻辑以在UART线之间切换(这需要花钱)。每个额外的从站意味着额外的成本。不建议。
编辑
像克里斯说,你可以使用UART创建多点总线。然后,您必须添加寻址,这使您的UART有点像I2C,但随后又异步了,并且没有像I2C那样的地址匹配硬件。因此仍然不是真正的优势。 编辑结束

SPI还使用共享线存储数据:单个MOSI,并且连接了MISO线。要单独寻址每个从站,您需要每个从站一条SS(从站选择)线路。因此,至少有5个I / O:MOSI,SCK,3×SS和MISO(如果您还想从从站读取数据)。每个附加从机在主机上增加1个I / O引脚。

在此处输入图片说明

我认为I2C是最好的解决方案,需要的导线数量最少。该协议比UART或SPI复杂一点,但是由于AVR具有用于它的硬件,因此它应该易于使用。


2
声称需要多个UART或外部逻辑的说法并不准确。总线UART通信始终使用软件寻址进行。通过共享的发送和接收,这只需要I2C即可。
克里斯·斯特拉顿

@Chris-好点,我会更新我的答案。
stevenvh 2012年

1
@capcom-我为SPI添加了一个框图。MOSI是主设备的输出,而从设备是输入。MISO是从站的输出,主站的输入。是的,您将要发送数据的从站的SS设置为低电平。SS不仅用于指示通信的开始和结束,而且未选择的从站也应使其MISO对总线冲突具有较高的阻抗。
stevenvh 2012年

2
@nkint-8 m的电容约为800 pF,而I2C仅允许400 pF才能获得所需的边沿速度。您必须使用P82B715之类的总线扩展器,该扩展器可以在长达50 m的电缆上驱动总线。
stevenvh 2012年

1
@stevenvh P82B715很棒,很容易插入!
nkint 2012年

5

我假设串行是指UART?请注意,UART,SPI,I2C都是串行协议。

SPI或I2C都可以使用,因为它们都使用主/从架构。
不包括地,对于3个从设备,SPI将需要6个引脚(MOSI,MISO,CLK + 3个SS引脚),而I2C仅需要2个引脚(SDA和SCK)
,假设您不需要很高的数据传输,我可能会选择I2C。速率(<400kHz)

从站添加的越多,SPI就越不方便,因为每个新从站都需要另一个SS(从站选择)。使用I2C,这不是问题,因为寻址是协议的一部分,因此您仍然只需要2条线(加地线)。

对于Arduino,应该有一整套包含I2C / SPI库的教程以及上面两个示例的示例代码,这应该使启动和运行起来非常轻松。


没错,每个从站的数据都不同。我被“ send_to_all”函数的名称所迷惑,但是似乎每个函数都使用不同的坡度(它们被索引了)。我删除了第一个答案。
stevenvh 2012年

1

类似于RS485的共享异步信令方案也应该可行。

如果您不使用线路驱动器/接收器(仅是裸露的ATMEGA引脚),则在轮到您讲话时必须将UART TX作为输入。如果使用的是线路驱动器,则在轮到您发言时,需要使用一个额外的引脚来控制线路驱动器上的三态启用。

还要注意,当最后一个字节被接收到发送寄存器(可以发送另一个字符的点)时,不能仅仅使发送器处于三态,而是必须确保使发送器或线路驱动器保持启用状态,直到字被完全移出。

在您在同一根导线(或差分对)上进行传输和接收的方案中,请考虑到您将听到自己的传输。


1

通过UART连接的特殊情况下,可以使用UART RS485 MODBUS。这是具有软件地址,功能,校验和的通信协议。

我认为:由于RS-485,它比I²C或SPI更可靠,并且使用的线数少于SPI。

注意:它可以作为标准实现,带有一些库,但是它可能会很昂贵,因为您需要一个RS485模块用于每个从站,一个RS485模块用于主站,但是它与现有网络兼容。但是您可以通过使用旧有组件并制造自己的设备来降低成本。的MAX 485可以是基座部件以使一个硬件总线485或通过使用软件RS485


0

满足特定要求的最简单解决方案是在主站(总线控制器)上的TX线上使用RS-422发送器,这将扇出至多个接收器(远程终端)。

所有RT都会听到广播消息,但只会验证和执行通过RT地址定向到它的那些命令。

如果使用类似于1553的总线协议,将很容易实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.