salve a tutti ho utilizzato dopo alcune prove LSM303 per creare la bussola compensata , ho fatto la taratura e tuttosembra funzionare correttamente...
Ora volevo utilizzare lo stesso LSM303 anche per creare l'inclinometro, ma non trovo documentazione a riguardo, mi serviva per sapere in Gradi l'inclinazione di X.
qualcuno potrebbe aiutarmi?
uwefed
September 30, 2017, 7:32pm
2
L' accelerometro misura i 1g (ca 9,81 m/s^2) del accelerazione terrestre con i 3 vettori x,y e z. Visto che sai che la somma vettoriale é 1g é facile con 2 funzioni di trigonometria calcolare l' inclinazione del sensore.
La trigonometria, dal greco trígonon (τρίγωνον, triangolo) e métron (μέτρον, misura), quindi 'risoluzione del triangolo', è la parte della matematica che studia i triangoli a partire dai loro angoli. Il compito principale della trigonometria, così come rivela l'etimologia del nome, consiste nel calcolare le misure che caratterizzano gli elementi di un triangolo (lati, angoli, mediane ecc.) partendo da altre misure già note (almeno tre, di cui almeno una lunghezza), per mezzo di speciali funzioni....
Ciao Uwe
Grazie Uwe, condivido il mio studio trigonometrico con la comunity...
per chi avesse la stessa mia esigenza... ecco delle formule ed uno sketch funzionante.
#include <Wire.h>
#include <LSM303.h>
LSM303 compass;
int xmin=-412;
int xmax=+622;
int ymin=-595;
int ymax=+365;
int zmin=-1114;
int zmax=-115;
void setup()
{
Serial.begin(9600);
Wire.begin();
compass.init();
compass.enableDefault();
compass.m_min = (LSM303::vector<int16_t>){xmin, ymin, zmin}; //inserisci i valori min risultanti dalla calibrazione.
compass.m_max = (LSM303::vector<int16_t>){xmax, ymax, zmax}; //inserisci i valori min risultanti dalla calibrazione.
}
void loop()
{
compass.read();
// converto il tutto in range da -90 a +90 gradi
int xAng = map(compass.a.x, -412, +622, -90, 90);
int yAng = map(compass.a.y, -595, +365, -90, 90);
int zAng = map(compass.a.z, -1114, -115, -90, 90);
// converto in gradi
int beccheggio = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
int rollio = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
if (beccheggio > 180) {
beccheggio = beccheggio - 360;
}
if (rollio > 180) {
rollio = rollio - 360;
}
Serial.println("Calcolo Angoli Beccheggio,\t Rollio");
Serial.print(beccheggio );
Serial.print("\t");
Serial.println(rollio);
delay(500);
}