Go Down

Topic: Dubbio analogReference( INTERNAL ) (Read 15413 times) previous topic - next topic

leo72

No, ho detto quando cambi canale, ecco perché ho messo la doppia lettura della fotoresistenza, perché è la seconda lettura analogica che fai.
Quindi così:
Code: [Select]

void setup() {
  Serial.begin(9600)
}

void loop() {
    tempC = analogRead(tempPin);           //lettura valore del sensore
    tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
 
    Valore = analogRead(Fotoreistenza );
    Valore = analogRead(Fotoreistenza );
 
    Serial.println(tempC);             //invia i dati alla seriale
    Serial.print(" Celsius, ");
   
    Serial.print("Valore luminosita' = ");
    Serial.println (Valore);         
    delay( 1500 );
}

format

Purtroppo neanche così funziona....

leo72


Purtroppo neanche così funziona....

Bene, a livello SW abbiamo appurato che va tutto bene.
adesso segui i consigli di Michele per la parte HW  ;)

menniti

Prima di tutto ti faccio i complimenti per la foto, finalmente qualcuno che mette chiunque in condizioni di vedere e comprendere i collegamenti, anche se l'ideale è sempre postare uno schema elettrico completo, le cose saltano all'occhio più faculmente.

Ho visto ora che il C 100nF in uscita c'è (parlo del 7805): aggiungi anche quello in ingresso e mettili entrambi vicinissimi ai pin IN/OUT del regolatore; il resto dello schema va bene

il pin IORef dovrebbe corrispondere all'ARef, va bene così, un C100nF infilato tra questo pin e GND

la resistenza mi sembrava marrone-nero-giallo, se l'ultimo anello è arancio allora va bene; devi invertirli di posizione: metti l'LDR tra 5V e A0 e la R tra A0 e GND, in tal modo otterrrai un incremento della tensione su A0 man mano che aumenta la luce, è anche più semplice da gestire.

Il problema che hai a mio avviso è esclusivamente software, l'LM35 funziona in modo lineare, la conversione che fai non è precisa ma indicativamente dovrebbe andare, il reference INTERNAL dovrebbe migliorare le cose, ma anche così non dovrebbe "sballare"; ma un'indicazione dei valori che ottieni e della temperatura presunta potresti darceli?

domande per Leo:
1 - non converrebbe mettere un piccolo delay tra le letture di A0 e A1
2 - il fatto che usi i comandi di lettura analogica permette di chiamare i pin 0 e 1 invece che A0 e A1?
3 - è buona pratica quella di usare la stessa variabile per acquisire il dato analogico e poi per ricalcolarne il valore nella conversione?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
Ho visto ora che il C 100nF in uscita c'è (parlo del 7805): aggiungi anche quello in ingresso e mettili entrambi vicinissimi ai pin IN/OUT del regolatore; il resto dello schema va bene


ok grazie per il consiglio

Quote
il pin IORef dovrebbe corrispondere all'ARef, va bene così, un C100nF infilato tra questo pin e GND


ho messo anche il condensatore

Quote
la resistenza mi sembrava marrone-nero-giallo, se l'ultimo anello è arancio allora va bene; devi invertirli di posizione: metti l'LDR tra 5V e A0 e la R tra A0 e GND, in tal modo otterrrai un incremento della tensione su A0 man mano che aumenta la luce, è anche più semplice da gestire.


infatti ora legge i valore al contrario di prima, la resistenza è marrone - nero - arancio

questi i valori che leggo nel serial monitor a luce spenta:

22.46
Celsius, Valore luminosita' = 9
22.95
Celsius, Valore luminosita' = 9
22.46
Celsius, Valore luminosita' = 9

la temperatura con altri due termometri mi segna circa un grado in meno, ma se uso il  reference INTERNAL è precisa

questi i valori che leggo nel serial monitor a luce accesa:

17.09
Celsius, Valore luminosita' = 784
18.55
Celsius, Valore luminosita' = 785
20.02
Celsius, Valore luminosita' = 786
33.20
Celsius, Valore luminosita' = 788

ho provato anche così:
int tempPin = A1;
int Fotoreistenza = A0;

ma non cambia nulla




menniti

ok, però sembra davvero impossibile questa cosa; fai queste due prove:
tra la lettura della temperatura e quella della luminosità metti un delay(200);
se non ottieni alcun risultato tangibile elimina l'LDR dal circuito (la sfili dalla bread) e riprova (chiaramente leggerai 0 come luminosità)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

