Duda sobre conexion de una pantalla LCD a dos Arduinos distintos.

Hola a todos.

Sé que es posible conectar 2 pantallas LCD (mediante módulo i2c) a un solo arduino, poniendo a cada pantalla una dirección individual y distinta entre ambas.

Pero... Es posible hacer lo inverso?, Es decir conectar una sola pantalla (mediante i2c) a dos Arduinos distintos y que se le puedan mandar mensajes individualmente desde cada uno de ellos.

La cuestión es que utilizo dos Arduinos distintos, cada uno con su pantalla LCD i2c 16x2, y cada uno hace su función, pero como voy a cambiar las dos pantallas (16x2), me gustaria entonces usar solamente una (20x4) dividiendo la pantalla en dos partes, es decir las dos lineas de arriba para uno y las dos de abajo para el otro, y como no dispongo de una pantalla (20x4) no he podido probar.

Agradezco de antemano cualquier información sobre este tema.

Gracias a todos.

Hola.

La respuesta es que que se podría hacer, puesto que el protocolo I2C admite varios maestros y esclavos.
Pero como en cada momento solamente un maestro puede tener el control del bus y por lo tanto solo uno puede transmitir los datos, habría que tener un sistema de contencion en el programa para que no hubiese colisiones.

No conozco si las librerias de display LCD con interfaz I2C (como LiquidCrystal_I2C) permiten ese sistema de contencion o habría que hacerlo aparte.

Saludos.

La cuestión es que utilizo dos Arduinos distintos, cada uno con su pantalla LCD i2c 16x2, y cada uno hace su función, pero como voy a cambiar las dos pantallas (16x2), me gustaria entonces usar solamente una (20x4) dividiendo la pantalla en dos partes, es decir las dos lineas de arriba para uno y las dos de abajo para el otro, y como no dispongo de una pantalla (20x4) no he podido probar

Tajantemente no es posible.

Ya que tendras un Arduino conectado fisicamente al LCD via I2C, lo único que puedes hacer es que el 2do arduino sea un esclavo I2C del primer arduino, y los mensajes que envie, sean presentados donde gustes en el que ya lo tiene conectado.

No es así.

I2C es un protocolo soportado en un bus, esto implica que de esos hilos pueden colgar muchos dispositivos: varios arduinos, sensores, medidores de temperatura etc, mientras se respeten los estandares del bus que, por cierto, en los ATmega328 se llama TWI.

Ambos Arduinos pueden ser maestros por turnos, es decir no simultaneamente y para que esto sea asi

Alfaville:
... Pero como en cada momento solamente un maestro puede tener el control del bus y por lo tanto solo uno puede transmitir los datos, habría que tener un sistema de contencion en el programa para que no hubiese colisiones.

No conozco si las librerias de display LCD con interfaz I2C (como LiquidCrystal_I2C) permiten ese sistema de contencion o habría que hacerlo aparte.

Posible sí es. ¿ El esfuerzo para implementarlo compensa ?. Eso le corresponde a Mikms valorarlo.

Saludos

Ambos Arduinos pueden ser maestros por turnos, es decir no simultaneamente y para que esto sea asi

Y dime como vas a hacer eso?
Debes comunicar los dos Arduinos con un pin para avisarle al otro que usarás el bus.

Mas simple es hacer lo que digo.

Ahora que lo planteas asi te doy la derecha pero para que?

Comunico dos arduinos por Serial como algo mas simple, y el que deseo lo uso para presentar todo.

Ahora esta claro que una cosa es lo que uno haría y otra es lo que consulta Mikms

En primer lugar a la consulta sobre

Mikms:
Pero... Es posible hacer lo inverso?, Es decir conectar una sola pantalla (mediante i2c) a dos Arduinos distintos y que se le puedan mandar mensajes individualmente desde cada uno de ellos.

Hay que contestar que SI.

En segundo lugar la implementacion no tiene (aunque puede) depender del uso del puerto serie para comunicar ambos arduinos.
El protocolo I2C se basta y se sobra para que ambos Arduinos compartan, por turnos, la unica pantalla 20x04.

Y por último a la pregunta de

surbyte:
Y dime como vas a hacer eso?

yo solo pretendo contestar a la pregunta que se plantea. El como habria que plantearlo

Alfaville:
... Posible sí es. ¿ El esfuerzo para implementarlo compensa ?. Eso le corresponde a Mikms valorarlo.

Lo que no me queda claro es esto

surbyte:
... Ahora que lo planteas asi te doy la derecha pero para que?

