Skip to product information
1 of 2

Blue PCB Electronics

1B26A GY-271 HMC5883L 3-Axis Magnetic Electronic Compass Module

1B26A GY-271 HMC5883L 3-Axis Magnetic Electronic Compass Module

Regular price Dhs. 25.00
Regular price Sale price Dhs. 25.00
Sale Sold out
View full details

Description:

QMC5883L is a multi-chip 3-axis magnetic sensor compatible with HMC5883L. Targeted for high precision applications such as compassing, navigation in drone, robot, mobile and hobby purpose applications.This triple axis compass magnetometer sensor module with power supply of 3.3V or 5V. The module size is: 16mm*18mm. There is a 2.54mm pin pitch. It comes with a pin header.

Datasheet

Overview:

  • model: GY-271
  • Chip: QMC588L
  • Three Axis Magnetometer sensor
  • I2C interface
  • Arduino compatible
  • Application: compassing,navigation etc.

Features:

  • Module Type: QMC5883L
  • Power Supply: External 3.3V - 5V
  • Communication protocol: I2C
  • Enables 1degree to 2degree compass heading accuracy allows for Navigation and LBS Applications.
  • 16 Bit ADC With LOW Noise AMR Sensors Achieves 5 Milli-Gauss Field Resolution.
  • Measuring range: ±1.3-8 Gauss
  • Weight: 12.00g
  • Board Size: 16mmx18mm

Wiring:

Code:

#include <Wire.h> //I2C Arduino Library

#define HMC5883L_ADDR 0x1E //0011110b, I2C 7bit address of HMC5883

bool haveHMC5883L = false;

bool detectHMC5883L ()
{
  // read identification registers
  Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
  Wire.write(10); //select Identification register A
  Wire.endTransmission();
  Wire.requestFrom(HMC5883L_ADDR, 3);
  if(3 == Wire.available()) {
    char a = Wire.read();
    char b = Wire.read();
    char c = Wire.read();
    if(a == 'H' && b == '4' && c == '3')
      return true;
  }

  return false;
}

void setup()
{
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Serial.println("GY271 TEST");
  Wire.begin();
  // lower I2C clock http://www.gammon.com.au/forum/?id=10896
  TWBR = 78;  // 25 kHz 
  TWSR |= _BV (TWPS0);  // change prescaler  
}

void loop()
{
  bool detect = detectHMC5883L();

  if(!haveHMC5883L) 
  {
    if(detect) 
    {
      haveHMC5883L = true;
      Serial.println("We have HMC5883L, moving on");
      // Put the HMC5883 IC into the correct operating mode
      Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
      Wire.write(0x02); //select mode register
      Wire.write(0x00); //continuous measurement mode
      Wire.endTransmission();
    }
    else
    {  
      Serial.println("No HMC5883L detected!");
      delay(2000);
      return;
    }
  }
  else
  {
    if(!detect) {
      haveHMC5883L = false;
      Serial.println("Lost connection to HMC5883L!");
      delay(2000);
      return;
    }
  }
  
  int x,y,z; //triple axis data

  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(HMC5883L_ADDR);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();

 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(HMC5883L_ADDR, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
  }
  
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.println(z);
  
  delay(250);
}
  
  

 

Output: