Comunicación entre múltiples microcontroladores

Me gustaría comenzar a implementar un sistema que consista en N microcontroladores (N >= 2 MCU), pero me gustaría saber las posibilidades para que se comuniquen entre sí.

Idealmente, los microcontroladores (N-1) se colocan dentro de la casa actuando como clientes, mientras que el último (el "servidor") se conecta a una PC a través de USB. El problema que tengo ahora es cómo conectar estos microcontroladores (N-1) al "servidor". Los MCU de los clientes realizan tareas muy simples, por lo que puede que no sea una buena solución usar ARM para realizar trabajos tan simples solo porque proporcionan CAN/ PHY-MAC .

La comunicación no ocurrirá más de una vez cada pocos minutos para la mayoría de los dispositivos y bajo demanda para otros. La velocidad no es muy crítica (el mensaje es corto): 1 Mbit/s Creo que es MUY exagerado para mis propósitos.

Los MCU que planeo usar son los siguientes.

  • Atmel AVR Pequeño / Mega
  • TI MSP430
  • BRAZO Corteza M3/M4
  • (Posiblemente Atmel AVR UC3 - 32 bits)

Me gustaría evitar los PIC si es posible (elección personal), simplemente porque hay menos posibilidades de programarlos (todos los anteriores tienen más o menos herramientas de código abierto, así como algunas herramientas oficiales).

Sé que algunos ARM brindan funcionalidad CAN y no estoy tan seguro acerca de los demás.

Ahora mismo se me ocurrieron estas posibilidades:

  1. GPIO simple para enviar datos (digamos > 16 bits en ALTO para indicar el inicio del mensaje, > 16 bits en BAJO para indicar el final del mensaje). Sin embargo, tiene que estar en una frecuencia estándar << (frequency_client, frequency_server) para poder detectar todos los bits. Solo necesita un cable por MCU de cliente.
  2. RS-232 : creo que este es, con mucho, el protocolo de comunicación más utilizado, pero no sé qué tan bien escala. Estoy considerando hasta 64 MCU de clientes en este momento (probablemente más más adelante)
  3. USB: AFAIK, esto es principalmente como RS-232, pero no creo que se adapte muy bien en este caso (aunque USB admite muchos dispositivos, 255 si no recuerdo mal, puede ser demasiado complicado para esta aplicación)
  4. RJ45 / Ethernet: esto es lo que realmente me encantaría usar, porque permite la transmisión a largas distancias sin problema (al menos con cable blindado > Cat 6 ). El problema es el costo (PHY, MAC, transformador, ...). Sin embargo, no sé si realmente puedes soldarlo bien en casa. De esta manera no necesitaría un MCU de cliente
  5. Inalámbrico / ZigBee : los módulos son muy caros, aunque puede ser el camino a seguir para evitar "espaguetis" detrás del escritorio
  6. Módulos/transceptores de RF: Hablo de los que están en la banda de 300 MHz - 1 GHz, por lo que deberían ser difíciles de soldar en casa. Todos los módulos están integrados, pero son tan caros como el ZigBee (al menos los módulos de RF en Mouser, en Sparkfun parece haber otros más baratos).
  7. ¿LATA? Parece ser muy robusto. Aunque no planeo usarlo en aplicaciones automotrices, aún puede ser una buena alternativa.
  8. ¿ I²C / SPI / UART ? Nuevamente, mejor evite los "espaguetis" con los cables si es posible
  9. Los PLC no son realmente una opción. El rendimiento se degrada bastante rápido a medida que aumenta la longitud y depende de la carga de capacitancia de la red eléctrica. Creo que en cuanto al precio es casi lo mismo que Ethernet.

