Netduino / IMU Notes

Here are a few notes about using the Netduino with the 6 DOF board from Sparkfun that combines both the ITG3200 gyro and the ADXL345 accelerometer. Generally, using C# to access the IMU board is straight forward. Being able to visually debug the program while it's running on the Netduino is invaluable. I found the provided .Net I2C classes a bit strange, and wrapped them in easier to understand (at least for me) classes.

ITG3200 Gyro

Spec Sheet

General Communication

The gyro is located on the i2c bus at address 0x68. I use the default 100 khz communication rate for i2c bus traffic.

Initialization

There are a few things that need to be initialized before the gyro will start returning data. At the very least, you'll need to write to address 0x16 to turn the gyro on. Refer to the spec sheets for detailed information.

Here's how I'm currently initializing the gyro:

  • Write 0x09 to address 0x15. This sets the sample rate to 100 hz.
  • Write 0x1a to address 0x16. This sets up a 98 hz low pass filter, and more importantly enables the gyro by setting a 2000 degree per second range. If you don't do this, the gyro will not return data!

Reading Data

Data is read from address 0x1d. I'm reading all 6 bytes at the same time for efficiency reasons. For this device, the most significant byte of the 16 bit value is read first, followed by the least significant byte.

This makes the data parsing straight forward, and can be accomplished via code similar to:

x = (short)((bufferData[0] << 8) | bufferData[1]);
y = (short)((bufferData[2] << 8) | bufferData[3]);
z = (short)((bufferData[4] << 8) | bufferData[5]);

ADXL345 accelerometer

Spec Sheet

General Communication

The accelerometer is located on the i2c bus at address 0x53. I use the default 100 khz communication rate for i2c bus traffic.

Initialization

Similar to the gyro, the accelerometer needs a bit of initializion before it will start to return values. Refer to the spec sheets for detailed information.

  • Write 0x09 to address 0x31. This sets the data format to support a +/- 4g range, and sets the Full_Res bit to use the full resolution.
  • Write 0x08 to address 0x2D. This takes the device out of standby mode, and has it start measureing acceleration. This is necessary for the device to return data!

Reading Data

Data is read from address 0x32. I'm reading all 6 bytes at the same time for efficiency reasons. For this device, the least significant byte of the 16 bit value is read first, followed by the most significant byte. Note this is the opposite way that the gyro functions

Reading data can be accomplished as such:

x = (short)((bufferData[1] << 8) | bufferData[0]);
y = (short)((bufferData[3] << 8) | bufferData[2]);
z = (short)((bufferData[5] << 8) | bufferData[4]);