Módulo ACS712 – Medindo Corrente Elétrica Alternada e Contínua com Arduino

Neste tutorial você aprenderá como medir corrente elétrica alternada utilizando o  módulo sensor de corrente ACS712 juntamente com um Arduino. Para isso, realizaremos a medição do valor de corrente de um motor universal monofásico, com o objetivo de monitorar seu consumo de energia. Recomendamos a você que leia os tópicos introdutórios do tutorial SCT-013 – Sensor de Corrente Alternada com Arduino, pois, além de serem abordados os conceitos à respeito da medição de corrente, também são vistos os conceitos relacionados à Potência Elétrica, os quais, que serão utilizados neste tutorial. 

Apesar de abordarmos como medir corrente alternada, a medição de corrente Contínua é muito semelhante e será comentada em um tópico ao final do tutorial.

[toc]

kit robotica educacional com Arduino ESP ou Microbit

Sensor de corrente ACS712

O ACS712 é um pequeno sensor de corrente invasivo para baixas e médias correntes com alta sensibilidade e baixo custo. Ele é capaz de medir valores de corrente continua e alternada.

O ACS712 é um sensor de efeito Hall que gera uma saída de tensão proporcional a corrente que flui entre os pinos IP+ e  IP- do sensor.

Chip sensor ACS712
Chip sensor ACS712

Por usar o efeito Hall, o circuito do sensor ficar isolado eletricamente do circuito cujo o qual se está aferindo a corrente.

Existem diversos modelos do ACS712 com diferentes limites de medição de corrente, como podemos ver na tabela abaixo.

Tabela de opções sensores de corrente ACS712

As informações que serão importantes para nós são: os modelos (Part Number), a temperatura de operação em graus Celsius (TA), a corrente máxima a ser medida em Ampères (Optimized Range) e a relação de mV/A (Sensitivity, Sens). As informações completas podem ser consultadas no datasheet do fabricante.

O Módulo sensor de corrente ACS712

O módulo ACS712 nada mais é que um placa com o ACS712 e tudo que é preciso para usá-lo de maneira mais simples. Lembrando que este é um sensor de corrente invasivo, onde é necessário interromper o circuito para que ele seja instalado. Para este tutorial, será utilizado o módulo ACS712 30A, que por sua vez, consegue ler valores de corrente de até 30 Ampères.

Caso esteja usando o módulo ACS712 5A você precisa levar em conta a sensibilidade dele e fazer a devida alteração no código do Arduino.

Imagem do Módulo sensor de corrente ACS712
Imagem do Módulo sensor de corrente ACS712

Efeito hall

O ACS712 utiliza do efeito Hall para realizar a interface entre a corrente real do circuito com o Arduino, no qual, segundo preleciona Thomazini no livro Sensores Industriais:

“O efeito Hall caracteriza-se basicamente pelo aparecimento de um campo elétrico transversal em um condutor percorrido por uma corrente elétrica, quando ele se encontra mergulhado em um campo magnético”.

Os sensores por efeito Hall são constituídos por dispositivos semicondutores que sofrem influência de campo magnético. Quando colocamos esse dispositivo semicondutor em série com a fonte e a carga, ocorre a passagem de elétrons por meio dele.

Passagem de corrente elétrica por um material semicondutor

Ao adicionarmos um campo magnético perpendicular ao movimento dos elétrons, surge uma força magnética, chamada de força de Lorentz.

Adição de um campo magnético

Sob influência dessa força, os elétrons livres não se moverão mais de forma retilínea, mas se concentrarão na direção da força magnética.

Regra da mão direita, indicando o sentido da força magnética
Concentração dos elétrons livres na parte superior do material semicondutor

Essa concentração faz surgir um potencial negativo, logo, na parte onde houver falta desses elétrons, surgirá o potencial negativo. Dessa forma, haverá uma diferença de potencial entre essas extremidades que será proporcional ao valor de corrente que está passando pelo material semicondutor. Com isso, medindo a tensão entre essas extremidades e por meio de cálculos, é possível descobrir o valor de corrente.


Mãos à Obra – Medindo Corrente Elétrica Alternada com Módulo ACS712 30A

Componentes necessários

Para a realização deste tutorial serão necessários:

Além desses itens, utilizaremos um pequeno motor universal monofásico para realizar a medição da corrente inerente ao funcionamento da mesma e também da potência consumida estipulada.

Montando o projeto

Por se tratar de um sensor de corrente invasivo, é necessário realizar a interrupção do circuito para que o ACS712 possa ser conectado ao circuito, como vemos abaixo.

Após isso, conectamos a alimentação (5V e GND) do ACS712 no arduino, e o pino OUT conectamos ao pino analógico A0, de acordo com o diagrama abaixo.

Programando

Após concluir a montagem descrita acima, basta dar upload no código abaixo para o arduino, no qual a explicação detalhada de cada linha poderá ser vista no tópico “Entendendo a fundo/Software”. Lembre-se de selecionar a placa e a porta que está utilizando corretamente.

float vetCorrente[300];

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop()
{
  double maior_Valor = 0;
  double valor_Corrente = 0;  

  float tensao = 127;
  float potencia = 0;

  for(int i = 0; i < 300; i++)
  {
    vetCorrente[i] = analogRead(A0);
    delayMicroseconds(600);
  }  

  for(int i = 0; i < 300; i++)
  {
    if(maior_Valor < vetCorrente[i])
    {
      maior_Valor = vetCorrente[i];
    }
  }  

  maior_Valor = maior_Valor * 0.004882812;
  valor_Corrente = maior_Valor - 2.5;
  valor_Corrente = valor_Corrente * 1000;
  valor_Corrente = valor_Corrente / 66;         //sensibilidade : 66mV/A para ACS712 30A / 185mV/A para ACS712 5A
  valor_Corrente = valor_Corrente / 1.41421356;

  Serial.print("Corrente = ");
  Serial.print(valor_Corrente);
  Serial.println(" A");

  potencia = valor_Corrente * tensao;

  Serial.print("Potencia = ");
  Serial.print(potencia);
  Serial.println(" W");
  
  Serial.print(".");
  delay(500);
  Serial.print(".");
  delay(500);
  Serial.print(".");
  delay(500);

  Serial.println("");
}

Colocando pra funcionar

Código compilado e circuito montado! Veja o resultado abaixo.

Resultado da montagem prática
Valores mostrados no monitor serial

Entendendo a fundo

Neste tópico serão tratados o funcionamento de cada parte do projeto deste tutorial, onde veremos os cálculos realizados pelo arduino para chegar ao valor de corrente correto.

Hardware

O circuito integrado ACS712 é fabricado pela Allegro MicroSystems, no qual é possível visualizar sua pinagem na imagen logo abaixo.

Pinagem do circuito integrado ACS712
  • IP+ / IP- : são os terminais que serão conectados em série com a carga. É por onde a corrente elétrica irá fluir.
  • VIOUT: corresponde ao pino de saída do sensor. Ele irá representar a forma de onda da corrente proporcional a sua entrada, no qual a sua proporcionalidade é definida pelo modelo que será utilizado. A forma de onda em sua saída apresentará um offset de 2,5V.
  • FILTER: terminal no qual será conectado um capacitor que definirá a largura de banda.
  • VCC / GND: correspondem aos terminais de alimentação do circuito integrado.

Logo abaixo é mostrado o circuito típico de suas aplicações.

Circuito do sensor ACS712

Software

A programação será responsável por, primeiramente, realizar várias leituras do pino analógico, no qual o ACS712 está conectado, durante um período de tempo, assim, podemos ter uma noção dos valores que constituem a senoide da corrente. Com esses valores, o arduino poderá calcular o valor de pico da senoide, no qual o mesmo equivale ao maior valor da amostra encontrada, e após isso, basta dividir esse valor por √2, segundo a seguinte fórmula:

Irms = Ipico / √2

Assim, conseguiremos descobrir o valor rms (eficaz) da corrente passando pelo condutor no qual o ACS712 está conectado.

Agora será explicado a função de cada linha presente no código apresentado no tópico “Programando”.

– Criando um vetor

Inicialmente é criado um vetor que será utilizado para armazenar 300 amostras de valores que serão lidos adiante.

float vetCorrente[300];

– Aquisição das amostras por meio de uma estrutura de repetição

É criado um “for” para que o arduino possa armazenar vários valores de corrente durante um determinado instante de tempo.

for(int i = 0; i < 300; i++)
{
  vetCorrente[i] = analogRead(A0);
  delayMicroseconds(600);
}

– Encontrando o maior valor de amostra do vetor “vetCorrente[300]”

Cria-se outro laço “for” para que o arduino possa encontrar, entre as 300 amostras, a que apresente o maior valor.

for(int i = 0; i < 300; i++)
{
  if(maior_Valor < vetCorrente[i])
  {
    maior_Valor = vetCorrente[i];
  }
}

– Calculando o valor da corrente

No primeiro instante é necessário converter o valor encontrado, que se encontra entre 0 e 1023, para o valor de tensão lido pelo arduino. Para isso, por meio de uma regra de 3 simples, é possível encontrar o valor de tensão.

1024     –     5

(valor da amostra)     –     x

Seguindo essa regra de 3, é possível descobrir que basta multiplicar o valor da amostra por 0,004882812 para encontrar o valor da tensão lido pelo arduino.

maior_Valor = maior_Valor * 0.004882812;

– Removendo o valor de offset das amostras

A forma de onda resultante na saída do módulo ACS712 equivale a uma senoide com uma tensão de offset, como podemos ver abaixo.

Exemplo da forma de onda da saída do módulo ACS712

Seguindo seu datasheet, o valor da tensão de offset (equivalente ao zero da forma de onda senoidal da corrente) é proporcional ao valor de VCC * 0,5, que no nosso caso seria:

Voffset = VCC * 0,5

Voffset = 5 * 0,5

Voffset = 2,5 V

Por esse motivo foi necessário diminuirmos o valor de tensão encontrado por 2,5, como é indicado logo abaixo.

valor_Corrente = maior_Valor - 2.5;

– Convertendo para mili