Además, ¿qué protocolo sería "mejor" en el caso de transmisiones simultáneas (supongamos el raro caso de que en el mismo instante dos dispositivos comiencen a transmitir: qué protocolo proporciona el mejor "sistema de gestión de conflictos" / "sistema de gestión de colisiones"?

Para resumir : me gustaría saber cuál puede ser la mejor solución para un sistema de cliente distribuido que hace una comunicación de datos muy ligera, teniendo en cuenta tanto la flexibilidad (número máximo de dispositivos, sistema de gestión de conflictos/colisiones, ...), el precio , fácil de hacer en casa (soldadura), ... Me gustaría evitar gastar 20 $ solo en el módulo de comunicación, pero al mismo tiempo sería horrible tener 30 cables detrás del escritorio.

La solución que estoy imaginando en este momento sería hacer una comunicación básica entre MCU cercanos por GPIO o RS-232 ( ¡ barato !) Y usar Ethernet / ZigBee / Wi-Fi en una MCU por "zona" para comunicarse con el servidor ( caro , pero sigue siendo mucho más económico que un módulo Ethernet por cada MCU de cliente).

En lugar de cables, también puede ser posible utilizar fibra óptica/fibras ópticas. Aunque se necesitan conversiones adicionales, y no estoy seguro de si sería la mejor solución en este caso. Me gustaría escuchar detalles adicionales sobre ellos.

Hay PICs con funcionalidad CAN y hay herramientas oficiales gratuitas para programarlos con documentación.
@AndrejaKo PIC realmente no tiene un compilador de código abierto como AVR o al menos MSP430. Es cierto que a menudo brindan más funciones que las MCU que mencioné anteriormente por el mismo precio. Realmente no me gustan estas grandes diferencias entre las familias 12/16/18/24/32 y que algunas de ellas no tienen ningún compilador gratuito (creo que es PIC18).
En realidad, PIC18 tiene un compilador gratuito y otros también. La principal ventaja de otras familias es que trabajan con GCC. En el campo de código abierto, está el compilador C de dispositivo pequeño que debería ser compatible con los dispositivos PIC 16 y PIC 18.
Si aún no tiene experiencia con ninguno de los uC que mencionó, tenga en cuenta que ARM es mucho más difícil para comenzar que, por ejemplo, PIC o AVR, especialmente si desea utilizar el código abierto. Con ARM, los proveedores no diseñan el núcleo y, por lo general, tampoco proporcionan un IDE, lo que puede hacer que todo sea un poco más complejo. Es bueno que, por ejemplo, Microchip proporcione y apoye todo en el caso de los PIC.
@OliGlaser Bueno... si bien es cierto que las herramientas de código abierto para ARM pueden ser un poco difíciles de usar (probé una placa STM32 Discovery y no funcionó muy bien), muchos proveedores ofrecen un IDE que es, con sus pros y contras: basado en eclipse y de libre limitación: LPCXpresso (NXP) y Code Composer Studio (TI), por ejemplo (no de código abierto, pero al menos son compatibles). Los AVR, por otro lado, son bastante compatibles con el código abierto, así como con ATMEL STUDIO 6. No tengo experiencia con PIC en absoluto. Codificado solo AVR (ensamblador) y ARM (C, en el NDS).
@ user51166 PIC con el IDE más nuevo usa Netbeans.
@AndrejaKo: Ya veo eso. Pero eso en sí mismo no significa realmente que PIC se pueda codificar fácil o eficientemente (así como muchas otras cosas).
@user51166 - Sí, debería haber dicho que algunos proveedores no proporcionan un IDE (por ejemplo, ST), y la mayoría de las versiones gratuitas que he visto están limitadas de alguna manera molesta (por ejemplo, solo pueden programar/depurar hasta 32kB - muy útil en un STM32F4 ;-) ) Yo uso las herramientas de Raisonance, que no son tan malas y más baratas que la mayoría.
@OliGlaser: entonces probablemente el mejor que existe es LPCXpresso (NXP) con hasta 128K si no recuerdo mal (¿o eran 256K?) con una licencia gratuita que le permite usarlo incluso comercialmente. Luego vienen las otras herramientas de código abierto, aunque son más difíciles de configurar. Las versiones gratuitas de CCS / IAR / Keil / ... no son muy útiles con ARM como dijiste debido a sus limitaciones de tamaño de código (para compilar O "solo" para depurar).
rs232 no tiene un protocolo, quisiste decir uart.
Hay un ecosistema creciente de dispositivos IoT que son inalámbricos. El RuuviTag viene a la mente. Si sus esclavos son sensores simples y funcionarían con batería, entonces puede ser una opción.

Respuestas (8)

CAN suena más aplicable en este caso. Las distancias dentro de una casa pueden ser manejadas por CAN a 500 kbits/s, lo que suena como un ancho de banda suficiente para sus necesidades. El último nodo puede ser una interfaz USB a CAN lista para usar. Eso permite que el software en la computadora envíe mensajes CAN y vea todos los mensajes en el bus. El resto es software si desea presentar esto al mundo exterior como un servidor TCP o algo así.

