Go Down

Topic: Calculo angular (Read 442 times) previous topic - next topic

pacheco

Buenas tardes a todos.
Usando un magnetometro hmc5883l, con uno de tantos sketches en la red, tengo salida "rumbo" (0º á 360º) para cualquier giro del sensor en el plano horizontal.
Mediante un boton, conectado al pin 2 del Arduino, he logrado que al pulsarlo se guarde en una variable "guardado", el valor "rumbo" que pueda haber. Hasta aqui sin problemas.
Ahora quisiera conseguir lo siguiente...
Que la diferencia angular entre el "guardado" y el "rumbo" posteriores a la pulsacion del boton me modifiquen una variable a la que llamo "error" con signo (+) si "rumbo">"guardado" y signo (-) si "rumbo"<"guardado".
Y no debería tener mayor complicacion si no fuese por el siguiente supiesto:
Estando "rumbo" en 5º pulso el boton y ese valor queda en la variable "guardado".
Si a continuación "rumbo" varía a 25º, el "error" pasa a ser de 25-5 =15 ... correcto.
Pero si "rumbo" varía a 350º, el error pasa a ser de 350-5=345... lo que es incorrecto ya que deberia ser -15.
Sé que hay que jugar con el módulo de 360º (o de 180º) con el "if", <,> y = de una forma específica para que obtener una solución válida pero a la hora de traducirlo a código me hago un lío tremendo.
A ver si hay algun genio de las matematicas que me eche una mano.
Gracias anticipadas.

surbyte

Bueno en realidad tu cuenta debería tener una corrección para el caso negativo.
No hay que ser genio, hay que pensar un poco.
Lo que te molesta es la interpretación pero entonces fija un limite
Si el 2do valor supera 180 haz esta cuenta
Sigamos con tus ejemplos. 
1er dato 5 y segundo 350.. 350 > 180 entonces hago esta cuenta para esos casos.
if (ang2 > 180) 
   ang2 = ang2-360; // en este caso ang2 = - 10 = 350-360
Entonces cuando hgas la diferencia tienes
-10-5=-15
Simple!!
l

pacheco

Gracias...
Lo he arreglado asi:
error = rumbo - guardado;
if (error < 180) error += 360;
if (error > 180) error -= 360;
Gracias...

surbyte

pero este caso
if (error < 180) error += 360;
a tu primer ejemplo le introduce 360 grados extra.
mira... 
rumbo = 25
guardado = 5
entonces error = rumbo - guardado = 25-5 = 20 (además ahora me doy cuenta que hiciste mal tu cuenta)
ahora tus condiciones

if (error<180) error += 360; 
Segun esto 20<180 entonces error = 20+360 = 380 grados MAL!!!

pacheco

Hola surbyte..
Cierto que me equivoqué en la operacion.. aunque creo que el concepto lo entendiste..
El codigo que tengo es  este:
Code: [Select]
float rumboGrados = (rumboRadianes * 180/M_PI);
    float declinacionmag = (-4.86 + (26.0 / 60.0)) / (180 / M_PI); // -4.86 LPA
    float rumbofinal = rumboGrados += declinacionmag;
    Serial.print(" Rumbo:     "); 
    Serial.print(rumbofinal);
    int estadoBoton = digitalRead(pinBoton);
    if (estadoBoton == HIGH){
      guardado = rumbofinal;
    }
    float desvio = rumbofinal - guardado;
    if(desvio < 180) desvio += 360;
    if(desvio > 180) desvio -= 360;
    Serial.print(" Error: ");
    Serial.println(desvio);


primero obtengo "rumboGrados" de radianes
luego lo corrijo por la "declinacionmag" en mi zona y lo llamo "rumbofinal" presentandolo..
y en el "if" compruebo si el boton esta pulsado para almacenar "guardado"="rumbofinal"
a continuacion creo "desvio" de la diferencia entre "rumbofinal"-"guardado"
y a partir de ahí hago las operaciones de caculo que dije y aparentemente sale todo bien
Probaré con tus datos aunque a estas horas tengo la neurona hecha polvo..
Saludos y muchas gracias...

surbyte

Yo te entendí por tu a mi no.
Esto no va
Code: [Select]
float desvio = rumbofinal - guardado;
    if(desvio < 180) desvio += 360;
    if(desvio > 180) desvio -= 360;


lo reemplazas por esto

Code: [Select]
float desvio = rumbofinal - guardado;
    if(desvio > 180) desvio -= 360;

Porque si desvio es menor que 180, la cuenta esta bien hecha, pero si es mayor a 180, debe dar negativo cosa que aseguramos restandole 360.

pacheco

#6
May 23, 2016, 09:21 am Last Edit: May 23, 2016, 09:09 pm by pacheco
Buenos dias ..
He puesto lo que me indicas y efectivamente, es lo adecuado. Mi error es que tras pulsar el boton, no he llegado a girar el sensor mas de 180 grados. Por eso no veia el fallo..
En realidad estoy usando un 10dof como este
http://www.dx.com/es/p/gy-87-10dof-3-axis-gyro-3-axis-acceleration-3-axis-magnetic-field-air-pressure-module-149359#
Para que lleguen los datos del HMC5883L , hay que jugar con el I2C bypass del MPU6050 (ya conseguido) .
Mi objetivo es hacer una pequeña estacion meteorologica con el sensor bmp180 (tambien he incluido esa parte), una lectura de balance/cabezada del MPU6050 y señal de rumbo con un boton para fijar una direccion determinada (el problema expuesto) y... Finalmente quiero emplear el desvio +/- del rumbo guardado para aplicarla a un puente tipo "H" que gire un motorcillo destinado a corregir el rumbo de un velero miniatura...
Esto ultimo aun en proyecto...
De nuevo muchas gracias por tus aclaraciones

pacheco

Creo haber reparado el enlace de mi anterior comentario.
Hoy he hecho progresos enviando el valor "desvio" a un LCD de 16x2 junto con Temperatura y presion (miliBares). No dá para mucho mas la pantalla...
Estoy averiguando el comportamiento de un pequeño servo (DS04-NFC sin tope fisico), con la idea de que al pulsar el boton (desvío=0º) y acto seguido alimentarlo, los valores CW(+) y CCW(-) de error, se traduzcan en giro del servo en un sentido u otro.
He encargado un puente "H" para usarlo con un motor posteriormente pero mientras tanto no se si el servo servirá para hacer pruebas.
Vuelvo entrar de lleno en cuestiones circulares... (veremos si logro algo).
Un saludo.

Go Up