TODOPIC

Misceláneas - Interés General => Off Topic => Mensaje iniciado por: PCCM en 02 de Abril de 2013, 18:49:15

Título: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 02 de Abril de 2013, 18:49:15
Buenas, estoy intentando usar el compás digital HMC5883L:

Datasheet del Compás digitalhttp://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf (http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf)

Con un dspic33fj32mc204, en cuanto a la programación no tengo problemas, ya que la comunicación I2C funciona bien.
Lee correctamente los registros de identificación del dispositivo.

El problema es la lectura de los datos del sensor mismo. Lo configure correctamente pero a pesar de eso me da valores errados. Lo coloco quieto y los datos dados son aleatorios.
Solde otro sensor pensando que tal vez esta fallando, pero se sigue comportando igual.

Me cambie de lugar para ver si alguna interferencia magnética causaba eso pero nada.
El sensor lo compre solo, le tuve que colocar los condensadores que pide 0.22uf y 4.7uf, ambos ceramicos SMD.

Lo malo que no encontre el de 4.7uf y le coloque uno through-hole de tantalio que encontre.(ya que por donde vivo no venden en SMD)
En el datasheet dice que se debe colocar uno con bajo ESR.

Mi pregunta es si tal caracteristica de ESR del capacitor puede afectar mucho a un dispositivo(en este caso al HMC5883L, en el datasheet esta el diagrama en donde se coloca el capacitor).

Gracias.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: planeta9999 en 02 de Abril de 2013, 19:59:25



En el esquema tienes un tercer condensador de 100nf entre masa y positivo, ignorar los condensadores de desacoplo podría afectar el funcionamiento del chip.
Supongo que sabes que los condensadores de tántalo están polarizados.

De todas formas, a mi me da la sensación de que es más un problema de programación que de hardware, pero por si acaso yo pondría lo que dice el datasheet, ambos condensadores cerámicos, y no olvides el condensador de desacoplo.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 02 de Abril de 2013, 20:22:00
Si, disculpa me olvidé comentar lo del condensador de 0.1uf también lo puse(no le tome importancia en el comentario ya que siempre lo pongo a todos los dispositivos que tienen alimentación)
Y lo probé tb con arduino, con sus propias librerias, y de igual manera no funciona bien.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: planeta9999 en 02 de Abril de 2013, 20:56:04



Comprueba la polaridad del condensador de tántalo, o ponlo cerámico como indica el datasheet, en el hardware ya no hay más que "rascar".



Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: gera en 02 de Abril de 2013, 22:51:24
Hola!!
Yo estoy trabajando con el mismo integrado, sólo que compré una placa ya hecha en sparkfun:
https://www.sparkfun.com/products/10724
Acá está el esquemático de este circuito, tal vez te sirva: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/IMU/9DoF-Stick-v13.pdf

Yo me comunico con un PIC18F2550 y unas librerías que programé. Decime si te sirven y te las paso.
Saludos!!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 03 de Abril de 2013, 18:14:40
Al principio había colocado la polaridad del condensador al revés, pero ya lo coloque como debería ser. Y nada.

Le coloque la misma configuración que esta en el esquema,y tampoco me funciona bien. De paso bonita tarjeta gera, si la hubiera visto al principio , la hubiera comprado.
Me compre integrados sin tarjeta para que me salga más barato, lo malo que el magnetómetro me esta pasando factura, ya que el acelerometro y gyroscopo si me funcionan bien.

Ya mande a comprar el HMC5883L con todo y tarjeta, ya que intente de todo y nada.

Saludos.


Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: gera en 03 de Abril de 2013, 23:38:59
Al principio había colocado la polaridad del condensador al revés, pero ya lo coloque como debería ser. Y nada.
El mismo condensador? Tal vez se daño por ponerlo al revés. Proba con otro.
Otra cosa.. como lo soldaste?? Esos integrados son casi imposibles!! Yo creo que va por ahi la cosa.
Saludos!!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 04 de Abril de 2013, 13:07:28
Mmmm, puedes tener razón que se haya dañado por eso, justo me queda uno nuevo.
Mas tarde lo sueldo y comento.

