Hi, I'm truly a newbie w/ IMU. What I want to try first is at least just make sure the accelerometer can be connected to Arduino using I2C. I'm using arduino Leonardo anyway.
I think I've already made it correct about the hardware, that just connect these ones:
IMU -> Arduino
3.3V -> 3.3V
A4 -> SDA
A5 -> SCL
GND -> GND
And this one is my code (just ignore the gyro and magnetometer ones):
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <math.h>
#include <Wire.h>
#define ITG3200_Address 0x69 // 68
#define ADXL345_Address 0x53 //
#define HMC5883L_Address 0x1E
float GyroX,GyroY,AccX,AccY,AccZ;
float roll_acc,pitch_acc;
float *pitch,*roll,*yaw;
int MagX,MagY,MagZ;
float x_caliba,y_caliba;
float u1;
void setup()
{
// initial baud rate of UART as 19200
Serial.begin(19200);
// initial using i2c by Arduino command
Wire.begin();
pinMode(13, OUTPUT);
// initial accelerometer
Intial(ADXL345_Address,0x2D,0x08); // set PWR
//Intial(ADXL345_Address,0x31,0x09); // set scale +/- 4g
Intial(ADXL345_Address,0x31,0x09);
delay(12);
Calibrating_Acc();
delay(5);
// initial gyroscope
Intial(ITG3200_Address,0x3E,0x82);
Intial(ITG3200_Address,0x15,0x09);
Intial(ITG3200_Address,0x16,0x1B);
Intial(ITG3200_Address,0x17,0x01);
delay(10);
Calibrating_Gyro();
delay(10);
// initial Digital compass
Intial(HMC5883L_Address,0x02,0x00);
delay(10);
// initial PWM and interrupt timer
}
void loop()
{
// Read sensor
AccelerometerRead();
GyroRead();
MagRead();
// Calculate
pitch_acc = atan2(sqrt(pow((AccY*1/128),2)+pow((AccZ*1/128),2)),(AccX*1/128))*RAD_TO_DEG - 90;
roll_acc = atan2(sqrt(pow((AccX*1/128),2)+pow((AccZ*1/128),2)),(AccY*1/128))*RAD_TO_DEG*-1 + 90;
delay(10);
Serial.println(AccX);
Serial.print("\t");
Serial.print(AccY);
Serial.print("\t");
Serial.println(AccZ);
delay(10);
}
void Intial(int16_t address, int16_t regiter, int16_t value)
{
Wire.beginTransmission(address);
Wire.write(regiter);
Wire.write(value);
Wire.endTransmission();
delay(10);
}
void Calibrating_Acc()
{
float AccX_caliba = 0;
float AccY_caliba = 0;
float AccZ_caliba = 0;
float output_x = 0;
float output_y = 0;
float output_z = 0;
for(int i=0; i<100;i++)
{
AccelerometerRead();
output_x += AccX;
output_y += AccY;
output_z += AccZ;
}
output_x /= 100;
output_y /= 100;
output_z /= 100;
AccX_caliba = -(output_x)/4;
AccY_caliba = -(output_y)/4;
AccZ_caliba = -((output_z-256))/4;
Intial(ADXL345_Address,0x1E,AccX_caliba);
Intial(ADXL345_Address,0x1F,AccY_caliba);
Intial(ADXL345_Address,0x20,AccZ_caliba);
}
void Calibrating_Gyro()
{
x_caliba = 0;
y_caliba = 0;
//z_caliba = 0;
for (int i=0; i<100; i++)
{
GyroRead();
x_caliba += GyroX;
y_caliba += GyroY;
//z_caliba += GyroZ;
}
x_caliba /= 100;
y_caliba /= 100;
//z_caliba /= 100;
}
void AccelerometerRead()
{
Wire.beginTransmission(ADXL345_Address); // address of the accelerometer
Wire.write(0x32); // set read pointer to data
Wire.endTransmission();
Wire.requestFrom(ADXL345_Address, 6);
// read in the 3 axis data, each one is 16 bits
int i = 0;
byte result[6];
while(Wire.available())
{
result[i] = Wire.read();
i++;
}
Wire.endTransmission();
AccX = ((result[1] << 8) | result[0]);
AccY = ((result[3] << 8) | result[2]);
AccZ = ((result[5] << 8) | result[4]);
}
void GyroRead()
{
Wire.beginTransmission(ITG3200_Address); // address of the gyro
Wire.write(0x1B); // set read pointer
Wire.endTransmission();
Wire.requestFrom(ITG3200_Address, 8);
int i = 0;
byte buff[8];
while(Wire.available())
{
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
GyroX = ((buff[2] << 8) | buff[3]);
GyroY = ((buff[4] << 8) | buff[5]);
//GyroZ = ((buff[6] << 8) | buff[7]);
//GyroTemp = (buff[0] << 8) | buff[1]; // temperature
}
void MagRead()
{
//Tell the HMC5883 where to begin reading data
Wire.beginTransmission(HMC5883L_Address);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();
//Read data from each axis, 2 registers per axis
Wire.requestFrom(HMC5883L_Address, 6);
if(6<=Wire.available())
{
MagX = Wire.read()<<8; //X msb
MagX |= Wire.read(); //X lsb
MagZ = Wire.read()<<8; //Z msb
MagZ |= Wire.read(); //Z lsb
MagY = Wire.read()<<8; //Y msb
MagY |= Wire.read(); //Y lsb
}
}
But the result in serial window is just like this:
3843.00 3587.00 3331.0
3843.00 3587.00 3331.0
3843.00 3587.00 3331.0
3843.00 3587.00 3331.0
(I cannot attach picture, something error).
I also try this code anyway
#include "Wire.h"
#define DEVICE (0x53)
byte byte1 = 0;
void setup(){
Wire.begin();
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
cbi(PORTC,5);
cbi(PORTC,4);
Serial.begin(115200);
}
void loop(){
Wire.beginTransmission(DEVICE);
Wire.send(0x00);
Wire.endTransmission();
Wire.requestFrom(DEVICE,1);
byte1 = Wire.receive();
Serial.println(byte1,HEX);
delay(2000);
}
It says to detech the REGISTERID every 2 seconds. But what I got is FF FF FF FF....
Is there anyone know that means? Or can help me with this? I have tried many open source code from internet, but I cannot make even accelero or gyro working. It always give zero results 0 0 0. I truly give up with this. Or maybe is there any chance that my IMU is broken? I really just bought it some days ago though..
Truly big thanks
Arduino & IMU - Newbie