para lectura y gestión de 2 enc. absolutos, lectura 2 ext. rs232 + envío etherne

:confused:

Hola tras intentar utilizar los encoders, absolutos , ya con exito y gracias a las colaboraciones varias.

Con seguí que funcionara bien para mis propósitos con el suigiente código:

const int CLOCK_PIN = 5;
const int DATA_PIN = 6;
const int BIT_COUNT = 25;
char cBuffer[32];
unsigned long NumVueltas;
float vueltasDec;
float Angulo;
unsigned long pulsos;

void setup() {
  //configuración de pines
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  //pinMode(13, OUTPUT);

  //coge los valores por defecto
  digitalWrite(CLOCK_PIN, HIGH);

  Serial.begin(19200);
}


void loop() {
  float reading = readPosition();

  if (reading >= -0.5) {
      //Serial.print("Rumbo: ");
       //Serial.print(reading,2);
       //Serial.println(" ");
       //digitalWrite(13, HIGH);
       Serial.println(vueltasDec,5);
     
  }

  delay(10);
}

//lee la posición angular actual de la monovuelta
float readPosition() {
  // repite la lectura de posición para verificar si hay errores
  unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);
  //delayMicroseconds(25);  // El reloj se debe quedar en Alto (5V)durante 20 microsegundos antes de poder coger otra lectura
  
  unsigned long sample2 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);
  delayMicroseconds(25);  // El reloj se debe quedar en Alto (5V)durante 20 microsegundos antes de poder coger otra lectura

  if (sample1 != sample2)
    return -1.0;

  pulsos = sample1;
	Angulo = ((sample1 & 0x0FFF) * 360UL) / 4096.0;
	NumVueltas = ((sample1 >> 12) & 0x0FFF);
  vueltasDec = (float)sample1 / 4096.0;
  
    //Serial.print( " Pulsos: ");
    //Serial.print( pulsos);
    //Serial.print( " Numero Vueltas: ");
    //Serial.print( NumVueltas);
    
  return Angulo;
  }

//lee en un byte de datos de la entrada digital de la placa.
unsigned long shiftIn(const int data_pin, const int clock_pin, const int bit_count) {
  unsigned long data = 0;

  for (int i=0; i<bit_count; i++) {
    data <<= 1;
    digitalWrite(clock_pin,LOW);
    delayMicroseconds(1);
    digitalWrite(clock_pin,HIGH);
    delayMicroseconds(1);

    data |= digitalRead(data_pin);
  }

  return data;
}

Bien, dicho esto y en funcionamiento, me ebcont´re el problema de que no podía leer los encoders que estaban más alejados del maxim1486, podeis ver el adjunto con el esquema básico del transceptor para la transformación del protocolo rs422 a rs232 para que arduino lo pueda manejar.

Bueno, tras pedir ayuda al departamento técnico de MAXIM, y tras probar variso tipos de cables para este problema de 75 metros de cable, he optado por hacer lo siguiente:

Instalar el Arduino Uno cerca de los encoders absolutos, donde tengo verificado que no hay problames de transmisión de información y funcionan bien, MENOS DE 20 METROS DE CABLE.

Colocar en el arduino UNO un módulo Ethernet Shield para que sea este el que se comunique con el ordenador de control y utilizar cable cat5 o superior , para el envío de datos vía ethernet.

Solicito ayuda para leer los dispositivos , imagino que con la librería SERIAL debería ser suficiente para tener los siguientes equipos:

GPS profesional RTK, salida de datos NMEA0183.

Sentencias…

GGA (posición):

GGA,152812,1017.0032,N,06734.0493,W,2,08,224632,1017.0419,N,06733.9866,W,0,00

, VTG (Vector velocidad):
$GPVTG,360.0,T,348.7,M,000.0,N,000.0,K*43

y ZDA (Hora gps):
$–ZDA,hhmmss.ss,xx,xx,xxxx,xx,xx

Sensor de movimientos y rumbo HONEYWELL HMR-3000

Sentencia:

$PTNTHPR,Heading,h,Pitch,p,Roll,r"

Y cada uno de los encoders, debería poder leer los dos y enviar los dos, cada uno con un cabecero que permita destinguirlos:

Encoder de babor y estribor:

$ENC_bab, NN,nnnnn… usando variable float

$ENC_est, NN,nnnnn… usandfo variable float

Y ya sería la leche si puediera retransmitir la corrección GNSS desde el pc de control al GPS de proa mediante el ethernet del arduino…

Ahí lo dejo, a alguien le apetece colaborar?
:slight_smile: