Ardu-Aquarium Controller v. 3.3.1

Ma la RRef te la sei calcolata? non la riporti nei tuoi esperimenti, invece è un fattore fondamentale, perché in pratica stabilisce il punto di partenza del tuo sensore.
La tua tabella è fatta bene, ma io come la leggo? alla prima riga quei 686 e 402 sono dei valori che corrispondono ai livelli minimo e massimo, ma la loro unità di misura qual'è? e dove rilevi questi valori?
Come detto non sono praticissimo di op-amps, sicuramente quel circuito è un amplificatore differenziale, ma i componenti devono essere correttamente "tarati", altrimenti puoi avere comportamenti strani in uscita.

Ciao,
La RRef, l'ho misurata, così come la RSens, anche se sul datasheet la danno per 1,5k bho!!!
Mentre i valori di cui parli li leggo in analogread() perdonami, dovevo specificarlo :blush:

byte levelsensor = A0; 
int levelvalue = 0;
void setup() {
   Serial.begin(9600);  
}

void loop() {

  levelvalue = analogRead(levelsensor);    
  Serial.println(levelvalue);
            
}

Nel file in allegato, c'è un circuito che sfrutta un operazionale, ma utilizzando "virtual ground", da quello che ho capito però serve per gli operazionali a doppia alimentazione...

Riccardo

eTape_AppNotes.pdf (512 KB)

Che vuol dire che la RRef l'hai misurata?
Non è una resistenza di riferimento che devi scegliere tu?
Puoi mettere un link al datasheet del tuo sensore?
Infine, affinché possa capirci qualcosa, prendiamo p.es. la riga con R1-R2 = 1k5, i due valori 587 e 309 li stai leggendo col micro all'uscita dell'op amp con l'analogRead? ed invece i due valori 2,00 e 0,97 che sono? Di sicuro non una corretta conversione delle letture analogiche in Volt.
L'altro circuito lascialo stare, questo deve funzionare; vuoi fare una prova semplicissima, abbandonando un attimo questo tuo circuito?
0 - predisponi il sensore come in quello schema: R1 da 1k5 tra +5 e sensore, l'altro capo del sensore a GND, il punto in comune è l'uscita del sensore.
1 - collega l'uscita del tuo sensore al + dell'op-amp
2 - metti una R da 10k tra il - dell'op-amp e GND
3 - metti una R da 22k tra il - e l'uscita dell'op-amp
4 - misura con un multimetro la tensione che hai all'uscita del sensore: p.es. 1V
5 - sull'uscita dell'op-amp dovresti trovarti tale tensione moltiplicata x3,2, quindi appunto 3,2V
Vediamo i valori minimo e massimo che escono; non so nemmeno se il sensore lavora in "positivo" o in "negativo", ma la cosa non dovrebbe cambiare, al massimo invertiamo di posizione R1 e sensore.

Michele, grazie infinite :slight_smile:

Ecco il link: http://www.milonetech.com/uploads/eTape_Datasheet_12110215TC-8.pdf
Come vedi la Rref è fissa, i valori sono letti in analogread all'uscita dell'operazionale ed anche i voltaggi li ho misurati li, ora non posso fare la prova che mi chiedi, ma appena posso ti aggiorno.
Grazie ancora.

Riccardo

P.S. Hai visto i link delle videolezioni?