CAN es el único medio de comunicación que mencionó que en realidad es un bus, a excepción del suyo propio con líneas de E/S. Todos los demás son punto a punto, incluido ethernet. Se puede hacer que Ethernet se vea lógicamente como un bus con conmutadores, pero las conexiones individuales aún son punto a punto y obtener la topología de bus lógico será costoso. La sobrecarga de firmware en cada procesador también es considerablemente mayor que CAN.

Lo bueno de CAN es que las pocas capas de protocolo más bajas se manejan en el hardware. Por ejemplo, varios nodos pueden intentar transmitir al mismo tiempo, pero el hardware se encarga de detectar y tratar las colisiones. El hardware se encarga de enviar y recibir paquetes completos, incluida la generación y validación de la suma de verificación CRC.

Sus razones para evitar los PIC no tienen ningún sentido. Hay muchos diseños para programadores que pueden construir el suyo propio. Uno es mi LProg , con el esquema disponible en la parte inferior de esa página. Sin embargo, construir uno propio no será rentable a menos que valore su tiempo en centavos por hora. También se trata de algo más que el programador. Necesitará algo que ayude con la depuración. Los Microchip PicKit 2 o 3 son programadores y depuradores de muy bajo costo. Aunque no tengo experiencia personal con ellos, escuché que otros los usan de manera rutinaria.

Adicional:

Veo algunas recomendaciones para RS-485, pero no es una buena idea en comparación con CAN. RS-485 es un estándar solo eléctrico. Es un bus diferencial, por lo que permite múltiples nodos y tiene buena inmunidad al ruido. Sin embargo, CAN también tiene todo eso y mucho más. CAN también suele implementarse como un bus diferencial. Algunos argumentan que RS-485 es fácil de interconectar eléctricamente. Esto es cierto, pero también lo es CAN. De cualquier manera, un solo chip lo hace. En el caso de CAN, el MCP2551 es un buen ejemplo.

Entonces, CAN y RS-485 tienen prácticamente las mismas ventajas eléctricamente. La gran ventaja de CAN está por encima de esa capa. Con RS-485 no hay nada por encima de esa capa. Estas por tu cuenta. Es posible diseñar un protocolo que se ocupe del arbitraje de bus, la verificación de paquetes, los tiempos de espera, los reintentos, etc., pero hacerlo bien es mucho más complicado de lo que la mayoría de la gente piensa.

El protocolo CAN define paquetes, sumas de verificación, manejo de colisiones, reintentos, etc. No solo ya está ahí, pensado y probado, sino que la gran ventaja es que se implementa directamente en silicio en muchos microcontroladores. El firmware interactúa con el periférico CAN en el nivel de envío y recepción de paquetes. Para el envío, el hardware realiza la detección de colisiones, el retroceso, el reintento y la generación de la suma de verificación CRC. Para la recepción, realiza la detección de paquetes, el ajuste de la desviación del reloj y la validación de la suma de comprobación CRC. Sí, el periférico CAN necesitará más firmware para manejar que un UART como el que se usa a menudo con RS-485, pero en general requiere mucho menos código ya que el silicio maneja gran parte de los detalles del protocolo de bajo nivel.

En resumen, RS-485 pertenece a una era pasada y tiene poco sentido para los nuevos sistemas actuales. El problema principal parece ser que las personas que usaron RS-485 en el pasado se aferran a él y piensan que CAN es "complicado" de alguna manera. Los niveles bajos de CAN son complicados, pero también lo es cualquier implementación competente de RS-485. Tenga en cuenta que varios protocolos bien conocidos basados ​​en RS-485 han sido reemplazados por versiones más nuevas basadas en CAN. NMEA2000 es un ejemplo de un nuevo estándar basado en CAN. Hay otro estándar automotriz J-J1708 (basado en RS-485) que ahora está bastante obsoleto con OBD-II y J-1939 basados ​​en CAN.

