Interfaz de gran número de UART a PC

Me gustaría encontrar una buena manera de conectar muchos dispositivos UART (sensores) a una sola PC para la recopilación y el procesamiento de datos. Para mi uso, puede haber hasta 100 dispositivos UART, cada uno operando a 115200 baudios. Actualmente estoy usando puentes FTDI UART a USB, un FTDI separado para cada dispositivo UART. Esto, combinado con un concentrador USB, funciona bien para una pequeña cantidad de dispositivos, pero más allá de unos 5 o 6 dispositivos, hay problemas con las caídas de datos a través de las comunicaciones seriales virtuales. Y parece haber un límite de número asociado con la computadora (12 para una de mis computadoras, 17 para mi computadora portátil) más allá del cual la computadora no reconoce más. En general, esto no parece una solución viable e incluso si pudiera conectar 100 UART + FTDI + concentradores USB, etc., parece que sería una solución muy torpe.

Por cierto, también pensé en este módulo de quemador de red que admite 8 UART y podría enviar los datos a través de Ethernet para una interfaz de red: http://www.netburner.com/products/core-modules/mod5441x . Es una opción, pero todavía solo 8 canales.

Así que ciertamente no soy la primera persona que quiere conectar y registrar datos de muchos sensores UART. ¿Cuál es la mejor manera de hacerlo?

Sus más de 100 UART en una sola PC suenan como un trabajo para un FPGA más grande, conectado a través de PCIE a la PC, por ejemplo.
¿Por qué no hacer una comunicación RS485?
Estoy de acuerdo con el enfoque FPGA
Es una pregunta muy amplia y uno de los principales problemas es la cantidad de datos que realmente desea recopilar. 100 dispositivos a 115200 bps significa potencialmente 11 Mbits por segundo y cualquier PC encontrará que el procesamiento y la grabación son un desafío, independientemente de cómo esté conectado.
¿Está utilizando concentradores alimentados?
@TurboJ Sí, me preguntaba si este sería el momento en el que necesitaría implementar un FPGA.
@MarkoBuršič, según tengo entendido, RS485 no aborda el problema de cómo reunir datos de 100 dispositivos UART. Esa es mi principal preocupación.
@Finbarr, la velocidad de datos real es probablemente de 12 kbps por dispositivo.
@Jon, sí, los concentradores están alimentados.
Vale, esa velocidad de datos es mucho más manejable, pero incluso con una placa diseñada a medida sigue siendo un desafío físico conectar 100 puertos serie a una PC y un desafío de software manejarlos todos. (a) ¿Tengo razón al suponer que los sensores no incluyen información de ID en su flujo de salida? (b) ¿Cuán ampliamente dispersos están? (c) ¿Es esta una instalación única o algo que harás en muchas ocasiones? Y (d) ¿con qué rapidez necesita los datos de los sensores cargados en la PC?
¿Qué tipo de dispositivos (sensores) y cuál es la velocidad? Si los dispositivos son de bricolaje (aún no construidos), puede agregar un transceptor RS485 e implementar un protocolo Modbus RTU.
@Finbarr, a) No hay información de identificación en la transmisión. b) los sensores abarcan físicamente de 1 a 3 metros. c) hará mucho de esto. d) los datos deben registrarse en aproximadamente 1 segundo. No me importan los tableros personalizados. Encontré este chip de maxim maximintegrated.com/en/products/interface/controllers-expanders/… que podría hacer lo que necesito. Podría tener 25 de estos chips conectados por spi a un procesador habilitado para red que podría enviar el flujo de datos combinados a través de Ethernet a una computadora cercana (o remota). ¿Suena esto como una idea horrible? ¿Quizás el FPGA personalizado es el camino a seguir?
Meh. Debería llegar a la conclusión de que la interfaz de sensor que tiene no es adecuada para muchos nodos. Cambie la interfaz del sensor (y probablemente el sensor) a una adecuada (como 485 o Ethernet); o cambie la cantidad de sensores que está dispuesto a admitir.
@Finbarr No estoy de acuerdo: 11mbit/s es ridículamente poco para cualquier PC moderna. Hago cerca de 10 Gb/s con el mío, y hago cosas útiles con las muestras complejas que vienen a través de eso...
@py_man El MAX14830 es una buena opción. Algunas placas Arduino tienen un puerto USB nativo (Arduino Leonardo, Zero, M0, Due) que no utiliza la velocidad de transmisión. Pueden enviar datos a una computadora muy rápido. El Arduino Leonardo es lento, los otros con procesadores ARM Cortex son mejores. Estoy seguro de que algunas placas Arduino, cada una con muchos chips MAX14830, pueden hacer el trabajo. La mejor solución es un FPGA personalizado. No proporciona suficiente información para tomar la mejor decisión (¿necesita enviar comandos a los sensores? ¿Puede sondear los sensores? ¿Cuántos bytes transmiten los sensores? ¿Con qué frecuencia? Y así sucesivamente).
@jot, desafortunadamente, el FPGA solo puede proporcionar muchos UART. Muchos puertos RS232C requieren muchos transceptores de línea y mucha placa. No es repentinamente imposible, pero es más que un IC lógico. Y todos esos datos deben canalizarse hacia/fuera de la PC. Como ya saben, no se trata de lo que podría diseñarse con recursos infinitos, es lo que puede hacer nuestro OP particular de manera confiable y dentro de los presupuestos de tiempo y costo :-)
@Jot, mencionas algunos puntos muy buenos y espero poder dar detalles para aclarar. Necesito enviar algunos comandos de configuración a cada sensor, pero en condiciones normales, los sensores solo transmiten datos en tiempo real de forma continua y un host debe escucharlos. Para bien o para mal, los sensores no se pueden sondear. Los sensores transmiten aproximadamente 16 bytes a una velocidad de 200 Hz.