Comunico dos arduinos por Serial como algo mas simple, y el que deseo lo uso para presentar todo.

Ahora esta claro que una cosa es lo que uno haría y otra es lo que consulta Mikms

Saludos.

Sigues sin decir como hara un arduino para no colisionar con el segundo Arduino que tiene tomado el bus I2C.
Las sugerencias de usar un pin o usar el serial eran justamente para evitar la colisión.

Aunque ahora que lo pienso mis dudas se deben a mi ignorancia sobre el protocolo I2C. Lo estudiaré y veré si es posible o mejor dicho cómo es posible que dos dispositivos tomen el control

Te recuerdo que la pregunta de Mikms es sobre "si es posible". Y la respuesta es que si.

Si ahora preguntase sobre como hacerlo y suponiendo que fuese procedente seguir con el mismo tópico, entonces sería el momento de que entre todos viesemos el como. Sería un reto del que todos aprenderiamos.

Yo admito que nunca lo he hecho y por lo tanto comparto tu ignorancia, pero las especificaciones lo permiten y por lo tanto debe ser posible.

Saludos.

Mikms:
Pero... Es posible hacer lo inverso?, Es decir conectar una sola pantalla (mediante i2c) a dos Arduinos distintos y que se le puedan mandar mensajes individualmente desde cada uno de ellos.

Buenas. Esta es la pregunta del usuario. Tal y como lo veo NO es posible
Que cada arduino envie información como "maestros" del bus a un solo esclavo (pantalla por ejemplo). En el bus I2C solo puede tener un maestro y los demas componentes del bus siempre seran esclavos.

Sin embargo la pregunta hubiese sido

Puedo conectar dos arduinos y enviar información a una sola pantalla ...

La respuesta es SI

Apreciado lightcalamar

Los diseñadores del protocolo-bus I2C lo ven de esta forma, (cito el texto del documento AN10216-01 de Philips)

....If two masters try to start a communication at the same time, arbitration is performed to determine a “winner” (the master that keeps control of the bus and continue the transmission) and a “loser” (the master that must abort its transmission)....

....Si dos maestros tratan de iniciar una comunicación al mismo tiempo, se realiza el arbitraje para determinar un "ganador" (el maestro que mantiene el control del bús y continua la transmisión) y un "perdedor" (el maestro que debe abortar su transmisión)....

Es decir que SI se pueden poner dos Arduinos en un mismo bus I2C para compartir una pantalla LCD, o varios sensores o lo que sea.

El hecho de que un elemento conectado al bus I2C se comporte como maestro o como esclavo no depende nada mas que de que sea "inteligente", o esté diseñado solo como esclavo.

Hay hasta 128 dispositivos (caso ideal) que pueden compartir el mismo bus y con una mezcla de maestros y esclavos.

Creo que la mecánica de uso ya la he comentado anteriormente: un protocolo de contencion

  • Arduino A escucha el bus
  • si hay transmision activa un TimeOut y espera
  • si el bus está libre inicia como maestro una transmision al LCD con los datos deseados
  • libera el bus
  • Si durante la transmision del Arduino A, el Arduino B necesita acceder al LCD seguirá el mismo protocolo

Y de esta manera se puede compartir el bus y los dispositivos conectados a él.

El sistema de contencion o detecteccion de colisiones es ampliamente usado en accesos a buses, por ejemplo en el acceso por cable de los distintos PC´s a una red de área local.

Quizás la resistencia instintiva que tenemos a aceptar el bus multimaestro se derive de que las librerias que usamos no lo soportan, y de que en nuestros proyectos no solemos compartir recursos entre varios Arduinos, dando la sensacion de que la relacion es de un solo maestro <--> varios esclavos.

Saludos.

Alfaville gracias por la respuesta, surbyte gracias por la respuesta, lightcalamar gracias por la respuesta.

Sé que es una pregunta complicada, o quizás más bien esto es una manera de complicarse uno la vida habiendo otras soluciones, y que muy posiblemente serán hasta mucho más sencillas de hacer que esta animalada que yo pretendo. Pero es que tengo que hacer las cosas dentro de mis limitaciones, que son muchas.

A ver que termino por hacer al final, intentaré hacerlo de la manera correcta que se hacen estas cosas (si es que soy capaz de conseguirlo), o sino al final volver a colocar dos pantallas individuales como están actualmente.

Muchisimas gracias como siempre a todos por vuestro tiempo, interés y ayuda en todos los temas.