construir mi propia placa personalizada es útil al integrar la MCU con el hardware que tiene a su alrededor. Para fines de desarrollo, estoy de acuerdo en que un kit de desarrollo es una mejor manera. Mi razón para evitar los PIC es su falta de compiladores de código abierto (hay algunos gratuitos, pero no para PIC18, por ejemplo) en lugar de la falta de esquemas disponibles públicamente, aunque proporcionan algunas funciones adicionales que quizás no encuentre en otros MCU (Ethernet, LATA, ...). Y I2C es un autobús AFAIK.
@ user51166 - Hay compiladores PIC18 gratuitos proporcionados por microchip. Consulte la página del producto Compiladores MPLAB XC . También enumera los compiladores para uC de 16 bits y 32 bits.
@ user51166 También está el compilador C18 gratuito .
@PetPaulsen Extraño. Estoy bastante seguro de que vi hace un mes una página que enumeraba todos los compiladores disponibles gratuitamente para descargar (PIC16/24/32), con la excepción del PIC18 que no se debió a algún problema de licencia que tenían. Probablemente eso se resolvió con la transición MPLAB C Compiler -> MPLAB XC Compiler aunque no estoy seguro. Además, "solo" ofrecen una edición gratuita que no optimiza su código, no es un compilador de código abierto completo. Aún así, eso es mejor que nada;)
@usuario: Creo que todos los compiladores de Microchip tienen versiones gratuitas que difieren solo de las completas en que algunas de las optimizaciones están deshabilitadas. El ensamblador, el bibliotecario, el enlazador y el simulador están incluidos en el paquete MPLAB gratuito. Realmente no hay problema aquí.
@user51166 Bueno, puede desarrollar con la versión gratuita y luego descargar la demostración de la versión completa que funciona con todas las optimizaciones durante 60 días. Además, C18 está actualmente disponible de forma gratuita, lo descargué hace solo un par de días.
@AndrejaKo: es bueno saberlo. Solo dije que hace un mes vi una página diferente en el sitio de Microchip que decía que el compilador PIC18 no estaba disponible gratuitamente. Es bueno saber que las cosas cambiaron para mejor ;)
@ user51166: en lo que respecta a mi experiencia, Microchip siempre ha proporcionado compiladores gratuitos para todas sus familias (los he usado todos en un momento u otro) con capacidades completas de programa y depuración, solo funciones de optimización deshabilitadas como dice Olin (que para muchos las aplicaciones importan poco)
+1: creo que sopesar todos los requisitos de OP parece ser el camino a seguir. Sin embargo, si la comunicación es muy poco frecuente, una configuración básica de RS485 con el maestro iniciando todas las transacciones podría ser una opción.
+1 - Estoy de acuerdo con todo lo que dices. Los ARM pueden ser un dolor de cabeza sorprendente para un principiante. CAN será la forma más sencilla de hacer que un montón de MCU hablen en un autobús. Pero debe considerar velocidades de datos aún más bajas.

Recomendaría un controlador con CAN, ya que esta característica está diseñada exactamente para el propósito de la red del controlador.

RS232 se puede implementar fácilmente, pero será un verdadero desafío si intenta implementar la comunicación en más de 2 nodos (porque no está diseñado para este propósito).

Ethernet también puede ser una buena opción, ya que mencionó algunas interconexiones de host y clientes que son naturales para la implementación de Ethernet.

¿Cuáles son las ventajas de CAN sobre Ethernet, por ejemplo? Probablemente más barato, pero aparte de eso, ¿qué más?
@ user51166 - CAN no solo es más barato sino mucho más barato. No solo es más fácil, sino mucho más fácil.
@Rocketmagnet: explique un poco más. En la mayoría de los casos, necesita un IC integrado de todos modos (aunque los PIC, ARM y otros, a menudo integran la función CAN, son un poco caros). Desde el punto de vista del hardware, no veo cómo esto puede ser mucho más barato, ya que los circuitos integrados se pueden encontrar por 0,5-1,0 $ por pieza. Supongo que te refieres a más fácil desde el punto de vista del software, ¿verdad? CAN tiene una distancia máxima de ~ 500 metros, lo que seguramente es suficiente en mi caso, pero, solo para información, ¿habría alternativas similares para distancias más largas (fibra óptica tal vez)?

Elegiría un bus RS-485 que funcione con datos de codificación Manchester .

RS-485 porque:

  • Es barato
  • Es fácil de implementar
  • Se usa bajo poder
  • Permite largas distancias (hasta 1200 metros)
  • Altas velocidades de datos (hasta 10 Mbps)
  • Alta inmunidad a las interferencias
  • Hay transceptores que permiten hasta 256 dispositivos en el mismo bus
  • Recuento de piezas bajo

Codificación Manchester porque:

  • Es fácil de implementar
  • Es autosincronizable

Para la integridad de los datos, el mensaje puede incluir una longitud y un campo CRC.

