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.