Respuestas (5)

En primer lugar, esto se ha dicho antes, pero: UART no es una interfaz de sensor adecuada aquí. Elija un sensor diferente, si es posible. Asumiré que no es posible, de lo contrario no estarías haciendo todo este esfuerzo.

Personalmente, creo que la pregunta más importante no ha sido realmente respondida por usted:

  • ¿Es este un sensor que consulta y responde, después, o
  • ¿El sensor enviará datos continuamente?

El primer caso podría ser el más fácil, porque le permitiría tomar un UART y multiplexarlo entre múltiples sensores, lo que significa que conecta TX al primero, habla con él, luego se vuelve a conectar al segundo, y así sucesivamente. RX se compartiría entre todos los sensores del bus, pero debido a que es un sistema de consulta/respuesta, siempre sabrá quién está hablando en ese momento (el que le preguntó).

Si es el segundo caso, bueno: necesitará algo que administre cada uno de estos en un bus más flexible.

Personalmente:

  • obtenga un microcontrolador económico que pueda hablar UART por un lado e I²C por el otro, uno para cada uno de sus sensores. Los tableros deben ser pequeños y la lista de materiales sería < $3, idealmente.
  • Escriba un firmware que permita consultar el sensor a través de I²C. Eso significa transmitir cosas que el "controlador" envía a través de I²C al dispositivo y almacenar los datos que el dispositivo envía a través de UART el tiempo suficiente para que el maestro los solicite. No es un firmware muy complejo, pero todavía es un poco para escribir y depurar. Es probable que si haces esto en una plataforma popular (arduino, stm32), alguien más lo haya hecho antes.
  • Asigne una dirección I²C separada a cada uno de sus traductores.

No hay un número infinito de direcciones ni un ancho de banda infinito, por lo tanto, agrupe una cantidad razonable de sensores a través de I²C en un bus cada uno. Utilice un microcontrolador compatible con USB de velocidad completa (12 Mb/s) para conectar todos sus traductores y transmitir los datos a su PC. Puedes tener varios de esos.

Además, puede haber UART listos para usar que podrían usarse a través de I²C como extensores de bus.

Otro pensamiento:

Hay microcontroladores que tienen controladores Ethernet incorporados. Solo necesita un Ethernet Phy (hay una interfaz estandarizada para eso, llamada MII). ethernet

  • permite un número prácticamente arbitrario de dispositivos, y
  • los cables de ethernet pueden ser largos,
  • Los conmutadores ethernet cuestan < 2€/puerto
  • Los conmutadores Ethernet pueden agregar una gran cantidad de enlaces lentos y fáciles de diseñar de 10 Mb/s a un enlace Ethernet de 100 Mb/s o gigabit,
  • ethernet en realidad está destinado a autobuses enormes ,
  • y es realmente fácil de conectar: ​​simplemente escriba el software de red para su PC (sin desarrollo de controladores de ninguna manera, solo maneje paquetes de red sin procesar),
  • dependiendo de lo que ofrezcan los ejemplos de los fabricantes de su microcontrolador, obtendrá una pila de ethernet completa, que incluye cosas como la detección automática simplemente dejando que su firmware envíe periódicamente paquetes de transmisión "hey, estoy aquí".

Yo iría con esa solución. El ST STM32F107RC y microcontroladores similares vienen con dicha interfaz MII y hasta 5 USART. O elija el NXP LPC1830, que es significativamente más económico, pero solo tiene 4 UART.

Eso sería

  • un LPC1830 6,17€, conectando cuatro sensores UART a la vez
  • una RMII fast ethernet PHY 0,80€
  • Conector Ethernet con imanes integrados 2,70€ (más barato si separas los imanes y el conector, pero puede que no valga la pena el esfuerzo de montaje adicional)
  • Fuentes de alimentación, discretas 2€
  • PCB fabricado en China 1,50€ (puede ser más barato si panelizas correctamente)

Firmware: código de ejemplo de Ethernet de NXP, manejo de UART escrito a mano

Hace un total de unos 13,50€ por 4 sensores, o unos 3,50€ por sensor. Necesita 25 de estos para conectar 100 sensores. Necesitas un conmutador ethernet gigabit de 24 puertos, más otro conmutador pequeño para el resto que añade unos 50€ a la factura (sin IVA).

El beneficio sería tener un sistema que pueda extender arbitrariamente. Si se siente aventurero, use una pila de IP en su microcontrolador (lwIP, µIP) y haga posible implementar sus dispositivos dentro de cualquier LAN, incluso a través de los límites de la red, como Internet, etc.

Editar : resulta que NXP envía ejemplos que hacen el baile completo de TCP/IP en la MCU. Oh, bueno, todo más simple entonces.

Personalmente, habría pensado en el bus CAN para ese propósito. Mucho más simple que Ethernet, especialmente cuando se trata de microcontroladores.
@Nasha también es una buena idea, pero lo que realmente me gusta de mi idea de ethernet es el hecho de que el enlace no se comparte realmente entre las cosas que desarrollo; si uno de los firmwares de la interfaz de mi sensor falla, el Switch continuará felizmente trabajando con el otros dispositivos, y solo un puerto LAN estaría muerto :) Pero: ¡CAN sería una reducción de costos masiva, de hecho!
Sí. Además del hecho de que CAN también abarca detección de errores, retransmisión y robustez con muy pocos componentes y relativamente pocos esfuerzos de programación.
@Nasha, si escribe una respuesta que sugiera "oye, puede usar CAN, está completamente probado que vale la pena como bus de muchos nodos, por ejemplo, en una aplicación automotriz", y describe la arquitectura de bus que propones, y hazme un ping: votaría a favor, y Mencionaría su respuesta en mi respuesta como "deseable".

Buscaría usar un solo UART de un microcontrolador y multiplexarlo.

Si los dispositivos solo responden cuando se solicitan datos, entonces lógicamente puede O todas las líneas de recepción en el UART. Un multiplexor en la salida UART selecciona qué dispositivo recibe datos del micro.