Y lo sueldo con aire caliente, 240 grados, aprox 20 segundos. es un NANBU 852D.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 30 de Diciembre de 2013, 00:20:34
Hola! ya funciona ese sensor? ando tras los mismos pasos tuyos parece

Yo lo tengo semi funcionando, pero creo que neceito revisar la calibracion (soft y hard iron) porque los ejes no responden igual... a vos com ote fue?

Saludos!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 31 de Diciembre de 2013, 01:20:15
Como te comente el el otro post, opté por los sensores en plaquita.
la calibración es muy importante, funcionando solo el magnetómetro(sin ninguna corrección por otro sensor) tengo una desviación estándar de 1 grado.
Si lo bajas me pasas los tips de como lo hiciste. :mrgreen:
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 31 de Diciembre de 2013, 07:56:37
Como te comente el el otro post, opté por los sensores en plaquita.
la calibración es muy importante, funcionando solo el magnetómetro(sin ninguna corrección por otro sensor) tengo una desviación estándar de 1 grado.
Si lo bajas me pasas los tips de como lo hiciste. :mrgreen:

jajaj, es el límite de resolucion de mi magnetometro.... no creo pueda bajarlo.... hoy no estoy ni cerca!!!

Esa presicion la obtenes con la calibracion hard iron y soft iron?
tenes algo de código de este sensor y algo sobre la caliracion? algun algoritmo?

Saludos!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 04 de Enero de 2014, 02:20:17
En internet puedes encontrar mucha información sobre calibración en 2D, pero poca en 3D. El mejor algoritmo de calibración que encontré, aunque no la óptima ya que se basan en que la distorsión por soft-iron es tan pequeño que es despreciable, fue en esta página:

http://www.aepwebmasters.it/index.php/tutorial/11-robotica-e-sensori/32-calibrazione-magnetometro

Al final te dan un código en matlab para que lo pruebes, se basan en la nota de aplicación AN3192 de STmicroelectronics.
Sigo investigando por mejorar la calibración del gyro, acel y magnetómetro, además de la estimación de orientación. si tienes algunos datos importantes sería de gran ayuda.

Saludos.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 04 de Enero de 2014, 08:44:50
Con el magnetómetro estoy un poco trabado para hacer pruebas, porque tengo que sacar la IMU del protoboard y hacerle un PCB con el micro para que pueda moverlo libremente. En este momento, si logueo Mx y My y lo giro 360° obtengo cualquier cosa menos un circulo... pero es por la gran influencia de metales...

En cuanto a lo de la orientacion sigo trabajando en la DCM, pero o hay algo que no entiendo o hay algo mal en mi código.

te comento por si me podes ayudar.
me hice este script de matlab:

clear;
imu_interval=0.02;
dcmEst=[1 0 0; 0 1 0; 0 0 1];
gyro=[0 1 0] * imu_interval;
g=[1 -gyro(3) gyro(2); gyro(3) 1 -gyro(1); -gyro(2) gyro(1) 1];
graf(5000,2)=zeros;
for n = 1:5000
    dcmEst=dcmEst*g;
    error=-dot(dcmEst(1,:),dcmEst(2,:))*0.5;
    x_est=[0 0 0];
    y_est=[0 0 0];
    x_est = dcmEst(2, :) * error;
    y_est = dcmEst(1, :) * error;
    dcmEst(1,:) = dcmEst(1,:) + x_est;
    dcmEst(2,:) = dcmEst(2,:) + y_est;
    dcmEst(3,:) = cross(dcmEst(1,:), dcmEst(2,:));
    dcmEst(1,:)=dcmEst(1,:)/norm(dcmEst(1,:));
    dcmEst(2,:)=dcmEst(2,:)/norm(dcmEst(2,:));
    dcmEst(3,:)=dcmEst(3,:)/norm(dcmEst(3,:));
    graf(n,1)=n*imu_interval;
    graf(n,2)=dcmEst(1,1);
   
end
figure
plot(graf(:,1),graf(:,2));

Como ves puse que mi gyro me da solo señal en Y, 1°/seg. El tiempo de muestreo es de 20mseg. El lazo es por 10 seg. por lo que espero que al final de todo la matric DCM quede con un roll de 10°. Lo que hice fue almacenar la fila 1 columna 1 de la DCM

