Inclinometro con ADXL335: come migliorare?

SCOPO:
misurare l’ibardata di un corpo che giace su di un piano ortogonale al terreno (es. una finestra). L’asse z punta contro l’osservatore mentre x e y giacciono paralleli al piano/finestra.
HARDWARE:
ADXL335, accelerometro analogico 3v, ±3g, 3 assi.
(datasheet: https://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf)
TECNICA:
calcolo dell’arcotangente tra x e y e uscita del valore in gradi (0-360)
DOMANDE:
Il programma è scritto bene ed in maniera essenziale? con questo settaggio hardware e software, sto già ottenendo il massimo della risoluzione e della sensibilità possibili?

PROGRAMMA:
/////////////////////////////////////////////////

/////////////////
//ADXL335, il programma legge gli assi x e y e restituisce l'angolo di imbardata (phi)
//Nota: l'ADXL è montato con il piano del chip ortogonale al piano terrestre, l'imbardata è intesa considerando tale piano di riferimento.
//////////////////////////////////////////////////////////////////

//Analog read pins
const int xPin = A0;
const int yPin = A1;
const int zPin = A2;

//Taratura: i valori vanno settati ricercando manualmente i minimi e i massimi
int minValx = 398;
int maxValx = 598;
int minValy = 393;
int maxValy = 593;

//to hold the caculated values
double phi;

void setup(){
  Serial.begin(9600);
  analogReference (EXTERNAL); //L'ADXL esce i valori in un range di 0-3000mV. L'ADC di arduino legge gli Analog e                                                    // li confronta su una scala 0-5000mV. 
                                                   //per perdere minor risoluzione possibile si cambia il range di riferimento dell'ADC                                                    // con la funzione analogReference() e
                                                 //si collega una tensione regolata vicina ai 3V su AREF (es. 3v3 di Arduino).
}


void loop(){

  //read the analog values from the accelerometer
  int xRead = analogRead(xPin);
  int yRead = analogRead(yPin);

  //convert read values to degrees -90 to 90 - Needed for atan2
  int xAng = map(xRead, minValx, maxValx, -90, 90);
  int yAng = map(yRead, minValy, maxValy, -90, 90);

  //con l'arcotangente 1)posso sapere in quale quadrante mi trovo e 2)linearizzo (rendo costante) la sensibilità interpolando le singole sensibilità di x e y
  //57,2957795 è il fattore di conversione rad/gradi, necessario perchè atan2 esce i valori in radianti.
  //arctan spazza da -180 a 180, sposto l'intervallo a 0->360 addizionando 180
  [/color]
[color=navy]phi =  (57.2957795* (atan2(-yAng, xAng)))+180; //imbardata

  //Output the caculations
  Serial.print("xRead: ");
  Serial.print(xRead);
  Serial.print(" | xAng: ");
  Serial.print(xAng);
  Serial.print(" | yRead: ");
  Serial.print(yRead);
  Serial.print(" | yAng: ");
  Serial.print(yAng);
  Serial.print(" | phi: ");
  Serial.println(phi);
  delay(200);
}[/color]

Prima di tutto, essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie,

Guglielmo

Sicuro che Atan2 vuole i parametri in grado?

flz47655:
Sicuro che Atan2 vuole i parametri in grado?

Non so. Quasi tutto il codice è stato preso altrove. Tuttavia sembra non ho incontrato problemi di sorta con atan2.

atan2 vuole delle cordinate cartesiane X e Y di un vettore e ti ritorna l'angolo del vettore.
La domanda era ironica.

Mappi X e Y in [-90 : +90] ma non sono gradi, i commenti sono fortemente da rivedere secondo me.
Poi perché la taratura fatta così?

In sostanza il codice NON è fatto bene e con arrotondamenti vari non ti da la massima risoluzione.

flz47655:
Mappi X e Y in [-90 : +90] ma non sono gradi, i commenti sono fortemente da rivedere secondo me.

flz47655:
Poi perché la taratura fatta così?

Ho preso i pezzi da questo codice:

La taratura cos'ha che non va? ruoto a mano l'acc e col Serial.begin mi segno il valore minimo (-1g) e il massimo (1g) in modo da avere una scala.

flz47655:
In sostanza il codice NON è fatto bene e con arrotondamenti vari non ti da la massima risoluzione.

Effettivamente mappando x e y in +-90 perdo una 20ina di valori in risoluzione (x e y spazzano tra 200 valori).

Rimango in attesa di delucidazioni, e nel frattempo grazie.

Consiglio, prova a ragionare sul tutto e riscrivere da solo del codice.
Sono sicuro che verrà fuori qualcosa di meglio di quella cosa scopiazzata.

Sopratutto non serve a nulla usare la tangente, il valore di inclinazione degli assi, ricavato tramite variazione gravitazionale, è dato semplicemente dal arcoseno/arcocoseno del valore letto tra 0 e 1 G come float, rammento che le funzioni trigonometriche lavorano con i radianti, se servono i gradi i valori vanno convertiti.
La tangente si usa per conversione tra polari e rettangolari e in questo caso non serve a nulla visto che parliamo di un inclinometro.