Подключение модуля трехосевого компаса GY-271 к Arduino
В статье детально расскажу шаги по правильному подключению модуля GY-271 к Arduino, а также продемонстрирую наглядный процесс чтения данных с датчика сразу на монитор порта. Использование данного модуля совместно с Arduino даёт возможность построить полноценный цифровой компас, способный точно определить основные направления сторон света: север, юг, восток и запад.

1. Технические параметры
- Тип модуля: GY-271;
- Использованный чип: QMC5883L;
- Источник питания: 3 – 5В;
- Режим связи: I2C;
- Габариты: 33 х 15 х 3 мм;
- Вес: 2 грамм;
2. Описание модуля GY-271
Модуль оснащён современным высокочувствительным магниторезистивным датчиком QMC5883L, которая включает в себя предусилитель сигнала, автоматический демагнетизатор, систему коррекции смещения и высокоточный 12-разрядный аналого-цифровой преобразователь, обеспечивающий высокую точность измерения направления — погрешность составляет всего 1-2 градуса. Подключение к микроконтроллеру осуществляется с помощью двухпроводной шины I²C. Подключается модуль к микроконтроллерам через стандартную интерфейс-шину I²C, упрощающую работу с датчиками.

Модуль дополнительно оснащён встроенным стабилизатором напряжения, что позволяет подавать питание от стандартных источников с выходным уровнем 3,3 или 5 В. Интерфейс I²C также поддерживает напряжение 3,3 или 5 В, обеспечивая удобство и универсальность подключения.

Конфигурация контактов:
- VCC – питание модуля 3.3В;
- GND – минус от источника;
- SDA – шины данных I2C (SPI);
- SCL – шины данных I2C (SPI).
- DRDY – Прерывающий контакт для подготовки данных.
3. Подключение модуля GY-271 к Arduino UNO
В качестве примера опишу последовательность действий по подключению 3-осевого магнитного датчика GY-271 к Arduino UNO и представлю фрагмент программы (скетч), который обеспечит вывод данных с датчика на последовательный порт.
Необходимые детали:
- Arduino UNO R3 x 1 шт.
- Модуль трехосевого цифрового компаса GY-271 x 1 шт.
- Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
- Кабель USB 2.0 A-B x 1 шт
Подключение:
Подключение GY-271 выполняется элементарно: достаточно соединить выводы согласно следующей схеме ниже. Сначала подключаем питание VCC и GND модуля присоединяется к выводу 5V и GND платы Arduino, затем контакт SCL и SDA модуля подключаем к выводу A5 и A4 Arduino.

Определение чипа:
Простейший метод идентификации модуля типа QMC5883L заключается в использовании сканера интерфейса I²C. Этот вариант отличается собственным уникальным адресом (0x0D), отличным от стандартного адреса устройства HMC5883L.
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
while (!Serial) {delay(100);};
Serial.println();
Serial.println("I2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
delay(5000);
}
Получив указанный результат, можете быть уверены, что перед вами модификация QMC5883L.

Установка библиотки:
Для работы, будем использовать библиотеку «QMC5883LCompass» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи.

Калибровка:
Первым делом необходимо получить калибровочные показания датчика QMC5883L загрузите данный скетч на ваш Arduino.
#include <QMC5883LCompass.h>
QMC5883LCompass compass;
void setup() {
Serial.begin(9600);
compass.init();
Serial.println("This will provide calibration settings for your QMC5883L chip. When prompted, move the magnetometer in all directions until the calibration is complete.");
Serial.println("Calibration will begin in 5 seconds.");
delay(5000);
Serial.println("CALIBRATING. Keep moving your sensor...");
compass.calibrate();
Serial.println("DONE. Copy the lines below and paste it into your projects sketch.);");
Serial.println();
Serial.print("compass.setCalibrationOffsets(");
Serial.print(compass.getCalibrationOffset(0));
Serial.print(", ");
Serial.print(compass.getCalibrationOffset(1));
Serial.print(", ");
Serial.print(compass.getCalibrationOffset(2));
Serial.println(");");
Serial.print("compass.setCalibrationScales(");
Serial.print(compass.getCalibrationScale(0));
Serial.print(", ");
Serial.print(compass.getCalibrationScale(1));
Serial.print(", ");
Serial.print(compass.getCalibrationScale(2));
Serial.println(");");
}
void loop() {
delay(1000);
}
После загрузки скетча откройте монитор последовательного порта и подвигайте модуль вперед и назад, в конце необходимо скопировать две строчки compass.setCalibrationOffsets и compass.setCalibrationScales

Программа:
Скопируйте ниже скетч и загрузите его в плату Arduino UNO вставив ваши калибровочные показания.
#include <QMC5883LCompass.h>
QMC5883LCompass compass;
void setup() {
Serial.begin(9600);
compass.init();
compass.setCalibrationOffsets(288.00, -160.00, 391.00);
compass.setCalibrationScales(0.97, 1.75, 0.72);
}
void loop() {
int x, y, z;
// Read compass values
compass.read();
// Return XYZ readings
x = compass.getX();
y = compass.getY();
z = compass.getZ();
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Z: ");
Serial.print(z);
Serial.println();
delay(250);
}
После загрузки скетча откройте монитор последовательного порта.


