Here’s an example using the GY273 compass and the Wire.h library. The GY273 detects three axes for magnetic field. It uses the Honeywell HMC5883L chip.

Top view of chip, arrow shows +ve output for the axis direction. The module has an I2C address of 0x1E.

// compass module GY273 I2C
/* connections
GY273 Arduino
VCC 3.3V
GND GND
SCL A5
SDA A4
DRDY not used
*/
#include "Wire.h"
// module I2C address
#define GY273ADDR 0x1E
// register addresses for Axes X, Y and Z data, see table above
#define X 0x03
#define Z 0x05
#define Y 0x07
void setup()
{
Serial.begin(9600);
Wire.begin(); // create wire object
initGY273(); // initialise module
}
void loop()
{
/* Read each sensor axis data and output to the serial port */
Serial.print(GY273read(X));
Serial.print(" ");
Serial.print(GY273read(Y));
Serial.print(" ");
Serial.println(GY273read(Z));
// Wait a little before reading again
delay(500);
}
// initialise module
void initGY273(void)
{
// Set the module to 8x averaging, 15Hx rate
Wire.beginTransmission(GY273ADDR);
Wire.write(0x00); // config reg A
Wire.write(0x70); // 0 11 100 00
// Set a gain of 1090 (default), range +/-1.3Ga, gain 1090
Wire.write(0x01); // config reg B
Wire.write(0x20); // 001 00000
Wire.endTransmission();
}
// read from X, Y or Z data registers
// return 16 bit signed int
int GY273read(byte Axis)
{
int r;
// single measurement mode
Wire.beginTransmission(GY273ADDR);
Wire.write(0x02); // mode register
Wire.write(0x01); // 000000 01
Wire.endTransmission();
delay(50); // was 6
// move register pointer
Wire.beginTransmission(GY273ADDR);
Wire.write(Axis); // to one of the axis data registers 0x03, 0x05 or 0x07
Wire.endTransmission();
// Read the 2 bytes of data, concatenate and return
Wire.requestFrom(GY273ADDR, 2);
r = Wire.read() << 8; // shift L for 8 MSB, reads register 0x03...
r |= Wire.read(); // add LSB to make int, reads register 0x04...
return r;
}
No comments:
Post a Comment