domenica 5 maggio 2013

Ohmmetro

Ohmmetro-1

- Arduino partiamo da zero - n°6

 

  Misuriamo una resisistenza.

Ohmmetro arduino



Con questo esperimento si prova a misurare una resistenza utilizzando il convertitore
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)

 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.



 

Vedrete così il valore della resistenza sotto misura.

 



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

12 commenti:

  1. Risposte
    1. Grazie per l'apprezzamento del lavoro.
      Sergio

      Elimina
  2. Grazie per il commento.

    Saluti

    Turicchi ( Firenze ) Italy
    Sergio

    RispondiElimina
  3. Stasera lo sperimenterò in pratica.
    Un 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

    RispondiElimina
    Risposte
    1. Questo commento è stato eliminato dall'autore.

      Elimina
    2. Ciao,
      scusa 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...

      Elimina
    3. Questo commento è stato eliminato dall'autore.

      Elimina
    4. Ok 10k va bene -1 con resistenza da 220k è ancora giusto in quanto Rxx > 200000
      ma 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

      Elimina
    5. Salve. sig. Sergio
      Dal 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

      Elimina
    6. Buongiorno.
      Si 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

      Elimina
    7. Mi scuso per la precedente risposta alla tua domanda, ho scambiato le risposte.
      ******
      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

      Elimina

Vi ringrazio per la lettura e vi invito al prossimo post.
Se il post vi è stato utile, vi è piaciuto oppure no, scrivete un commento.

Un saluto a tutti.
Sergio

Copyright - Condizioni d’uso - Disclaimer
http://avventurarduino.blogspot.it/2012/10/inizia-lavventura-arduino-12-settembre.html