Arduino - Bus RS485 con funcionamiento anómalo

 
Vista:
sin imagen de perfil
Val: 8
Ha disminuido su posición en 4 puestos en Arduino (en relación al último mes)
Gráfica de Arduino

Bus RS485 con funcionamiento anómalo

Publicado por Victor Manuel (2 intervenciones) el 27/06/2020 10:56:07
Hola a todos,

Es mi primera vez aquí, llegué buscando información para desvelar un problema con el que llevo una semana peleando.

He instalado 6 Arduinos Nano y una Raspberry Pi 3B+ conectados mediante un bus RS485. Todos los equipos tienen un MAX485/RS485 para conectarse al bus. Un detalle que puede ser importante, es que el RS485 de la Raspberry está alimentado con 3.3V para evitar problemas de tensiones con los pines de datos.

Todos los RS485 están permanentemente en modo lectura, y sólo pasa a modo escritura el que necesita enviar algo, y por el tiempo necesario.

Aunque al principio no le puse ninguna resistencia, probando todo lo que he encontrado ahora el bus tiene una resistencia de 150 ohm en cada punta, y resistencias de polarización de 1k. El A conectado a masa, y el B a positivo. Los valores no solo los ideales, pero es lo que tenía a mano para probar. Es un bus corto, realizado con un par de un cable UTP, y la longitud total es de unos 6 metros. La velocidad de transmisión está en 9600 baudios.

Hasta ahora, he logrado que todos los arduinos reciban datos de la Raspberry, y que la Raspberry reciba los datos de todos los arduinos. Hasta ahí, todo bien.

Pero ahora me encuentro con que los datos que escribe un Arduino, no son recibidos por ningún otro Arduino. Reciben "algo", pero al leer el buffer y pasarlo a una variable, esta se queda vacía. Ayer "solucioné" esto, haciendo que la Raspberry repita ciertas comunicaciones que deberían pasar de un arduino a otro, y de esa manera sí llegan a los demás. Pero es un proceso lento y absurdo.

Por otra parte, me encuentro con que en ocasiones, la Raspberry recibe datos de un Arduino, y en función de estos, tiene que enviar una orden a uno concreto de los Arduinos. Pues bien, si el dato lo recibió de ese mismo Arduino al que debe enviar la orden, no hay ningún problema. Pero si el dato lo recibió de otro Arduino diferente, la única manera de que pueda enviar esa orden, es poniendo un delay de 0.9 segundos o más antes de hacerlo. Con 0.8, no llega nunca nada. Con 0.9, llega absolutamente todo.

Esta es la función que uso en los Arduinos para enviar datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void informa(String comando=""){
    int l;
    char respuesta[15];
    digitalWrite(ReDePin, HIGH); // PASA A MODO ESCRITURA
    if(comando==""){
      l=0;
      for(int x=0; x<numero_salidas_cortas; x++){
        if(int(digitalRead(salida[x])==encendido)){
          l += 1;
        }
      }
      sprintf(respuesta, "R03L%i", l);
      Serial.println(respuesta);  // ENVÍA LA ID Y EL NÚMERO DE SALIDAS ACTIVAS
    } else {
      Serial.println(comando);  // ENVÍA EL COMANDO REQUERIDO
    }
    Serial.flush();
    digitalWrite(ReDePin, LOW);  //VUELVE A MODO LECTURA
}

Y esta es la parte del final del LOOP de Arduino donde se reciben datos del bus:
1
2
3
4
5
6
7
8
9
10
11
12
13
if(Serial.available()) {
  orden = Serial.readString();
  if (orden.substring(0, 2) == "DK"){
    if (orden.substring(0, 3) == "DK1"){  // DK1 Y DK0 SON DOS DE LAS ORDENES QUE SE PUEDEN RECIBIR
      digitalWrite(A0, encendido);
    } else {
      digitalWrite(A0, apagado);
    }
    informa();
  } else {
    while(Serial.available()) Serial.read();
  }
 }

No quiero hacer aún más largo este post, pero si alguien lo pide, pongo las partes de código de la Raspberry que envían y reciben datos.

Agradecería cualquier ayuda, es la primera vez que intento algo con RS485 y estoy un poco perdido.

Saludos
Víctor
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder