Go Down

Topic: Sensor con comunicación RS485 (Read 636 times) previous topic - next topic

Danicap

Quote
Si que tengo dos MAX485 pero solo tengo un arduino mega, es posible autocomunicarme por dos puertos diferentes?
No lo he probado pero entiendo que si, al igual que deberías poder comunicarte vía serie del Serial1 al Serial2 por ejemplo, pruébalo a ver, así podremos descartar tanto los Serial del mega como el Max485

elduino

Buenas, y perdónenme por meterme en lo que no entiendo, aunque es un tema interesante. yo tenia localizado este tutorial, donde vienen algunos ejemplos mas simples, con los que podrías probar su funcionamiento (creo), también vienen sus conexiones, según la forma en que quieras que trabaje.

No-se-que

Gracias elduino por tu aporte. Esa página que me envias fue de las primeras que miré y que usé de referencia para mi programa. El problema es que yo solo tengo una placa arduino mega y no tengo placa secundaria para conectar el segundo MAX485.

Respecto a los sensores, he conectado los dos con un amperimetro, uno de ellos me consume unos 50 mA y creo que está bien, pero el otro solo me consume 3 mA, puede que este tenga un problema como que se haya quemado  :smiley-cry:  :smiley-cry:  :smiley-cry:

surbyte

Te envie un privado No-se-que miralo por favor!!

No-se-que


surbyte

#35
May 24, 2017, 08:07 pm Last Edit: May 24, 2017, 08:11 pm by surbyte
Bueno tras dos dias de colaborar con Alejandro (no-se-que), y aprovechando un código que la empresa del sensor le facilitó. Con esa guía pude adapartar ese código al Arduino y a lo que alejandro tenía hecho.
Luego logramos que funcionara de tanto en tanto hasta que No-se-que cambio un retardo de tiempo entre el envio de la trama y su recepción.
Un código ponía una demora de 2300 useg y asumimos que estaba bien pero lográbamos respuestas muy aleatorias, finalmente No-se-que puso solo 300 uSeg y el Sensor comenzó a responder a cada petición.
Este es el código resultante.

Code: [Select]
const byte ledPin   =  13;  // Led integrado
const byte ReDePin  =  2;  // HIGH = Driver / LOW = Receptor
char incomingByte   =  0;

const unsigned char  interruptor[]= {0xFE, 0x44, 0x12, 5, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFD};
unsigned char ser_sw[32];
unsigned char ser_buf[32];
//unsigned char temp_ser_buf[32];

unsigned char rep_rate    = 0;
unsigned char ping_ctr    = 0;
unsigned char last_nBytes   = 0;

unsigned char head_id   = 0x12; //0x11, 0x12, 0x13, 0x14, 0x15 or 0x1D
unsigned char range   = 5;
unsigned char gain    = 3;
int intento           = 0;

void envioTrama();
void reciboTrama();
unsigned long timeOut;

void setup()
{
  Serial1.begin(115200);      // Puerto serie 1 usado para comunicar con el sensor (18TX, 19RX)
  Serial.begin(9200);         // Puerto serie para ver los datos que estoy escribiendo en el serie1
  //Serial.setTimeout(100);     // establecemos un tiempo de espera de 100ms
 
 //inicializamos los pines
  pinMode(ledPin, OUTPUT);
  pinMode(ReDePin, OUTPUT);
  SetSwitches();
}

void loop() {

 
  envioTrama();
  //Serial.flush();  //Limpio el buffer de salida
  delayMicroseconds(300); //retardo para leer respuesta

  reciboTrama();
  //delay(20);
  delay(20);

 }

 void envioTrama() {
  //RS485 en modo transmisor, el activador del sensor
  digitalWrite(ReDePin, HIGH); //Pongo el pin 2 en modo alto para que el RS485 sea transmisor
  digitalWrite(ledPin, HIGH);
  char buffer[30];
  sprintf(buffer, "Peticion = %d ",intento++);
  Serial.println(buffer);

  for (byte i=0; i<27; i++) {
    Serial1.write(ser_sw[i]); //Escribo el comando por el puerto 1
    //Serial.print(ser_sw[i],HEX); //Veo los datos que estoy escribiendo en el puerto 1 mediante el monitor serie
    //delay(1); //Dejo un pequeño retraso sacado de un programa que tiene el fabricante
  }
  //Serial.println();
 
  Serial1.flush();
 }

 void reciboTrama() {
  bool data_found = false;
  char buffer[30];

  //RS485 como receptor
  digitalWrite(ReDePin, LOW); //Pongo el pin 2 en estado bajo para activar el RS485 como receptor
  digitalWrite(ledPin, LOW);
 
 
  byte ch_ctr = 0;
  int bytes_read = 12;
  bytes_read = Serial1.available();
  //  sprintf(buffer,"Bytes leidos: %d",bytes_read);
  //  Serial.println(buffer);
  ClearTimeOut();
  //Serial.println();
  while(data_found == false && CheckTimeOut() == false) {
   
   
   //while (Serial.available() >0) { //< 12) {
       while (Serial1.available() >1) { //< 12) {
        incomingByte = Serial1.read();

        //Serial.println(incomingByte, HEX);
        if (bytes_read >=1) {
            for (byte i=0;i<bytes_read;i++)
                ser_buf[ch_ctr++] = incomingByte;
           
            if (ser_buf[ch_ctr-1]==0xFC) {
                data_found = true;
                ClearTimeOut();

                //Serial.println();

                Serial.println("Datos recibidos");

                sprintf(buffer,"Header     : %c%c%c",ser_buf[2],ser_buf[3],ser_buf[4]);
                Serial.println(buffer);
                sprintf(buffer,"Head ID    : 0x%02X",ser_buf[5]);
                Serial.println(buffer);
                sprintf(buffer,"Status      : 0x%02X",ser_buf[6]);
                Serial.println(buffer);
                sprintf(buffer,"Rango      : %d M",ser_buf[9]);
                Serial.println(buffer);
                sprintf(buffer,"Profundidad: %-3d",((ser_buf[11]&0x7F)<<7) | (ser_buf[10]&0x7F));
                Serial.println(buffer);
                //sprintf(buffer,"ser_buf[%d]:  0x%02X - Termination Byte",ch_ctr-1,ser_buf[ch_ctr-1]);
                //Serial.println(buffer);
             
            }
        }       
       
      }
      Serial1.flush();       
    }

}

void ClearTimeOut() {
   timeOut = millis();
}

bool CheckTimeOut(){
  if (millis() - timeOut >= 10000)
      return true;
  else
      return false;

}

void SetSwitches(void)
{
  //bytes_to_read = 13;

  ser_sw[0]  = 0xFE;    //Switch Data Header (1st Byte)
  ser_sw[1]  = 0x44;    //Switch Data Header (2nd Byte)
  ser_sw[2]  = head_id; //Head ID
  ser_sw[3]  = range;   //Range: 5,10,20,30,40,50 in meters
  ser_sw[4]  = 0;
  ser_sw[5]  = 0;
  ser_sw[6]  = 0;
  ser_sw[7]  = 0;
  ser_sw[8]  = gain;    //Start Gain: 0 to 40dB in 1 dB increments
  ser_sw[9]  = 0;
  ser_sw[10] = 0;
  ser_sw[11] = 0;
  ser_sw[12] = 0;
  ser_sw[13] = 0;
  ser_sw[14] = 100;     //Pulse Length: 100 microseconds
  ser_sw[15] = 0;
  ser_sw[16] = 0;
  ser_sw[17] = 0;
  ser_sw[18] = 0;
  ser_sw[19] = 0;
  ser_sw[20] = 0;
  ser_sw[21] = 0;
  ser_sw[22] = 0;
  ser_sw[23] = 0;
  ser_sw[24] = 0;     //Switch Delay: (delay in milliseconds)/2
  ser_sw[25] = 0;
  ser_sw[26] = 0xFD;    //Termination Byte - always 0xFD
}

No-se-que

Bueno desde aquí quería agradecer la ayuda a surbyte. Nunca había visto una implicación tan grande por alguien en un foro, se estudió el manual del fabricante, analizo un codigo que me había facilitado el fabricante y a partir de ahí creó un código que ha conseguido comunicar la placa con el sensor.

Aun faltan retocar cosas pero el trabajo principal ya está realizado.

Muchas gracias surbyte por toda la ayuda que me has prestado, te estoy muy agradecido.

Go Up