¿Se pueden conectar 50 Arduinos en cadena?

Tengo múltiples usuarios en asientos (50), cada uno con un pequeño teclado para ingresar datos. Necesito recopilar entradas de todos los usuarios; Quiero usar Arduinos para cada usuario, que también mostrará las respuestas en una pantalla de 7 segmentos. Tengo la intención de conectar todos los Arduinos usando I2C, pero me temo que la señal podría caer debido a las limitaciones de larga distancia y distribución, por lo que estoy considerando conectarlos en cadena.

¿Es esta una buena idea, o hay un mejor enfoque para hacer esto?

¿Vas a alimentarlos por todo este cable también?
Alguien en el medio cortando un cable o jugando con los datos. Literalmente, un ataque de hombre en el medio
¿Por qué no manejar múltiples asientos con cada Arduino? Un solo Arduino debería ser lo suficientemente rápido para sondear múltiples teclados y controlar múltiples pantallas (especialmente con los búferes de enganche apropiados en cada asiento), luego, en lugar de 50 dispositivos en el bus, es posible que solo tenga 5 o 10.
Por el precio de un arduino, ¿por qué no usar una Raspberry Pi con un dongle wifi? ¡Probablemente saldrás más barato por no tener que comprar todo ese cable! Si esta no es una aplicación absolutamente crítica en tiempo real, parece que esta es la herramienta incorrecta para el trabajo.
por la mitad de precio, usa un NodeMcu que ya integre Wifi.

Respuestas (5)

Como dice la nota de aplicación publicada por RedGrittyBrick :

Debido a que las aplicaciones originales de I 2 C-bus eran internas a una pieza de equipo, por ejemplo, en una PC o equipo de radio/TV/audio, I 2 C-bus rara vez se considera para sistemas cuando las largas distancias con un gran número de caídas se requieren puntos.

Las soluciones en la nota de aplicación es usar circuitos de controlador específicos para convertir las señales en algo que se pueda conducir a distancias más largas.

Dado que necesitará circuitos de controlador de todos modos, permítame sugerirle que eche un vistazo a RS-485 . Este es un estándar probado y confiable para la transmisión bidireccional a través de cables largos. Utiliza un UART normal en su Arduino, y los circuitos del controlador se pueden encontrar en muchas formas y formas. Si no quiere hacer su propia PCB, hay tarjetas adaptadoras disponibles que toman una señal TTL RX/TX de un UART y la convierten a niveles RS-485.

RS485 es conceptualmente una buena categoría de solución, aunque 50 nodos pueden comenzar a exceder la capacidad de manejo de algunas implementaciones de RS485, al menos es un problema que debería verificarse electrónicamente.
El peor de los casos (RS-485) es un selector A/B que alterna entre dos grupos de 25 nodos. Un pin del Arduino haría el cambio para que se sincronice con el último marcador EOT. Dado que cada nodo tiene una identificación única y un detector de colisiones incorporado, debería funcionar.

Si no está particularmente atado a la idea de usar Arduinos para esto, puede probar otras placas de microcontroladores. Soy bastante aficionado a las diversas placas que se basan en el chip ESP8266; estos tendrían la ventaja de que tienen una conexión de red inalámbrica integral para que todos puedan hablar directamente con su sistema central que almacena la entrada.

Si el costo adicional (en realidad, diferente) no es un problema, la conexión inalámbrica sería muy ventajosa. En particular, no es necesario realizar más de 50 conexiones de cables diferentes ni diseñar el cableado de señal para el espacio.
@ user2943160 Correcto: el costo no es realmente un problema a menos que ya tenga el equipo. Un módulo como la omnipresente placa ESP12 (vendida por numerosos proveedores chinos) más una placa de conexión (porque es un módulo de montaje en superficie y es probable que desee conectar pines) cuesta solo una pequeña cantidad más que un arduino clon chino , y algo menos que un arduino genuino. Y ciertamente menos que un arduino + un escudo ethernet u otro hardware externo.

¿Ha considerado arduino Ethernet con PoE? Resuelve el problema de alimentación de los dispositivos y permite comunicaciones bidireccionales

Esto es prácticamente para lo que se inventó Power over Ethernet. Excelente sugerencia. Incluso puede implementarlo usted mismo con diferentes voltajes del estándar, ya que Ethernet no usa todos los pares en el cable.
Un Arduino no se adapta bien a Ethernet, ya que requiere un adaptador de red externo que probablemente cuesta más que la placa base y no tiene mucha memoria para manejar paquetes (aunque en este caso no es necesario que sean largos). Para la aplicación en cuestión, existe el problema adicional de que la mayoría de los adaptadores Ethernet compatibles con Arduino son UTP punto a punto y requieren que se proporcione un puerto concentrador por nodo, lo que con 50 nodos suma una cantidad absurda de cableado. Para que esto sea práctico, necesitaría encontrar adaptadores 10Base2 integrados.
@Dan: Eso depende del tipo de Ethernet del que esté hablando: Gigabit Ethernet (y superior) usa todos los pares...
@psmears, si puede encontrarme un caso de uso de arduino que necesite un gigabit, estaré impresionado
@psmears En ese momento, ya no estás hablando de PoE.
@hardillb: Jaja, es cierto: simplemente no quería que la gente tuviera la impresión de que puedes salirte con la tuya con dos de los cuatro pares para cualquier configuración de Ethernet :)
@jpaugh: ¿Por qué no? PoE funciona bien con Gigabit Ethernet...
@psmears No soy un experto, pero si Gigabit Ethernet ya usa todos los cables, ¿cómo puede usar algunos de ellos para obtener energía?
@jpaugh: la potencia y las señales se envían a través de los mismos cables; en términos generales, las señales se envían mediante CA y la potencia se envía como una compensación de CC y se filtra en el receptor.
@jpaugh: No solo eso, sino que gigabit ethernet usa los cuatro pares en ambas direcciones al mismo tiempo. Los filtros del transceptor restan su propia señal de salida para obtener la señal enviada por el otro lado. Todo esto se hace para mantener la frecuencia lo suficientemente baja para trabajar con un cable Cat-5e, en lugar de requerir tolerancias aún más estrictas.

Si la distancia entre sus nodos no es grande y no necesita una comunicación particularmente rápida, una conexión en cadena donde los mensajes se propagan de uno a otro a través de UART en serie es probablemente una de las pocas cosas que puede hacer sin agregar hardware . . No hay límite para la longitud de la cadena que puede lograr si cada placa regenera la señal que transmite, sin embargo, cada nodo agregará un retraso antes de transmitir un mensaje; en la implementación más simple, el retraso por nodo podría ser igual al tiempo de transmisión del contenido del mensaje.

Sin embargo, parece que es posible que necesite pasar mensajes en ambas direcciones a lo largo de la cadena. El desafío en eso sería la presencia de solo un UART de hardware en cada placa. Puede aumentar eso con un uart de software, aunque para obtener más de uno de esos, debe usar una implementación más sofisticada que la predeterminada que se envía con el IDE. O si puede mantener cualquier puerto serie USB integrado, puede usar el hardware UART para comunicarse en una dirección y el software en la otra.

O, por supuesto, podría usar un Mega 2560 , que tiene 4 UART en lugar de solo 1 como otros Arduinos.
Sí, pero el costo de 50 nodos ATmega1284/2560 aumentaría rápidamente. Software Serial en realidad debería funcionar para esto, o hay múltiples partes de UART que cuestan menos que en ATmega328p.

Puede superar las limitaciones de I2C utilizando el puente DS28E17 de 1 cable a I2C.

Por supuesto, la solución dependerá de tu presupuesto y del ancho de banda requerido.