Raffaele Ilardo


Misurare resistenze con Arduino


© La parziale riproduzione dei contenuti di questa pagina è consentita a patto di citare l'indirizzo del sito e l'autore.

Motivazioni del progetto

Ed eccomi nuovamente a parlare di Arduino, la piattaforma hardware che consente di sviluppare applicazioni basate sui microcontrollori ATMEL.
mucchio di resistori
Sarà che sto diventando vecchio, pigro e che la vista mi è notevolmente calata, ma ultimamente mi pesa parecchio leggere gli anelli colorati dei resistori. Non parliamo poi di quelli di alta precisione, che hanno quattro anelli, spesso microscopici e mal tracciati.
Succede poi che, dopo aver passato una giornata a sperimentare, ci si ritrova un'infinità di resistenzine tutte sparpagliate sul tavolo, e, a meno di non fare pulizia buttando via tutto, occorre raccoglierle una per una e, in base al valore, riporle nel giusto cassettino!
Ma anche usare il tester porta via tempo, perchè quasi per ogni lettura occorre ruotare il commutatore in cerca della scala appropriata.
Mi sono così ricordato di Arduino, che da più di un anno avevo lasciato nel cassetto. In effetti è stata abbastanza dura riprendere confidenza con le istruzioni e le modalità di impiego, ma alla fine ce l'ho fatta.

reading boy

Criteri di funzionamento del codice

Cosa fa il codice che ho sviluppato? Si tratta di inserire la nostra resistenza incognita in due pin appositi, e poi arduino fa tutto da solo. Si sceglie automaticamente la scala di misura e fornisce il valore finale sul solito "monitor seriale"
La gamma dei valori misurabili spazia dai megaohm fino alle decine di ohm; non è possibile misurare valori di pochi ohm, perchè i pin digitali di arduino possono erogare una corrente massima di circa 40 mA, e quindi non sono compatibili con resistenze di valore eccessivamente basso.
La misura avviene in modo molto semplice; la resistenza da misurare Rx viene a trovarsi in serie ad una resistenza Ref di valore noto: a questo punto, leggendo la tensione nel punto intermedio, si risale al valore di Rx. Il problema è che, per la lettura analogica di una tensione, arduino usa una scala a 1024 step; finchè le due resistenze hanno valori abbastanza vicini, la lettura è sufficientemente precisa; diversamente si va incontro ad un errore eccessivo.
Nasce da qui la necessità di usare di volta in volta una resistenza di riferimento Ref di valore adatto alla Rx. Il codice qui descritto usa quattro resistenze diverse, e sceglie ogni volta quella di valore più vicino.
schema del collegamenti fra arduino e le resistenze di misura
Figura 2

Le resistenze sono: 470 kohm, 47 kohm, 4700 ohm e 470 ohm; naturalmente è opportuno usare per questo scopo delle resistenze precise, al 5 % o 1 %.
pin di fissaggio resistenze
Figura 3
Vorrei precisare che scopo di questo progetto non è quello di fornire misure di altissima precisione, ma di consentire la catalogazione delle varie resistenze leggendone facilmente il valore.

L'hardware

Come si vede nello schema di figura 2, l'hardware è proprio ridotto al minimo. Servono solo quattro resistenze e dei cavetti per il collegamento. Potete usare una breadboard, ma direi che non ne vale la pena.
Secondo me conviene realizzare quelle poche saldature che occorrono e fissare il tutto, compresa la scheda di Arduino, su una piastrina tipo millefori.
Per collegare la resistenza da misurare si possono usare dei pin come quelli di figura 3, che permettono una veloce inserzione dei terminali (o "reofori"); vengono venduti in stecche e sono facilmente separabili.

Il codice commentato

Di seguito riporto il codice che va caricato sulla scheda di arduino. Per evitare errori è bene usare il "copia e incolla", come ho fatto anch'io. Aggiungo qualche breve commento, per chi fosse interessato a comprendere meglio il funzionamento.

Commenti al codice

Nelle prime tre righe vengono definite alcune variabili, tra cui l'unità di misura che sarà affiancata al valore della resistenza. Viene poi inizializzata la comunicazione seriale.



Nella sezione ciclica void loop() vengono settati su INPUT i pin digitali 2, 4, 7 e 8.



Con Rzero=470000 si procede alla prima lettura del valore VD.

Il pin digitale n.2 viene impostato su OUTPUT e portato a livello HIGH: in tal modo le resistenze in serie Rzero e Rx vengono alimentate a 5V e, con VD = analogRead(A0); si legge la tensione nel punto intermedio.
Naturalmente il valore letto come VD si riferisce ai 1024 step della lettura di tensioni.

Se il valore VD risulta inferiore a 105, significa che la lettura, effettuata per confronto con la Rzero = 470000 ohm, non è sufficientemente precisa. Con le istruzioni:
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
la resistenza Rzero da 470000 viene allora sostituita da una resistenza di valore più basso, Rzero = 47000 ohm.



Si effettua una nuova lettura con VD = analogRead(A0); se anche in questo caso il valore di VD è inferiore a 105, si passa ad una terza resistenza, questa volta da 4700 ohm.









Il processo si ripete poi, eventualmente, con la successiva resistenza da 470 ohm.









Alla fine, con l'istruzione float RX = VD*Rzero/(1024-VD); il valore di VD, corrispondente a una scala che va da 0 a 1023, viene convertito in un valore in ohm.




In funzione del valore ottenuto, viene scelta l'unità di misura da mostrare affiancata al valore numerico.









Nel caso non risulti inserita alcuna resistenza incognita, il codice rileva un valore anomalo e fornisce l'indicazione di "lettura non significativa".




Con le istruzioni Serial.print i valori vengono inviati al monitor seriale affinchè possano essere letti.



Il ritardo delay(100) serve a rallentare lo scorrimento delle letture sul monitor; può essere liberamente modificato o eliminato.
String unit=" ohm";
unsigned long Rzero;
int VD;

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

void loop() {
pinMode(2,INPUT);
pinMode(4,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);

Rzero = 470000;
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
delay(100);
VD = analogRead(A0);
pinMode(2,INPUT);

if (VD<105)
{
Rzero = 47000;
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
delay(100);
VD = analogRead(A0);
pinMode(4,INPUT);
}

if (VD<105)
{
Rzero = 4700;
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);
delay(100);
VD = analogRead(A0);
pinMode(7,INPUT);
}

if (VD<105)
{
Rzero = 470;
pinMode(8,OUTPUT);
digitalWrite(8,HIGH);
delay(100);
VD = analogRead(A0);
pinMode(8,INPUT);
}

float RX = VD*Rzero/(1024-VD);
unit=" ohm";

if (RX>1000000)
{
RX = RX/1000000;
unit=" Mohm";
}
else
if (RX>10000)
{
RX = RX/1000;
unit=" Kohm";
}

if (VD>1020)
{
Serial.print("lettura non significativa");
Serial.println();
}
else
{
Serial.print(RX,2);
Serial.print(unit);
Serial.println();
}
delay(100);
}






raffaele ilardo