Como medir corrente com Arduino?
28 de outubro de 2014
Sensores
33 Comentários
5
Agora você pode medir correntes de -30A à +30A utilizando o seu Arduino ou outro
microcontrolador de sua preferência. Com o módulo Sensor de Corrente ACS714 da
Pololu você tem um dispositivo alimentado por 5v e que permite medir essa faixa de
corrente com uma margem de erro de apenas ±1,5%.
Esse sensor utiliza um CI Allegro ACS714 com sensor de efeito hall (datasheet) para
medição da corrente, o que garante um perfeito isolamento do circuito. Nesse post
vamos trabalhar com baixa tensão e corrente, mas o ACS714 suporte tensões de até 2.1
kV RMS. Confira o tutorial abaixo!
Medindo corrente e tensão
Antes de mostrarmos de mostrar como medir corrente com Arduino, vamos ver de uma
maneira resumida a diferença de procedimento entre medir tensão e medir corrente, já
que uma ligação incorreta pode danificar o circuito ou até mesmo o aparelho medidor.
Para medir tensão, veja este exemplo usando um multiteste (multímetro), um circuito
com uma lâmpada e uma bateria. Devemos colocar o multiteste na escala de tensão (V),
e medir dessa maneira, com as pontas de prova em paralelo ao circuito:
Já para a medição da corrente, que é o assunto desse post, devemos ligar um multiteste
em série com o circuito, na escala de Ampéres:
Ligação do Sensor de Corrente com Arduino
Vamos testar o sensor utilizando um motor DC de 5v, ligado em SÉRIE com o Sensor
de Corrente ACS714. O sensor irá enviar os dados ao Arduino por meio do pino
analógico A3. A alimentação do sensor é feita pelo próprio Arduino (5v), e para a
alimentação do motor utilizamos pilhas comuns. Assim, podemos mostrar o isolamento
do circuito do motor em relação ao Arduino e o restante dos componentes:
No display LCD 20×4, teremos as informações do valor “puro” lido do sensor (entre 0 e
1024) e o valor da amperagem calculada pelo programa abaixo. A cada ampere de
variação na entrada do sensor, a tensão de saída varia 66mV. A atualização é feita a
cada 1 segundo.
1 //Programa : Teste sensor ACS714 corrente com Arduino
//Alteracoes e adaptacoes : FILIPEFLOP
2
3
//Carrega a biblioteca do LCD
4 #include <LiquidCrystal.h>
5
6 //Inicializa o LCD
7 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
8
9 //Define o pino analogico usado pelo ACS714
int AnalogInputPin = 3;
10
11
12void setup()
13{
14 //Define o LCD com 20 colunas e 4 linhas
15 lcd.begin(20, 4);
//Informacoes iniciais no display
16 lcd.setCursor(1,0);
17 lcd.print("--- FILIPEFLOP ---");
18 lcd.setCursor(0,1);
19 lcd.print("Sensor : ");
20 lcd.setCursor(0,2);
lcd.print("Amp :");
21
22 Serial.begin(9600);
23}
24
25void loop()
26{
27 //Chama rotina que calcula a corrente
double Current = currentSensor(analogRead(AnalogInputPin));
28 //Imprime as informacoes no display e na serial
29 Serial.print(" Amp : ");
30 printDouble(Current, 2);
31 Serial.print(" A");
Serial.println("");
32 lcd.setCursor(11,2);
33 lcd.print("A");
34 delay(1000);
35}
36
37void printDouble(double val, byte precision)
{
38 Serial.print (int(val));
39 if( precision > 0)
40 {
41 Serial.print(".");
42 lcd.setCursor(7,2);
lcd.print(".");
43 unsigned long frac, mult = 1;
44 byte padding = precision -1;
45 while(precision--) mult *=10;
46 if(val >= 0) frac=(val-int(val))*mult;
else frac=(int(val)-val)*mult;
47 unsigned long frac1 = frac;
48 while(frac1 /= 10) padding--;
49 while(padding--) Serial.print("0");
50 lcd.setCursor(6,2);
51 lcd.print("0");
Serial.print(frac,DEC) ;
52 lcd.setCursor(8,2);
53 lcd.print(frac, DEC);
54 }
55}
56
long readInternalVcc()
57
58
59
60
61
62
63
64
{
65 long result;
66 ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
67 delay(2); // Wait for Vref to settle
68 ADCSRA |= _BV(ADSC); // Convert
69 while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
70 result |= ADCH<<8;
71 result = 1126400L / result; // Back-calculate AVcc in mV
72 return result;
73}
74
75
// Calculate current with Allegro ACS714
76double currentSensor(int RawADC)
77{
78 int Sensitivity = 66; // mV/A
79 long InternalVcc = readInternalVcc();
80 double ZeroCurrentVcc = InternalVcc / 2;
81 double SensedVoltage = (RawADC * InternalVcc) / 1024;
82 double Difference = SensedVoltage - ZeroCurrentVcc;
double SensedCurrent = Difference / Sensitivity;
83 Serial.print("Sen: ");
84 Serial.print(RawADC);
85 Serial.print("/1024");
86 lcd.setCursor(9,1);
87 lcd.print(RawADC);
return SensedCurrent;
88}
89
90
91
92
93
94
95
96
Para utilização do programa sem precisar de um LCD, os resultados são impressos
também na serial, e você pode checar os valores no serial monitor:
Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no
final do artigo). Já conhece a loja virtual FILIPEFLOP? Não? Então confira um pouco
sobre nossa confiável trajetória de vendas e Quem Somos.