Diseñé una caja cúpula para poder albergar el conjunto en el exterior del barco. Incluso la imprimí, pero no quedaba bien. Buscando en fabricantes de todo el mundo encontré ésta de Altinkaya enclosures en Turquía, que impuso sus minúsculas medidas al diseño de las placas de circuito:
Bueno, tenía una PCB ya con i2c. Podía ser buen momento para intentarlo otra vez con el MPU9255, pero tenía que partir de cero otra vez con el software de calibración y filtrado. Me animó ver que el piloto Garmin Reactor que me trajo Juan Solís llevaba ese mismo sensor.
Se trataba de corregir mediante calibración las derivas del giróscopo, el offset (descentrado) del acelerómetro y magnetómetro (eso que se llama distorsión "hard iron"), y la conversión del elipsoide del magnetómetro a una esfera (eso que se llama distorsión "soft iron").
Revisé muchísimo código (Arduino y ARM) y artículos de doctorados de todo el mundo. Había calibraciones muy simples y otras complejísimas y poco documentadas sin pagar derechos. Desde luego, seguir el proceso mal indicado por InvenSense fue un auténtico fracaso. El procesado interno del MPU9255 es del todo contraproducente.
Finalmente encontré unos documentos PDF de ST Microelectronics (el fabricante del STM32) que describían el procedimiento para la calibración y el cálculo de la matriz de rotación para el acelerómetro (
https://www.st.com/resource/en/design_ti...ronics.pdf).
Depués de desenpolvar mi odiada álgebra de la carrera, me puse a trabajar con esas condenadas matrices y cuaternions. Con respecto a la calibración del magnetómetro, encontré varios programas para hacerlo: Magmaster (malísimo), Magcal (necesita un archivo de entrada con los datos en bruto y luego hay que escribir la calibración a mano), y el campeón: MotionCal (
https://www.pjrc.com/store/prop_shield.html), que se instala en un PC, recibe datos por USB, y envía la matriz de calibración también por USB.
El único problema de ese software es que está pensado para otros sensores con diferente sensibilidad; así que tuve que analizar más software para ver qué proporcionalidad en microteslas por LSB usaban, y adaptarme. Ese programa Motioncal no está pulido del todo, pero la parte del magnetómetro está bastante bien. Usa el mismo algoritmo que la tarea magcal del filtro Kalman de Freescale. (
https://www.nxp.com/docs/en/data-sheet/XSFLK_DS.pdf).
Primeras pruebas estáticas de respuesta: Vamos encaminados pero los sensores producen mucho ruido superpuesto.
La gráfica inferior es el heading magnético en centésimas de grado, y la distancia horizontal entre las bolitas es de 0,1 segundo.
Empecé a escribir filtros digitales (DSP) de paso alto para el giróscopo y de paso bajo para el acelerómetro y magnetómetro. Mejoró la cosa, pero me dí cuenta de que el magnetómetro AK8963C incrustado en el MPU9255 tenía una baja resolución (pocos microteslas por bit) y eso afectaba a la precisión del conjunto.
Más búsquedas por internet me hicieron ver que existía una plaquita de sensores MPU6050 + magnetómetro separado de Rockwell HMC5883. Bueno, por casa tenía una plaquita con un HMC5883 e hice un sandwich con la del MPU9255.
Con eso mejoró mucho la precisión, así que pedí cinco supuestas placas GY-87 (MPU6050 + HMC5883 + BMP180). Digo supuestas porque al recibirlas, estaban marcadas como HW-290 y el HMC5883 estaba suplantado por otro chip. Evidentemente no funcionaban, y las devolví.
Se trataba de buscar más, y al hacerlo me enteré de que Rockwell hacía dos años que dejó de fabricar esos magnetómetros y había cedido los derechos de explotación a un fabricante chino. Este fabricante anuncia que su chip QMC5883 es compatible, pero no lo es sin modificar el software totalmente. Por tanto NO es compatible. Pues nada a rehacer de nuevo el software y a pedir placas previa consulta al vendedor. Del nuevo chip no me gustó que no tuviera programado un procedimiento interno para crear un campo magnético como hacía el Rockwell, y así calcular con precisión la sensibilidad (pero qué le vamos a hacer, no hay otra...). Me tranquilizó un poco que todo el mundo lo está usando; incluso los que montan conjuntos con los GNSS UBLOX para el "dead reckoning" (estima mediante sensores inerciales y brújula).