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:
/////////////////////////////////////////////////
code: [select]
/////////////////
//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: valori vanno settati ricercando manualmente minimi e massimi
int minvalx = 398;
int maxvalx = 598;
int minvaly = 393;
int maxvaly = 593;

//to hold caculated values
double phi;

void setup(){
  serial.begin(9600);
  analogreference (external); //l'adxl esce 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 analog values accelerometer
  int xread = analogread(xpin);
  int yread = analogread(ypin);

  //convert read values degrees -90 90 - needed 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 valori in radianti.
  //arctan spazza da -180 180, sposto l'intervallo 0->360 addizionando 180
  [/color]
[color=navy]phi =  (57.2957795* (atan2(-yang, xang)))+180; //imbardata

  //output 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 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 sinistra).

grazie,

guglielmo


Arduino Forum > International > Italiano > Software (Moderator: leo72) > Inclinometro con ADXL335: come migliorare?


arduino

Comments

Popular posts from this blog

Error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode - Raspberry Pi Forums

class MPU6050 has no member named begin

missing filename after '-o'