di nulla, speriamo invece di risolvere :~
allora ora ho capito, la RRef è interna al sensore è serve per l'eventuale compensazione di temperatura, quindi il circuito originale lo devi sfruttare mettendo R1-R2 a 1,5kohm.
Invece tornando alla nostra prova, rispetto a quanto ti ho detto devi invertire R1 e sensore, visto che dal ds si evince che lavora in negativo (la resistenza diminuisce all'aumentare del livello).

I link non li ho guardati, purtroppo sono a corto di tempo e devo finire al più presto un progetto, quindi a parte qualche intervento sul Forum, ogni secondo libero lo dedico lì. Fai una cosa, intervieni in Link utili e mettili lì come suggerimento, così mi resta come promemoria. :wink:

Ho trovato un po' di tempo, ed ho montato il circuito che mi hai suggerito, ma sul Vout dell'operazionale ho senpre 0,0 V, in ogni caso le misurazioni in uscita dal sensore sono:
con il sensore verso massa e R1 a +5v ho in uscita dal sensore V-livmax= 2,17 V-livmin = 4,13
con il sensore verso +5v e R1 verso massa ho in uscita dal sensore V-livmax = 4,94 V-livmin = 3,08

In più mi si è scaricata la batteria del multimetro :~

:frowning:

Più tardi mi rimetto all'opera

Col partitore fatto con una resistenza da 1.5K e il sensore a vuoto (resistenza dichiarata al livello minimo = 1.5K) dovresti avere dimezzata la Vin. Quindi se gli dai 5V in uscita dovresti ottenere 2.5V.
Che misure ottieni con un semplice partitore?

Ciao Paolo,
le resistenze misurate sia la Rref che Rsens a vuoto, sono malgrado il datasheet, di 2K e come dici tu in configurazione partitore, ho 2,5v sia calcolati che misurati :relaxed:

Puoi chiarire la cosa.
Se misuri a vuoto la Rsens hai 2Kohm. Se fai un partitore con una resistenza da 1.5Kohm ottieni 2.5V in uscita?
Dovresti avere 2.14. :roll_eyes:

A meno che non hai misurato la resistenza a vuoto ed il partitore in acqua col livello minimo.
Puoi essere che la Rsens asciutta valga 2K e bagnando il sensore al livello minimo scenda subito a 1.5K, ma mi pare strano visto che nella pagina evidenzia un andamento lineare.

Calcolatore per op-amp --> http://www.daycounter.com/Calculators/Op-Amp/Op-Amp-Voltage-Calculator.phtml

Si scusami, hai ragione,
avendo misurato entrambe le resistenze del sensore all'asciutto, ma anche a livello minimo, ed avendole trovate uguali, le ho messe in configurazione partitore e ho fatto le misurazioni ottenendo appunto 2,5v
Ora ho provato anche con una r da 1K5 e misuro 2,1v su questa e 2,85 sulla Rsens ma il mio multimetro non è un granché, comunque direi che è come dici tu

Grazie PaoloP

Riccardo

riciweb:
Ho trovato un po' di tempo, ed ho montato il circuito che mi hai suggerito, ma sul Vout dell'operazionale ho senpre 0,0 V, in ogni caso le misurazioni in uscita dal sensore sono:
con il sensore verso massa e R1 a +5v ho in uscita dal sensore V-livmax= 2,17 V-livmin = 4,13
con il sensore verso +5v e R1 verso massa ho in uscita dal sensore V-livmax = 4,94 V-livmin = 3,08

Ma se hai tensioni così alte all'uscita del sensore l'op-amp se ne va in saturazione; a questo punto non ti serve amplificare il segnale, semmai lo riduciamo ;). Comunque ogni misurazione va fatta in condizioni ideali, altrimenti c'è troppo casino: come dice Paolo, il sensore avendo 1,5k all'asciutto, con una R di pari valore in partitore ti dovrebbe fornire sempre 2,5V, a prescindere dalla posizione del sensore e della R1, invece i valori da te misurati fanno comprendere che la resistenza del sensore sia molto più elevata, e così non andiamo da nessuna parte.
Cerca di capirmi, un partitore fatto da due R da 1,5k divide la tensione esattamente a metà, cioè 5:2=2,5V; in queste condizioni, che il sensore sia collegato a massa o a 5V è come se tu invertissi tra loro due R uguali, quindi dovresti avere sempre 2,5V come livello minimo; invece cambia il livello massimo, poiché la R tende a 0 all'aumentare del livello, possiamo considerare che ad un certo punto sia così bassa da far misurare una tensione prossima al punto in cui è collegata; cioè se la Rsens è collegata verso GND, tu avrai una variazione tra 2,5V (liv. minimo) e 0V circa (liv. massimo), viceversa avrai una variazione tra 2,5V (SEMPRE liv. minimo) e 5V circa (liv. massimo).
Bene, se riesci ad ottenere queste condizioni allora possiamo proseguire in un ragionamento, in caso contrario non ne usciamo.

Rici, se hai misurato 2K a vuoto allora usa solo resistenze da 2K per l'operazionale. Altrimenti sballa il valore.
Quelle da 1k5 rimettile nel cassetto.
Che poi da 2 mi sa che non ci sono. Ho hai 1.8 o 2.2 :~

