Interpretazione libreria

Buon giorno. Chiedo a tutti una mano sull'interpretazione di questa libreria:

Vorrei capire in particolare cosa fa la funzione. In particolare nell'acquisizione dei valori come si comporta?

La devi "interpretare" partendo dal componente --> https://www.sparkfun.com/datasheets/Components/General/MMA7361L.pdf
Poichè quell'accelerometro ha in uscita tre segnali analogici (X, Y e Z), la libreria legge i valori delle accelerazioni con l'analogRead e li converte in dati utilizzabili.

io vorrei capire solo se la libreria effettua una manipolazione del segnale.

Cioè c'è un qualcosa che media il valore che acquisisco?

se io faccio una serie di acquisizioni in loop come faccio a capire con quale frequenza sto acquisendo i dati?

Se non ci fosse alcuna media dei valori acquisiti avrei più o meno una stima di questa frequenza di acquisizione grazie al delay che impongo io.

In realtà a quanto pare c'è una media sui valori che l'accelerometro acquisisce!

Non era con te che ne avevamo già parlato e ti avevo detto di guardare DENTRO la libreria per vedere quello che fa ?

Se prendi il file AcceleroMMA7361.cpp e lo studi ... capisci come funziona ...
... e scopri che hai TRE possibili tipi di acquisizione per ogni canale: 1. RAW; 2.Volt; 3. Accel.

Le prime due fanno usa sola lettura, la terza effettua la media di "_average" elementi dove, per default, "_average" vale 10.

Per l'asse X (... ma, ovviamente, ci sono anche per Y e per Z) i metodi che devi studiarti sono :

  1. int AcceleroMMA7361::getXRaw()
  2. int AcceleroMMA7361::getXVolt()
  3. int AcceleroMMA7361::getXAccel()

Guglielmo

Si Guglielmo ne avevamo parlato. Ma ho preferito aprire un altro post in quanto in quel caso ci stavamo concentrando più sui tempi di acquisizione che sul “come vengono acquisiti i dati” solo per questo ho deciso di riaprire un nuovo post.

Ok ora ci sono! Grazie
Nel caso della media me lo dice qui:

/// getXAccel(): Returns the acceleration of the X-axis as a int (1 G = 100.00)
int AcceleroMMA7361::getXAccel()
{
  int sum = 0;
  for (int i = 0;i<_average;i++)
  {
    sum = sum + _mapMMA7361G(getXRaw());
  }
  return sum/_average;
}/// getXAccel(): Returns the acceleration of the X-axis as a int (1 G = 100.00)
int AcceleroMMA7361::getXAccel()
{
  int sum = 0;
  for (int i = 0;i<_average;i++)
  {
    sum = sum + _mapMMA7361G(getXRaw());
  }
  return sum/_average;
}

mentre nel caso di getRaw e quindi senza media ne parla qui:

/// getXRaw(): Returns the raw data from the X-axis analog I/O port of the Arduino as an integer
int AcceleroMMA7361::getXRaw()
{
  return analogRead(_xPin)+_offSets[0]+2;
}

Ovviamente dei due preferirei utilizzare il getRaw. Infatti con questa funzione dovrei avere un maggior controllo sui tempi di acquisizione.

Almeno in teoria.

la getRaw da dei valori in unità di misura uguali alla getAccel? In quest’ultima mi da ad esempio un intero 100=1G

sossio89:
la getRaw da dei valori in unità di misura uguali alla getAccel? In quest'ultima mi da ad esempio un intero 100=1G

... perdona, ma se esamini il codice VEDI chiaramente che mentre nella getRAW ti viene semplicemente ritornato :

return analogRead(_xPin)+_offSets[0]+2;

... nella getAccel viene preso il valore della GetRAW e viene dato in pasto alla funzione _mapMMA7361G():

sum = sum + _mapMMA7361G(getXRaw());

... ed il risultato di ciò viene accumulato e poi viene fatta la media, per cui, suppongo ... ritornano cose differenti.

Devi vedere cosa fa quella _mapMMA7361G() ... ::slight_smile:

Guglielmo