Modulo accellerazione triassiale ADXL330

Ho questo modulo :

Purtroppo lavora con tensioni a 3 volt ..... mentre il mio Arduino 2009 a 5V.

Come si fa a ad acquisire un valore coerente? Come si fa ad ottenere
valori espressi in G?

saluti
Drake

leggendo rapidamente il datasheet:
quando la tensione letta è pari a Vcc / 2 vuol dire 0G, ogni incremento/decremento di Vcc/10 significa rispettivamente +/- 1G

io con un pin leggerei la Vcc che alimenta il sensore (es. analog_0) e con un altro pin leggerei la tensione di uscita del sensore (es. analog1). Poi il calcolo viene:

G = (analog_1 - (analog_0 / 2) ) / (analog_0 / 10)

Non capisco per quale motivo devo mettere il pin_anlog_0 su Vcc visto che questa tensione è una costante.

Poi c'è da dire una cosa .... il manuale del sensore dice che l'alimentazione è 3,3 volt ma il modulo ha un regolatore che 5V trasforma a 3.3volt.... Le 3 uscite invece sono a 3,3 volt e questo complica un poco le cose.

infatti se applico la formula che mi hai dato :

G = (PinAccZ - (3 / 2) ) / (3 / 10) ottengo sempre lo stevvo valore ... fisso a -1

ho visto adesso che c'è uno zener che limita la tensione sull'alimentazione del sensore (non è proprio un regolatore).