Ejemplo de una función CRC:

unsigned char crc_calc(unsigned char buffer[], unsigned short size)
{
  unsigned long i;
  unsigned char crc;

  crc = CRC_INIT;

  for (i=0;i<size * 8;i++)
  {
    crc = (crc << 1) | (crc >> (7));

    if (buffer[i/8] & (0x80 >> (i%8)))
    {
      crc ^= CRC_POLY;
    }
  }

  return crc;
}

CRC_INITy CRC_POLYson valores arbitrarios que se utilizan para calcular el CRC.

Ejemplo de un mensaje con campos de longitud y CRC:

Ejemplo de mensaje

¿Alguna sugerencia para tan buenos transceptores, posiblemente baratos?
Además, como sugirió @AndrejaKo, RS-485 no parece ofrecer un protocolo de resolución de conflictos.
La elección de los transceptores depende del voltaje que pretenda utilizar. La resolución de conflictos debe realizarse en software con verificación de CRC, monitoreo de línea o ambos.
Si tiene un maestro, también podría implementar algún tipo de direccionamiento o transmisión por turnos.
No es realmente un maestro. Solo el "servidor" que actúa como una interfaz para la PC a través de USB. Sin embargo, los clientes tienen que enviarle mensajes automáticamente...
@user51166 Estoy usando un sistema de comunicación similar, y todos los mensajes tienen un campo CRC, todos los nodos están monitoreando el bus, cuando ocurre una colisión (CRC no coincide), los nodos que necesitan transmitir esperan un tiempo aleatorio antes tratando de transmitir de nuevo. Esto funciona y nunca tuve problemas con eso.
No estoy muy familiarizado con CRC. Traté de leer el artículo en Wikipedia pero realmente no lo entendí. ¿Tiene alguna referencia a un artículo/libro que me ayude a entenderlo?
@ user51166 Verifique la respuesta actualizada.
Gracias. Ahora está un poco más claro. Supongo que envía el CRC junto con el mensaje y verifica el CRC enviado con el CRC calculado localmente, ¿verdad? Para distancias como las que dije para esta aplicación puede que no importe, pero sería posible usar una fibra óptica / fibra óptica para extender más la transmisión (en términos de distancia) ya que entonces el mensaje se envía como luz y no como voltaje / ¿Actual? ¿O eso necesitaría otro protocolo? Gracias.
@ usuario51166 Correcto. Recuerda que también tienes que enviar la longitud del mensaje, puedes usar eso como primera validación, luego comparas el CRC calculado del mensaje recibido con el CRC recibido y si es igual significa que el mensaje "probablemente" no lo es corrompido Puede usar un CRC de 16 o 32 bits para disminuir la probabilidad de que una verificación de CRC de un mensaje corrupto se interprete como bueno. Recuerde también establecer el campo CRC en 0 (u otro valor de su elección) antes de calcular el mensaje CRC.
@usuario: la generación de CRC es solo una pequeña parte del problema general de diseñar su propio protocolo de bus multipunto por encima de RS-485. También hay mucho más por encima de la codificación de Manchester. Esta no es una tarea fácil. ¿Cómo va a detectar colisiones, y mucho menos manejarlas, por mencionar solo un ejemplo?
@OlinLathrop Sí, sé que la verificación de CRC no resuelve todo, es necesario tener una capa de protocolo que maneje las colisiones y la corrupción de datos, pero no es tan complicado implementar una comunicación confiable sobre RS-485 usando la codificación de Manchester. Lo sé porque ya lo he hecho.
CAN ya tiene CRC y un montón de otros trucos para detectar problemas. ¿Por qué rodar el tuyo cuando CAN ya hace todo lo que quieres?
@Rocketmagnet Fue solo una sugerencia. Nunca usé CAN, así que solo puedo sugerir lo que sé. Tal vez si ya hubiera usado CAN, lo estaba sugiriendo en su lugar.

RS-485 usando múltiples cables podría funcionar bien aquí, si existe la posibilidad de cablear la misma línea a todos los dispositivos.