http://imageshack.us/a/img197/506/bj9i.jpg

El tema es que no entiendo porque con girar solo 10° ese item de la DCM varía muchas veces entre 1 - 0 - -1 0.... en teoria ese item de la DCM debería variar con el cos del ángulo puesto que solo roto en un eje...
http://upload.wikimedia.org/math/8/8/6/8867b40e7d7d69e2db9cba8a7b42d2db.png

Eso es lo que no comprendo, no se si eso es normal o si mi código esta mal....
puse una pregunta en DIY Drone: http://diydrones.com/xn/detail/705844:Comment:1517619
y en esta página: http://www.starlino.com/dcm_tutorial.html
Pero no estoy hallando respuestas.... sabes donde puedo consultar por este tema?

Saludos!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 04 de Enero de 2014, 11:09:58
Por los metales a los más te debe salir una elipsoide, he visto videos donde los prueban en protoboard:


En cuanto a la DCM, no entiendo mucho tu algoritmo, como que es "g", que es el "error". si pudieras explicar la lógica que aplicas te podría intentar ayudar.
Ademas si el muestreo es de 0.02 segundos a 5000 análisis da 100 segundos.

Pero entiendo lo que quieres hacer, te he hecho un código, Si te sirve de ayuda:
Código: [Seleccionar]

clc
clear
t=0;
%%%velocidad de muestreo
H=0.02;
%%datos iniciales
banqueo_cuerpo=0;
cabeceo_cuerpo=0;
guinada_cuerpo=0;
%%%velocidad angular del giroscopo en grados por segundo(idealmente siempre constante)
banqueo_gyro=0;
cabeceo_gyro=1;%% 1 grado/s
guinada_gyro=0;
%%%%
%%conversion a radianes
banqueo_gyro=(banqueo_gyro*pi)/180;
cabeceo_gyro=(cabeceo_gyro*pi)/180;
guinada_gyro=(guinada_gyro*pi)/180;

for i=1:500
%%%integrando para hallar los angulos respecto al cuerpo
banqueo_cuerpo=banqueo_cuerpo+H*banqueo_gyro;
cabeceo_cuerpo=cabeceo_cuerpo+H*cabeceo_gyro;
guinada_cuerpo=guinada_cuerpo+H*guinada_gyro;
%%%componentes de la DCM
Ax=[1 0 0;0 cos(banqueo_cuerpo) sin(banqueo_cuerpo);0 -sin(banqueo_cuerpo) cos(banqueo_cuerpo)];
Ay=[cos(cabeceo_cuerpo) 0 -sin(cabeceo_cuerpo);0 1 0;sin(cabeceo_cuerpo) 0 cos(cabeceo_cuerpo)];
Az=[cos(guinada_cuerpo) sin(guinada_cuerpo) 0; -sin(guinada_cuerpo) cos(guinada_cuerpo) 0;0 0 1];
DCM=Ax.*Ay.*Az;
%%%%%%calculo del angulo girado en el eje de referencia de la tierra
Convertido=DCM*[banqueo_cuerpo;cabeceo_cuerpo;guinada_cuerpo];
%%angulos de radianes a sexagesimales
banqueoT=(Convertido(1,1)*180)/pi;
cabeceoT=(Convertido(2,1)*180)/pi;
guinadaT=(Convertido(3,1)*180)/pi;
subplot(1,3,1)
hold on
plot(t,banqueoT);
subplot(1,3,2)
hold on
plot(t,cabeceoT);
subplot(1,3,3)
hold on
plot(t,guinadaT);
t=t+H;%%%aumento de tiempo para graficar
end
subplot(1,3,1)
xlabel('tiempo(s)')
ylabel('angulo-banqueo(°)')
grid
subplot(1,3,2)
xlabel('tiempo(s)')
ylabel('angulo-cabeceo(°)')
grid
subplot(1,3,3)
xlabel('tiempo(s)')
ylabel('angulo-guinada(°)')
grid


Puedes variar banqueo_gyro, cabeceo_gyro y guinada_gyro dándole velocidades angular constantes del giroscopio.

