Autor Tema: Trabajando con el HM55B Compass Module y CCS... consideraciones importantes.  (Leído 4814 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Saludos!

Bueno abro este hilo para colocar algunas observaciones importantes para quienes en algún momento deseen trabajar con este modulo HM55B de brújula electrónica...
Para que no pasen tanto trabajo como yo  :D

Algunas cosas a tomar en cuenta:

1- Las variables donde se almacenan los datos recibidos correspondientes a los valores en X y en Y, deben ser del tipo "Signed Long". De esta forma el compilador reconocerá los valores negativos automáticamente (pues el compilador asume las variables "signed" como complemento a dos).

2- Los datos recibidos de la brújula son a 11 bits, por lo tanto hay 5 bits "sobrando"... esos bits deben aclararse para que no ocasionen falsos valores, sobre todo en caso de que el valor sea positivo. Podría usarse un código del tipo:
Código: C
  1. dato_x &= 0b0000011111111111;
  2. dato_y &= 0b0000011111111111;

3- Si el valor es negativo, deben setearse los 5 bits que "sobran" para completar un correcto complemento a dos. Para saber si el valor recibido de la brújula es negativo, bastará con evaluar el bit10. Si es 1, el número es negativo (en complemento a dos), si es 0, es positivo. El código a usarse sería algo así:
Código: C
  1. if (bit_test(dato_x,10)) dato_x |= 0b1111100000000000;
  2. if (bit_test(dato_y,10)) dato_y |= 0b1111100000000000;

4- Por otro lado, según el manual del compass module:



De manera que el valor recibido de Y en realidad es -Y... por eso para conseguir el ángulo hay que hacer: tita=atan(-y/x)
Recordando un poco de trigonometría... la tangente es una función que repite sus valores... aquí tenemos una gráfica:



Como puede observarse, los valores son iguales para el primer y tercer cuadrante, y para el segundo y el cuarto....
Para saber cuál es el ángulo real a partir de la X y Y que recibimos de la brújula, debemos evaluar sus signos y ver en qué cuadrante estamos.
Recordando, nuevamente, que si la Y que recibimos es negativa, la Y verdadera es positiva, y viceversa.

Lo que yo hice fue usar unas banderas, "x_neg" y "y_neg" que colocaba a uno cuando los valores de X y Y (en caso de Y hay que tener cuidado por lo que ya se ha mencionado, el signo real es contrario al recibido, lo reitero por si acaso). Luego evaluaba las distintas posibilidades y guardaba un valor denominado "correccion"... para corregir el ángulo real en función a los signos de X y Y. Recordemos que la función atan del CCS hace exactamente lo mismo que nuestra calculadora, y devuelve valores entre -90 y 90 (claro, en radianes). Aquí les dejo la parte del código que corrige el ángulo:

Código: [Seleccionar]
x=(float)(dato_x);
y=(float)(dato_y);
  if (!x_neg  && !y_neg) corrector=0;
if ( x_neg  && !y_neg) corrector=180;
if ( x_neg &&   y_neg) corrector=180;
if (!x_neg &&   y_neg) corrector=360;
if ( x==0  &&  !y_neg)
{
angulo=1.57;
error=1;
corrector=0;
}
else
if (x==0 && y_neg)
{
angulo=-1.57;
error=1;
corrector=360;
}
else error=0;
cociente=((-1.0)*y)/x;
if(!error)angulo=atan(cociente);
angulo*=57.29;
angulo+=corrector;
Con este código se obtendrá el angulo en degrados, en un rango de 0 a 360.
EDITO: tuve que quitar la herramienta "code=C" porque salían unos números extraños al colocar el "&&" seguido de un "!" (problemas del editor supongo).

5- Otra cosa en la cual hay que tener cuidado es cuando la división -y/x da indefinido (es decir, cuando x=0)... recordemos que la tangente de 90º y de 270º es infinito, por lo que lo contrario debería también ser cierto....
Eso lo pueden también observar en el código colocado arriba, en esta parte:
Código: C
  1. if (x==0 && !y_neg)
  2.         {
  3.                 angulo=1.57;
  4.                 error=1;
  5.                 corrector=0;
  6.         }
  7.         else
  8.         if (x==0 && y_neg)
  9.         {
  10.                 angulo=-1.57;
  11.                 error=1;
  12.                 corrector=360;
  13.         }

Pues me parece que esto es todo, son las cosas más críticas...
Lo demás (como por ejemplo la forma de enviar sólo 4bits por spi para los comandos del módulo) ya lo he comentado en otros hilos en este foro.
Espero esta información le pueda ser útil a alguien.

Ok nos leemos!  :mrgreen:
« Última modificación: 17 de Junio de 2008, 13:33:58 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Smith

  • PIC10
  • *
  • Mensajes: 1
Re: Trabajando con el HM55B Compass Module y CCS... consideraciones importantes.
« Respuesta #1 en: 27 de Junio de 2009, 17:27:51 »
Hola estoy trabajando con el HM55B Compass Module y quiedo obtener la señal con un pic 16f877A pero estuve  buscando =informacion sobtre eso y me dice que  la data se lee por la comunicacion i2c

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Trabajando con el HM55B Compass Module y CCS... consideraciones importantes.
« Respuesta #2 en: 01 de Julio de 2009, 10:05:04 »
Qué tal Smith...

La comunicación no la traté en este hilo, se realiza por spi..
Si quieres puedes leer algo de eso aquí:
http://www.todopic.com.ar/foros/index.php?topic=21986.0

Saludos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web


 

anything