Please note that User Registration has been temporarily disabled due to a recent increase in automated registrations. If anyone needs an account, please request one here: RequestAccount. Thanks for your patience!--Wmat (talk)
Please email User:Wmat if you experience any issues with the Request Account form.

Difference between revisions of "Sparkfun: HMC5883L Magnetometer"

From eLinux.org
Jump to: navigation, search
(Communicating with the HMC5883L Using the Shell)
Line 22: Line 22:
 
==Communicating with the HMC5883L Using the Shell==
 
==Communicating with the HMC5883L Using the Shell==
  
the HMC5883L has 13 8-bit registers:
+
the HMC5883L has 14 8-bit registers:
 
{| style="color:green; background-color:#ffffcc;" cellpadding="10" cellspacing="0" border="1"
 
{| style="color:green; background-color:#ffffcc;" cellpadding="10" cellspacing="0" border="1"
 
!scope="col"| Address
 
!scope="col"| Address
Line 29: Line 29:
 
|-
 
|-
 
| 00
 
| 00
| Configuration Register A
+
| WHO_AM_I
 
| Read/Write
 
| Read/Write
 
|-
 
|-
| 01
+
| 15
| Configuration Register B
+
| SMPLRT_DIV
 
| Read/Write
 
| Read/Write
 
|-
 
|-
| 02
+
| 16
| Mode Register
+
| DLPF_FS
 
| Read/Write
 
| Read/Write
 
|-
 
|-
| 03
+
| 17
| Data Output X MSB Register
+
| INT_CFG
 +
| Read/Write
 +
|-
 +
| 1A
 +
| INT_STATUS
 
| Read
 
| Read
 
|-
 
|-
| 04
+
| 1B
| Data Output X LSB Register
+
| TEMP_OUT_H
 
| Read
 
| Read
 
|-
 
|-
| 05
+
| 1C
| Data Output Z MSB Register
+
| TEMP_OUT_L
 
| Read
 
| Read
 
|-
 
|-
| 06
+
| 1D
| Data Output Z LSB Register
+
| GYRO_XOUT_H
 
| Read
 
| Read
 
|-
 
|-
| 07
+
| 1E
| Data Output Y MSB Register
+
| GYRO_XOUT_L
 
| Read
 
| Read
 
|-
 
|-
| 08
+
| 1F
| Data Output Y LSB Register
+
| GYRO_YOUT_H
 
| Read
 
| Read
 
|-
 
|-
| 09
+
| 20
| Status Register
+
| GYRO_YOUT_L
 
| Read
 
| Read
 
|-
 
|-
| 10
+
| 21
| Identification register A
+
| GYRO_ZOUT_H
 
| Read
 
| Read
 
|-
 
|-
| 11
+
| 22
| Identification register B
+
| GYRO_ZOUT_L
 
| Read
 
| Read
 
|-
 
|-
| 12
+
| 3E
| Identification register C
+
| PWR_MGM
| Read
+
| Read/Write
 
|}
 
|}
  
The sensor values for each axis are 16-bit and are stored across 2 registers each.
+
The sensor values for each axis are 16-bit and are stored across 2 registers each. GYRO_#OUT_H and GYRO_#OUT_L where # is just letter for the axis. Will have to get the two halves of the 16-bit signed measurement to read the entire value..
 
+
beagle$ '''i2cget -y 3 0x1e 3'''
+
 
+
beagle$ '''i2cget -y 3 0x1e 4'''
+
 
+
will get the two halves of the 16-bit signed measurement along the +x axis.
+
 
+
By default the magnetometer takes a single sample and enters idle mode.The lowest two bits of the mode register control the measurement mode. Setting these to 0x01 will cause the device to take one measurement and then enter idle mode again. Setting to 0x00 should cause the device to enter continuous measurement mode,
+
 
+
beagle$ '''i2cset -y 3 0x1e 2 1'''
+
will cause a single measurement to be taken.
+
 
+
The new values for each axis can be read from registers 03-08 as shown above. By default the measurements correspond to 1090 LSB/Gauss, but this can be changed by modifying the gain in Configuration Register B.
+
 
+
Note: reading a value of 0xF000 (-4096) in a data output register indicates an overflow or underflow error in the ADC or a math error.
+
  
 
==Using C==
 
==Using C==

Revision as of 19:20, 26 September 2012

Overview

The HMC5883L Magnetometer is a sensor that measures the magnetic field vector in three dimensions. the Magnetometer uses a 400KHz I2C bus to communicate. The breakout board comes with filtering capacitors and four pins for the I2C, Vcc and ground.

Connecting to the Bone

The Beagle Bone can be connected to the magnetometer via the I2C bus, but the bone only has 100kHz I2C and communication is limited. Ground and Vcc on the breakout board should be connected to pins 1 and 2 respectively on the bone's P9 header, and the SCL and SDA pins should be connected to one of the I2C pairs on the bone. 4.7k resistors should be connected between SCL and Vcc and between SDA and Vcc. I used I2C3 (P9, pins 19 and 20). The address of the magnetometer can be found by using the i2cdetect command from the shell. I get:

beagle$ i2cdetect -y -r 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- 1e -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

The address should be 0x1e

Communicating with the HMC5883L Using the Shell

the HMC5883L has 14 8-bit registers:

Address Name Access
00 WHO_AM_I Read/Write
15 SMPLRT_DIV Read/Write
16 DLPF_FS Read/Write
17 INT_CFG Read/Write
1A INT_STATUS Read
1B TEMP_OUT_H Read
1C TEMP_OUT_L Read
1D GYRO_XOUT_H Read
1E GYRO_XOUT_L Read
1F GYRO_YOUT_H Read
20 GYRO_YOUT_L Read
21 GYRO_ZOUT_H Read
22 GYRO_ZOUT_L Read
3E PWR_MGM Read/Write

The sensor values for each axis are 16-bit and are stored across 2 registers each. GYRO_#OUT_H and GYRO_#OUT_L where # is just letter for the axis. Will have to get the two halves of the 16-bit signed measurement to read the entire value..

Using C

the I2C code from exercise 12 should work for the magnetometer, but it produces an error trying to read from or write to the device. This is probably because the magnetometer I2C operates at 400Khz and the bone uses 100kHz, so anything other than the simple shell commands produces corrupted data due to timing errors.