Comunicación Arduino I2C entre 2 redes maestras

Tengo 2 microcontroladores Arduino, cada uno con una red de dispositivos I2C conectados a ellos (uno tiene 2 ADC y el otro una pantalla LCD y un RTC). ¿Cómo puedo usar la conexión I2C para transferir los valores obtenidos por el primer uC de los ADC al segundo? Ambos uC son maestros en sus buses I2C. Estaba pensando en hacer un software I2C en el segundo uC y conectarlo como esclavo al primero (así el segundo controlador tendría 2 puertos I2C: uno de hardware y otro de software). El problema es que no puedo encontrar ninguna biblioteca de software I2C que funcione como esclavo. Todos son maestros.

Esperando sus ideas.


La pregunta es, ¿puedo hacer 2 redes I2c usando un Arduino Mega2560? Uno como maestro en el puerto de hardware para comunicarse con la pantalla LCD y el RTC y otro como esclavo en un puerto de software en otros 2 pares de pines (para SCL y SDA) para recibir datos de otro arduino maestro...


Después de analizar todos los datos, llego a la conclusión de que los 2 buses I2C no se pueden vincular entre sí. En el puerto I2C externo que tengo disponible en la uC de adquisición de datos, conectaré otro arduino como esclavo que recibirá la información y la transmitirá mediante un adaptador inalámbrico (probablemente un NRF24N01). De esa manera, no necesito tener cables desde mi controlador solar al arduino que informa la producción al sitio web pvoutput.

¿Qué Arduino (en realidad, qué microprocesador)?
Arduino Pro mini está conectado a los ADC. Arduino Mega2560 es el que tiene etc y LCD.

Respuestas (4)

De los comentarios, desea poder conectarse solo al bus I2C en cada uno de sus proyectos separados y transferir datos.

Wirning le permite ejecutar un Arduino como Maestro I2C o como Esclavo. No puede ejecutar el software Wiring maestro y esclavo en un solo micro ya que ambos quieren usar el hardware USI, pero como solo tiene un USI, puede conectarse a un solo bus de todos modos.

Sugeriría que una forma efectiva sería usar un ATTiny85 como una interfaz esclava I2C en cada bus y luego conectarlos a través de un UART de software. Hay una biblioteca TinyWire muy agradable disponible para ATTiny85 de Adafruit... también tienen una placa muy pequeña llamada Trinket que podrías usar.

Hay un montón de placas ATTiny85 (como Digispark) disponibles que pueden conectarse al entorno de programación Arduino, por lo que esta debería ser una forma simple y económica de crear un esclavo I2C.

Si bien algunos pueden decir que esto es excesivo, sería extremadamente simple de implementar y no requeriría ninguna modificación de hardware para su proyecto.

IIC no es una buena opción para la comunicación entre pares.

La forma más fácil de conectarse a microcontroladores es probablemente con UART. Tenga en cuenta que proporciona un canal independiente y asíncrono en cada dirección. Tampoco está atascado con las velocidades de transmisión estándar. Use algo rápido que pueda derivarse directamente de ambos relojes. Puede hacer fácilmente un MBaud o más entre UART en la misma placa.

Especialmente si aumenta la velocidad en baudios, podría ser una buena idea implementar el control de flujo. Algunos microcontroladores UART tienen RTS/CTS incorporados, pero incluso si no lo tienen, este tipo de capacidad es fácil de agregar en el firmware. Asegúrese de que el receptor pueda almacenar en el búfer al menos tantos caracteres como hay en el FIFO del hardware del remitente. De esa manera, la línea de control de flujo se puede usar en el remitente para simplemente no escribir más datos en el hardware. Los microcontroladores tienden a tener pequeños FIFO de salida UART (generalmente solo uno o dos, rara vez más de 4), por lo que esto no es un gran problema.

