Hmc5883l with arduino


Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats


Failed to load latest commit information.

HMC5883L — Arduino I2C library

C++ library for HMC5883L magnetometer for I2C communication with Arduino Wire library. Main features:

  • read raw data,
  • read scaled data,
  • self test calibration,
  • soft and hard iron compensation,
  • some minor changes.

The library is intended to work without any user interference, just open project and upload working example and use it.

Library uses I2C Interface, I2C Sensor Interface to simplify and unify working with I2C devices. The library also uses Status Class which is optional.

The working example for this library is writen in Atmel Studio 7 with Visual Micro addon. But it is possible to run it with Arduino IDE by adding files to project (probably there will be need to change the #include paths).

  • Software:
    • Atmel Studio 7 (tested) or Visual Studio,
    • Visual Micro addon for above AS7 or VS.
  • Hardware:
    • Arduino Due (tested) or Arduino Uno (any ATmega 328P) board,
    • HMC5883L board or any IMU sensor with HMC5883L.
HMC5883L board Due board Uno board
DRDY 19* any free pin*
SCL SCL (21) SCL (A4)
SDA SDA (20) SDA (A5)
VCC 3.3V 3.3V 3.3V
VCC 5V — ** 5V

*To change pin number use HMC5883L_A_DATA_READY_PIN define in Config.h file.

**The Due MCU cannot be exposed to the voltage above 3.3V level!

To see a real-life example open AS7 project file HMC5883L_.atsln and upload the HMC5883L_.ino to a micro-controller. You should see somethink like that on Serial Monitor (baud rate = 115200):

HMC5883L output rate

The library by default provide the fastest output rate, it is about 160 Hz , by using DDRY HMC5883L pin.

Due to manufacturing process, magnetometers have some problems with the data quality. In other words, to get the best accuracy, you need to calibrate it.

The library provide the way to obtain magnetic data from magnetometer and use them in MATLAB script to calculate soft and hard iron compensation parameters. Read the instructions here.

The result of this calibration is shown below:

HMC5883L::getDataReadyFlag() method can be polling in loop, which provide the fastest readout. There is a mechanism using external interrupts without blocking the processor.



Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats


Failed to load latest commit information.

HMC5883L Triple Axis Digital Compass Arduino Library

This library use I2C to communicate, 2 pins are required to interface.

I need your help

In the near future I plan to refactoring the libraries. The main goal is to improve code quality, new features and add support for different versions of Arduino boards like Uno, Mega and Zero.

For this purpose I need to buy modules, Arduino Boards and lot of beer.

If you want to support the further and long-term development of libraries, please help.

You can do this by transferring any amount to my PayPal account:


HMC5883L Triple Axis Digital Compass Arduino Library


Tutorial to Interface HMC5883L Compass Sensor With Arduino

Introduction: Tutorial to Interface HMC5883L Compass Sensor With Arduino


HMC5883L is a 3-axis digital compass used for two general purposes: to measure the magnetization of a magnetic material like a ferromagnet, or to measure the strength and, in some cases, the direction of the magnetic field at a point in space. Communication with the HMC5883L is simple and all done through an I2C interface. There is an on board regulator. The breakout board includes the HMC5883L sensor and all filtering capacitors. The power and 2-wire interface pins are all broken out to a 0.1″ pitch header. Uses famous HMC5883L magnetometer chip. Supports 3.0V to 5.0V IO levels on I2C SCL and SDA pins.


  • Power supply :3V — 5V
  • IO Voltage Level: 3V — 5V
  • Communication: Standard IIC communication protocol
  • Module Dimensions: 14.35 mm (L) x 13.16 mm (W) x 3.40 mm (H)
  • PCB thickness: 1.60 mm
  • Measuring range: ± 1.3-8 Gauss

Step 1: Materials Preparation

In this tutorial, you will need :

1. Arduino Uno Board and USB Cable.
2. HMC 5883L Compass Sensor
3. Jumper Wires
4. LCD 16X2
5. Breadboard
6. 10K Potentiometer
7. Arduino IDE Software

Step 2: Pin Description

VCC : Power supply

SCL: I2C Clock Input

SDA : I2C Data IO

DRDY: Data Ready Output

Step 3: Pin Connection

Connect HMC5883L to Arduino Uno Board as following :

  • VCC to +5V
  • GND to GND
  • SCL tO A5
  • SDA to A4

Connect LCD to Arduino Uno Board as following :

  • VSS to +5V
  • VDD to GND
  • RS to 12
  • RW to GND
  • E to 11
  • D4 to 5
  • D5 to 4
  • D6 to 3
  • D7 to 2
  • A/VSS to +5V
  • K/VDD to GND

Connect 10K Potentiometer to LCD as following (refer image for potentiometer pinout) :

Step 4: Connect Arduino to Computer

After u have complete your circuit, connect your Arduino Uno Board to your computer via USB Cable. You can see your LCD is on.

Step 5: Sample Source Code

You may download this sample source code and open it on your Arduino IDE. Choose the correct board and port. Then, upload your Code into your Arduino Uno Board.


Step 6: Library

You have to download these libraries before uploading the sample source code into your Arduino IDE to allow Arduino to communicate with LCD and HMC5883L. Download the ZIP file below > Open Zip File > Extract to your Arduino Uno Library folder. Refer the image above for your references.


Step 7: Corresponding Output

As illustrated, twisting or turning the device will provide the corresponding outputs.

Step 8: Result : Serial Monitor

i. when device rotate around it’s X-axis, X-axis remain the same while the other two axis changed.

ii. when device rotate around it’s Y-axis, Y-axis remain the same while the other two axis changed.

iii. when device rotate around it’s Z-axis, Z-axis remain the same while the other two axis changed.

Step 9: Video

This video shows HMC5883L Compass Module corresponding output when interfaced with Arduino Uno.

Step 10: News!

HMC5883L not Working!

Try download Library (Mecha_QMC5883L) and source code.


2 People Made This Project!

Did you make this project? Share it with us!


Halloween Contest

Microcontroller Contest

Cheese Challenge


Question 3 months ago on Step 8

I want to know what are these numbers. Is these numbers represent angle or radians with respect to North , South, East, West. The content was amazing and crisp n clear . Will done !


Arduino UNO урок 14 — цифровой компас HMC5883L

Микросхема HMC5883L представляет собой 3-х осевой цифровой компас, работающий по шине I 2 C. В качестве сенсоров используется три магниторезистивных датчика. Разработчик: компания Honeywell. Даташит PDF. Напряжение питания составляет 2.2-3.6В. Чувствительность датчика составляет 5 миллигаусс.

Датчик может использоваться в мобильных телефонах, планшетах, навигационном оборудовании и прочей потребительской электронике, но для радиолюбителей он может быть интересен тем, что цифровой компас может очень пригодится при конструировании роботов и радиоуправляемых моделей. В данном уроке мы рассмотрим подключение HMC5883L к Arduino. Т.к. датчик работает по шине I 2 C, то схема подключения предельно проста:

Т.к. сам чип компаса очень маленький 3×3 мм (16-ти выводной LPCC корпус), то некоторые фирмы выпускают платы с удобными выводами для подключения и распаянными подтягивающими резисторами. Именно такую плату мы и будем использовать в качестве примера.

Вывод SDA чипа подключаем к выводу SDA платы Arduino (обычно Analog IN 4), а вывод SCL чипа соответственно к выводу SCL платы Arduino (обычно Analog IN 5). На Arduino Mega это 20 и 21 пины. И не забываем питание 3.3В и общий GND.

На сайте bildr существует готовая библиотека для работы с датчиком. Ею мы и воспользуемся (немного подправив ошибку при проверке диапазона scale). Папку HMC5883L поместите в ваш каталог Libraries. Код работы с датчиком:

Чувствительность датчика задается функцией SetScale() и может быть выбрана только из следующих значений: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1. Более подробно читайте даташит.

После загрузки скетча в контроллер Arduino и запуске утилиты мониторинга порта, вы должны увидеть поступающие данные с датчика:

Вращая датчик вокруг своей оси, будет изменяться градус поворота. 0° — это будет север, а 180° — юг. Помните, что датчик очень чувствителен к любым намагниченным предметам, а также к сотовым телефонам и другим подобным устройствам излучающих магнитные поля. Также датчик необходимо располагать строго в горизонтальной плоскости, стоит его наклонить и тогда данные будут неверные. При применении цифровых компасов в робототехнике это необходимо учитывать и обычно, такие цифровые компасы применяют в паре с цифровым акселерометром, для компенсации наклона.


Как подключить цифровой компас HMC5883L к Arduino

Рассмотрим подключение модуля GY-273 с трёхосевым цифровым компасом HMC5883L фирмы Honeywell. Эта микросхема может использоваться для магнитометрических измерений, в навигации, если не требуется большая точность измерений (с погрешностью 1…2° и возможностью калибровки). Устройство подключается по интерфейсу I2C.

  • Arduino UNO или иная совместимая плата;
  • модуль GY-273 с цифровым датчиком магнитного поля HMC5883L;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1 Описание цифрового компаса HMC5883L и модуля GY-273

Цифровой компас HMC5883L – это миниатюрная микросхема, выполненная на одном кристалле, дешёвая и неприхотливая, она быстро заслужила признание у радиолюбителей. Часто её продают в составе готового модуля со всей необходимой обвязкой, например GY-273.

Вот основные технические характеристики магнитного датчика:

  • 3-осевой магниточувствительный датчик;
  • 12-разрядный АЦП с разрешением 2 мГс (миллигаусс);
  • встроенная самопроверка;
  • низкое рабочее напряжение и малое потребление;
  • цифровой интерфейс I2C;
  • высокая скорость опроса – до 160 раз в секунду (время одного измерения примерно 6 мс);
  • точность определения направления 1…2°;
  • может применяться в сильных магнитных полях (до ±8 Гаусс).

2 Подключение цифрового компаса HMC5883L к Arduino

Схема подключения магнитного датчика HMC5883L к Arduino приведена на рисунке. Она очень компактная и простая: двухпроводной интерфейс IIC тем и хорош, что требует малого количества соединений.

Схема подключения цифрового компаса HMC5883L к Arduino

Можно воспользоваться макетной платой. Должно получиться примерно так, как на фотографии. У меня тут ещё к шинам SCL и SDA подключён логический анализатор, чтобы контролировать информационный обмен.

Цифровой компас HMC5883L подключён к Arduino на макетной плате

3 Скетч для Arduino, считывающий идентификационные регистры HMC5883L

Как же осуществляется обмен с магнитным датчиком HMC5883L? Откроем паспорт на датчик HMC5883L и узнаем, что адрес устройства 0x1E, а в наличии имеются следующие регистры:

Регистры цифрового компаса HMC5883L

Давайте в качестве первого знакомства попробуем прочитать идентификационный регистры 10 (0xA), 11 (0xB) и 12 (0xC) устройства.

Открыв монитор последовательного порта мы увидим:

Сигнал, полученный с помощью логического анализатора, будет следующим:

Временная диаграмма обмена по I2C с цифровым компасом HMC5883L

Что это значит? Первый байт – I 2 C адрес, с которым мы (ведущее устройство, Arduino) устанавливаем связь (старшие 7 бит 0x1E), и режим записи (младший бит – 0x0); получается число 0x3C. Второй байт – число 0xA, которое мы записали по адресу 0x1E и бит подтверждения от датчика HMC5883L, которое является ведомым. Это номер регистра, с которого мы начнём считывать данные. На этом первая транзакция закончилась. Начинается следующая. Третий байт – это запрос чтения у ведомого (старшие 7 бит – адрес 0x1E, 8-ой бит – операция чтения 0x1; получается число 0x3D). Последние 3 три байта с значениями 0x48, 0x34 и 0x33 – это ответ ведомого устройства HMC5883L из регистров 0xA, 0xB и 0xC, соответственно.

Перемещение по регистрам цифрового компаса HMC5883L при непрерывном считывании осуществляется автоматически. Т.е. каждый раз указывать регистр не обязательно (но и не запрещено). Например, если мы вместо 0xA записали бы 0x3 и 10 раз считали, то получили бы значения в 10-ти регистрах, начиная с 3-го по 12-ый.

А что это за три числа – 0x48, 0x34, 0x33? Снова воспользовавшись паспортом на цифровой компас HMC5883L, мы увидим, что это значения по умолчанию для трёх идентификационных регистров:

Идентификационные регистры цифрового компаса HMC5883L

4 Скетч для Arduino, считывающий показания цифрового компаса HMC5883L

А теперь давайте рассмотрим типичную измерительную задачу: снимем показания магнитной индукции по трём осям. Этот пример описан в паспорте на устройство. Мы лишь переведём его на язык, понятный Arduino. Итак, скетч.

Здесь показаны разные варианты получения двухбайтового числа из двух отдельных байтов. Вот как мы это сделали: по отдельности считали старший байт и младший байт, а затем воспользовались оператором word, который объединил два байта в двухбайтовое число («слово»). Можно поступить так: считать старший байт, сдвинуть его на 8 разрядов влево, считать младший байт, а затем объединить их по OR (ИЛИ). В последнем случае приводится просто более короткий синтаксис предыдущего варианта. Выбирайте тот, который вам более удобен и понятен.

Рассмотрим временную диаграмму информационного обмена:

Временная диаграмма I2C при принятии данных от цифрового компаса HMC5883L

Первые 5 байтов до небольшой паузы – это то, что мы описали в секции void setup():

  • выбор адреса ведомого устройства и режима записи;
  • выбор первого регистра управления Control Register A (CRA) с адресом 0x00 (согласно вышеприведённой таблице);
  • запись в первый регистр управления CRA числа 0x70 – усреднение по 8 точкам, 15 Гц, нормальные измерения (подробности см. в паспорте); HMC5883L переводит указатель к следующему регистру – Control Register B (CRB);
  • запись в регистр CRB числа 0xA0, что соответствует установке чувствительности 5; HMC5883L переводит указатель к следующему регистру – Mode Register, регистр выбора режима;
  • записываем в регистр режима число 0x00 – бесконечный режим измерения.

Далее идёт небольшая пауза примерно в 20 мкс, и передаются ещё два байта – это выбор адреса ведомого в режиме записи и запись адреса регистра – 0x03 – с которого мы будем начинать каждый цикл считывания данных, определённый нами в void loop(). Это первый регистр данных, как видно из таблицы выше.

Последние 7 байтов означают следующее:

  • первый байт из 7-ми – выбор адреса ведомого устройства и режима чтения;
  • следующие два – чтение двух байтов показаний с канала оси X;
  • следующие два – оси Y;
  • следующие два – оси Z.

В итоге, в мониторе порта мы видим показания магнитного датчика по трём осям:

Принятые данные цифрового компаса HMC5883L по трём осям

Если поворачивать датчик в пространстве, видно, как меняются показания.

Думаю, что калибровка и настройка цифрового компаса – тема для отдельной статьи.