Hola a todos.
Tengo conectados 3 Arduinos mediante MAX485 Half duplex. El problema que tengo es que el 1 y el 3 no se comunican, pero el 1 con el 2 y el 2 con el 3 si. Si apago el Arduino 2, el 1 y 3 siguen sin comunicarse, incluso si desconecto el MAX485 del Arduino; pero si desconecto los cables a y b del MAX485, entonces si se comunican el 1 el 3.
Los cables que he usado para a y b son ethernet cat6 apantallados con un total de 20m. He probado con y sin resistencias de 120Ω en ambos extremos de las líneas a y b, pero siempre hace lo mismo: solo funciona 1-2 y 2-3 (o 1-3 si desconecto físicamente los cables a y b del 2) pero nunca funciona 1-2-3.
Adjunto código de prueba.
¿Alguien tiene alguna idea de qué puede ser? Gracias por vuestro tiempo.
ARDUINO 1:
//ARDUINO 1
#include <SoftwareSerial.h>
#define RX 10
#define TX 11
#define pinMAX 2
char varChar=' ';
String bufferIn="";
SoftwareSerial rs485(RX, TX);
void setup() {
pinMode(pinMAX, OUTPUT);
Serial.begin(9600);
rs485.begin(4800);
delay(1000);
enviarDato('-', 0); //Envía un dato para borrar suciedad el módulo
}
void loop() {
enviarDato('a', 1234);
comprobarMAX();
delay(1000);
}
void comprobarMAX(){ //Comprueba si nos ha llegado algún dato
digitalWrite(pinMAX, LOW); //Prepara el pin en modo recepción
if(rs485.available()){ //Lee si hay algo en RS485
Serial.print("Datos recibidos: ");
while(rs485.available()){ //Mientras haya datos en el buffer
varChar=(char)rs485.read();
Serial.print(varChar);
bufferIn+=varChar;
delay(1);
}
Serial.println("");
}//if
}
void enviarDato(char letra, int valor){
digitalWrite(pinMAX, HIGH); //Habilitar transmisión
Serial.print("Datos enviados: ");
Serial.print(letra);
Serial.print(valor);
Serial.println('#');
rs485.print(letra); //Enviar identificador de la letra
rs485.print(valor); //Enviar el valor del entero
rs485.write("#"); //Finalizar el mensaje
digitalWrite(pinMAX, LOW); //Volver a recepción
}
OTROS ARDUINOS:
//OTROS ARDUINOS
#include <SoftwareSerial.h>
#define RX 10
#define TX 11
#define pinMAX 2
char varChar=' ';
String bufferIn="";
SoftwareSerial rs485(RX, TX);
void setup() {
pinMode(pinMAX, OUTPUT);
Serial.begin(9600);
rs485.begin(4800);
delay(1000);
enviarDato('-', 0); //Envía un dato para borrar suciedad el módulo
}
void loop() {
comprobarMAX();
}
void comprobarMAX(){ //Comprueba si nos ha llegado algún dato
digitalWrite(pinMAX, LOW); //Prepara el pin en modo recepción
if(rs485.available()){ //Lee si hay algo en RS485
Serial.print("Datos recibidos: ");
while(rs485.available()){ //Mientras haya datos en el buffer
varChar=(char)rs485.read();
Serial.print(varChar);
bufferIn+=varChar;
delay(1);
}
Serial.println("");
}//if
}
void enviarDato(char letra, int valor){
digitalWrite(pinMAX, HIGH); //Habilitar transmisión
Serial.print("Datos enviados: ");
Serial.print(letra);
Serial.print(valor);
Serial.println('#');
rs485.print(letra); //Enviar identificador de la letra
rs485.print(valor); //Enviar el valor del entero
rs485.write("#"); //Finalizar el mensaje
digitalWrite(pinMAX, LOW); //Volver a recepción
}