Recuerda que el método de integración también es importante, si tienes tiempos grandes de muestreo tu integración debe ser más precisa.
Por ejemplo para este algoritmo si colocas la guiñada a una velocidad angular de 10 grados/s te dará datos errados, pero si aumentas la velocidad de muestreo a 1ms te dará el angulo correcto.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 04 de Enero de 2014, 11:22:06
Creo que encontre los errores. El primero es el que tu mencionas, estoy corriendo el bucle por 100seg. de todos modos con esa modificacion tampoco funcionaba, lo que hacía es hacer menos bucles, pero había varios de ellos.
El principal problema es que yo ponía los datos del gyro en deg/sec mientras que debería estar haciendo los cálculos en rad/sec.

Ahora estoy en el trabajo, despues más tarde voy a poner la explicacion del código y voy a ver mejor el código que me pasaste.

Tambien tengo que probar haber si en la realidad funciona... pero en la simulacion ya lo hace!!!!!

Saludos y seguimos en contacto
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 04 de Enero de 2014, 13:08:45
Ahi estudie tu código, entiendo perfectamente lo que haces.
Mi código (el que usan la mayoria de los que haces sistemas de estabilizacion casero) se basa en algunas simplificaciones. básicamente que para angulos pequeños el cos A = 1 y el sin A = A creo y que para pequeñas rotaciones no es importante el orden con que se aplican. Esas simplificaciones hacen que la DCM deje de ser orthonormal. Entonces lo que se hace es renormalizar en cada pasada.
Primero se calcula el error de perpendicularidad entre primera y segunda fila de la DCM y se reparte dicho error a cada fila:
    error=-dot(dcmEst(1,:),dcmEst(2,:))*0.5;
    x_est=[0 0 0];
    y_est=[0 0 0];
    x_est = dcmEst(2, :) * error;
    y_est = dcmEst(1, :) * error;
    dcmEst(1,:) = dcmEst(1,:) + x_est;
    dcmEst(2,:) = dcmEst(2,:) + y_est;
Luego la tercer fila fila debe ser perpendicular a las otras dos entonces se crea con un producto entre esas filas:
    dcmEst(3,:) = cross(dcmEst(1,:), dcmEst(2,:));
finalmente se renormaliza cada fila (se hace que la magnitud de cada vector sea 1)
    dcmEst(1,:)=dcmEst(1,:)/norm(dcmEst(1,:));
    dcmEst(2,:)=dcmEst(2,:)/norm(dcmEst(2,:));
    dcmEst(3,:)=dcmEst(3,:)/norm(dcmEst(3,:));

con eso se ahorra cálculo (para no resolver tantos senos y cosenos).

Mi código quedó así:
clear;
imu_interval=0.02;
dcmEst=[1 0 0; 0 1 0; 0 0 1];
gyro=[0 1*0.017453293 0] * imu_interval;
g=[1 -gyro(3) gyro(2); gyro(3) 1 -gyro(1); -gyro(2) gyro(1) 1];
graf(18000,2)=zeros;
for n = 1:18000
    dcmEst=dcmEst*g;
    error=-dot(dcmEst(1,:),dcmEst(2,:))*0.5;
    x_est=[0 0 0];
    y_est=[0 0 0];
    x_est = dcmEst(2, :) * error;
    y_est = dcmEst(1, :) * error;
    dcmEst(1,:) = dcmEst(1,:) + x_est;
    dcmEst(2,:) = dcmEst(2,:) + y_est;
    dcmEst(3,:) = cross(dcmEst(1,:), dcmEst(2,:));
    dcmEst(1,:)=dcmEst(1,:)/norm(dcmEst(1,:));
    dcmEst(2,:)=dcmEst(2,:)/norm(dcmEst(2,:));
    dcmEst(3,:)=dcmEst(3,:)/norm(dcmEst(3,:));
    graf(n,1)=n*imu_interval;
    graf(n,2)=dcmEst(1,1);
   
end
figure
plot(graf(:,1),graf(:,2));

Ahora si obtengo la variacion esperada en cada elemento de la DCM.
Tambien lo probe en mi IMU con mi uC y lo que obtengo es una deriva bajísima (imaginate que yo estaba metiendo los datos de mi gyro 57 veces más grandes de lo que eran!!!)

Por lo que veo has hecho mucho trabajo en este tema. Nunca leiste los trabajos de william premerlani de DIY Drone? (code.google.com/p/gentlenav/downloads/list) Ellos tienen un sistema de autopiloto para UAV (MatrixPilot) opensource muy pero muy bueno.

Si te parece abrimos un post nuevo en el foro técnico y vamos poniendo ahí los avances con los sensores y la implemetacion de la DCM...

Saludos y gracias por la ayuda!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 05 de Enero de 2014, 00:58:30
Interesante forma de simplificar la DCM, no he leido a william premerlani , gracias por el dato.  :mrgreen:
Y has calculado cuanto tiempo ahorras en el cálculo. También lo voy a probar.

Claro sería mejor tener un foro de discusión sea junto o separado(por sensor) profundizándose en el tema. Para realizar una orientación y posición lo más optima posible. Mi fin es eso pero sin GPS, solo con acelerómetro,magnetómetro, gyro y barometros.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 05 de Enero de 2014, 11:39:45
no he echo el calculo del ahorro de tiempo. lo empecé a implementar a raiz de haber leido en los foros de diy drone que es lo que todos usan. con un buen micro (que usas vos?) consiguen frecuencias de 100 a 200Hz. aparte tienen software tipo estacion terrena, todo open source. es increible lo que hacen. hay proyectos como aeroquad que tmb es open source...
bueno, ahora habro un par de hilos en el foro técnico haver si se engancha alguien mas. yo voy a estar trabajando por un buen tiempo con este tema ya que quiero fabricarme un sistema de navegacion para mi planeador y despues para un quadcoptero...

Saludos!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: PCCM en 05 de Enero de 2014, 11:58:54
Utilizo el dspic33fj32mc204 es de 40Mhz, llega a aprox 250Hz junto con la DCM que usaba. pero separado con la comunicación. osea en un dspic usaba el gyro, acel y mag. y se comunicaba via spi con otro dspic para que realice comunicaciones seriales, gps, bluetooht, algoritmos de control osea dispositivos de velocidades más lentas, bueno y con barometros(pero estos si son rápidos).

Ok ahí te sigo, seguimos por el mismo camino, también estaré un buen tiempo en esto.
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 05 de Enero de 2014, 13:03:18
che, tenemos casa propia ahora http://www.todopic.com.ar/foros/index.php?board=65.0
yo voy con un arm a 120Mhz jejeje ya veremos lo que alcanzamos...
La seguimos por el otro lado, despues si puedo empiezo a poner lo que he hecho y algo de teoria basica para el que le interese...

Saludos!!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: oscman en 16 de Enero de 2014, 19:45:57
che, tenemos casa propia ahora http://www.todopic.com.ar/foros/index.php?board=65.0
yo voy con un arm a 120Mhz jejeje ya veremos lo que alcanzamos...
La seguimos por el otro lado, despues si puedo empiezo a poner lo que he hecho y algo de teoria basica para el que le interese...

Saludos!!

Hola a todos, soy nuevo en el foro y tambien en programacion de pic, alguien me puede colaborar con un codigo en ccs c para este magnetometro HMC5883L

Gracias por adelantado
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: elgarbe en 16 de Enero de 2014, 20:39:26
una simple busqueda en google arroja:

http://www.ccsinfo.com/forum/viewtopic.php?p=174329

http://www.ccsinfo.com/forum/viewtopic.php?p=179610

y muchos otros resultados... yo no uso PIC en este caso por lo que no tengo códigos en CCS, pero cualquier librería que ande dando vueltas la podrás portar sin problemas a CCS para pic.

Saludos!
Título: Re: Lectura errada de Magnetómetro HMC5883L
Publicado por: lalos en 28 de Noviembre de 2014, 20:11:51
Gera yo estoy tratando de comunicarme con con 9dof stick y el mismo  pic que vos...el 18f2550, me podrías pasar un código en c sencillo para probar la cominicación, porque tal vez el problema es el hardware. mi mail es alepastre33@hotmail.com