Comunicación entre múltiples microcontroladores.


20

Me gustaría comenzar a implementar un sistema que consta de N microcontroladores (N> = 2 MCU), pero me gustaría saber las posibilidades para permitirles comunicarse uno con el otro.

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

La comunicación no se realizará más de una vez cada pocos minutos para la mayoría de los dispositivos y a pedido de otros. La velocidad no es muy crítica (el mensaje es corto): 1 Mbit / s, creo que es una forma excesiva para mis propósitos.

Las MCU que planeo usar son las siguientes.

  • Atmel AVR Tiny / Mega
  • TI MSP430
  • BRAZO Cortex 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 proporcionan la funcionalidad CAN y no estoy tan seguro de los demás.

En este momento 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 << (frecuencia_cliente, frecuencia_servidor) para poder detectar todos los bits. Solo necesita un cable por cliente MCU.
  2. RS-232 : Creo que este es, con mucho, el protocolo de comunicación más utilizado, pero no sé qué tan bien se escala. Estoy considerando hasta 64 MCU de cliente en este momento (probablemente más tarde)
  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 recuerdo bien, 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 problemas (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 cliente MCU
  5. Inalámbrico / ZigBee : los módulos son muy caros, aunque puede ser el camino a seguir para evitar "spaghetti" detrás del escritorio
  6. Módulos / transceptores de RF: estoy hablando de aquellos 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 bastante caros como el ZigBee (al menos los módulos de RF en Mouser, en Sparkfun parecen ser 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 ? Una vez más, mejor evitar "espagueti" 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 el precio es casi lo mismo que Ethernet.

Además, ¿qué protocolo sería "mejor" en 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"?

En resumen : me gustaría saber cuál puede ser la mejor solución para un sistema de cliente distribuido que realiza 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, ...), precio , fácil de hacer en casa (soldar), ... Me gustaría evitar gastar 20 $ solo en el módulo de comunicación, pero al mismo tiempo tener 30 cables detrás del escritorio sería una mierda.

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

En lugar de cables, también es posible utilizar fibras ópticas / fibra óptica. Aunque son necesarias 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.


2
Hay PIC con funcionalidad CAN y herramientas oficiales gratuitas para programarlos con documentación.
AndrejaKo

@AndrejaKo PIC realmente no tiene un compilador de código abierto como AVR o al menos MSP430. Es cierto que a menudo ofrecen más funciones que las MCU que enumeré anteriormente por el mismo precio. Realmente no me gustan estas grandes diferencias entre las familias del 16/12/18/24/32 y que algunas de ellas no tienen un compilador gratuito (creo que es PIC18).
user51166

2
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 Small device C que debería admitir dispositivos PIC 16 y PIC 18.
AndrejaKo

2
Si aún no tiene experiencia con ninguno de los uC que mencionó, tenga en cuenta que ARM es mucho más difícil de 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 tampoco proporcionan generalmente un IDE, lo que puede hacer que todo sea un poco más complejo. Es bueno tener, por ejemplo, Microchip que proporcione y soporte todo en el caso de los PIC.
Oli Glaser

@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 de descubrimiento STM32 y no funcionó muy bien), muchos proveedores ofrecen un IDE que es - con sus ventajas y desventajas: basado en eclipse y sin límite: LPCXpresso (NXP) y Code Composer Studio (TI), por ejemplo (no de código abierto, pero al menos son compatibles). Por otro lado, los AVR están bastante bien soportados en el lado de código abierto, así como en ATMEL STUDIO 6. No hay experiencia con PIC en absoluto. Codificado solo AVR (ensamblador) y ARM (C, en el NDS).
user51166

Respuestas:


22

CAN suena más aplicable en este caso. CAN puede manejar las distancias dentro de una casa a 500 kbits / s, lo que suena como un gran ancho de banda 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 autobús, excepto para rodar el suyo con líneas de E / S. Todos los demás son punto a punto, incluido ethernet. Se puede hacer que Ethernet parezca lógicamente un bus con conmutadores, pero las conexiones individuales siguen siendo punto a punto y obtener la topología lógica del bus 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 lidiar con las colisiones. El hardware se encarga de enviar y recibir paquetes completos, incluida la generación y validación de suma de verificación CRC.

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

Adicional:

Veo algunas recomendaciones para RS-485, pero esa 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 se implementa generalmente como un bus diferencial. Algunos argumentan que RS-485 es fácil de conectar a la electricidad. 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.

Por lo tanto, 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.

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 se conecta al periférico CAN a nivel de envío y recepción de paquetes. Para el envío, el hardware realiza la detección de colisión, retroceso, reintento y generación de suma de verificación CRC. Para recibir, realiza la detección de paquetes, el ajuste de la desviación del reloj y la validación de la suma de verificación CRC. Sí, el periférico CAN necesitará más firmware para conducir que un UART, como se usa a menudo con RS-485, pero requiere mucho menos código en general, ya que el silicio maneja gran parte de los detalles del protocolo de bajo nivel.

