Sensor Magnetômetro, Bússola Hmc5883l

10 OUT
2015

Autor: Leonardo Dalla Porta

O sensor Magnetômetro HMC5883l é um dispositivo de alta sensibilidade e baixa eixo transversal é projetado para medir tanto a direção e a magnitude dos campos magnéticos da Terra, a partir de mili-gauss a 8 Gauss.

Como é que um magnetômetro? Como funciona?

Um magnetômetro eletrônico como o  HMC5883L  baseia-se na anisotrópica no fenômeno da Magnetorresistência.
Basicamente, a um campo magnético interage com o caminho da corrente que flui através de um material ferroso, de acordo com a Lei de  Lorentz, consequentemente, a resistência do material parece mudar para o observador. Você pode imaginar como se o bar de material ferroso (por exemplo InSb) cresce mais tempo, aumentando a sua resistência elétrica. Portanto, medindo a alteração na resistência pode-se estimar o campo magnética! A equação que governa o fenômeno é na imagem abaixo. Para uma investigação mais aprofundada da questão, especialmente na eletrônica um magnetômetro baseia-se:

Em uma bússola, o campo magnético se mede é a sua terra. É tangente à superfície do planeta e flui de norte a sul. O  HMC5883L  tem três eixos diferentes para calcular as posições, como você pode não saber a inclinação do dispositivo quando você precisar os dados! De qualquer forma para este exemplo, vamos supor que o sensor é plana sobre uma mesa, por isso não precisa se ​​preocupar com a sua inclinação. Portanto, vamos usar apenas eixos X e Y dados.

Vamos assumir Hz = 0

Após entender esta parte, neste link você pode fazer download da biblioteca para o sensor, as ligações são muito simples, pois este sensor é I2C, o que facilita muito na hora de por em pratica, além de ser possível utilizar mais dispositivos ligados juntos, em apenas duas portas de comunicação.

E aqui o Código:
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
123
124
125
126
/*
HMC5883L_Example.ino - Example sketch for integration with an HMC5883L triple axis magnetometer.
 Copyright (C) 2013 BluLemonLabs (bluelemonlabs.blogspot.com)
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the version 3 GNU General Public License as
 published by the Free Software Foundation.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
// Reference the I2C Library
#include <Wire.h>
// Reference the HMC5883L Compass Library
#include <HMC5883L.h>
 
// Store our compass as an object.
HMC5883L compass;
 
// Record any errors that may occur in the compass.
int error = 0;
 
// Out setup routine, here we will configure the microcontroller and compass.
void setup()
{
  // Initialize the serial port.
  Serial.begin(9600);
 
  Serial.println("Starting the I2C interface.");
  Wire.begin(); // Start the I2C interface.
 
  Serial.println("Constructing new HMC5883L");
  compass = HMC5883L(); // Construct a new HMC5883 compass.
  //The implementation of the class is provided in the library
 
  // Now we have an istance of the class!
  //Let's initializate it...
 
  Serial.println("Setting scale to +/- 1.3 Ga");
  error = compass.SetScale(1.3); // Set the scale of the compass to 1.3Ga
  if(error != 0){ // If there is an error, print it out. 
    Serial.println(compass.GetErrorText(error));
    error =0;
  }
 
  Serial.println("Setting measurement mode to continous.");
  error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
  if(error != 0) {// If there is an error, print it out.
    Serial.println(compass.GetErrorText(error)); //Todo: Error handling for this method in .h and .cpp
    error=0;
  }
}
 
// Our main program loop. 
void loop()
{
  // Retrieve the raw values from the magnetometer (not scaled).
  MagnetometerRaw raw = compass.ReadRawAxis();
  // Retrieve the scaled values from the magnetometer (scaled to the configured scale).
  MagnetometerScaled scaled = compass.ReadScaledAxis();
 
  // Values are accessed like so:
  int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)
 
  // Calculate heading when the magnetometer is level, then correct for signs of axis.
  // Atan2() automatically check the correct formula taking care of the quadrant you are in
  float heading = atan2(scaled.YAxis, scaled.XAxis);
 
  // Once you have your heading, you must then add your 'Declination Angle',
  // which is the 'Error' of the magnetic field in your location. Mine is 0.0404 
  // Find yours here: http://www.magnetic-declination.com/
 
  // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  float declinationAngle = 0.0404;
  heading += declinationAngle;
 
  // Correct for when signs are reversed.
  if(heading < 0)
    heading += 2*PI;
 
  // Check for wrap due to addition of declination.
  if(heading > 2*PI)
    heading -= 2*PI;
 
  // Convert radians to degrees for readability.
  float headingDegrees = heading * 180/M_PI; 
 
  // Output the data via the serial port.
  Output(raw, scaled, heading, headingDegrees);
 
  // By default the HMC5883L reads the data 15 time per second (15Hz)
  // However since we have a long serial out (104ms at 9600) we will let
  // it run at its natural speed.
  // delay(66);
}
 
// Output the data down the serial port.
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
  Serial.print("Raw:\t");
  Serial.print(raw.XAxis);
  Serial.print("   ");   
  Serial.print(raw.YAxis);
  Serial.print("   ");   
  Serial.print(raw.ZAxis);
  Serial.print("   \tScaled:\t");
 
  Serial.print(scaled.XAxis);
  Serial.print("   ");   
  Serial.print(scaled.YAxis);
  Serial.print("   ");   
  Serial.print(scaled.ZAxis);
 
  Serial.print("   \tHeading:\t");
  Serial.print(heading);
  Serial.print(" Radians   \t");
  Serial.print(headingDegrees);
  Serial.println(" Degrees   \t");
}
Na imagem abaixo você pode ver como o título medido com um iPhone 4 é bastante próximo ao que temos lido do Arduino. Existem muitos margem de melhoria.  Além disso, esta protoboard tem um plano de terra de alumínio na sua parte inferior, o que, obviamente, pode tornar mais difícil para a estrutura para detectar o campo magnético e / ou pode derivar-lo e criar um deslocamento.

Qualquer dúvida deixe seu comentário abaixo, espero ter sido esclarecedor, um abraço e até a próxima!

Faça um bom uso! Att. Equipe Nadiel Comércio.

Deixe um comentário

Free WordPress Theme

*

 
Weboy
WordPress Themes