ho fatto così

Code: [Select]
tempC = analogRead(tempPin);           //lettura valore del sensore
    tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
 
   delay( 200 );
 
   Valore = analogRead(Fotoreistenza );
 
   Serial.println(tempC);             //invia i dati alla seriale
   Serial.print(" Celsius, ");
   
   Serial.print("Valore luminosita' = ");
   Serial.println (Valore);         
    delay( 1500 );


poi ho anche staccato la fotoresistenza (solo i 5v) e leggo questo

22.95
Celsius, Valore luminosita' = 0
22.95
Celsius, Valore luminosita' = 0
22.95
Celsius, Valore luminosita' = 0
22.95
Celsius, Valore luminosita' = 0



leo72


domande per Leo:
1 - non converrebbe mettere un piccolo delay tra le letture di A0 e A1

La lettura "a perdere" secondo me è migliore perché si dà modo al multiplexer di cambiare l'ingresso nonché di caricare il circuito S&H con una lettura reale. Generalmente il delay(10) prima della seconda lettura serve tra 2 letture differenti fatte su uno stesso pin.
Quote

2 - il fatto che usi i comandi di lettura analogica permette di chiamare i pin 0 e 1 invece che A0 e A1?

Sì. Nella funzione analogRead c'è un controllo che riporta il numero di pin nel range compatibile col microcontrollore in uso. A0 è un alias per 14, ma siccome i pin digitali in un Arduino UNO vanno solo da 0 a 13, se il codice si vede passare A0/14 esso lo riporta a 0 (fa proprio numero_pin-14).

Quote

3 - è buona pratica quella di usare la stessa variabile per acquisire il dato analogico e poi per ricalcolarne il valore nella conversione?

Usi la stessa variabile, evitando sprechi di RAM. Il nome di una variabile è solo un riferimento che il compilatore usa per indirizzare una certa locazione di memoria. a=analogRead(0) dice al compilatore: leggi il pin analogico 0 e poi salvami il contenuto nella posizione indicata da "a". Farlo 1 o 10 o 100 volte non cambia nulla.

menniti

#23
Jan 06, 2013, 01:11 pm Last Edit: Jan 06, 2013, 01:31 pm by Michele Menniti Reason: 1
@ Leo: ok.
@ format: ma col delay 200 e l'LDR collegata cosa fa?
Potresti misurare la tensione di alimentazione durante le varrie fasi per verificare se non succede qualcosa quando l'LM35 da' i numeri? Potrebbe essere che l'alimentazione diminuisca a circa 4V, p.es.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
ma col delay 200 e l'LDR collegata cosa fa?


con delay a 200 con pochissima luce (valore 20) la temperatura è fissa a 21.97
con poca luce (valore 300) la tempperatura varia tra 21.00 e 22.95
con molta luce (valore 800) la temperatura sballa da 33.69 a 21.97 a 42.97 ecc...

fa cosi anche senza delay a 200

mentre il valore della luce varia da 20 a 300 e poi 800 ho misurato la tensione sui pin del sensore LM35 ed è fissa a 4.60 Volt.

menniti

Ovviamente ti riferisci al pin di alimentazione del sensore, non a quello di uscita, giusto?
4,6 Volt sono pochi, non vorrei che il sensore stesse lavorando male o, peggio, che stesse lavorando male il comparatore dell'ADC.
Che tensione stai mandando in ingresso al 7805? e con quale fonte?
Il riferimento che stai usando in queste misure ora è DEFAULT o INTERNAL?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
Ovviamente ti riferisci al pin di alimentazione del sensore, non a quello di uscita, giusto?


Sulla breadboard ho misurato sia in ingresso che in uscita, il sensore LM35 e anche la fotoresistenza, per entrambi ho letto
lo stesso valore: 4.56V.Le prove le ho fatte tutto alimentato da Arduino con il riferimento di default, con e senza delay 200, e con
e senza le modifiche software suggerite da Leo72.

Il circuito 7805 è alimentato dall'alimentatore che ho trovato nello Starter Kit Arduino, cioè 12V 300mA.

