Sync 12 Arduinos - I2C vs Serial

2

Me han dado 12 arduinos (Mega) y 12 tableros separados (construidos a medida. Aumentan la salida de los pines digitales a 12v @ 120mA) para controlar alrededor de 300 LED. Estoy utilizando una pseudo biblioteca PWM para atenuar los LED.

Esto podría haberse logrado con una configuración mucho más barata. Abierto a sugerencias, pero el tiempo es esencial.

Mi dilema es sincronizar todos estos microcontroladores. Nunca he estado involucrado en un proyecto donde el tiempo fuera tan importante; Por lo general, usaría los pines serie TX / RX para retransmitir órdenes, pero dormiría mejor por la noche si hubiera algún tipo de latido de un maestro a 11 esclavos. ¿Es I2C el camino a seguir en este caso o busco alternativas?

tl; dr ¿Cuál es la mejor manera de mantener sincronizados a 12 arduinos?

    
pregunta rom

2 respuestas

4

Use dos pines por chip, una entrada y una salida, y encadélelos en serie. Haga que el chip "maestro" accione el pin para alternar cada 'marco' y todos los esclavos interrumpan el cambio de pin, registre el evento de latido y 'sync', luego propague el estado del pin al siguiente chip, y así sucesivamente ... si desea obtener un toque elegante, envuelva la salida del último chip de la cadena al maestro para que el maestro pueda determinar si el mensaje fue recibido y cuál fue la latencia de esa respuesta.

Este es un enfoque agradable y simple que no requiere mucha sofisticación de software o mucha preocupación por las características eléctricas y la integridad de la señal. Obviamente, existen otros enfoques más complejos y con muchas funciones para resolver el problema que plantea.

    
respondido por el vicatcu
1

El AVR TWI puede configurarse para aceptar una transferencia de "llamada general", que es esencialmente una escritura I²C a la dirección 0. Todos los esclavos pueden tener una dirección de esclavo individual y también responder a la dirección 0 (que puede ser simplemente ACK'ing SLA + W, por ejemplo).

Esto se puede utilizar para sincronizar los esclavos. Envíe datos a todos los esclavos, luego envíe SLA + W a la dirección de llamada general. Todos los esclavos recibirán este "comando" y pueden comenzar a procesar los datos más o menos al mismo tiempo.

El AVR TWI generará una interrupción cuando se genere una parada o un inicio repetido en el bus. Esto solo puede suceder cuando todos los esclavos hayan lanzado SCL, por lo que puede estar seguro de que todos los esclavos con ACKed SLA + W también han procesado el comando y liberado SCL.

Con este "protocolo" no puedes no asegurarte de que todos los 11 esclavos HAN ACEPTADO el comando.

El tiempo depende del otro código que se ejecuta en tus esclavos. Si no hay ninguna otra interrupción activa, se reduce a interrumpir la latencia, que es un par de ciclos de reloj (soy demasiado vago para buscar eso ahora).

No estoy seguro de si lo siguiente funciona con el hardware TWI: Es posible que la llamada general se convierta en una transferencia de lectura. Todos los esclavos devuelven 2 bytes y cada esclavo genera un cero en una posición individual. La funcionalidad AND cableada del bus I²C dará como resultado una respuesta combinada de todos los esclavos. El resultado podría verse como 1111 1000 0000 0000 . El maestro puede verificar todos los ceros que espera y actuar en consecuencia. Puede ser complicado desde aquí si desea agregar una función de "abortar" que se activa si no todos los esclavos hicieron su trabajo. Solo he intentado esto una vez con I²C con golpes de bits

Una cosa más que intentar en lugar de una lectura general de llamadas: Lío con el registro de máscara de dirección. El TWI puede configurarse para aceptar una sola dirección, pero también puede aplicar una máscara de dirección al verificar la dirección. Esto se puede usar para convertir una dirección distinta de cero en una dirección de llamada general personalizada que se puede usar para leer datos de todos los esclavos a la vez.

Resolver esto suena como un proyecto genial por sí mismo ...

Y otra edición: he echado un vistazo a la hoja de datos y he llegado a la conclusión de que el hardware TWI no puede ser engañado para aceptar direcciones de esa manera. Puede probar mi primera sugerencia (solo envíe una llamada general) o escribir un controlador I²C de poco uso que haga lo que quiera. O prueba algo totalmente diferente, como la sugerencia de vicatcu.

    
respondido por el Christoph

Lea otras preguntas en las etiquetas