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.
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.
Dicho todo esto, busque aquí cómo conectar dos placas Arduino Uno (una maestra y una esclava) usando un bus I2C.
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:
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.
st2000
Mihai