La tensione di uscita del circuito con il 7805 è di 5.04 V, infatti ho alimentato il sensore LM35 con il 7805 e sui pin
di ingresso e di uscita ho letto sempre 5.04, però c'è sempre l'errore della temperatura sballata quando la fotoresistenza
in presenza di luce segna valori prossimi a 1000, mentre con quasi buio totale e valori di circa 20 / 30 la temperatura è costante.

superzaffo

ciao.. scusate se entro anche io.. ma mi è sorta una domanda spontanea... L' arduino con cosa l' alimenti ?
Mi sembra di aver notato dalla foto che lo alimenti tramite il circuito 7805 tramite i suoi 2 pin (che dovrebbero essere in output) 5v e GND. Io non ho mai avuto esperienza con un modello ethernet di arduino, ma non mi sembra il massimo dell'alimentazione  :)
Prova ad alimentare l' arduino tramite l' alimentatore che usi per il 7805 e togli un attimo il 7805.. arduino non dovrebbe avere problemi ad alimentare quei due sensori.. anche se la corrente errogata da quell'alimentatore mi sembra un po' bassa...
Cosa dici Michele ?

menniti

Concordo pienamente, infatti stavo cercando di capire perché usare un'alimentazione esterna che alimentasse anche Arduino. Alimentare Arduino tramite il pin +5V non è un grande problema, il regolatore interno è protetto in tal senso. La corrente è bassa ma dovrebbe bastare per quei componenti, anche se al limite.
Quello che non capisco è come faccia a leggere 5,04V sul 7805 e 4,65V sulla bread, questa caduta è ingiustificabile.
Inoltre non capisco che intende per ingresso e uscita, ho letto e riletto, boh? CERTAMENTE NON può leggere sull'uscita dell'LM35 4,65-5V, è IMPOSSIBILE; l'LM35 genera 10mV per °C, a 100°C dovremmo avere circa 1V, a temperatura ambiente avrà al massimo 250-300mV.
Il fatto è che se un sensore ha tre pin: Vdd-GND-OUT, non li si può chiamare tutti e tre indifferentemente "pin" o ingressi e uscite, non si capisce nulla di ciò che intende dire :smiley-sweat:
@ format: ti propongo una prova "globale":
1 - elimina il tuo circuito col 7805
2 - infila l'alimentatore 12V nel jack di Arduino (i collegamenti sono bidirezionali, quindi lascia tutto il resto com'è)
3 - Imposta nello sketch analogReference(INTERNAL)
4 - il capo dell'LDR attualmente collegato a 5V, scollegalo e collegalo invece al pin IORef (ma sincerati che tra questo pin e GND ci siano circa 1,1V.
Mi sto facendo l'idea che se lavora col riferimento interno (come credo stia facendo, almeno dal titolo del Topic), mentre il sensore LM35 non manda più di 2-300mV a temperatura ambiene, l'LDR collegato a 5V potrebbe superare abbondantemente i 2,5V (ma bisogna vedere il data-sheet dell'LDR). Non vorrei che tale situazione disturbasse in qualche modo il comparatore o l'ADC, anche se teoricamente NON dovrebbe.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

#29
Jan 07, 2013, 04:38 pm Last Edit: Jan 07, 2013, 04:51 pm by format Reason: 1
Quote
Concordo pienamente, infatti stavo cercando di capire perché usare un'alimentazione esterna che alimentasse anche Arduino

io non ho mai alimentato l'arduino con il 7805, ma senpre con l'usb, ho fatto il circuito 7805 solo per prova portando la tensione solo al pin del sensore LM35, ma l'arduino era sempre alimentato tramite USB

Quote
Inoltre non capisco che intende per ingresso e uscita

Infatti mi sono sbagliato, intendevo dire che ho rilevato la tensione sulla stessa fila della bredboard dove c'è il +5 e GND del sensore LM35.
Però ho notato che se Arduino è alimentato via usb la tensione è 4.60V, mentre se alimentato con l'alimentatore è 5.0V, ma anche con l'alimentatore esterno ho gli stessi problemi

Quote
Imposta nello sketch analogReference(INTERNAL)


ho impostato lo sketch a analogReference(INTERNAL) ma la tensione tra  IORef e GND e 5.0V, quindi non ho fatto la prova

In questa discussione
http://arduino.cc/forum/index.php/topic,60618.0.html
l'utente oretovalley ha il mio stesso problema, ma non credo abbia risolto

Approfitto per chiedere se posso almintare l'arduino contemporaneamente con l'usb e l'alimentatore esterno

Go Up