Brújula digital para un barco

Buenos días a todos, soy muy nuevo en Arduino y poco sé de programación, pero mi interés me hace buscar hasta el último rincón de la WEB para encontrar lo que necesito. Y escribo por fin aquí, porque no encuentro respuesta en otros sitios.

He construido mi brújula digital con Arduino Nano, un sensor HMC5883L y una pantalla TFT para imprimir los resultados. Todo ha salido bien, estaba muy contento....hasta que incliné el sensor fuera de la horizontal. Los grados que va dejando no son los correctos cuando lo inclino. Y claro, es que un barco nunca va horizontal...
Este es mi código:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>


// Pines de conexión de la pantalla TFT
#define TFT_CS        10
#define TFT_RST       9 // O configúralo a -1 y conéctalo al pin RESET del Arduino
#define TFT_DC        8

// Crear un objeto para la pantalla
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Crear un objeto para el sensor de brújula
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);



void setup() {
  // Inicializa la pantalla
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(8);
  tft.setRotation(1); //Horizontal
  


  // Inicializa el sensor
  if(!mag.begin()) {
    tft.println("No se puede encontrar un sensor HMC5883");
    while(1);
  }
}

void loop() {
  // Leer el sensor de brújula
  sensors_event_t event;
  mag.getEvent(&event);

  // Calcular el ángulo de la brújula
  float heading = atan2(event.magnetic.y, event.magnetic.x);
  if (heading < 0) {
    heading += 2 * PI;
  }
  float headingDegrees = heading * 180/M_PI;

  // Convertir el ángulo a un string
  String headingStr = String(headingDegrees, 0); // 0 decimal de precisión

  // Calcular las dimensiones del texto
  int16_t x1, y1;
  uint16_t w, h;
  tft.getTextBounds(headingStr.c_str(), 0, 0, &x1, &y1, &w, &h);

  // Calcular la posición 'x' para alinear a la derecha
  int xPos = tft.width() - w;
  int yPos = 50;  // Cambiar este valor si necesitas ajustar la posición vertical

  // Limpiar la zona de texto anterior
  tft.fillRect(0, yPos, tft.width(), h, ST7735_BLACK);

  // Mostrar el ángulo alineado a la derecha
  tft.setCursor(xPos, yPos);
  tft.print(headingStr);

  delay(500);  // Espera antes de actualizar
}
escribe o pega el código aquí

He leido sobre sensores con giroscopio, inclinómetro, etc, etc, etc....pero no sé hacia qué sensor ir para hacer lo que necesito. También he leído sobre Quaterniones, filtros de Kalman, filtros diversos, que me suenan a matemáticas elevadas.
También he visto aparatos que venden en Aliexpres algo más caros que vienen con algorimos complejos incorporados como éste:

Sensores como el JY901, MPU9050, MPU6050, ... todo muy barato y asequible, pero no sé para donde tirar.

Necesito la ayuda de alguien que me ayude a decidir qué sensor es más adecuado, que tenga librerías correctas y que tenga códigos de ejemplo para desarrollar bien mi brújula para mi pequeño barco.

Espero haberme expresado correctamente y les doy a todos las gracias de antemano.

Yo he usado un BWT901CL para controlar un rotor de antena (desplazamiento 2 ejes) y no tenía ese problema. Cierto que tuve algún otro que tuve que "bypasar", pero quizás por usar la versión bluetooth.Seguimiento trayectoria con BWT901CL
El dispositivo retorna directamente los cálculos de los ángulos.

Gracias por tu comentario. Pero una antena está fija...yo pretendo que me diga los grados reales dentro de un barco. Qué se mueve, vamos que se balancea constantemente. Creo que necesito un osciloscopio y acelerómetro...pero quiero saber cuál.

No, no está fija. Es una antena que se mueve tanto en acimut como en elevación para seguir satélites.:slightly_smiling_face:

Ah, ese es de WIT no? Y trae librerías y ejemplos?...porque no soy muy bueno en programación. Me busco la vida para encontrar el código. :blush: Yo he visto el wT901c...parecen todos iguales. No sé qué diferencia tienen, la verdad. He entrado en su web y dice poca cosa.

Llego a la conclusión que no vives en el Ecuador. Tienes que tener en cuenta la inclinación del vector magnético
https://fcaglp.fcaglp.unlp.edu.ar/extension/preguntas/geomagecua.html

Prácticamente en todas partes hay declinación magnética si a eso te refires. Wi el barco en cuestion del que hablamos se ha de desplazar por zonas amplias (diría miles de kilómetros), habria que implementar el modo de indicarle el offset en cada zona. Si se trata de una zona reducida, se pone como constante ese offset. En mi caso no era relevante (creo que en mi zona es de menos de un grado negativo), y no lo intoduje. Cierto que no es constante, pero por suerte hay sitios web donde se pueden consultar online e incluso predicciones.