il datasheet del sensore dice che la tensione di uscita è raziometrica (cioè è proporzionale alla tensione di alimentazione). Sul PinAccZ (direttamenta dall'ADC) che valori leggi? Non è che il -1 è corretto (asse "zeta" rivolto verso cielo)?

ciao frog
Se guardi bene la tensione di alimentazione va sui operzionali e il zener fa da stabilizzatore da 3V per l'integrato adxl330.

Per aumentare la risolzione del arduino puoi variare la tensione di riferimento del convertitore ADC. Devi mettere per esempio 3,3V sul pin Vref e usare la funzione analogReference() - Arduino Reference

Ciao Uwe

FROG : io leggo 470 quando l'asse Z è rivolta verso l'alto.

uwefed : Scusami ma qual'è il pin Vref ?

drake

uwefed forse ho capito.......

devo mettere un ponticello dal pin 3,3v e il pin Vref e poi nel setup()
aggiungo questa riga?

analogReference(EXTERNAL)

Non funziona!
ho provato a mettere un ponticello tra il pin 3V3 e il pin AREF e ho aggiunto nella funzione Setup() il comando :

analogReference(EXTERNAL);

Adesso ricevo 1023 fissi su tutti e 3 i canali che rappresenta il valore massimo per l'adc.

Ma dove sbaglio ?

drake

@uwefed
ho guardato lo schema dopo il datasheet

@drakelive
la formula è sbagliata, devi utilizzare
G = (PinAccZ - (614 / 2) ) / (614 / 10)
(3Vdc sono 614 bit con un riferimento di 5Vdc)

i conti comunque non tornano perché con 470 verrebbe 2,65G

secondo me il riferimento a 5V può andare bene per il momento, visto che in questo modo hai una risoluzione di 0,016G

prova a fare qualche prova ruotando il sensore e posta i risultati

ciao drakelive

come detto nel altro tread:
Collega la schedina del sensore direttamente alla massa e ai 5V e non usare uscite del arduino come alimentazioni.

La schedina é messa in orizontale:
La sensibilitá del sensore é 300mV/g
Il valore di tensione in uscita a 0g (vale per le assi x e y se il sensore é fermo) e con alimentazione a 3V é 1,5V (+/- 0,3V di tolleranza)
Per l' asse z misuri da fermo 1g dato dall' accelerazione gravizionale della terra. Questo corrisponde a 1,8V oppure se capovolto 1,2V (+/- 0,3V di tolleranza). Se giri il sensore di 90 gradi (che la schedina é in verticale) il valore asse z dovrebbe essere 1,5V (+/- 0,3V di tolleranza).

La tolleranza é data da tolleranze di fabricazione e dovrebbe essere costante nel tempo per quel esemplare di ADXL330.

con Vref =5V
1,5V dovrebbe essere in lettura ADC 307
1,8V dovrebbe essere in lettura ADC 368
1,2V dovrebbe essere in lettura ADC 245

con Vref =3,3V
1,5V dovrebbe essere in lettura ADC 465
1,8V dovrebbe essere in lettura ADC 558
1,2V dovrebbe essere in lettura ADC 372

correzione fatta in un secondo momento: I g si calcolano per Vref=5V: g= (ADC - 465 307)* (5V/1023) / 0,3V/g
formula: (valore letto meno valore a zero g) * (voltaggio per ogi incremento di ADC) diviso per la sensibilitá del sensore (che sono 300mV/g).

@ frog
La tua formaula é anche sbagliata.
Il adxl330 da una tensione di zero ( con un accelerazione di 0g) di 1,5 +/- 0,3V.
470 sono abbastabnza precisamente 0g se Vref é 3,3V.

http://www.analog.com/static/imported-files/data_sheets/ADXL330.pdf

Ciao Uwe

c'è qualcosa che non mi torna.
parlando in analogico l'accelerazione si calcola:
g = (v_sensore - 1,5V) / 0,3V
se ci riferiamo all'acquisizione dell'ADC invece:
g = (ADC_sensore - (1,5 / Vref * 1023)) / (0,3 /Vref * 1023)
giusto?

edit: avevo dimenticato due parentesi

ciao frog

considerando che l'integrato che hai legge lo zero 1,5V e che Vref sia 5V:

"g = (v_sensore - 1,5V) / 0,3V" Giusto

g = (Tensione misurata meno tensione) zero diviso sensibilitá; Giusto

"g = (ADC_sensore - (1,5 / Vref * 1023)) / (0,3 /Vref * 1023)"

Si deve tutto tradurre in ADC che poi dipendono dalla tensine di riferimento ADC.

g = (ADC_sensore - ((1,5V * 1023 )/ 5V )) / ((0,3* 1023) /5V ) Sí, la formula é giusta; era sbagliata nella mia precedente il valore di zero von Vref di 5V; avevo preso quello a Vref =3,3V.
Senó le formule sono le stesse.

Ciao Uwe

ok.
rimaniamo in attesa di qualche altra prova di drakelive (è lui che ha il sensore)

Mi sono un perso tra i numeri :smiley:

Allora vediamo di fornire un po di dati.
Stasera ho montato il sensore su una scheda figlia da inserire sopra
al mio Arduino 2009 almeno rimane fermo e si possono fare tutte le
prove di accelerazione possibili.

In questo montaggio ho seguito i vostri consigli ovvero ho utilizzato i
pin di alimentazione +5V e di GND presenti sul connettore evitando di utilizzare i pin Analogici. AREF adesso è a 5V.

Mettendo a 1G l'asse Z e a zero gli altri due ottengo questi valori :

AsseX = 375 ---> 1,75v
AsseY = 375 ---> 1,75v
AsseZ = 433 ---> 2,12v

Secondo voi può andare bene?

Saluti
Drake

si, lo zero è a 1,75V poco più del previsto, 1G vale 0.37V, anche qui poco più del previsto (0,3V), ma direi che ci siamo! oserei dire che l'errore è proporzionale, forse i valori son grandi perché stai alimentando il sensore a 5V?

qualche domanda che non centra quasi nulla, ma i valori che leggi sono stabili o "saltellano", in questo caso di quanto variano da fermo? l'accelerometro risponde in fretta alle sollecitazioni? ;D

@ lesto;
la schedina ha un "alimentatore" 3V fatto da un diodo zener per alimentare il adxl330.
Ciao Uwe

Per LESTO :

Ovviamente i valori saltellano. In condizione di quiete, ottenuta
posizionando Arduino e modulo connesso su di un mobiletto staccato
dalla scrivania di lavroro i valori oscillano di +- 2 punti.

La sensibilità è molto alta .... se tengo il sensore sulla scrivania riesce
a rilevare il rumore delle ventole del portatile e se appoggio le mani
sulla scrivania il fenomeno amumenta particolarmente (forse le pulsazioni del sangue ) .

A questo punto qualcuno potrebbe rispiegarmi la formula per convertire i valori letti in G e ricavare da questi valori l'inclinazione in gradi del modulo ? A tal fine ho trovato in internet questo codice..... la prima parte non mi è parecchio chiara ma credo che sia la formula di conversione dei campioni letti dall'ADC in G :

div_x = (float)(meas_x-zeroG_x) / (oneG_x-zeroG_x ); // G
x_rad = asin( div_x ); // x angle in radians
x = (x_rad*180) / 3.14; // x angle in degrees

Saluti

piccolo errore:
sull'asse x e y hai 375 o 357? perché i volt converiti non tornano con il 375

per convertire la tensione in G si fa così:
(v_letta - V_a_zero_g) / delta_v_su_1g
nominalmente sarebbe
(v_letta - 1,5) / 0,3

lesto, utilizzando i tre dati in volt che hai segnalato, ha calcolato i valori reali: 1,75V con zero G (asse x e y) 2,12 con 1 G (asse z) e viene la seguente formula
G= (v_letta - 1,75) / 0,37

ti consiglio di lavorare direttamente con i bit dell'ADC, così non ti perdi torncamenti e il calcolo è più veloce
G = (ADC_letto - a) / (b - a)
a = valore letto dall'asse x con zero G
b = valore lello dall'asse z con 1 G

div_x = (float)(meas_x-zeroG_x) / (oneG_x-zeroG_x ); // G
x_rad = asin( div_x ); // x angle in radians
x = (x_rad*180) / 3.14; // x angle in degrees

la prima riga è il calcolo dell'accelerazione.
la seconda è trigonometria: l'angolo di inclinazione del sensore è l'arcoseno (funzione inversa del seno) dell'accelerazione misurata lungo l'asse z del sensore
la terza riga è la conversione da radianti a gradi

piccolo errore:
sull'asse x e y hai 375 o 357? perché i volt converiti non tornano con il >375

Per l'esattezza ti confermo che sia l'asse x che quello y restituiscono 376
mentre l'asse Z che risulta essere a 1G è a 433.
Ti ricordo che la Aref è a 5 Volt.