adafruit / Adafruit_HMC5883_Unified

48 stars 35 forks source link

The "begin" function always returns TRUE #2

Open budryerson opened 8 years ago

budryerson commented 8 years ago

This function apparently means to detect whether an HMC5883 device is detected, and if no device is detected, to trigger the "Ooops, no HMC5883 detected ... Check your wiring!" message in the Adafruit sensor initialization example code. It does not. As written, the function must always returns TRUE.

bool Adafruit_HMC5883_Unified::begin()
{
  // Enable I2C
  Wire.begin();

  // Enable the magnetometer
  write8(HMC5883_ADDRESS_MAG, HMC5883_REGISTER_MAG_MR_REG_M, 0x00);

  // Set the gain to a known level
  setMagGain(HMC5883_MAGGAIN_1_3);

  return true;
}
oliver30982 commented 8 years ago

Hi,

I had the same problem and solved it by putting

if (read8(HMC5883_ADDRESS_MAG, HMC5883_REGISTER_MAG_MR_REG_M) == 0xFF) return false;

directly after Wire.begin();

Oliver

budryerson commented 8 years ago

Thanks, Oliver. Adafruit should add that correction to their library.

I cobbled together my own library from bits and pieces of this and the Honeywell version. In my setup, I request the ID from the device and fail if I get other than "H43".

But these days, everyone uses an IMU of some kind with the mag compass built in. I don't think anyone but a masochist would use this device anymore.

zs6buj commented 6 years ago

Thanks Guys, but alas oliver30982's patch didn't immediately work for me on v1.8.5. Eventually I determined that, in my environment

(read8(HMC5883_ADDRESS_MAG, HMC5883_REGISTER_MAG_MR_REG_M)

returns 3 when the HMC5883 is present, and 0 when it is not.

In all fairness, my "HMC5883" might not be the real McCoy, as it came off an old CX-20 Quad. The chip is, however, marked L883.

I hope this is useful to someone.