Si, es de WIT. Creo que principalmente la diferencia es en tipo de conexión; no sabría decirte más. El que yo utilizo es vía bluetooth pero no creo que tú lo necesites así. Lo importante es que una vez lo tengas instales el programa o app de WIT y hagas una calibración (muy sencillo una vez que se entiende🙂).
Con el mismo software puedes verificar los ángulos en los tres ejes a medida que mueves el aparato. Hasta dentro de unos días no tendré acceswo al,pc en el que tengo recopliada algo de información (p.e., cómo extrare los ángulos en el fluio de informacion, etc.) Busca por WT901 y encontrarás bastante cosa.

No es la declinación, es la inclinación, el vector magnético de la tierra tiene tres componentes en los ejes xyz, pero en el Ecuador el componente en el eje z (inclinación) es cero y en el polo ,(magnético )es 90 grados.

Gracias por avisar. Sé perfectamente lo de la declinación magnética....norte magnético y norte geográfico. La verdad es que eso no me afecta mucho, puesto que es un barco de vela ligera (regatas en costa). Lo que necesito es que la brújula me diga el norte (el que sea) con el barco escorado o el barco plano....

Sería genial que me ayudaras. De momento y para seguir mi investigación he pedido el IMU MPU9250...a ver qué va ocurriendo. Si no lo consigo me iré a por el WT. Estamos en contacto. ¡¡¡Gracias!!!

Por tu repuesta, no se si te quedo claro. La declinación, no es lo mismo que la inclinación. Si estuvieras en el ecuador no te habrías dado cuenta del problema, porque al inclinar el sensor, tendrías componente en el eje Z, pero los otros dos siempre te indicarían el norte magnético, Para evitar tu problema de balanceo, lo haces a la antigua, con un soporte cardanico o agregas un sensor (adosado al magnético) que te indique la inclinación. Tendrías como resultados dos vectores. Con el vector de inclinación haces un cambio de coordenadas del magnético y te quedas con los valores en el plano XY.
Saludos

Buenas. No soy experto en estas cosas, pero creo entender lo,que indicas. Pero, no sé si es porque estos sensores llevan tambien sensor de aceleración y giróscopo, pueden detectar también balanceo y "cabeceo". Imagino que sus algoritmos internos deben hacer los cálculos que indicas, porque en pruebas que hice, la,indicación del norte aunque inclinase latedal o frontalmente el sensor, se mantenía. Claro está que no sé hasta qué nivel retorna datos exactos, pero para lo que lo utilicè era suficiente.

Ahora te he entendido. No había caído en lo del Ecuador. Toda la razón.
Tengo que utilizar un sensor con acelerómetro y Giroscopio...y meterle un filtro complementario (a ver si soy capaz) para estabilizar la brújula.
Lo del cardan lo he hecho...con una impresora 3D, pero hay un problema con el cableado.
No deja el sensor libre. :face_with_spiral_eyes:

Eso es buena señal.
En el móvil tengo descargadas dos brújulas. Una hace lo mismo que mi sensor de Arduino. La otra va perfecta. Eso es por el uso de los sensores del móvil y por el algoritmo que llevará....curioso

De momento y para seguir mi investigación he pedido el IMU MPU9250...a ver qué va ocurriendo.

:+1: De hecho creo que es el que utiliza Wit.

Dale un vistazo a este link https://learn.adafruit.com/lsm303-accelerometer-slash-compass-breakout/overview. Anuncian el sensor más especificamente como brújula con compensación de balanceos. En el forum hay algún proyecto que hace referencia a este sensor LSM303

Fenomenal. Le echo un vistazo. Muchas gracias.

Encontré este tutorial (https://www.instructables.com/Quaternion-Compass/) está muy currado. Tiene todos los ingredientes para que salga bien el proyecto....
Pero no. No sé cómo lo habrá hecho el hombre pero no con el sensor ese. Resulta que el mundo de los sensores está bastante corrompido. El sensor que yo he comprado, es el mismo modelo que el que propone el tutorial pero no funciona el magnetómetro. Lo he comprobado en otros tutoriales. Da un error de lectura. Resulta que fabrican sensores falsos, con el aspecto, letras, etc, etc,...muy parecidos...pero le faltan componentes.
En fin...me cambio de sensor. A ver si tengo más suerte con el próximo.
El LSM303 tiene buena pinta pero no lo encuentro por España ...Saludos .

Es muy cierto incluso yo abrí un hilo en Documentación respecto a las cosas falsas.
Sería bueno que hicieras tu aporte y tmb si encuentras uno bueno que digas donde lo compraste.
El problema de esto somos nosotros mismos. En el afán por comprar mas barato nos dejamos llevar por el precio y no prestamos atención a los comentarios de la gente. Yo hace tiempo que solo leo y compro donde la gente solo habla positivamente y deben ser muchos no solo 3 o 4. Eso lo hace el mismo vendedor pirata.
Por supuesto que nosotros no somos responsables por los estafadores pero... si algo cuesta 10 como por ejemplo un nRF24 de Nordic y lo pagas 1.2 en Aliexpress no te quejes cuando no funciona. Este es uno de los elementos mas falsificados. Pero hay transitores, de todo tipo, integrados que consumen mas y no hacen nada de nada y la lista es enorme.
El mercado del reciclado CHINO y su posterior repintado hace que vendan lo que sea con tal de llevarse unos dolares. Todos caemos o caíamos,
Asi que mucho cuidado!!