Si, por ejemplo, se usa con un cable de red tradicional de categoría 5e, podría tener dos pares para trabajar para la transmisión de datos en ambas direcciones (usando un módulo dúplex completo), tener un par o incluso un solo cable como tierra común y el resto para negociar qué dispositivo va a transmitir en qué momento. Es un poco más complicado que RS-232, pero los módulos son más económicos que CAN y Ethernet y el límite de cable es de 1200 m. La desventaja es que tendrás que hacer tu propio protocolo de resolución de conflictos. Tal vez haga que el dispositivo que quiere transmitir verifique un cable dedicado y vea si es alto. Si no es así, llévelo alto y comience a comunicarse y si es así, espere un período de tiempo aleatorio. Todavía no estoy seguro de qué tan bien funcionaría esto en largas distancias.

No hay que preocuparse por las distancias demasiado largas, no planeo pasar de los 100m por el momento.
Por cierto, ¿por qué stackexchange hoy no acepta @<username> ? Cada vez que pongo uno, se borra por completo (no solo el símbolo @)...
@ user51166: se notifica automáticamente al creador de la respuesta, por lo que el "\@-ruido" se elimina automáticamente. (Mi \@user51166 no se eliminó porque no eres el creador de esta respuesta)
Lo interesante es que no recibí notificaciones por ninguno de los comentarios aquí.

Permítame comparar su opción preferida, Ethernet, con mi opción preferida, CAN.

Componentes requeridos:

  • Ethernet: conector RJ45, magnetismo, chip Phy (a menos que esté integrado en MCU). También necesita interruptores y un cable desde el interruptor a cada nodo. Cada PCB necesita bastantes condensadores y resistencias de terminación, posiblemente también ferritas. Necesita un buen diseño de PCB.
  • CAN: chip transceptor (barato), cualquier conector, cable barato puede saltar de un nodo al siguiente en un bucle alrededor del sitio. Solo necesita un condensador para el transceptor y una resistencia de terminación en cada extremo del bus.

Estás hablando de microcontroladores de $1. Hay mucho más en el costo del autobús que el MCU. Tendrá que sumar el costo total de cada solución para saber cuál es realmente más barata. Sume el costo de la MCU, conectores, transceptores, componentes pasivos, PCB, cables, etc.

LPC11C24 de NXP también tiene el transceptor CAN integrado y CANOpen compatible en ROM (sin consumir su Flash de datos de 32 K). La placa LPCXpresso 11c24 cuesta 20 EUR (ha proporcionado espacio para el conector DB9), por lo que realmente solo agrega cables :-)

Repost de otra pregunta similar. Comunicación simple de bajo costo entre dos microcontroladores

TLDR : ajuste no particularmente económico pero confiable en algunos casos de uso.

Mirando fuera de la caja, podría haber otras soluciones aquí, como el siguiente chip con el que me topé últimamente. Por supuesto, todo depende de lo que quieras hacer. Algo como UART viene a la mente si tiene ambos MCU en la misma placa o incluso planea protegerlos manualmente contra ESD si se separan.

Solución maestra y de dispositivos para aplicaciones IO-Link

L6360   Master
L6362A  Device

ingrese la descripción de la imagen aquí

¿Cuándo consideraría una solución como esta:

  1. Los chips fronterizos vienen completamente protegidos, lo que sería importante si tiene cada MCU en una placa separada y se ocupa de pines expuestos, por ejemplo, terminal de tornillo.
    • Polaridad inversa
    • Sobrecarga con función de corte
    • Exceso de temperatura
    • Subtensión y sobretensión
    • Cable abierto GND y VCC
  2. Interoperabilidad. Si alguien más va a diseñar el otro lado, todo lo que necesita saber es canalizar los datos a través de IO-Link.
  3. Regulador integradoVcc(in) 7~30v, Vdd(out) 3.3/5v

Me pareció interesante, así que pensé en publicarlo.

Depende de la escala de su aplicación y sus microcontroladores. Mencionaste Atmel tiny/mega, son bastante pequeños. En su caso, I2C / SPI / UART tienen la ventaja de que están implementados en hardware y, por lo tanto, son fáciles de usar.

Bien, pero ¿cómo aborda esto el problema del OP? IIC es un autobús, pero realmente no es adecuado para largas distancias como cruzar una casa. Es de un solo extremo y de impedancia relativamente alta. SPI es un bus, pero controlado por un solo maestro con una línea de selección de esclavos separada para cada dispositivo. Puede implementar cada línea como un par diferencial con controladores de línea y receptor, pero aún tiene el problema de selección punto a punto maestro a esclavo. UART es estrictamente punto a punto. No está claro cómo pretende usarlos en la situación del OP.