Scusatemi tutti e due, più cerco di fornire tutte le informazioni, più perdo in chiarezza,
malgrado ciò che dice il datasheet, sia Rsens che Rref, hanno valore 2k misurati con il multimetro, ed in modalità partitore, con Vcc di Arduino 5v ho appunto 2,5v sul vout, questa condizione, si verifica con sensore sia con acqua a livello minimo che all’asciutto, se poi porto l’acqua a livello massimo ossia 20cm, allora la lettura in volt sul vout, sempre in modalità partitore, scende a 1,25v, (Rsens circa 670 Ohm) quindi con il partitore, la tensione dal livello minimo al livello massimo ha una variazione di 1,25v, questa variazione si traduce in appena 278 rampe in analogread() in particolare leggo al minimo 790 ed al massimo 512.
Mi piacerebbe, aumentare il divario di lettura tra livello minimo e massimo, amplificando il segnale, in modo da ottenere più rampe ed ottenere una migliore definizione del sensore è possibile farlo?
Ora è tardi, ma domani appena posso inverto Rsens e Rref e rifaccio le misurazioni.

PaoloP:
Rici, se hai misurato 2K a vuoto allora usa solo resistenze da 2K per l'operazionale. Altrimenti sballa il valore.
Quelle da 1k5 rimettile nel cassetto.
Che poi da 2 mi sa che non ci sono. Ho hai 1.8 o 2.2 :~

OK, ho quelle da 2,2k vedrò di usare quelle, ma dovrei prima capire come... :blush:

Grazie infinite a tutti e due.

Riccardo

Secondo me stai anche facendo un po' di casino con i circuiti, Paolo sta seguendo l'originale che a me, per il momento, sembra un po' troppo impegnativo, visto che la RRef serve per compensare le variazioni di temperatura e per aumentare la precisione di lettura, ma ora hai da risolvere un problema diverso, semmai poi si può riprendere il discorso.
Io per ora ti consiglio di trattare questo sensore come una banale resistenza variabile, visto che i valori in tensione sono molto alti. Tu hai un range di lettura di circa 1,25V, e le rampe sono esattamente 255, non so come ti sei calcolato questo 278.... Se imposti l'ARef su External e gli fornisci 3,3V già le tue rampe salgono a 390. Se non ti bastano puoi usare uno di quegli integratini (sono in formato TO-92, tipo transistor, io ho preso l'intera serie...) che fanno da riferimento di tensione fissa; ora non ricordo esattamente ma dovrebbe esistere la versione a 2,1V, sicuramente c'è la 2,5V. Nel caso peggiore le rampe aumentano a 520. Infine potresti usare l'RRef interna a 1,1V, che significa che ti perdi la parte "alta", il sensore somincia a funzionare a più o meno 18cm di livello, oltre avrai sempre lettura 1023. Per questo tipo di uso non dovremo fare altro che calcolare un semplice partitore, lasciando stare op amp e altro, per rientrare nel range di RRef scelto.
Quindi ora devi prendere una decisione, o insisti con l'op-amp e segui i consigli di Paolo, oppure fai questa prova più semplice e per il momento butti via tutto in un cassetto, e ti aiuto io a calcolare tutto quanto.

altra possibilità: usi 2 partitori come nella figura 4.
Uno lo butti in AREF e l'altro nell'ingresso analogico. In questo modo il riferimento di tensione (inizialmente a 2.5V con resistenze uguali) varia automaticamente in funzione della temperatura e va a compensare automaticamente il dato letto.

Interessante, un ARef dinamico :cold_sweat: In effetti l'RRef è il valore di riferimento fisso per il sensore empty, se ho ben capito è strutturato in modo da compensare le variazioni di temperatura, fornendo il riferimento esatto dello 0; resta il fatto che la tensione di alimentazione V+ può variare e fornire comunque indicazioni non esatte, ma questo vale sempre, a meno di non decidere di usare i 3,3V di Arduino, che sono certamente stabili.
Allora la prova da fare sarebbe questa:
a) 3,3V - RSense - R 2k2 - GND : il punto di contatto tra RSense e R2k2 va in un pin analogico, p.es. A0
b) 3,3V - RRef - R 2k2 - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
c) nel Software bisogna impostare analogRead (EXTERNAL), quindi si fanno un po' di prove di lettura, poi vediamo....