Si todos los dispositivos envían constantemente sus datos, es posible que no necesite transmitirles líneas en absoluto. Tenga la línea de recepción en el único UART multiplexado. Se selecciona un dispositivo, el firmware espera para asegurarse de que esté sincronizado con el flujo de bytes, los datos capturados, el siguiente dispositivo seleccionado, etc.

Otra posibilidad más es colocar un pequeño micro en cada dispositivo y encadenarlos en lugar de la topología en estrella que está asumiendo ahora. Cada micro manejaría su dispositivo de forma privada. Se puede usar un esquema de paso de token para permitir que cada micro envíe sus datos al siguiente en la cadena, de lo contrario, pasa datos del anterior al siguiente. La PC está al final de la cadena y recopila todos los datos a través de un único puerto serie o USB.

Otra forma es similar a la anterior, pero use CAN para cada uno de los micros individuales para dejar escapar la información de su sensor periódicamente. La PC recibe todos los mensajes CAN a través de un adaptador USB a CAN.

Hay muchas formas, pero intentar configurar una PC con 100 puertos COM no es una de ellas.

Podría implementar una línea multipunto similar a RS485. Quizás deberías leer esto .

RS485 se utiliza en aplicaciones industriales de líneas muy largas y puede ser muy útil. Este artículo del EE-Times lo explica bastante bien.

Si desea simplicidad, puede implementar líneas de envío/recepción separadas y usar un protocolo de solicitud/respuesta muy simple.
La operación a 115 kbaudios debería ser posible, pero depende de la calidad de su cable de par trenzado y las distancias involucradas.

Si los sensores simplemente envían datos a una velocidad asíncrona, necesitará algún medio para acelerarlos y sincronizarlos.
Tú podrías:

  1. Frontend los sensores con un pequeño micro (por ejemplo, un Arduino Pro mini) que acumula lecturas y simplemente almacena los datos en búfer o se acumula con marcas de tiempo si es necesario. El micro responde a un protocolo de solicitud/respuesta de software. La acumulación de resultados y el promedio podría reducir significativamente la cantidad de datos enviados.
  2. Si sus sensores admiten DTS/RTS, entonces una interfaz RS485 implementada a través de un pequeño micro podría simplemente detener las lecturas. Esta vez utiliza el protocolo de solicitud/respuesta del software para detener el envío al sensor.
Mirando esto más de cerca, parece que RS485 podría ofrecer una conexión simple a la PC, pero todavía no estoy seguro de cómo poner todos los dispositivos UART en un solo RS485. ¿Cómo puedo asegurarme de que no estén todos intentando transmitir al mismo tiempo?
Ese sería el protocolo simple de solicitud/respuesta. Envíe un comando de dirección al sensor... obtenga la respuesta de un solo sensor. Si sus sensores son Tx ciegos asíncronos todo el tiempo, entonces tiene un problema.
Parece que podría tener un problema. ¿Hay algo como un búfer RS485 que pueda almacenar los datos entrantes en un FIFO y responder al protocolo de solicitud/respuesta?
@py_man: un microcontrolador que interactúa directamente con el sensor y también el RS-485 podría hacer eso.

Podría considerar un sistema de conexión en cadena, algo como esto...

Cada uno de sus sensores contiene una entrada RS232 y una salida RS232, llamadas aquí rin y rout, y un microcontrolador económico con 256 bytes de RAM o más para un búfer en serie.

Cada sensor envía un mensaje de n bytes, que consta de una dirección de sensor de mensaje, una marca de tiempo (si es necesario) y la salida del sensor. Para facilitar la identificación de las posiciones de los mensajes, podría tener un '1' en el bit 7 del primer byte solamente, un '0' en el bit 7 de todos los bytes posteriores. Distribuya los bits de datos a través del bit 6..0 de los bytes del mensaje y el comienzo de un mensaje es fácil de encontrar para un receptor.

Cada sensor envía su propio mensaje en ruta. Cada sensor almacena en búfer todo el mensaje que recibe en rin, luego lo transmite en ruta cuando está libre para hacerlo.

