Cómo probar una red atmega (arduino) i2c

Antes que nada, perdón por mi mal inglés y por esta pregunta "teórica" ​​sobre cómo es la mejor manera de hacer las cosas. Acabo de salir de la universidad y nunca nadie me dijo cómo se pueden resolver los problemas de una manera práctica.

Estoy tratando de desarrollar una red de 4 atmega (estoy usando la plataforma Arduino), 1 maestro y 3 esclavos. se comunican a través de i2c.

Estoy buscando una forma inteligente de probarlo. en este momento, mi depuración está ocurriendo a través del protocolo en serie: tengo algunos

Serial.println(...);

y los estoy leyendo conectando los Arduinos a través de USB y leyendo los mensajes entrantes en serie con el monitor en serie en el IDE de Arduino.

Lo que estoy haciendo ahora es:

  1. Esclavos de codificación que tienen un programa de prueba (uno para cada esclavo) en el maestro (alimentado con una fuente de alimentación normal).
  2. Cuando esté "seguro" de que el esclavo está bien, desconecte el USB del esclavo, conecte el maestro y codifique el maestro.
  3. Haga esto para cada esclavo.
  4. Orar.

Este flujo de trabajo tiene muchos problemas; es una comunicación ciega. Cuando estoy trabajando en el maestro, realmente no sé qué está pasando en los esclavos y viceversa. Luego, si un Arduino falla hace que el maestro se bloquee (porque el protocolo I2C no contempla el hecho de que un esclavo no responde o está apagado) y tengo que restablecer todos los esclavos (estoy haciendo eso apagando la fuente de alimentación de todos los esclavos).

Un problema más: algunos esclavos necesitan operación en tiempo real con motores paso a paso, y si un motor está funcionando y Wire.hocurren algunas interrupciones de la biblioteca de protocolos I2C (y esto sucede cada vez que el maestro requiere algún mensaje del esclavo, creo), es Eventualmente puede suceder mientras el motor está funcionando y esto hace que el movimiento de los motores (que debe ser lo más lineal posible) sea "troteado". Para evitar esto, solo tengo comunicación unidireccional: Los esclavos solo reciben comandos. No sé si esta es la mejor solución, pero parece funcionar.

La comunicación unidireccional ciega, el enchufar y desenchufar repetidamente el USB, enchufar y desenchufar la fuente de alimentación y presionar los botones de reinicio me hace sentir estúpido. Hasta ahora, he realizado desarrollo de software con IDE (Eclipse) que proporciona depuración. Si tengo algunos subprocesos para sincronizar, puedo tener impresiones o lo que sea que haga la vida más simple, y con el software estoy haciendo pruebas unitarias que me brindan una buena herramienta para aislar el error. Ahora, con la red Arduinos, cuando algo sale mal, no tengo idea de cómo encontrar dónde está el problema. Esta es mi primera red de hardware y es frustrante.

Necesito algunos consejos sobre cómo encontrar un flujo de trabajo inteligente, tener una buena manera de probar mi sistema y sentirme un programador.

¿Por qué desenchufar y volver a enchufar? ¿Por qué no dejarlos todos enchufados y leer los datos de depuración de los cuatro dispositivos?
¿Creó usted esta red o solo la está probando? La única razón por la que pregunto es porque los dispositivos atmega se pueden conectar a través de SPI con la configuración de la que está hablando. Debe usar un pin para habilitar/esclavo seleccionar cada esclavo cuando quiera hablar con él. Los esclavos pueden responder a través de MISO.

Respuestas (2)

Puede sondear y monitorear el autobús usando BusPirate . De esta manera, puede ver lo que sucede en el autobús y lo ayudará a solucionar los problemas.

Aquí hay un video que demuestra el escaneo del bus i2c.
También se puede usar como analizador I2C, como se muestra en este video .

¿Conectar todas las placas arduino a un concentrador usb?

Está bien que los esclavos solo reciban, pero no tiene garantía de que los comandos se hayan recibido correctamente. Probablemente sea mejor algún tipo de ACK.

Si está usando I2C, entonces el propio protocolo asegura que se recibió el mensaje.