Comunicación entre dos Arduinos via RX pero distinta fuente de alimentación

Muy buenas!

Es el primer post que escribo y no lo haría si hubiera encontrado la solución a mi problema. He buscado en todas las secciones del foro, ya sea en ingles o español y nada.

Os comento mi problema:
Estoy realizando una comunicación entre dos arduinos MEGA. El Arduino Master recibe la información por USB desde el PC y la envía por RX (si RX, no TX) al otro Arduino Esclavo la misma información, ya que ambos tienen programado el mismo código pero alterado para que realice su funciones. Hasta aquí todo bien.

Mi problema viene en las conexiones con las fuentes de alimentación + PIN RX. Detallo:

  • Si ambos arduinos están alimentados por USB en el mismo PC, funciona perfectamente la transmisión de datos usando solo un cable de RX (Arduino Master) a RX (Arduino Esclavo). Pero esto no puedo hacerlo.

  • Si el Arduino Master esta alimentado por USB (o USB mas fuente externa), tengo que llevar tres cables al Arduino Esclavo; (GND, +5V, RX) to (GND, VIN, RX). De esta forma el Arduino Master alimenta al Arduino Esclavo. También funciona. Pero no quiero alimentarlos así.

Esto implica que ambos arduinos deben tener la misma fuente de alimentación (ya sea por USB, externa o uno alimentando al otro). Necesito que cada arduino este alimentado individualmente y la comunicación entre ellos sea de máximo dos cables, como el RX y el GND, pero no se como solucionarlo.

¿Es posible hacer esto, o por obligación necesitaré como mínimo 3 cables?

Gracias de antemano.

Saludos.

tengo que llevar tres cables al Arduino Esclavo; (GND, +5V, RX) to (GND, VIN, RX). De esta forma el Arduino Master alimenta al Arduino Esclavo. También funciona.

Mas alla que te funcione esta mal.
Vin necesita al menos 1.5 a 2V por encima de 5V asi que lo minimo deberia ser 6.5V

Tu conexión claro que es posible y no entiendo porque la duda.

En todos debes compartir siempre GND y luego los alimentas como gustes. LISTO!!!

Si quiers cada uno en una PC diferente. Si quieres dos y 1 , si quieres los 3 con fuente externa. Si quieres los 3 con fuente por VIN.

Pero si no referencias a todos con GND, nada se va a comunicar.
Lo resalto para que veas que es sumamente importante.

surbyte:
Mas alla que te funcione esta mal.
Vin necesita al menos 1.5 a 2V por encima de 5V asi que lo minimo deberia ser 6.5V

Tu conexión claro que es posible y no entiendo porque la duda.

En todos debes compartir siempre GND y luego los alimentas como gustes. LISTO!!!

Si quiers cada uno en una PC diferente. Si quieres dos y 1 , si quieres los 3 con fuente externa. Si quieres los 3 con fuente por VIN.

Pero si no referencias a todos con GND, nada se va a comunicar.
Lo resalto para que veas que es sumamente importante.

De acuerdo, que funcione por +5V a VIN, es solo un ejemplo que he probado y ha funcionado.

Eso es lo que encontré y no me funciona tampoco, por lo que ahi está mi problema, que aunque comparta el GND no funciona. Por mucho que los alimente individualmente de forma externa o USB, compartiendo el GND no hace nada.

¿Tengo que poner en común un GND de los MEGA en especial, es decir, el GND que está donde las salidas PWM, o el GND de las salidas DIGITAL debajo de PIN 52-53, todos los GND juntos...? ¿O solo el GND de la alimentación correspondiente? Después de 5 horas probando todo no entiendo el problema.

Gracias por tu respuesta

NO!!

De acuerdo, que funcione por +5V a VIN, es solo un ejemplo que he probado y ha funcionado.

Que te haya funcionado no quiere decir que este bien

Ves la imagen VIN al centro despues del diodo a la izquierda del regulador de 5V
Entonces 1. No tienes proteccion contra inversión de polaridad y
2. debes entregar mas de 5V + 1.5V minimo segun el regulador
Ahi dice MC33269D-5 y la hoja de datos dice que al menos necesita 1.35 Volts por encima.

surbyte:
NO!!

Que te haya funcionado no quiere decir que este bien

Ves la imagen VIN al centro despues del diodo a la izquierda del regulador de 5V
Entonces 1. No tienes proteccion contra inversión de polaridad y
2. debes entregar mas de 5V + 1.5V minimo segun el regulador
Ahi dice MC33269D-5 y la hoja de datos dice que al menos necesita 1.35 Volts por encima.

Vale vale... solo he explicado que he probado ese ejemplo y ha funcionado la comunicación, no digo que esté bien en absoluto.

Mi problema sigue siendo el por qué con fuentes de alimentación externas, aun conectando el GND en común, no transmite comunicación. Cualquier prueba, comprobación o idea que pueda probar para hacerlo funcionar es lo único que busco.

Gracias aun asi.

Partamos de que tu dices enviar información por RX e insistes SI RX, bueno yo ahi no puedo continuar con eso.
Para mi RX recibe no envia, asi que si tu dices lo contrario y en algun momento funciona y luego no, no puedo seguirte.

surbyte:
Partamos de que tu dices enviar información por RX e insistes SI RX, bueno yo ahi no puedo continuar con eso.
Para mi RX recibe no envia, asi que si tu dices lo contrario y en algun momento funciona y luego no, no puedo seguirte.

Llevas razón, trataré de explicarme por que digo que RX envía y que me he dado cuenta del fallo.

La comunicación que hace el PC con el primer Arduino es por USB y esta información es la que recibe RX del primer Arduino, y lo que estoy haciendo mal es duplicarla hasta el otro Arduino, por lo tanto el primer Arduino no está transmitiendo, solo lo uso como medio al otro. Corrígeme si me equivoco.

Por eso no funciona la comunicación con solo GND y RX, por que no tiene lógica.

Supongo que la solución estaría en hacer que todo lo que RX recibe del USB, sea transmitido por TX del primer Arduino al segundo. Así no sería duplicar RX literalmente, si no comunicar lo que RX recibe y volver a enviarlo por TX ¿Cómo podría hacer esto? ¿Necesitaría alguna librería o no debería ser difícil?

A ver si entendí. ¿Quieres que todos los Arduinos reciban lo mismo? ¿Conectas en paralelo todos los RX?
De no funcionar así, retransmitir tampoco es algo de otro mundo

Lucario448:
A ver si entendí. ¿Quieres que todos los Arduinos reciban lo mismo? ¿Conectas en paralelo todos los RX?
De no funcionar así, retransmitir tampoco es algo de otro mundo

Exacto, eso es lo que estoy haciendo ahora, utilizar el Arduino Master que recibe desde USB y uso su pin RX en paralelo para el otro arduino. Y si funciona, pero no con dos cables y fuentes de alimentación externas.

¿Y como puedo retransmitir por TX para poder realizar la comunicación con fuentes externas y solo dos hilos de cable (GND + TX)?

Gracias

Si en el maestro necesitaras procesar los datos para algo, entonces sería que utilices esta función en vez de Serial.read():

byte retransmitRead() {
  Serial1.write(Serial.peek());
  return Serial.read();
}

La idea de esta sustitución es para que nunca se te olvide retransmitir el byte antes de "consumirlo" en el read(). Note que para esto hay que inicializar Serial1 (y por ende, se usa el TX de puerto número 1).

Lucario448:
Si en el maestro necesitaras procesar los datos para algo,

Según he comprobado no necesito procesar nada en el Maestro en lo que a comunicación respecta, solo retransmitir el Rx por Tx.

Voy a probar y ver si funciona. Gracias Lucario448

No me ha funcionado. Lo he declarado en las funciones, añadido Serial1.begin(9600) en setup y sigue igual. Solo funciona por Rx, Tx no hace nada.

Como más datos remarco que cuando el maestro recibe por USB el LED de Rx se enciende, pero en el esclavo cuando transmito por Rx (ya he entendido que no estoy trasmitiendo sino copiando en paralelo :wink: ) no se enciende el LED Rx, aunque no es algo que me preocupe solo lo digo como dato.

Seguiré investigando :slight_smile:

Y porque no haces un esquema?
Mano alzada como minimo, le tomas una foto, lo subes como adjunto captura el enlace, esperas 5 min, editas, lo pegas como URL en la etiqueta de imagen y listo.

surbyte:
Y porque no haces un esquema?

Gracias, pero no va a ser necesario, creo que el problema va a estar en el código. He hecho la misma prueba desde otros dispositivos que no sea Arduino Mega - Arduino Mega, pero esta vez entre Arduino Micro - Arduino Micro, también entre Arduino Uno - Arduino Micro y entre Arduino Nano - Arduino Nano, y usando el Rx como antes ni siquiera funciona, como dijiste Surbyte, no transmite. Es raro que funcione solamente desde Mega a Mega...

Aun así, os dejo el código reducido (solo lo que hace que funcione, lo demás que no estaría es solo digitalWrite para LEDs y otras funciones para otros usos que no están realizadas) para ver si me podéis ayudar a modificarlo, por que he probado todo para que reenvíe por TX lo mismo que recibe por USB y no hay manera, hasta tirando de librería SoftwareSerial para cambiar el Pin de TX y RX y tampoco. El código fue programado hace mucho tiempo con un compañero pero me es imposible volver a contactar con él. Seguiré probando y testeando.

Gracias por la ayuda.

Nada, sigue sin funcionarme. He añadido esto debajo de break; en cada función de void setSlat(int i) y setCue(int i):

 default:
      Serial.println(i);
}

Pero sigue sin enviar nada al otro arduino. ¿Se podría modificar el código o crear uno para que el primer Arduino se encargara solo de retransmitir los datos que recibe por USB? Solo que haga eso, nada más.

Gracias.

Saludos