Pages: 1 ... 5 6 [7] 8 9 ... 40   Go Down
Author Topic: Ardu-Acquarium Controller v. 3.0  (Read 41956 times)
0 Members and 2 Guests are viewing this topic.
Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Riccardo

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink. 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.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink. 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.

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.

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  smiley-confuse

OK, ho quelle da 2,2k vedrò di usare quelle, ma dovrei prima capire come...  smiley-red

Grazie infinite a tutti e due.

Riccardo
Logged

Riccardo

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessante, un ARef dinamico smiley-roll-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....
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
più che farlo il casino , sono io ad essere un casino umano  smiley-red, 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  smiley-sweat 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
Logged

Riccardo

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, grazie maaa...

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.

Non mi è molto chiara questa cosa...

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.

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  smiley-red

Riccardo
Logged

Riccardo

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

parlavo tra me e me smiley-grin
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.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La Rref è una resistenza fissa, dovrebbe variare il suo valore solo con la temperatura.
In pratica vuoi seguire lo schema della 4° figura.


Puoi fare una prova?
Metti il sensore in acqua fredda (diciamo su 10 °C) e misura Rref. Poi immergi il sensore in acqua calda (37° dovrebbero bastare) e rimisura le resistenza.
« Last Edit: March 11, 2013, 02:21:28 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per ora ho fatto prove solo a temperatura acqua di casa e mi pare anche dalle misuarzioni che sia abbastanza fissa, dovrei provare con acqua fino a 30° per vedere di quanto varia...
Ora sono ancora al lavoro, ma in serata posso fare la prova e dirti.

Grazie di tutto...
Logged

Riccardo

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, allora si può fare, non mi serve conoscere la variazione, poi lì bisognerà fare un pò di calcoli per la compensazione, quindi la nostra prova PER ORA prescinde dalla RRef che NON useremo. Cioè per ora facciamo finta di lavorare sempre alla stessa temperatura, poi introdurremo il correttivo. Allora fai così:
- Collega un capo di una R di 3k9 ai 3,3V di Arduino
- L'altro capo della R  ad un capo di RsenseR
- Il capo libero della Rsense a GND
- Il punto di unione tra Rsense e la R 3k9 ad A0 di Arduino
- Imposta nello sketch analogReference(INTERNAL)
Secondo i miei calcoli, che spero siano esatti, ma dobbiamo considerare le ovvie tolleranze in gioco, dovremmo avere un'uscita variabile tra 0,24V (pieno) e 1,1V (vuoto). Infatti sappiamo cha Rsense varia tra 2k (vuoto) e 300ohm (pieno), ricordo che i 2k li hai rilevati tu mentre i 300 ohm li ho presi dal datasheet, qundi dovremo verificare anche questi due valori come si deve!!!
Vout = 3,3 / 5900 * 2000 = 1,18V -> lettura = 1023 (vuoto)
Vout = 3,3 / 4200 * 300 = 0,24V -> lettura = 75 (pieno)
Se il test più o meno corrisponde avremo sfruttato circa il 92% della scala, mi pare possa bastare, poi nei prossimi 3-4 mesi completeremo il lavoro smiley-mr-green

Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 336
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto la prova, ma non ho la R da 3k9 quindi ho messo in serie una 3k una 560 ed una 330  smiley-roll-sweat  smiley-red
ecco i risultati:
A vuoto Analogread 1023 Vout= 1,14
A pieno Analogread 464 Vout = 0,48   (Rsens misurata a pieno 680 ohm domani scrivo a milonetech e chiedo per sti valori a cappero rispetto al datasheet)

Il codice:
Code:
byte levelsensor = A0;
int levelvalue = 0;  // variable to store the value coming from the sensor

void setup() {
   Serial.begin(9600);
   analogReference(INTERNAL);
}

void loop() {

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

Ciao e grazie
Logged

Riccardo

Pages: 1 ... 5 6 [7] 8 9 ... 40   Go Up
Jump to: