Con il solo accelerometro (quindi senza una bussola) e' possibile tuttavia avere le informazioni di inclinazione dell'accelerometro in Pitch e Roll (Yaw non e' possibile perche' il calcolo richiede la scomposizione del vettore di accelerazione di gravita' e quindi la rotazione sul piano ortogonale al vettore gravita' non e' registrabile)
Sfruttando questo post ho provato a fare la stessa cosa con un ADXL335
Nel post e' peraltro interessante l'uso di un filtro passa basso.Agendo sul parametro alpha si puo' ottenere un filtraggio meno (con numeri vicini a 1) o piu' aggressivi (con numeri dell'ordine di 0.1)
A sensore fermo la misura oscilla con filtro a 0.4 di circa
---------------------------------------------------------------------------
const float alpha = 0.5;
double fXg = 0;
double fYg = 0;
double fZg = 0;
double Xg = 0;
double Yg = 0;
double Zg = 0;
void setup()
{
Serial.begin(9600);
delay(100);
}
void loop()
{
double pitch, roll, Xg, Yg, Zg;
Xg = (analogRead(A5)*(5.0/1023.0))-1.59;
Yg = (analogRead(A4)*(5.0/1023.0))-1.60;
Zg = (analogRead(A3)*(5.0/1023.0))-1.67;
Xg = 9.8*(Xg/0.33);
Yg = 9.8*(Yg/0.33);
Zg = 9.8*(Zg/0.33);
//Low Pass Filter
fXg = Xg * alpha + (fXg * (1.0 - alpha));
fYg = Yg * alpha + (fYg * (1.0 - alpha));
fZg = Zg * alpha + (fZg * (1.0 - alpha));
//Roll & Pitch Equations
roll = (atan2(-fYg, fZg)*180.0)/M_PI;
pitch = (atan2(fXg, sqrt(fYg*fYg + fZg*fZg))*180.0)/M_PI;
Serial.print(pitch);
Serial.print(":");
Serial.println(roll);
delay(100);
}
---------------------------------------------------------------------------
Nessun commento:
Posta un commento