Comunicar a traves de Tx/Rx

Hola amigos.

Estoy intentando conectar un arduino al pc usando otro arduino como pasarela (quitándole el atmega). ¿por que hago esta tonterida? Para posteriormente sustituir la conexión tx/rx por conexiones rs485 full-duplex.

Os cuento las fases de mi experimento.

1.- Conecto un arduino con modbus-slave al pc mediante usb. En el pc tengo un software modbus-master. La comunicación funciona perfectamente.
2.- Desconecto el usb del ardu-modbus-slave y se lo conecto a un arduino sin atmega.
3.- Conecto tx->rx, rx->tx,5v, y gnd de ambos arduinos.
4.- Ambos arduinos comparten tensión.
5.- Con el software del pc busco al slave. El led rx del arduino sin chip parpadea. Esto quiere decir que recibe los datos del pc.
6.- El pc no encuentra nada.

¿Alguien me puede dar una pista de que está pasando?

Muchas gracias. Un saludo

PD. Por si a alguien le interesa después pienso usar un MAX488. El software que uso es Mango M2M. La librería Modbus es la de jpmzometa.

La patilla TX es por donde el ATMEGA envía datos.
La patilla RX es por donde el ATMEGA recibe datos.

Lo que envías desde el PC llegará al primer Arduino por la patilla RX (RX1).

Si luego conectas la patilla RX del primer Arduino(RX1) con la apatilla TX del segundo Arduino (TX2) estás intententando meterle al segundo Arduino por la patilla TX (que es para que el ATMEGA envíe datos, no para recibirlos) lo que envía el PC.

Por eso no funciona.

Gracias por la aclaración, pero sigue sin funcionar.

He conectado Rx -> Rx y Tx -> Tx
He alimentado al esclavo con una pila por si fuese problema de falta de tensión, comunicando los gnd.
He cambiado los cables de comunicación.

Y nada.

Funciona bien cuando lo conecto por usb directamente pero no cuando hago el puente con otro arduino sin atmega.

¿Fantasmas?

Sigo con los experimentos:

El arduino con atmega:
lo puedo programar directamente por usb.
Ese sketch (modbus) y otros con serial funcionan perfectamente a traves de usb.

Ahora uso un arduino intermediario sin atmega. tx a tx y rx a rx:
Le meto un sketch que SOLO escribe en el puerto serie y puedo ver los datos en el pc. Conclusión: el atmega envia datos y el ftdi los manda correctamente al usb
Le meto un sketch que lee comandos por puerto serie y escribe resultados por puerto serie: NO REACCIONA

Si saco un cable del pin rx del arduino sin atmega (es equivalente al tx del ftdi) y lo conecto al led tx o rx del arduino con atmega, el led parpadea. Conclusión el ftdi envía datos

En principio parece que esta sordo de pin rx, pero ¿como puede tener sordo el pin rx y funcionar perfectamente por usb?

¿Ghostbusters?

Estoy perdidisimo.

¿Me podéis indicar como comunicarme con un arduino a través de los pines tx/rx usando otro arduino sin atmega?

has unido las masas de ambas placas???

Si. De hecho alimento la una con la otra.
También las he alimentado por separado uniendo las masas

ummm!! Los pasos que se me ocurren:

  • Masas unidas??
  • El Tx del FTDI (Rx de la placa sin micro) unido al RX de la placa Arduino con micro??
  • El Rx del FTDI (Tx de la placa sin micro) unido al TX de la placa Arduino con micro??
  • Estoy seguro que el programa de Arduino funciona correctamente?? Lo he probado individualmente??
  • Por el lado de PC con la placa sin micro tengo el hyperterminal o similar en el puerto correcto, y configurado la velocidad, paridad, bit de stop y control de flujo adecuadamente??
  • NO tengo en la placa con micro el puerto serie abierto con el PC, a la vez que estoy haciendo las pruebas??

Yo lo he hecho muchas veces precisamente para el tema de rs485 sin ningún problema....

Masas unidas: OK.
Verificación. hago un puente entre 3v3 de una placa al led 13 de la otra y se enciende. (Ya se que no es sano)

RX de una a RX de la otra, TX de una a TX de la otra.

El programa funciona correctamente cuando lo uso por usb

En el pc uso el terminal de Arduino IDE, que por usb, 115200 bps y NL+CR va al pelo.

... y no chuta.

Justo cuando has contestado, estaba editando con otro punto mi post.
La placa con micro, no la tienes conectada al PC y abriendo el puerto mientras las pruebas, verdad??

Me refiero, sólo tienes abierto en el PC, el puerto serie correspondiente a la placa SIN micro.
La otra placa CON micro,NO tiene la conexión serie abierta con el PC. Es más, si estás sacando la alimentacion directamente de la otra placa, no tienes ni el usb conectado a dicha placa.

??

Solo un usb en uso: el de la placa sin micro.

Puedes poner un programita super básico que mande cosas de la placa del micro, y que si recibe algo, te saque un OK o algo asi.
Para probar Tx y Rx.

Me refiero, que no espere a recibir algo para empezar a transmitir.

/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the serial monitor

This example code is in the public domain.
*/

void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue, DEC);
}

Obtengo comunicación correcta

Ese esta a 9600 baudios (lo digo porque antes pusistes que estabas a 115200).
Tienes tu placa sin micro configurada a 9600 baudios y lees lo que te manda la placa con micro funcionando con dicho programa??

No, he cambiado la configuración del Serial Monitor.
El otro programa estaba a 115200 y está basado en la librería Messenger la cual, dicho sea de paso, está muy bien. (No se si me tendré que arrepentir de lo dicho)

No me ha quedado claro, estas recibiendo lo que te manda??

Si es que si, modifica el programa para que si Serial.available()>0, te mande un OK o algo asi, y pruebas de escribir algo....

/*
  DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor 
 
 This example code is in the public domain.
 */

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  
    if (Serial.available()) {
      Serial.read();
    Serial.println("OK"); 
  }
  
}

Este si va.
Muchas gracias Igor. Seguiré investigando por que falla el Messenger y te contaré.
Has sido muy amable.

No se por que, a traves de tx/rx no me funciona:
ni la librería Messenger con el serial monitor
ni la librería Modbus con Mango M2m
Pero si lo hacen cuando me conecto a traves de usb

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  Serial.println("OKttttttttttttttt");
    if (Serial.available()) {
      Serial.read();
    Serial.println("OK"); 
  }
  
}
  • Si conecto el arduino directamente, obtengo en el serial "OKttttttttttttttt" a chorro. Si le mando algún carácter obtengo un "OK"
  • Si lo conecto a través de otro arduino, obtengo "... -ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ EÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ ... "

:fearful:

Últimos experimentos:

  • si hago un puente entre la pata 1 del ftdi (txd) y la rx del arduino con chip, SI VA
  • si hago un puente entre la pata 2 del soket (rxd) al pin rx del arduino con chip, NO VA

Se supone que la pata 1 del ftdi está conectada directamente a la pata 2 del socket del atmega, siendo la pata 2 la segunda patilla cercana a las letras ICSP, ¿no?