Ya que el debate resultó ser intersante debido a lo inseperada de tu pregunta, porque no continuamos aportando ya mas en profundidad la posible solución?

Propongo que continúes, con la ayuda de los acá presentes a ver si podemos resolver esto.
Lo indicado por Alfaville muestra que debería ser mas fácil de lo que nuestro excepticismo (ignorancia) muestra.

Asi que porque no probar y ver que ocurre.

La mécanica de Alfaville también es impecable, misma realizada en otros protocolos asi que no por eso menos impecable.

Creo que la mecánica de uso ya la he comentado anteriormente: un protocolo de contencion
Arduino A escucha el bus
si hay transmision activa un TimeOut y espera
si el bus está libre inicia como maestro una transmision al LCD con los datos deseados
libera el bus
Si durante la transmision del Arduino A, el Arduino B necesita acceder al LCD seguirá el mismo protocolo

Yo implementaría dos arduinos, con bus I2C compartido, con un LCD I2C 20x4 como has sugerido.
Que uno intente escribir un contador en lineas 0 y 1 y el otro en lineas 2 y 3

En los códigos que deberías ser iguales salvo el que definas como 1 y el que definas como 2, el único cambio es donde imprimen.

Resto igual.

Amplio la idea: cuando armas el receptor I2C usas un WireRequest