O datasheet deste módulo apresenta os valores de sensibilidade de mV/A, com isso, foi necessário converter os valores de V para mV, para que o arduino possa calcular o valor da corrente adiante.

valor_Corrente = valor_Corrente * 1000;

– Encontrando o valor de pico da corrente

Agora dividiremos o resultado pelo valor equivalente a sensibilidade do sensor. Como visto anteriormente, existem diferentes modelos de ACS712, no qual o que foi utilizado neste tutorial é o ACS712ELCTR-30A-T, conhecido como ACS712 30A, no qual consultando seu datasheet foi possível encontrar o valor de sensibilidade de mV/A, que corresponde a 66 mV/A.

valor_Corrente = valor_Corrente / 66;

Caso o seu ACS712 seja de outro modelo, substitua o valor “66” pelo valor que corresponda a sensibilidade do seu módulo. Para o ACS712 5A, por exemplo, você precisa mudar para 185.

– Calculando o valor rms da corrente

Achado o valor de pico, é possível calcular o valor rms da corrente, finalizando assim o código referente a corrente.

valor_Corrente = valor_Corrente / 1.41421356;

– Mostrando o resultado no monitor serial

É mostrado os valores de corrente e potência no monitor serial, para que você possa visualizá-los.

Serial.print("Corrente = ");
Serial.print(valor_Corrente);
Serial.println(" A");

Serial.print("Potencia = ");
Serial.print(potencia);
Serial.println(" W");

É dado um tempo para a próxima atualização dos valores.

Serial.print(".");
delay(500);
Serial.print(".");
delay(500);
Serial.print(".");
delay(500);

Medindo corrente contínua

Uma vantagem deste sensor é que com ele você poderá medir também o valor da corrente de cargas DC, ou seja, do mesmo modo que ele pode ser empregado para medir corrente alternada, ele também pode ser empregado para medir corrente contínua.  Para isso, basta mudarmos algumas linhas da programação referentes ao vetor de amostras vetCorrente[300]. Abaixo é detalhado as alterações que deverão ser feitas.

Ao invés de encontrarmos o maior valor presente no vetor, como foi descrito no tópico Encontrando o maior valor de amostra do vetor “vetCorrente[300]” logo acima, teremos que realizar um cálculo de média aritmética com todos os valores.

Veja abaixo o código a ser retirado.

for(int i = 0; i < 300; i++)
{
  if(maior_Valor < vetCorrente[i])
  {
    maior_Valor = vetCorrente[i];
  }
}

maior_Valor = maior_Valor * 0.004882812;
valor_Corrente = maior_Valor - 2.5;

Em seu lugar, colocaremos o seguinte código.

int somaTotal;

for(int i = 0; i < 300; i++)
{
  somaTotal = vetCorrente[i] + somatorio;
}

valor_medio = somaTotal / 300;

valor_medio = valor_medio * 0.004882812;
valor_Corrente = valor_medio - 2.5;

Além disso, devemos retirar a seguinte linha do código:

valor_Corrente = valor_Corrente / 1.41421356;

Retirar essa linha se faz necessário pois ela converter o valor de pico da corrente para o valor rms, mas, por estarmos tratando de corrente contínua, isso não é necessário.

Essas modificações surtirão no seguinte efeito:

  • Por meio do laço for será realizado a soma de todos os valores presentes no vetor vetCorrente[300], e armazenando o resultado na variável somaTotal;
  • É realizado a divisão da variável somaTotal pelo número 300, encerrando assim o cálculo da média aritmética;
  • As linhas seguintes serão responsáveis por converter o valor achado até o momento no valor de corrente realmente lido.

O código final com essas alterações pode ser visualizado logo abaixo.

float vetCorrente[300];

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop()
{
  double maior_Valor = 0;
  double valor_Corrente = 0;  

  float tensao = 127;
  float potencia = 0;

  for(int i = 0; i < 300; i++)
  {
    vetCorrente[i] = analogRead(A0);
    delayMicroseconds(600);
  }  



  int somaTotal = 0;

  for(int i = 0; i < 300; i++)
  {
    somaTotal = vetCorrente[i] + somaTotal;
  }
  valor_medio = somaTotal / 300;
  
  valor_medio = valor_medio * 0.004882812;
  valor_Corrente = valor_medio - 2.5;



  valor_Corrente = valor_Corrente * 1000;
  valor_Corrente = valor_Corrente / 66;         //sensibilidade : 66mV/A para ACS712 30A / 185mV/A para ACS712 5A

  Serial.print("Corrente = ");
  Serial.print(valor_Corrente);
  Serial.println(" A");

  potencia = valor_Corrente * tensao;

  Serial.print("Potencia = ");
  Serial.print(potencia);
  Serial.println(" W");
  
  Serial.print(".");
  delay(500);
  Serial.print(".");
  delay(500);
  Serial.print(".");
  delay(500);

  Serial.println("");
}

Com essas alterações, você poderá medir a corrente de sua carga DC tranquilamente.


Considerações finais

Esperamos que este tutorial tenha tanto trazido-lhe o entendimento a respeito do módulo ACS712 quanto tirado suas dúvidas sobre esse sensor de corrente.

Privacy Preference Center