Ohmmetro-1
- Arduino partiamo da zero - n°6
Misuriamo una resisistenza.
Ohmmetro arduino
analogico digitale di arduino.
L'idea di partenza era quella di misurare anche tensione e corrente, ma procedendo per gradi ho cominciato dalla misura della resistenza.
Nel post precedente n°5 ho descritto come utilizzare un partitore resistivo.
Anche per questo progetto si parte da un partitore resistivo ... con una particolarità una delle due resistenze è incognita. ( R1).
Partiamo da qui:
Partitore resistivo
La corrente I che scorre nelle resistenze è uguale Ir1 = Ir2 = I. ( le resistenze sono in serie).
La corrente I è data da I = Vin / ( R1 + R2).
Quindi Vout = R2 * I cioè Vout = R2 * Vin / ( R1 + R2)
La corrente I che scorre nelle resistenze è uguale Ir1 = Ir2 = I. ( le resistenze sono in serie).
La corrente I è data da I = Vin / ( R1 + R2).
Quindi Vout = R2 * I cioè Vout = R2 * Vin / ( R1 + R2)
Nel nostro progetto fissiamo:
R1 = Rxx (la nostra resistenza sconosciuta da misurare )
R2 = R_nota ( una resistenza fissa e conosciuta io ho utilizzato un 10 Kohm)
Vin = 5.0 V cc di arduino.
calcoleremo Vout leggendo con analogRead il valore numerico restituto sul pin analogico.
dalla formula precedente Vout = R2 * Vin / ( R1 + R2)
possiamo ricavare con pochi passaggi la seguente:
R1 = ( ( R2 * Vin / Vout) - R2).
R1 che è nel nostro caso la nostra Rxx ( da misurare).
Applicheremo quindi la formula trovata per avere il valore in omm di Rxx.
Nel listato troverete:
Si legge il valore che rappresenta Vout
valR = analogRead(omm); // Legge un valore da 0 a 1023
Il valore che rappresenta Vout viene convertito con
Vout = (Vin/1024.0) * float(valR); // Si converte il valore in Volt
e successivamente si calcola la risistenza incognita.
Rxx = ((R_nota * Vin/Vout )- R_nota); // Si calcola la resistenza
esattamente la formula sopra detta: R1 = (( R2 * Vin / Vout ) - R2)
Gli altri passaggi servono per mostrare o migliorare i risultati, nello sketch è comunque commentato ogni passaggio.
I valori calcolati vengono inviati con la porta seriale al pc quindi si possono visualizzare aprendo il monitor.
Materiale occorrente per questo progetto:
Arduino, una Breadboard, Pc e cavo usb.
1) Resistenza da da 10 Kohm.
Filo per collegamenti e alcune resistenze di vario valore per le prove.
Realizzate il seguente semplice schema:
vista Breadboard
Nella mia realizzazione ( vedi foto iniziale) ho collegato due fili con due coccodrilli al posto della Rxx da misurare così da poter facilmente cambiare la resistenza sotto misura.
Ecco qui lo sketch:
/* Sergio & Adriano Prenleloup 04 / 05 / 2013 Lettura resistenza v. 1.01 Con questo sketch si legge una resistenza utilizzando un partitore resistivo con una resistenza nota ed con la resistenza da misurare (RX) Si leggono i valori su monitor seriale */ // associazione pin in uso int omm = 2; //Pin Analogico lettura resistenza // variabili utilizzate int valR = 0; // valore lettura resistenza float Vout = 0.0; //Voltaggio uscita partitore // rispetto a massa float Vin = 5.0; // Vcc (5 Volts) voltaggio arduino // se il valore reale si discosta // si inserirà il valore misurato per migliorare la // precisione della misura float R_nota = 10000.0; // Valore della resistenza nota (10Komm) // per migliorare la precisione inserire // il valore reale misurato con precisione float Rxx = 0.0; // Valore calcolato della resistenza sotto misura. long Resxx = 0; // per stampare il num intero della resistenza in omm void setup() { Serial.begin(9600); pinMode (omm, INPUT); } void loop() { int x = 0; // si leggono 10 valori for (int i = 0; i <= 9; i++) { valR = analogRead(omm); // Legge un valore da 0 a 1023 x = x + valR; // sommatoria letture } valR = x/10; // media delle letture Vout = (Vin/1024.0) * float(valR); // Si converte il valore in Volt Rxx = ((R_nota * Vin/Vout )- R_nota); // Si calcola la resistenza if (Rxx > 500 ) { // arrotondamento del valore misurato Rxx = Rxx/10; Rxx = round(Rxx); Rxx = Rxx*10; // ************************** } // questi controlli per gestire un eventuale fuori range. if (Rxx < 10 ) { Rxx = -1;} if (Rxx > 200000) { Rxx = -1;} Resxx = Rxx; // si stampano i valori Serial.println(" "); Serial.print("R: "); Serial.println(Resxx); delay(2000); // attesa per lettura } //end
Nota bene:
Questo ohmmetro presenta alcune limitazioni, si perde in precisione con resistenze oltre i 120 Kohm, ed altrettanto per resistenze sotto i 30 ohm non fornisce valori attendibili.
Il problema è nel rapporto r1/r2 , la massima sensibilità e precisione si ha con un rapporto vicino all'unità.
Si potrebbe ovviare con un commutatore che alterna r2 diverse per realizzare portate di misura in questo modo si potrebbe realizzare uno strumento più preciso.
In ogni modo con quanto esposto chiunque voglia migliorare ha gli elementi per farlo.
Ho realizzato questo esperimento per chi inzia e come me è alle prime armi.
Leggendo sul web ho trovato un commento che consigliava di effettuare la misura del tempo di scarica di un condensatore, questo approccio completamente diverso mi sembra interessante e cercherò di documentarmi meglio.
In ogni caso per valori compresi fra 50 ohm e 120 Kohm la precisione è comparabile ad uno strumento commerciale di tipo economico.
Scarica qui lo sketch ohmmetro
Sono graditi Vostri commenti.
Un saluto a tutti.
Sergio
Grazie per l'apprezzamento del lavoro.
RispondiEliminaSergio
MUY BUENO
RispondiEliminaGrazie per il commento.
RispondiEliminaSaluti
Turicchi ( Firenze ) Italy
Sergio
Stasera lo sperimenterò in pratica.
RispondiEliminaUn dubbio:se ho un aperto come si comporta?
Lo chiedo perché a me interesserebbe verificare e una lampadina dell'auto è bruciata, quindi 12 v di tensione, bassa resistenza se funziona o aperto se non funziona.
Grazie
Questo commento è stato eliminato dall'autore.
EliminaCiao,
Eliminascusa se prima non mi sono presentato: Sandro.
Ho fatto alcune prove.
E'normale che leggo:
10K con resistenza da 10K
-1 con resistenza da 220
100K con resistenza da 1K
C'è qualcosa che mi sfugge...
Questo commento è stato eliminato dall'autore.
EliminaOk 10k va bene -1 con resistenza da 220k è ancora giusto in quanto Rxx > 200000
Eliminama non va bene se leggi 100k con una resistenza da 1k.
il mio prototipo funzionava bene ed ho comunque conferma da altri che lo hanno provato come funzionante.
Fammi sapere se risolvi e se invece non funziona studiamo come risolvere il problema.
Ciao.
Sergio
Salve. sig. Sergio
EliminaDal primo al secondo schema sono state invertite le resistenze.
Nel primo la rx è collegata verso massa. Nel secondo verso positivo.
per far funzionare il circuito si deve collegare la rx al positivo e quella nota a massa altrimenti non funziona.
Saluti
Marco
Buongiorno.
EliminaSi hai perfettamente ragione ho invertito le resistenze nello schema filare, va bene invece lo schema pratico su BB.
Infatti anche la foto iniziale del post corrisponde allo schema su BB e funziona.
Grazie per la segnalazione.
Provvedo a correggere l'errore.
Cordiali saluti
Sergio
Mi scuso per la precedente risposta alla tua domanda, ho scambiato le risposte.
Elimina******
Risposta corretta ( 20/11/16) ...
Se il circuito è aperto Rxx infinito il pin analogico risulta a potenziale di massa la resistenza nota da 10K lo collega alla massa e quindi:
Vout = (Vin/1024.0) * float(valR); // Si converte il valore in Volt
questa quindi avrà questi valori:
Vout = (0/1024)*1024 e quindi Vout sarà = 0
nella formula del programma ci ritroviamo una divisione per 0 che probabilmente darà errore
Rxx = ((R_nota * Vin/Vout )- R_nota);
se effettivamente ti da errore basterà aggiungere un piccolissimo valore a Vout
per evitare il problema.
Se invece il circuito è chiuso da cortocircuito o bassissima resistenza Vout sarà uguale ai 5V.
quindi in questa avremo:
Rxx = ((R_nota * Vin/Vout )- R_nota);
Rxx = 0 ( o valori molto vicini )
in ogni caso dopo la fase di arrotondamento ho inserito un controllo per valori fuori range:
if (Rxx < 10 ) { Rxx = -1;}
if (Rxx > 200000) { Rxx = -1;}
e quindi il risultato dopo questi controlli sarà -1
Saluti
Sergio