НАЗАД

Компас HMC5883L

В качестве компаса используется датчик HMC5883L трех осевой измеритель магнитного поля. Для использования данного датчика необходима библиотека HMC5883L.h. Датчик измеряет отклонение от северного полюса. Подключение датчика выполняется по шине I2C. Вывод SDA датчика подключается к аналоговому пину Arduino 4 (SDA платы Arduino), вывод SCL подключается к аналоговому пину SCL платы Arduino 5 (SCL платы Arduino). Напряжение питания датчика 3.3 В. Датчик измеряет магнитное поле по трем осям. На маркировке ось X направлена на север. Как и любое устройство, работающее по интерфейсу I2C, датчик имеет свой собственный уникальный адрес для работы. HMC5883L присвоен адрес 0х1E. С восьмым битом записи/чтения адрес будет 0х3D для чтения и 0х3C для записи.
На рисунке ниже показана схема подключения датчика-компас к Arduino.

Ниже в листинге приведен программный код, демонстрирующий работу компаса.

#include "Wire.h"
#include "HMC5883L.h"
HMC5883L compass;
void setup()
{
Serial.begin(9600);
Wire.begin();
compass = HMC5883L(); // создаем экземпляр HMC5883L библиотеки
INIT_HMC5883L(); // инициализация HMC5883L
}
void loop()
{
float angel = getAngel();
Serial.println(angel);
delay(250);
}
void INIT_HMC5883L()
{
// инициализация HMC5883L, и проверка наличия ошибок
int error;
error = compass.SetScale(0.88);
// чувствительность датчика из диапазона: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1
if(error != 0) Serial.println(compass.GetErrorText(error));
// если ошибка, то выводим ее
error = compass.SetMeasurementMode(Measurement_Continuous);
// установка режима измерений как Continuous (продолжительный)
if(error != 0) Serial.println(compass.GetErrorText(error));
// если ошибка, то выводим ее
}
float getAngel()
{
// считываем данные с HMC5883L и рассчитываем направление
MagnetometerScaled scaled = compass.ReadScaledAxis();
// получаем масштабированные элементы с датчика
float heading = atan2(scaled.YAxis, scaled.XAxis);
// высчитываем направление
// корректируем значения с учетом знаков
if(heading < 0) heading += 2*PI;
if(heading > 2*PI) heading -= 2*PI;
return heading * RAD_TO_DEG;
// переводим радианы в градусы
}

Ниже приведен второй листинг работы с компасом. Данная программа показывает как «сырые» данные, так и обработанные данные с датчика.

// Ссылка на библиотеку I2C
#include // Ссылка на библиотеку HMC5883L
#include
// Создать переменную объекта компаса
HMC5883L compass;
// Создать переменную для записи кода любой ошибки.
int error = 0;
// Выполняем конфигурацию микроконтроллера и компаса
void setup()
{
// Инициализация последовательного порта
Serial.begin(9600);
Serial.println("Включен интерфейс по протоколу I2C");
Wire.begin(); // Запустить I2C
Serial.println("Создаем объект компас HMC5883L");
compass = HMC5883L(); // Создаем новый объект HMC5883.
Serial.println("Настройка точности +/- 1.3 Ga");
error = compass.SetScale(1.3); // Настройка точности измерения
if(error != 0) // Если возникает ошибка, вывести ошибку
Serial.println(compass.GetErrorText(error));
Serial.println("Настраиваем режим измерения «Сontinous”");
error = compass.SetMeasurementMode(Measurement_Continuous);
// Настройка в режим измерения Continuous
if(error != 0) // Если возникает ошибка, вывести ошибку
Serial.println(compass.GetErrorText(error));
}
// Основной цикл программы
void loop()
{
// Получаем «сырые», не обработанные, не масштабируемые данные
MagnetometerRaw raw = compass.ReadRawAxis();
// Получакм отмасштабируемые значения с компаса
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Доступ к значениям:
int MilliGauss_OnThe_XAxis = scaled.XAxis;
// (или YAxis, или ZAxis)
// Вычисляем направление на основании измерения напряженности магнитного поля //по осям
float heading = atan2(scaled.YAxis, scaled.XAxis);
// для вашего направления вы должны добавить угол отклонения
// 'Declination Angle',
//который является 'Error' магнитного поля в вашем месте расположения.
// Найдите Ваше значение: http://www.magnetic-declination.com/
//перевод градусов в радианы http://planetcalc.ru/71/
// Если вы не найдете отклонение
//закомментируйте нижние две строки и ваш компас будет работать,
//но с некоторой неточностью
float declinationAngle = 0.0457; 0,1847
heading += declinationAngle;
// Приведение к градусам от 0 (направление на север) до 360.
//Для начала приводим все к положительному знаку
if(heading < 0)
heading += 2*PI;
if(heading > 2*PI)
heading -= 2*PI;
// Конвертация радиан в градусы
float headingDegrees = heading * 180/M_PI;
// Вывод даных через последовательный порт.
Output(raw, scaled, heading, headingDegrees);
//В нормальном режиме необходима задержка работы приложения на 66 мс.
//чтобы позволить циклу работать на частоте измерения 15 Hz
// (значение по умолчанию HMC5883L).
// Но у нас используется продолжительный последовательный выход
// (104мс на 9600) это выполняется на стандартной скорости
// delay(66);
}
// метод вывода данных в последовательный порт.
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");
}