Un Arduino Pro mini está conectado a los ADC y forma la unidad de visualización de un controlador de carga solar (tiene una pantalla LCD especial conectada en serie). La única conexión que puedo usar es la I2C (o tengo que hacer un lío con la PCB encendida). Un Arduino Mega2560 es el que tiene RTC y LCD y también tiene un escudo Ethernet. Esta transferencia de datos no es necesaria para ser rápida, solo necesito enviar 2 valores (voltios y amperios) cada segundo más o menos.
  • Solo puede tener un maestro I2C en el bus I2C. (Puede haber algunos protocolos avanzados en los que puede cambiar quién es el maestro).
  • Muchos procesadores integrados se pueden configurar como maestro o esclavo I2C. (No creo que la biblioteca estándar Arduino I2C permita un cambio fácil entre maestro y esclavo. Puede haber Arduinos que usen procesadores sin soporte para el modo esclavo).
  • Estos tipos de protocolos (SPI o I2C) deben ser utilizados por partes que comparten la misma placa y fuente de alimentación. Por lo general, no son lo suficientemente robustos como para sufrir las complicaciones de (por ejemplo) cortes parciales de energía, conexión en caliente o cables excesivamente largos.

Dicho todo esto, busque aquí cómo conectar dos placas Arduino Uno (una maestra y una esclava) usando un bus I2C.

Estaba viendo todo este sistema como 2 redes I2C separadas: la primera con Arduino Promini como maestro + ADC y Arduino Mega2560 como esclavos. La segunda red formada por Arduino Mega2560 como maestro + LCD y etc como esclavos. Como puede ver, quiero que Mega2560 tenga 2 conexiones I2C, una como esclava (software) y otra como maestra en el puerto de hardware.
Es posible implementar un puerto I2C esclavo de software. O tiene que dedicar su programa a nada más que monitorear las líneas CS, Reloj y Datos durante una transferencia. O disminuya la velocidad del SPI hasta que el esclavo pueda manejar la transferencia y cualquier otra cosa que necesite hacer en el procesador esclavo.
Vaya, necesito cambiar de SPI a I2C en mi respuesta. Además, no hay CS (selección de chip) para I2C. I2C utiliza direccionamiento esclavo en su protocolo.
Veo que hay algunas bibliotecas para un software I2C, pero todas son maestras... No esclavas... Podría usar el software I2C para comunicarme con el LCD y el RTC, pero dudo que las bibliotecas creadas para estos módulos funcionen con un software. puerto...
Considere una situación en la que sabe exactamente lo que desea enviar entre sus 2 placas Arduino y qué tan rápido desea enviarlo. Considere que puede ser más fácil implementar alguna interfaz personalizada de apretón de manos implementada en el software en ambos procesadores. Mira, no creo que necesites (por ejemplo) la sobrecarga de direccionamiento del protocolo I2C. Después de todo, solo tienes 1 maestro y 1 esclavo. Y es posible que solo necesite enviar datos en 1 dirección. Por lo tanto, no es necesario que se tome la molestia de probar las líneas y levantarlas con resistencias.

Lo que ha sugerido @olin es algo que deberías considerar.

En caso de que necesite dos modos de I2C (maestro y esclavo), siga leyendo.

El arduino se puede configurar como maestro o esclavo en cualquier momento. Entonces, probaría esto. El arduino que tiene que tomar ambos roles (llámelo Arduino A) puede configurarse como esclavo por defecto. De esta manera, el Arduino no perderá ningún comando del Arduino B (el arduino que dominará siempre).

El Arduino A puede decidir por sí mismo cuándo cambiar su rol a Maestro . Esto depende de los intervalos periódicos de los que tiene que leer datos. Una vez que se leen los datos de los sensores o se escriben en la pantalla LCD, el arduino A puede volver a asumir el papel de esclavo.

Un problema es que, mientras que Arduino A ha asumido el papel de maestro, Arduino B no puede comunicarse con Arduino A. Esto se puede resolver de muchas maneras:

  1. Usando un GPIO de repuesto, Arduino A informa a B que está ocupado
  2. El Arduino B puede volver a intentarlo después de un pequeño período
  3. Arduino A puede informar a Arduino B cuando está listo para la comunicación (ejemplo: avisar a B cuando los datos a comunicar están disponibles a través de GPIO).
  4. Programe el Arduino B para escribir periódicamente los datos que espera el Arduino A.

Considere http://www.gammon.com.au/i2c si es útil. Hay buena información sobre las configuraciones. Todo en una página. Por favor, no se pierda durante la navegación.

Finalmente, los factores que influyen en la decisión de la lógica son las demandas de su propia aplicación. La frecuencia de la comunicación, que puede ser de vez en cuando o contigua, la criticidad del tiempo de respuesta, no la menor cantidad de recursos que uno quisiera ahorrar, en caso de que decida implementar también el software esclavo I2C.