I'm using an XL335B accelerometer in a GY-61 breakout board. I'm powering the device using the UNO's built-in 3.3V power supply. The following code should convert the readings to m/s² (SI); however, it returns (-0.43|-0.52|-5.83) instead of the expected (0|0|-9.81) when lying untouched.
Code:
const float CYCLE_LENGHT_MILLIS = 1000;
// REFERENCE_VOLTAGE 5 & STEP_COUNT 1024
// => VOLTAGE_STEP 0.0048828125
// MAX_ACC_VOLTAGE 3.3
// => MAX_ACC_VOLTAGE_STEP 675.84
// MIN_ACC_VOLTAGE 1.65 = 0.5 MAX_ACC_VOLTAGE
// => MIN_ACC_VOLTAGE_STEP 337.92
// MAX_ACC_MEASUREMENT 29.43 = 3g
// acceleration = (read()-MIN_ACC_VOLTAGE_STEP) * MAX_ACC_MEASUREMENT/(MAX_ACC_VOLTAGE_STEP-MIN_ACC_VOLTAGE_STEP)
//This can be simplified to: acceleration = read()*j - k
// => j = MAX_ACC_MEASUREMENT / (MAX_ACC_VOLTAGE_STEP-MIN_ACC_VOLTAGE_STEP)
// => k = MIN_ACC_VOLTAGE_STEP * j
const float j = 29.43/(675.84-337.92);
const float k = 337.92*j;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("(");
Serial.print(analogRead(0) * j - k); //X-AXIS
Serial.print("|");
Serial.print(analogRead(1) * j - k); //Y-AXIS
Serial.print("|");
Serial.print(analogRead(2) * j - k); //Z-AXIS
Serial.println(")");
delay(CYCLE_LENGHT_MILLIS);
}
(analogRead(0) - k) * j
?(analogRead(0)-337.92)/61.44
(337.92 is the 0g voltage in steps; 61.44 is 0.3V is steps)