平成30年度公開講座で演習する内容です。
地磁気センサQMC5883Lのテストに用いたコードです。地磁気センサをESP8266に取り付けた状態で,キャリブレーションを行います。一周360度回転をさせて最大値・最小値を調べ,maxX, maxY, minX, minY に値を入力します。また,静止状態のmag.xAxis,mag.yAxisの値をオフセット値としてoffX, offYも入力します。0度~360度で方位度が出力されます。0度,360度が北,180度が南を示します。
#include <Wire.h>
#include <DFRobot_QMC5883.h>
DFRobot_QMC5883 compass;
int maxX = 2550;
int maxY = 7480;
int minX = -10150;
int minY = -5060;
//int offX = -6466;
//int offY = 4349;
int offX = 0;
int offY = 0;
void setup() {
delay(1000);
Serial.begin(9600);
while (!compass.begin()) {
Serial.println("Could not find a valid QMC5883 sensor, check wiring!");
delay(1000);
yield();
}
if (compass.isQMC()) {
compass.setRange(QMC5883_RANGE_2GA);
compass.setMeasurementMode(QMC5883_CONTINOUS);
compass.setDataRate(QMC5883_DATARATE_50HZ);
compass.setSamples(QMC5883_SAMPLES_8);
}
}
void loop() {
Vector mag = compass.readRaw();
// Serial.print(mag.XAxis);
// Serial.print(",");
// Serial.print(mag.YAxis);
// Serial.print(",");
// Serial.print(mag.ZAxis);
// Serial.println(",");
if (mag.XAxis > maxX) maxX = mag.XAxis;
if (mag.YAxis > maxY) maxY = mag.YAxis;
if (mag.XAxis < minX) minX = mag.XAxis;
if (mag.YAxis < minY) minY = mag.YAxis;
// Serial.print(maxX);
// Serial.print(",");
// Serial.print(maxY);
// Serial.print(",");
// Serial.print(minX);
// Serial.print(",");
// Serial.println(minY);
Vector norm = compass.readNormalize();
// Calculate heading
float heading = atan2(norm.YAxis, norm.XAxis);
float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / PI);
heading += declinationAngle;
// Correct for heading < 0deg and heading > 360deg
if (heading < 0) {
heading += 2 * PI;
}
if (heading > 2 * PI) {
heading -= 2 * PI;
}
// Convert to degrees
float headingDegrees = heading * 180 / PI;
// Output
//// Serial.print(" Heading = ");
Serial.print(heading);
Serial.print(",");
//// Serial.print(" Degress = ");
Serial.print(headingDegrees);
Serial.println();
delay(30);
}



コメント