// aCount is the number of bytes received.
void receiveCallback(int aCount) {
     if (aCount == 2) {
        int receivedValue = Wire.read() << 8;
        receivedValue |= Wire.read();
        Serial.println(receivedValue);
     }
     else {
        Serial.print("Unexpected number of bytes received: ");
        Serial.println(aCount);
}

ejemplo tomado de : Communication Between two Arduinos using I2c

Sugiero que comencemos con estos ejemplos ya que lucen apropiados.

COLITION i2C un buen comentario

y esto ha derivado en la palabra clave en inglés Arduino Multimaster I2C link

no digo que este resuelto pero hecha por tierra lo que he escrito antes.
Este parece ser el punto de partida.

Hola de nuevo.

Por supuesto que agradezco que este debate pueda extenderse hasta el final e intentar hacerlo funcionar (o no).

Estaré encantado de que el tema continue, y se siga ampliando, por supuesto que me interesa que continue (aunque tampoco quiero ser pesado, y menos aún habiendo otras soluciones para este problema, aunque para mi sean demasiado complicadas hasta el momento).

Pero como ya comenté anteriormente, no dispongo de esa pantalla LCD 20x4 que ahora mismo vendría de maravilla para intentar probar y poder decir como va resultando el experimento.

Para mi era más por simplificar y que estuviera todo en una sola pantalla (ya digo que solo ultilizan dos lineas cada Arduino, y la idea era que uno utilizara las dos de arriba y el otro las dos de abajo, simulando dos pantallas 16x2 una encima de la otra como realmente estaban hasta el momento).

Pero claro una cosa era la idea (como cada uno va a utilizar dos lineas distintas, pues se configuran de esta manera, y que cada vez que lancen texto lo hagan a la parte de la pantalla que le corresponde, uno a las dos líneas de arriba, y el otro a las dos lineas de debajo) y otra cosa muy distinta es que realmente se pueda conseguir hacer y no se "colapsen" entre ellos y tengan "retrasos".

Si es posible hacer esto mismo de otra forma (cambiar las dos pantallas 16x2 por una 20x4) y que cada Arduino utilice la pantalla (dos lineas para cada uno individualmente), también habría que intentar conseguirlo aunque sea de esa otra manera.

Pero por supuesto que sigo abierto a cualquier aportación que pueda hacer cualquier compañero sobre este tema.

Gracias una vez más por el interés que mostrais siempre en todos estos temas.

@Mikms:

¿ Podrias hacer las pruebas con una pantalla 16x02 asignando la linea 0 al Arduino_A, y la linea 1 al Arduino_B ?

Para nosotros seria una ayuda importante de cara a determinar la forma de implementar el bus multimaestro.
Y a fin de cuentas tú eres el culpable de este lío. jajajaja...

Ahora en serio. Después de muchas lecturas y averiguaciones (la información no está tan clara como yo necesito), me parece haber visto luz en el camino y creo que la implementación será mucho mas facil de lo que creía.

¿ Te animas ?

Saludos.

Alfaville tienes toda la razon del mundo, podia haber probado con una de 16x2 una linea para cada arduino y podia haber ahorrado el post, pero sinceramente ni pense en sea option, siendo la mas facil. Que torpe pot mi parte!!!!.

Ahora mismo no dispongo de ninguna, pero lo hare en cuanto me sea posible y reciba las que pedi, que sera en los proximos dias.

No tengo perdón, que torpe no pensar eso que era lo más fácil.

Gracias

Por favor, nada de torpe.

Quizás demasiados asuntos al mismo tiempo y por lo tanto algun despiste... :smiley: :smiley:

Quedamos a la espera de tus pruebas, pero te anticipo que seguramente funcionará sin hacer nada especial, porque un primer repaso de la libreria "Wire" así me lo indica.

De ahí el interés de la prueba, porque si todo vá bien podriamos tener varios Arduinos compartiendo pantalla, sensores y algunas otras cosas, lo que abre las puertas a nuevos proyectos y a mejoras de los yá existentes.

Quedamos a la espera de tus comentarios.

Saludos.

Así lo haré, en cuanto tenga la ocasión de poder. Comprobarlo así lo haré y por supuesto comentaré que tal fue el resultado. Muchas gracias una vez más

Hola de nuevo. Como dije en mi anterior mensaje en cuanto tenga cualquier noticia sobre el siguiente paso que me propuso investigar Alfaville (que vuelve a pedir disculpas por mi TORPEZA de no haberlo comprobado con uno de dos lineas utilizando una sola linea para cada Arduino), pues acabo de hacer la primera prueba ahora mismo.

El resultado de dos Arduinos en una sola pantalla (en este caso es una pantalla 16x2 en el que cada arduino utiliza una sola linea, y la pantalla con conexión mediante el módulo i2c) es que ...SI FUNCIONA sin hacer más conexion que unir los cables de un arduino al otro (en los pines A4 y A5).

Cada linea está trabajando ahora mismo con un arduino distinto.

En un arduino he instalado un sensor de temperatura (DHT22 con solamente la temperatura) y en el otro arduino he instalado un reloj (DS1302 solamente la hora, minutos y segundos). Sobra decir que estan instalados en dos arduinos distintos tan solamente para probar y ver resultado.

Ambos funcionando con casi total normalidad, y la prueba la estoy haciendo ahora mismo en directo!!.

Y digo casi total normalidad (todo no iba a ser perfecto y a la primera), porque cada vez que se actualiza la temperatura (la puse cada minuto) la linea de la temperatura no tiene ningun efecto (excepto el cambio de grados si es que la temperatura variara en este tiempo), pero la linea del reloj si se apaga y se vuelve a encender (un segundo justo cuando hace la nueva medicion de temperatura), aunque por supuesto el reloj continua funcionando perfectamente, tan solo desaparece el texto durante ese segundo y vuelve a aparecer.

Logicamente es porque en el sketch de la medicion de temperatura está puesto el clear para que limpie la pantalla y no monte un numero con otro si varía la temperatura. Quizás haya otra forma de poder limpiar el texto en pantalla, pero yo realmente lo desconozco (soy muy limitado en estos temas, aunque aprendiendo cada dia más, gracias a vosotros y todo lo que leo por aqui).

Con otros sketch logicamente tendrá el mismo efecto, cuando una de las lineas se actualice hará "parpadear" ese segundo la otra linea, y viceversa, pero hasta el momento esto está funcionando sin más que esa "incomodidad".

Habrá que seguir probando, pero supongo que como es logico en la pantalla 20x4 (conectada de la misma forma que está 16x2) funcionaría tambien.

Un saludo para todos, (y perdon por haber hecho tan larga la explicacion pero he intentado que sea lo más completa posible)

Me alegro de que funcione.

Cuando tengas el programa mas o menos completado puedes postear el código y vemos la mejor forma de compartir display sin esas pequeñas molestias del borrado. De momento en vez del clear puedes escribir una cadena de espacios que limpiará la linea sin molestar al resto.

Saludos.

Bueno ya ha pasado un tiempo en el que he podido probar más cosas y más veces todo este tema...Y ahora la conclusión definitiva de esta prueba es que NO FUNCIONA!!

Al principio funciona sin el más mínimo problema, pero pasado un tiempo en la pantalla aparecen sólo símbolos que van cambiado (entiendo que al tiempo que se actualiza el sensor de temperatura).

He probado de varias formas, y siempre termina antes o despues apareciendo eso, por lo tanto NO FUNCIONA (al menos con las pruebas y sketch que yo he usado (temperatura en un arduino, y reloj en otro), quizas con otros puedan funcionar, pero me queda más bien claro que antes o despues terminarian apareciendo los los simbolos etc.