Arduino Digital kompass projekt (2 / 3 steg)
Steg 2: Arduino källkoden
Vad vi behöver göra först är att ladda upp en skiss till Arduino styrelsen som kommer att läsa data från magnetometer och det kommer att skicka det till bearbetning IDE. Här är Arduino källkoden:
< p > / * Arduino kompass < br > *
* av Dejan Nedelkovski,
www.HowToMechatronics.com
*
* / < /p >< p > #include < wire.h > //I2C Arduino bibliotek < /wire.h >< /p >< p > #define Magnetometer_mX0 0x03
#define Magnetometer_mX1 0x04
#define Magnetometer_mZ0 0x05
#define Magnetometer_mZ1 0x06
#define Magnetometer_mY0 0x07
#define Magnetometer_mY1 0x08 < /p >< p > int mX0, mX1, mX_out;
int mY0, mY1, mY_out;
int mZ0, mZ1, mZ_out; < /p >< p > flyta rubrik, headingDegrees, headingFiltered, deklination; < /p >< p > float Xm, Ym, Zm; < /p >< p > #define Magnetometer 0x1E //I2C 7 bitars adress HMC5883 < /p >< p > void setup() {
Initiera följetong och I2C kommunikation
Serial.BEGIN(115200);
Wire.BEGIN();
Delay(100);
Wire.beginTransmission(Magnetometer);
Wire.write(0x02); Välj läge register
Wire.write(0x00); Kontinuerlig mätning läge
Wire.endTransmission();
} < /p >< p > void loop() {
---X-axeln
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mX1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mX0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mX0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mX1 = Wire.read();
} < /P >< p > / /---y-axeln
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mY1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mY0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mY0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mY1 = Wire.read();
}
---Z-axel
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mZ1);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mZ0 = Wire.read();
}
Wire.beginTransmission(Magnetometer); överföra till enhet
Wire.write(Magnetometer_mZ0);
Wire.endTransmission();
Wire.requestFrom(Magnetometer,1);
IF(Wire.available() < = 1)
{
mZ1 = Wire.read();
}
---X-axeln
mX1 = mX1 << 8;
mX_out = mX0 + mX1; RAW-data
Från databladet: 0.92 mG/siffra
XM = mX_out * 0.00092; Gauss enhet
* Jorden magnetfält varierar från 0,25 till 0,65 Gauss, så är dessa värderingar som vi måste få ca. < /p >< p > / /---y-axeln
mY1 = mY1 << 8;
mY_out = mY0 + mY1;
YM = mY_out * 0.00092; < /p >< p > / /---z-axel
mZ1 = mZ1 << 8;
mZ_out = mZ0 + mZ1;
ZM = mZ_out * 0.00092;
// ==============================
Beräkning av rubrik
rubrik = ARCTAN2 (Ym, Xm);
Rättelse av rubriken med deklination vinkel beroende på din plats
Du kan hitta din deklination vinkel på: http://www.ngdc.noaa.gov/geomag-web/
På min plats det är 4,2 grader = > 0.073 rad
deklination = 0,073;
rubriken += deklination;
Korrigera när tecknen är reveresed
IF(heading <0) rubrik + = 2 * PI; < /p >< p > / / korrigera på att deklination vinkeln
om (rubrik > 2 * PI) rubriken-= 2 * PI; < /p >< p > headingDegrees = rubrik * 180/PI; Rubriken i grader enhet < /p >< p > / / utjämning utdata vinkeln / lågt passera filtret
headingFiltered = headingFiltered * 0,85 + headingDegrees * 0,15; < /p >< p > //Sending rubrik värdet genom serieporten till bearbetning IDE
Serial.println(headingFiltered); < /p >< p >
Delay(50);
} < /p >