Manual

do

Maker

.

com

ACS712 - Sensor de corrente AC/DC com Arduino

ACS712 - Sensor de corrente AC/DC com Arduino

Estava precisando fazer uma pequena medição de maneira simplificada, só pra tirar uma dúvida, mas com o multimetro ficava meio desajeitado, então resolvi montar esse pequeno brinquedo usando o sensor de corrente por efeito hall ACS712 com Arduino. Esse post é só um mini-tutorial pra colocar o sensor a funcionar de forma sucinta; vulgo "receita de bolo".

Confesso que não sei quanto à precisão do componente. Li no datasheet que é 66mV/A, mas não sei usar essa informação. O caso é que no Arduino UNO ou Leonardo, a resolução máxima de leitura analógica é 10 bits. O ESP8266, MSP432 e outros tem uma resolução mais alta, porém as duas citadas trabalham a 3.3V.

Características interessantes do ACS712

Olhando o datasheet, vi que a taxa de erro é de 1.5% - Um bocado alto, eu acho. Ele opera à 5V e tem 66mV/A de saída em modo de operação normal. A saída é proporcional à corrente AC ou DC. A saída é extremamente estável, a histerese é próxima a zero, é seguro e não depende de nenhum circuito de isolamento.

Corrente AC ou DC?

Ele pode ser utilizado tanto em corrente AC quanto DC. Se resolver utilizá-lo em AC, considere que será necessário fazer uma retificação do sinal, filtragem e coleta de uma pequena amostragem. Depois, somado o número de amostragens coletadas em um intervalo de tempo X, divide-se pelo número de amostras e depois aplica-se os cálculo dispostos mais adiante.

Proporções e cálculos

Ele opera à 5V e vou utilizar um Arduino que também opere nessa tensão para facilitar as coisas. A leitura será feita na porta analógica A0. A resolução da porta analógica é de 10 bits, portanto 1024 valores, a contar de 0.

O ACS712 lê corrente positiva e corrente negativa, de -30A à 30A. O ponto 0 é portanto o ponto médio da resolução, que é 512. A saída do ACS712 quando não tiver corrente é de VCC/2, ou seja, 2.5V.

O pino analógico do Arduino lê 5V em uma escala de 1024 valores, portanto:

0 = 2.5V = 512

E é nesses 512 que serão distribuidos os possíveis 30A de resolução do ACS712. Nesse caso:

I\_{(1A)} = \frac{512}{30} = 17.06

Sabendo agora que 1A equivale a 17.06, basta agora montar a fórmula da leitura:

Range = 0 à 1023 portanto 511 = 0

I = \frac{(analogRead(0)-511)}{17.06}

Agora já podemos partir para o wiring e posteriormente codificar essas continhas acima. Esse módulo que comprei da Sparkfun é uma verdadeira porcaria. Ele poderia já vir com os filtros, mas não. Vem apenas o CI soldado na board, o que não simplifica seu uso. Por conta disso, será necessário seguir esse esquema, indicado como "modo de operação típico" no datasheet:

Wiring:

ac-current.webp

Gostaria de exibí-lo no Fritzing, mas infelizmente o ACS712 que tem lá já tem filtro na board. Enfim, seguindo o esquema e guiando-se pela imagem, os 2 furos maiores são os furos para medir a corrente. Vamos ao ponto de atenção.

Atenção para não conectar errado os fios

Essa situação pode ser bem pior em corrente alternada, por isso é importante que você entenda o seguinte:

acs712-external.webp

O que desejo focar nessa imagem é que você deve fazer um "passthrough" de um dos fios, seja AC ou DC, mas jamais coloque GND/Neutro junto com VCC/Fase porque isso é um curto-circuito! Portanto, enfatizando: A conexão deve ser como exemplificado acima.

Estou com preguiça de codificar, então peguei um código pronto de outro post que escrevi e adicionei calc(), apaguei algumas linhas e coloquei alguns defines. Se quiser usar apenas a parte do cálculo, está fácil.

#define AMP_MAX 30.0
#define RANGE 511.0
#define SAMPLE (RANGE+1)/AMP_MAX

int secs         = 0;
int minutes      = 0;
int hours        = 0;
int days         = 0;
float currentVal = 0;

long interval  = 1000; //ms
long previous  = 0;
unsigned long current = millis();

void setup(){
  
}

void myClock(){
  secs +=1;
  if (secs > 59){
    minutes +=1;
    secs = 0;
  }
  if (minutes > 59){
    hours += 1;
    minutes = 0;
  }
  if (hours > 24){
    days += 1;
  }
}

void calc(){
    currentVal = (analogRead(0)-RANGE)/SAMPLE;
    Serial.println(currentVal);
    
}

void loop(){
  if(current - previous > interval) {
    previous = current;
    calc();
    myClock();
  }
}

Pessoal, gostaria de enfatizar a importância de se inscreverem no nosso canal Manual do Maker Brasil no YouTube, porque alguns videos e reviews eu farei exclusivamente para o canal, uma vez que aqui escrevo o procedimento e lá tentarei mostrar além do funcionamento, as possibilidades.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.