Sensore di corrente con Arduino

luca 29 novembre 2011 7

Il progetto che vi voglio presentare nasce da una esigenza: insieme ad un amico – Davide – sto da tempo realizzando un plastico ferroviario (Il Plastico di Davide e Luca): per dimensionare gli “alimentatori” (booster) che mandano corrente sui binari, ci serviva capire quanta corrente veniva utilizzata…

Il sensore

Per misurare la corrente, ho utilizzato l’integrato ACS712 di Allegro MicroSystems (qui il datasheet). Di tale integrato esistono 3 versioni a seconda della massima corrente misurabile (5-20-30A); per le nostre esigenze ho scelto il modello da 5A.

Il funzionamento del sensore è molto semplice: la tensione tra il PIN VIOUT e massa è direttamente proporzionale alla corrente tra i PIN IP+ e IP-. L’ACS712 richiede una tensione di alimentazione di 5V (VCC) e due condensatori per stabilizzare l’alimentazione e la lettura; sul datasheet è riportato lo schema tipico:

L’integrato è prodotto in package SOIC; SparkFun vende una comoda breakout board con l’ACS712 già saldato. Ho collegato tale board ad una millefori su cui ho saldato i due condensatori e i PIN per il collegamento con Arduino:

La misura

Come detto, la tensione di uscita è proporzionale alla corrente in ingresso. Il valore che lega queste due grandezze è la sensitivity (riportata sul datasheet) che – per il modello da 5A – ha un valore tipico di 185mV/A. Il sensore misura sia correnti positive che negative (range -5A…5A), per questo se la corrente in ingresso è 0, l’uscita avrà valore 2.5V.

Leggeremo il valore in uscita utilizzando uno degli ingressi analogici di Arduino e la funzione analogRead(). Tale funzione restituisce un valore tra 0 (0V in ingresso) e 1023 (5V in ingresso) ovvero 0,0049V per ogni incremento.

La formula per convertire i valori (units) della funzione analogRead() in Ampere è quindi:

Arduino

Lo sketch di Arduino è molto semplice: legge il valore presente sul PIN AN0, lo converte con la formula indicata sopra e lo invia al PC sulla porta seriale. Sul PC è in esecuzione il programma AnalogDemo che disegna il grafico dei valori letti e aggiorna un feed su Pachube.

L’integrato ACS712 restituisce una lettura istantanea; le prime prove hanno mostrato come tale lettura sia troppo soggetta a fluttuazioni, ecco perché lo sketch sotto riportato esegue una lettura di 1000 valori, ne calcola la media e ne invia il risultato al PC. La funzione analogRead() impiega circa 0.1ms per ogni lettura, volendo un campione al secondo introduciamo un ritardo di 1ms ad ogni lettura:

void setup() {
 
  Serial.begin(9600);
}
 
void loop() {
 
  float average = 0;
  for(int i = 0; i < 1000; i++) {
    average = average + (.0264 * analogRead(A0) -13.51) / 1000;
    delay(1);
  }
  Serial.println(average);
}

Test

Per verificare l’affidabilità del sensore, ho utilizzato un caricabatterie controllato da microprocessore, inserendo il sensore tra l’uscita del caricabatterie e le batterie in carica:

In questo modo ho potuto verificare una stretta corrispondenza tra quanto indicato come corrente di uscita dal caricabatterie e quanto letto dal sensore.

In carrozza!

Il circuito è stato provato Sabato scorso sul plastico, qui potete leggere la prova su strada e vedere un breve filmato che lo mostra in azione durante un piccolo cortocircuito.

Note

Leggendo direttamente con Arduino il sensore, si ottiene una risoluzione di circa 0,026A (ovvero il valore restituito da analogRead() incrementa di una unità ogni 0.026A). Per aumentare tale risoluzione, è possibile aggiungere un amplificatore operazionale che estende il range di tensioni restituite; sempre SparkFun vende una breakout board con tale configurazione.

7 Comments »

  1. hamvil 12 dicembre 2011 at 10:03 - Reply

    Hi, thanks for the very useful post. I do have a question: how do I choose the value for the two capacitors?

  2. luca 12 dicembre 2011 at 11:31 - Reply

    Hello!
    You can use the values (1nF for filtering and 100nF as bypass) suggested in the datasheet.

  3. Patrick 21 marzo 2012 at 23:57 - Reply

    I tried your sketch, and have a .25A load (a lightbulb) and I am not seeing any current whatsoever.

    I’m trying to measure current on 120V AC.

    • luca 22 marzo 2012 at 15:28 - Reply

      Hi Patrick,

      are you using the same breakout board from SparkFun? Do you see anything on the serial terminal?

  4. ardhitop 1 maggio 2012 at 09:53 - Reply

    i have use this sketch for AC power supply, but the value that shown in serial monitor is very fluctuate.

    is this sketch for DC only or i can use this sketch for AC?

    thanks

    • luca 1 maggio 2012 at 10:27 - Reply

      Hi!

      ACS712 is suitable for DC and AC… it gives you only the “actual” measure: as you can see my sketch calculate a mean of 1000 samples… try to increment that number and let me know!

Leave A Response »