Hi,
I have readed some posts with tilt measurement of ADXL335 accelerometer and i can't find the solution to calculate inclination angle.
Because i use Arduino Duemilanone with 3.3v and i read http://www.freescale.com/files/sensors/doc/app_note/AN3107.pdf, to calculate the inclination angle I have to use this formula:
angle=asin((Vout - 1650) / 330)
This is correct? I don't thing so, because the result is always 0.
Furthermore, my reads from x and y is about 324 and 345, so, with this values never i have a positive value.
Can you help me please, find the solution?
Thanks in advance.
This is correct? I don't thing so, because the result is always 0.
Furthermore, my reads from x and y is about 324 and 345, so, with this values never i have a positive value.
I'm guessing here that the "1650" is in millivolts, not raw ADC counts (0...1023).
Hi AWOL,
Thank you for your help... I think that i need explore more about reading analog values from Arduino. I think that the Arduinos Forum (http://didier.longueville.free.fr/arduinoos/?p=1389) will help me.
But... one more question. The raw values that i receive from X axis are:
-90º - 256
0º - 321
90º - 385
Is correct make a Lookup Table? I have to calculate the factor from 321 to 385 and from 321 to 256, and then make the calc.
Thank's again.
Depending on how accurate you need to be, you can start by assuming that your accelerometer's response is linear (it isn't) and use the map function thus:
angle=map(rawXAxisValue,256,385,-90,90)
May be sufficient, otherwise you will need better math or a lookup table as you suggest.
I am using the ADXL335 as well i go the code from somewhere else i forget where,
I am getting my readings, but they never reach 90 degrees in the X and Y...only goes up to the 87-88 area.
Is this due to the Min and MAx values i sub in?
If i dont have the exact range of the axis, then will this do this?
here is the calculations i use
Code:
//convert read values to degrees -90 to 90
int g0x;
int g0y;
int g0z;
g0x = ((maxValx - minValx)/2)+minValx;
g0y = ((maxValy - minValy)/2)+minValy;
g0z = ((maxValz - minValz)/2)+minValz;
int fx = (xRead - g0x);
int fy = (yRead - g0y);
int fz = (zRead - g0z);
float ax = fx*(3.3/(1024.0*((maxValx-minValx))/180)); //The 3.3V supply volt is divided by 1024 steps from the A/D converter. This value is divided by the sensitivity in X axis
float ay = fy*(3.3/(1024.0*((maxValy-minValy))/180)); //The 3.3V supply volt is divided by 1024 steps from the A/D converter. This value is divided by the sensitivity in Y axis
float az = fz*(3.3/(1024.0*((maxValz-minValz))/180)); //The 3.3V supply volt is divided by 1024 steps from the A/D converter. This value is divided by the sensitivity in Z axis
float rho = 0; //MyAngle in X Axis
float phi = 0; //MyAngle in Y Axis
float theta = 0; //MyAngle in Z Axis
rho = atan(ax/sqrt(pow(ay,2)+pow(az,2)))*(360/(2*3.1415)); //Calculate the X , Y ,Z angle.
phi = atan(ay/sqrt(pow(ax,2)+pow(az,2)))*(360/(2*3.1415)); // this used (360/(2*3.1415) to convert radians to degrees.
theta = atan(sqrt(pow(ay,2)+pow(ax,2))/az)*(360/(2*3.1415));
the sensitivity of the chip is
300mv per g TYP.
330mv per g Max