Brújula digital HMC5883L

En este nuevo tutorial estrenamos colaborador: Martí Puig, una joven promesa del mundo arduinero. Sin más os dejo con su tutorial.

Estamos en el S. XXI, ya hemos dejado la era analógica hace bastantes años, y durante esta evolución hemos ido viendo como todo se ha ido digitalizando. Pero aún hay elementos que, por diferentes motivos, no han dado el salto tecnológico. En muchos casos, porque han desaparecido dichos elementos y han pasado a integrarse en los smartphones, como es en el dispositivo que construiremos en este proyecto.

En este proyecto vamos a construir una brújula digital y vamos a imprimir los datos por el puerto serial.

Para este tutorial vamos a necesitar:
Arduino Uno
Cables
Magnetómetro HMC5883L

Un magnetómetro es un sensor capaz de medir el campo magnético terrestre y mostrárnoslo en 3 componentes cartesianas, es decir, un valor para cada uno de los ejes X, Y y Z, de esta forma mediante un magnetómetro y sus datos podemos obtener datos muy precisos de la orientación del sensor respecto al polo Norte. Por estas características son muy utilizados en multicópteros.

El cableado se distribuye de la siguiente forma:

arduino_HMC5883L.jpg

Como podéis ver en el esquema, este sensor no requiere de alimentación externa alguna.

Con el magnetómetro podemos medir los 3 ejes (X, Y y Z), sin embargo, en éste proyecto solo vamos a utilizar uno de ellos, el eje X concretamente.

Y a continuación vamos a programar la brújula digital:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//Código brújula digital con sensor magnetometro HMC5883

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

// Asignacion de una identificacion a la brujula
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

void displaySensorDetails(void)
{
  sensor_t sensor;
  mag.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("ID unica:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Valor Maximo:    "); Serial.print(sensor.max_value); Serial.println(" uT");
  Serial.print  ("Valor Minimo:    "); Serial.print(sensor.min_value); Serial.println(" uT");
  Serial.print  ("Resolucion:   "); Serial.print(sensor.resolution); Serial.println(" uT");  
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
 
}

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Magnetometro HMC5883 Test"); Serial.println("");
 
  /* Inicializamos el sensor */
  if(!mag.begin())
  {
    // Si hay algun problema con el HMC5883 sale el aviso de que revise las conexiones
    Serial.println("Ooops, no se ha detectado el HMC5883 ... revisa las conexiones!");
    while(1);
  }
 
  // Muesta la información básica del sensor
  displaySensorDetails();
}

void loop(void)
{
  // Hacemos que el sensor tome una nueva muestra
  sensors_event_t event;
  mag.getEvent(&event);
 
  /*
     Sostenga el módulo de manera que Z está señalando arriba y se pueda medir con el título X e Y
     Calcular la medida cuando el magnetómetro esté nivelado, y luego corregir los signos de eje
  */

 
  float muestra = atan2(event.magnetic.y, event.magnetic.x);
 
  /* Una vez tengamos la muestra tomada, a continuación debemos agregar el "ángulo de declinación"
    el ángulo de declinación es el "error" del campo magnético en su ubicación.
  Puedes encontrar el tuyo aquí: http://www.magnetic-declination.com/
   Si no encuentras tu ángulo de declinación, comenta las dos línias siguientes, la brújula estará  
  ligeramente desviada*/

 
  float declinacionAngulo = 0.23;
  muestra += declinacionAngulo;
 
  // corrige los valores negativos
  if(muestra < 0)
    muestra += 2*PI;
   
  // Comprueba si hay error debido a la adición de la declinación.
  if(muestra > 2*PI)
    muestra -= 2*PI;
   
  // Convierte los radianes a grados
  float muestraangulo = muestra * 180/M_PI;
 
/* A continuación vamos a mostrar por pantalla los diferentes valores y puntos cardinales en función de las muestras tomadas*/
  if (muestraangulo > 350){
    Serial.print("N      "); Serial.println(muestraangulo);
  delay(500);
  }
 
  if (muestraangulo <= 15){
    Serial.print("N      "); Serial.println(muestraangulo);
  delay(500);
  }
  if (muestraangulo > 15 && muestraangulo <= 75){
    Serial.print("NE    "); Serial.println(muestraangulo);
  delay(500);
  }
 
  if (muestraangulo > 75 && muestraangulo <= 105){
    Serial.print("E      "); Serial.println(muestraangulo);
    delay(500);
  }
 
   if (muestraangulo > 105 && muestraangulo <= 165){
    Serial.print("SE    "); Serial.println(muestraangulo);
    delay(500);
  }
 
  if(muestraangulo > 165 && muestraangulo <= 195){
    Serial.print ("S    "); Serial.println(muestraangulo);
    delay(500);
  }
 
  if(muestraangulo > 195 && muestraangulo <= 255){
    Serial.print ("SW    "); Serial.println(muestraangulo);
    delay(500);
  }
 
  if(muestraangulo > 255 && muestraangulo <= 285){
    Serial.print ("W    "); Serial.println(muestraangulo);
    delay(500);
  }
 
  if(muestraangulo > 285 && muestraangulo <= 350){
    Serial.print ("NW    "); Serial.println(muestraangulo);
  delay(500);
  }  
 
}


Espero que os haya gustado y entretenido este proyecto, que hayáis encontrado interesante el tutorial, ya que ha sido mi estrena como redactor de tutoriales.
Martí Puig


Si este tutorial te ha sido de utilidad puedes considerar hacerme un donativo, por pequeño que sea estarás contribuyendo a que siga con esta labor.


Deja un comentario

Campos requeridos marcados con *.


Una estúpida ley me obliga a molestarte con algo obvio: este sitio utiliza cookies. Aquí tienes el ladrillo en cuestión por si quieres leerlo