Ciao,
più che farlo il casino , sono io ad essere un casino umano :blush:, non avevo capito che Paolo si riferisse al circuito originario con amp-op.
Ad ogni modo, a me interessa la compensazione con Rref, proprio perché vorrei che il sensore funzioni al meglio sia con acquari temperati che tropicali…
Oggi ho messo il neurone sotto flebo di caffè, vediamo se riesco a fare qualche casino in meno!!!

Con il circuito originario con amp-op (quello del datadheet), utilizzando per R1 e R2 2,2K di valore, le letture dal livello minimo al livello massimo in analogread() vanno da 486 (1,96V) a 245 (0,96V).

Seguendo invece le indicazioni di Michele e Paolo riguardanti l’uso di Aref con i 3,3V di Arduino, utilizzando per R1 e R2 2,2K di valore, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 a 1023, mi ci sono rotto la testa, facendo prove con due arduino, pensando di fare casino io, ma ha ragione arduino, perché in effetti, Aref in questo modo è a 1,67 che corrisponde al valore di partenza del vout sul sensore (in realta misuro 1,72), quindi fondo scala per analogread(), con acqua a livmax, il Vout sale a 2,53 che è sempre fondo scala per analogread().

Invertendo i collegamenti, ossia:
3,3V - R 2k2 - RSense - GND : il punto di contatto tra RSense e R2k2 va ad A0
3,3V - R 2k2 - RRef - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
Con Aref 1,67, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 (1,57V) a 523 (0,76V).

Ho provato anche i collegamenti:
5V - R 2k2 - RSense - GND : il punto di contatto tra RSense e R2k2 va ad A0
5V - R 2k2 - RRef - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
Con Aref 2,32, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 (2,37V) a 498 (1,13 V).

Spero di aver fatto bene i compiti questa volta :sweat_smile: e che si riesca a sfruttare ancora di più l'analogread, ossia farlo arrivare ancora più giù ed arrivare alla massima risoluzione possibile...
Mi pare che siamo sulla buona strada giusto?

Riccardo

Sì, le ultime prove sono quelle che ti consigliavo di fare. Ricorda che se inverti tra loro le R fisse ed il sensore, la variazione sarà in aumento e non in diminuzione, cioè avrai circa 500 al minimo livello e 1023 al massimo livello.
Allora per aumentare il range della lettura ed usare contestualmente l'RRef potresti applicare quest'ultimo ad un altro pin analogico di Arduino, in modo da avere il riferimento fisso, partizionare Rsense e RRef in modo da avere tensione minima prossima a 0V e poi impostare ARef su INTERNAL, cioè su 1,1V.
In pratica tu hai un range di tensioni di 0,8V (a 3,3V) o di 1,2V (a 5V); se imposti l'ARef a 1,1V, nel primo caso sfrutterai circa 800 step vedendo l'intera scala, nel secondo caso perderai circa 180 step, che potresti sacrificare nella parte alta del livello (in pratica avresti 0 = vuoto e 1023 a partire dal 90% di livello in su; non so se sono stato chiaro.

Ciao, grazie maaa...

[quote author=Michele Menniti link=topic=141419.msg1152015#msg1152015 date=1363025270]
Allora per aumentare il range della lettura ed usare contestualmente l'RRef potresti applicare quest'ultimo ad un altro pin analogico di Arduino, in modo da avere il riferimento fisso, partizionare Rsense e RRef in modo da avere tensione minima prossima a 0V e poi impostare ARef su INTERNAL, cioè su 1,1V.[/quote]

Non mi è molto chiara questa cosa...

Qui invece è più chiaro e siccome ho bisogno di monitorare bene il livello massimo del sensore, che sarà anche il livello massimo dell'acqua in acquario, è il primo caso quello che mi interessa, ma non ho capito i collegamenti del passaggio precedente :blush:

Riccardo

parlavo tra me e me :smiley:
una domanda per conferma: la RRef è fissa? cioè la tensione di riferimento che fornisce il partitore fatto con una R+RRef è sempre stabile o varia vistosamente? Mi serve questo dato per capire se ho pensato una caxxata o meno.