En resumen, RS-485 es de una época pasada y tiene poco sentido para los nuevos sistemas de hoy. El problema principal parece ser las personas que usaron RS-485 en el pasado aferrándose a él y pensando que CAN es "complicado" de alguna manera. Los bajos niveles de CAN son complicados, pero también lo es cualquier implementación competente de RS-485. Tenga en cuenta que varios protocolos 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 está bastante obsoleto ahora con el 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, acepto 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 públicos disponibles, aunque proporcionan algunas características adicionales que puede no encontrar en otras MCU (Ethernet, LATA, ...). Y I2C es un autobús AFAIK.
user51166

@ user51166 - Microchip proporciona compiladores PIC18 gratuitos. Consulte la página del producto Compiladores MPLAB XC . También enumera los compiladores para 16 bits y 32 bits uC.
PetPaulsen

@ user51166 También existe el compilador C18 gratuito .
AndrejaKo

@PetPaulsen Strange. 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 el compilador MPLAB C de transición -> Compilador MPLAB XC, aunque no estoy seguro. Además, "solo" ofrecen una edición gratuita que no optimiza su código, no un compilador de código abierto. Aún así, eso es mejor que nada;)
user51166

@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 gratuito MPLAB. Realmente no hay problema aquí.
Olin Lathrop

6

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

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

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


¿Cuáles son las ventajas de CAN sobre Ethernet, por ejemplo? Más barato probablemente, pero aparte de eso, ¿qué más?
user51166

@ 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

@Rocketmagnet: explique un poco más. En la mayoría de los casos, necesita un CI integrado de todos modos (aunque los PIC y 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 IC 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 cual seguramente es suficiente en mi caso, pero, solo para información, ¿habría alternativas similares para distancias más largas (quizás fibra óptica)?
user51166

4

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

Si, por ejemplo, se usa con el cable de red de categoría 5e tradicional, 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 conexión a 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 baratos que CAN y Ethernet y el límite de cable es de 1200 m. La desventaja es que tendrá que hacer su 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í, colóquelo alto y comience a comunicarse y, si es así, espere un período de tiempo aleatorio. Aún así, no estoy seguro de qué tan bien funcionaría esto en largas distancias.


No te preocupes por distancias demasiado largas, no planeo ir más de 100 metros en este momento.
user51166

¿Por qué BTW hoy stackexchange no acepta @ <nombre de usuario>? Cada vez que pongo uno, se elimina por completo (no solo el símbolo @) ...
user51166

@ user51166: se informa automáticamente al creador de la respuesta, por lo que se elimina automáticamente "\ @ - noise". (Mi \ @ user51166 no se eliminó, porque usted no es el creador de esta respuesta)
PetPaulsen

Lo interesante es que no recibí notificaciones de ninguno de los comentarios aquí.
AndrejaKo

4

Elegiría un bus RS-485 que trabaje con datos de Manchester Encoding .

RS-485 porque:

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

Codificación Manchester porque:

  • Es fácil de implementar
  • Es auto-sincronizable

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 longitud y campos CRC:

Ejemplo de mensaje


¿Alguna sugerencia para tan buenos transceptores, posiblemente baratos?
user51166

Además, como @AndrejaKo sugirió que RS-485 no parece ofrecer un protocolo de resolución de conflictos.
user51166

La elección de los transceptores depende del voltaje que desee utilizar. La resolución de conflictos debe hacerse en software con verificación CRC, monitoreo de línea o ambos.
Bruno Ferreira

Si tiene un maestro, también podría implementar algún tipo de direccionamiento o transmisión por turnos.
Bruno Ferreira

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 deben enviarle mensajes automáticamente ...
user51166

3

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 barato. Sume el costo de la MCU, conectores, transceptores, componentes pasivos, PCB, cables, etc.


0

LPC11C24 de NXP también tiene un transceptor CAN integrado, y CANOpen es compatible con ROM (no elimina su memoria flash de 32 K). La placa LPCXpresso 11c24 cuesta 20 EUR (ha proporcionado espacio para el conector DB9), por lo que realmente solo agrega cables :-)


0

Vuelva a publicar de otra pregunta similar. Comunicación simple de bajo costo entre dos microcontroladores

TLDR : no es particularmente barato pero es confiable en algunos casos de uso.

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

Solución maestra y de dispositivo 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 totalmente 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
    • GND y VCC cable abierto
  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 integrado Vcc(in) 7~30v, Vdd(out) 3.3/5v

A mí me pareció interesante, así que pensé en publicarlo.


-3

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 se implementan en hardware y, por lo tanto, son fáciles de usar.


3
De acuerdo, pero ¿cómo aborda esto el problema del OP? IIC es un autobús, pero realmente no es adecuado para largas distancias como al otro lado de 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 esclavo 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 piensa usarlos en la situación del OP.
Olin Lathrop
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.