comunicación múltiple arduino (1 maestro, n esclavos)

8

Me gustaría desarrollar una red maestra / esclava que consiste en:

  • 1 Arduino maestro que lee sensores y genera perfiles de rampa de velocidad según las señales del sensor y luego envía esas rampas a los esclavos

  • 3 (o más) esclavos Arduino que controlan la velocidad de los servomotores de 12 V siguiendo las rampas enviadas por el maestro

¿Qué es un buen protocolo de comunicación para lograr esto? Serial (SPI)? I2C? ¿Algo más? Si es serial, ¿es la nueva Arduino Leonardo una buena opción? ¿Qué problemas debería tener en cuenta al seleccionar un protocolo?

Estoy imaginando algo como:

Maestro:

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

Esclavo 1:

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

Y comunicación en serie en la que RX / TX desde el maestro se envía a todos los esclavos.

¿Esto parece una solución razonable?

    
pregunta nkint

5 respuestas

12

Según tengo entendido, usted desea enviar datos diferentes a cada uno de los esclavos, pero los esclavos no tienen que enviar datos de vuelta.

I2C es un bus direccionado, por lo que si asigna una dirección I2C diferente a cada uno de los esclavos, solo necesitará dos cables para enviar los datos. Si es necesario, también puede solicitar los datos. Los AVR de Arduino tienen un bus serie compatible con I2C. Y puede extenderse a más de 3 esclavos sin hardware adicional, hasta un máximo de 127.

UARTs no tienen direccionamiento, por lo que necesitarías 3 UART (que no tiene el AVR), o agregar lógica externa para cambiar entre las líneas de UART (lo que cuesta dinero). Cada esclavo adicional significa costo extra. No recomendado.
editar
Como dice Chris, puedes usar UART para crear un bus multipunto. Y luego tendrá que agregar direccionamiento, lo que hace que su UART funcione un poco como I2C, pero luego asíncrono, y sin el hardware de coincidencia de direcciones como el I2C. Así que todavía no es realmente una ventaja. fin de la edición

SPI también usa líneas compartidas para datos: un solo MOSI y las líneas MISO conectadas. Para dirigirse a cada esclavo individualmente, necesitará una línea SS (Selección de esclavo) por esclavo. Entonces, al menos 5 I / Os: MOSI, SCK, 3 \ $ \ times \ $ SS y MISO si también desea leer datos de los esclavos. Cada esclavo adicional agrega 1 pin de E / S en el maestro.

Creo que el I2C es la mejor solución, que requiere el menor número de cables. El protocolo es un poco más complejo que UART o SPI, pero como el AVR tiene el hardware para ello, debería ser fácil de usar.

    
respondido por el stevenvh
5

Supongo que por serie te refieres a UART? Tenga en cuenta que UART, SPI, I2C son todos protocolos en serie.

SPI o I2C estarían bien para esto, ya que ambos usan la arquitectura maestro / esclavo.
Sin incluir tierra, para 3 esclavos, SPI requeriría 6 pines (MOSI, MISO, CLK + 3 pines SS) y I2C solo dos (SDA y SCK)
Probablemente elegiría I2C, asumiendo que no necesita tasas de transferencia de datos muy altas (< 400kHz)

Cuantos más esclavos agregue, menos conveniente será el SPI, ya que necesita otro SS (selección de esclavos) para cada nuevo esclavo. Con I2C, esto no es un problema, ya que el direccionamiento es parte del protocolo, por lo que aún necesita las 2 líneas (más tierra).

Para Arduino, debería haber una gran cantidad de tutoriales con bibliotecas I2C / SPI y código de ejemplo para los dos anteriores, lo que debería hacer que sea bastante fácil comenzar a trabajar.

    
respondido por el Oli Glaser
1

También deberían ser posibles esquemas de señalización asíncronos compartidos similares a RS485.

Si no está utilizando controladores / receptores de línea (solo los pines ATMEGA desnudos), debe hacer que UART TX sea una entrada cuando no le toca a usted hablar. Si está utilizando controladores de línea, necesita usar un pin adicional para controlar la activación de activación en el controlador de línea cuando no le toca a usted hablar.

También tenga en cuenta que no puede simplemente desconectar el transmisor cuando se acepta el último byte en el registro de transmisión (el punto en el que podría enviar otro carácter), sino que debe asegurarse de mantener el transmisor o el controlador de línea habilitado hasta que palabra ha sido completamente desplazada hacia fuera.

En los esquemas donde transmite y recibe en el mismo cable (o par diferencial) tenga en cuenta que escuchará sus propias transmisiones.

    
respondido por el Chris Stratton
1

En el caso especial que desea para conectarse a través de UART , puede usar UART RS485 MODBUS . Este es un protocolo de comunicación con direcciones de software, función, suma de comprobación.

PIENSO : es más confiable que I²C o SPI debido a RS-485 y usa menos cables que SPI.

NOTA: Se puede implementar como estándar, con algunos library pero puede ser costoso ya que necesita un módulo RS485 para cada esclavo y uno para el maestro, PERO es compatible con una red existente. Pero puede hacerlo menos costoso usando componentes heredados y haciendo su propio dispositivo. El MAX 485 podría ser el componente base para hacer un bus Hardware 485 o por utilizando un software RS485

    
respondido por el Alexis Paques
0

La solución más simple para los requisitos específicos sería un transmisor RS-422 en una línea de TX en el maestro (controlador de bus) Esto se extendería a los múltiples receptores (terminales remotos).

Todos los RT escucharán los mensajes de transmisión pero solo autentificarán & ejecute los comandos dirigidos a él a través de la dirección RT.

Si se utilizara un protocolo de bus similar a 1553, sería fácil de implementar.

    
respondido por el Stu

Lea otras preguntas en las etiquetas

Comentarios Recientes

que existente a través de una interfaz MISO. Cobran 2 centavos por megabyte, de aproximadamente $ 8 ~ $ 12 por mes. Como se mencionó anteriormente, he decidido entrar en una línea de producción más específica, un sistema de ejecución de producción completa con menos piezas y módulos agregados o utilizados. y DUAL SERVE Reenviar MOSFET remoto COSMOS / PP200 ----------------------------------------- ------------------------------ Este ejemplo, que se encuentra en el video de Linux Outer en las conversaciones... Lees verder