El final de cada conexión en cadena de sensores entra en su PC. La PC ahora necesita solo un puerto RS232C por cadena de sensores.

(Las direcciones de los mensajes se pueden asignar automáticamente mediante un protocolo simple, pero dejaré los detalles por ahora. Avísame si quieres más sobre esto).

Otra idea es que cada sensor pueda tener dos entradas RS323C, rin1 y rin2, y transmitir mensajes de ambos en ruta, junto con su propio mensaje. De esta manera, las cadenas se pueden combinar fácilmente en una sola entrada y su PC necesita menos o más puertos RS232C según lo considere oportuno.

Esto supone que puede cambiar el diseño de su sensor, tiene una capacidad razonable con los microcontroladores y que su sistema puede tolerar el tráfico y los retrasos inherentes a esto. La marca de tiempo de sus lecturas se encarga de algo de eso, pero depende de si su aplicación host puede tolerar un ligero envejecimiento de las lecturas.

En el lado positivo, es simple, muy ampliable, facilita el cableado y es bastante rápido de implementar y probar.

@py_man, por interés, ¿qué decidiste hacer al final?

La comunicación de múltiples nodos con múltiples sensores es una buena aplicación candidata para un sistema de bus CAN.

Si no puede evitar los sensores con una interfaz en serie, hay una serie de microcontroladores que incorporan controladores CAN y UART/USART. Busque en Digi-Key , Farnell , Mouser uno que se ajuste a sus necesidades. De lo contrario, vea I²C (o TWI), SPI u otros enlaces seriales de múltiples nodos (si los necesita) ya que UART/USART es solo una comunicación punto a punto, no adecuada para tal número de pares, como ya se mencionó.

Como ejemplo concreto, una búsqueda aproximada en Digi-Key informa que los microcontroladores más baratos son de Microchip, es decir, el ATmega16M1. Es una MCU automotriz con controladores CAN y UART integrados. También tiene un sensor de temperatura calibrado de fábrica, unidades ADC y DAC. Obtienes 100 unidades a alrededor de $1.5 cada una. CAN requiere un transceptor externo como ATA6560 de Atmel (~¢30 cada uno por 50 unidades), MCP2544 de Microchip (~¢60 cada uno por 50 unidades) o TJA1040 de Nxp (~$1 cada uno por 50 unidades). Todos son paquetes SMD de 8 pines y el lado bueno es que todos son compatibles con pines (casi). Si hay variaciones, se trata principalmente del pin 5, que algunos usan para alimentar la interfaz lógica, otros para proporcionar una referencia dividida (2,5 V) entre CANH y CANL.

El bus CAN proporciona robustez y extrema fiabilidad. Sus sensores solo tienen que transmitir sus datos periódicamente. Hay adaptadores CAN/USB disponibles para PC, como el analizador USB PCAN del sistema Peak ; está bien, este último está lejos de ser barato, pero entiende el punto: CAN es bastante generalizado y tiene herramientas disponibles para casi todas las plataformas.

Asegúrese de utilizar las herramientas de búsqueda paramétrica de los proveedores de componentes (Digi-Key, Mouser, Farnell) para ajustar su selección de microcontrolador y sensor. Si necesita sugerencias para la fabricación de PCB, consulte la respuesta de Marcus Müller .

En el lado del microcontrolador, todo lo que necesita es escribir cuándo enviar los datos de los sensores, ya que el hardware se encarga del resto (gestión de protocolos, detección de errores, arbitraje determinista, colisión, retransmisión...). CAN 2.0a proporciona 2048 mensajes posibles con identificadores de mensajes de 11 bits, lo que creo que debería ser suficiente para obtener datos de unos 100 sensores. De lo contrario, todavía tiene el formato de marco extendido CAN2.0b .

En el lado del software, hay bibliotecas de código abierto y/o gratuitas como OpenCAN o CANfestival si busca alguna solución estándar de la industria, como CANopen . También puede escribir su propio protocolo si lo desea.