Arduino Nano - Sensor de Corrente ACS712

Este tutorial ensina você a usar o Arduino Nano para ler quantos amperes passam por um fio, com a ajuda do módulo sensor de corrente ACS712 de 30A. Em detalhes, vamos aprender:

Arduino Nano ACS712 Current Sensor

Sugerimos:

Sobre o Sensor de Corrente ACS712

Pinagem do Sensor de Corrente ACS712

Dentro do chip ACS712, a corrente medida passa por um caminho curto e grosso de cobre. Essa corrente cria um campo magnético, e um sensor Hall colocado bem ao lado do cobre transforma o campo em uma tensão. O caminho de cobre tem apenas cerca de 1.2 mΩ de resistência, então quase não altera o seu circuito. Além disso, o lado de alta corrente é isolado eletricamente do lado do Arduino Nano (2.1 kV RMS), então o Nano nunca encosta nos fios da carga.

O chip ACS712 vem em três faixas de corrente. Este tutorial usa a versão de 30A.

ACS712 30A
Chip Allegro ACS712ELCTR-30A-T
Faixa de corrente −30A a +30A (DC ou AC)
Sensibilidade 66 mV por ampere
Outras versões 5A (185 mV/A), 20A (100 mV/A)
Tensão de alimentação 5V (4.5V a 5.5V)
Saída a 0A cerca de 2.5V (metade do VCC)
Saída a +30A / −30A cerca de 4.48V / 0.52V
Largura de banda 80 kHz
Erro total de saída cerca de ±1.5% a 25°C
Isolamento 2.1 kV RMS
Resistência do caminho de cobre cerca de 1.2 mΩ
ACS712 current sensor module pinout

O módulo tem um conector de 3 pinos para o lado do Arduino Nano:

  • Pino VCC: deve ser conectado ao pino 5V do Arduino Nano. Não o alimente com 3.3V
  • Pino GND: deve ser conectado ao GND (0V)
  • Pino OUT: saída de tensão analógica, deve ser conectado a um pino de entrada analógica do Arduino Nano (A0 neste tutorial)

No outro lado, há um borne de parafuso de 2 pinos para a corrente da carga. Em algumas placas esses terminais não têm rótulo:

  • Terminal IP+: a corrente entra aqui
  • Terminal IP−: a corrente sai aqui

Os dois bornes de parafuso devem ser conectados em série com a carga. Corte um dos fios de alimentação da carga e coloque o borne no meio, para que toda a corrente da carga passe pelo sensor. Uma corrente de IP+ para IP− dá um valor positivo. O módulo também tem um pequeno LED que mostra que ele está alimentado.

※ Nota:

A disposição dos pinos em um módulo pode variar de um fabricante para outro. É essencial sempre consultar os rótulos impressos no módulo ao usá-lo. Observe com atenção!

Como a Tensão de Saída Vira Amperes

Sem corrente, o pino OUT fica em cerca de 2.5V. Para cada ampere que flui de IP+ para IP−, a saída sobe 66 mV. Para cada ampere no sentido contrário, ela cai 66 mV. Então a fórmula é simples:

current_A = (Vout - Vzero) / 0.066

Por exemplo, se o ponto zero é 2.500V e o Nano lê 2.566V, a corrente é 0.066 / 0.066 = 1 A.

O Vzero quase nunca é exatamente 2.500V. Cada módulo é um pouco diferente, então o código mede o ponto zero real na inicialização, enquanto nenhuma corrente flui. É por isso que a carga deve estar DESLIGADA quando você liga o Nano.

Alguns fatos sobre a precisão no Arduino Nano:

  • O Nano tem um ADC de 10 bits. Com a referência de 5V, um passo do ADC é de cerca de 4.9 mV. Com 66 mV por ampere, um passo é de cerca de 74 mA. Então este sensor funciona melhor para cargas de cerca de 0.5A ou mais, como motores, lâmpadas, fitas LED e aquecedores.
  • Uma leitura de ±0.05A a ±0.1A sem carga é um ruído normal. O código faz a média de muitas leituras para reduzi-lo.
  • Quando o Nano é alimentado por USB, o pino 5V dele costuma ficar um pouco abaixo de 5V, por exemplo 4.8V. Isso não é um problema aqui: a saída do ACS712 é ratiométrica (ela acompanha a sua alimentação), e o ADC do Nano usa os mesmos 5V como referência, então as duas variações se cancelam.

Diagrama de Ligação

O conector de 3 pinos do sensor vai para o Nano (VCC no 5V, GND no GND, OUT no A0), e o seu borne de parafuso é colocado no fio positivo entre o adaptador de 12V e o dispositivo DC de 12V (como um motor DC, fita LED ou lâmpada).

The wiring diagram between Arduino Nano and ACS712 current sensor

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

De Para
ACS712 VCC Arduino Nano 5V
ACS712 GND Arduino Nano GND
ACS712 OUT Arduino Nano A0
Adaptador de 12V + (via DC power jack) ACS712 IP+
ACS712 IP− Dispositivo DC +
Dispositivo DC − Adaptador de 12V − (via DC power jack)

O pino OUT vai direto para o A0, sem resistor. O Nano é uma placa de 5V, então seus pinos analógicos aceitam toda a saída de 0.5V a 4.5V do sensor.

WARNING

Os fios de 12V vão apenas para o borne de parafuso do ACS712 e para o dispositivo DC. Nunca os conecte a nenhum pino do Arduino Nano.

Como Programar o Sensor de Corrente ACS712

Nenhuma biblioteca é necessária. O sensor fornece uma tensão analógica simples, então analogRead() é suficiente.

  • O primeiro passo é especificar o pino do Arduino Nano que está conectado ao pino OUT e a sensibilidade da versão de 30A:
const int SENSOR_PIN = A0; const float SENSITIVITY = 0.066; // 66 mV per amp
  • Leia o pino muitas vezes e converta a média para volts. O ADC do Nano dá de 0 a 1023 para 0V a 5V:
long sum = 0; for (int i = 0; i < samples; i++) { sum += analogRead(SENSOR_PIN); } float voltage = (sum / (float)samples) * 5.0 / 1024.0;
  • No setup(), com a carga DESLIGADA, salve o ponto zero. 1000 leituras dão um valor estável:
zeroVoltage = readSensorVoltage(1000);
  • No loop(), transforme a tensão em amperes com a fórmula acima:
float current = (voltage - zeroVoltage) / SENSITIVITY;

Código Arduino Nano para o Sensor de Corrente ACS712 - Corrente DC

O código abaixo encontra o ponto zero na inicialização. Depois disso, a cada 0.5 segundo, ele faz a média de 200 leituras e imprime a tensão OUT e a corrente em amperes.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-acs712-current-sensor */ const int SENSOR_PIN = A0; // Arduino Nano pin connected to the OUT pin of the ACS712 module const float VREF = 5.0; // ADC reference voltage of Arduino Nano (V) const float ADC_STEPS = 1024.0; // Arduino Nano has a 10-bit ADC const float SENSITIVITY = 0.066; // ACS712 30A version: 66 mV per amp (0.185 for 5A, 0.100 for 20A) const int NUM_SAMPLES = 200; // number of readings averaged for each result float zeroVoltage = 2.5; // output voltage at 0 A, measured again in setup() // read the sensor many times and return the average voltage on the OUT pin float readSensorVoltage(int samples) { long sum = 0; for (int i = 0; i < samples; i++) { sum += analogRead(SENSOR_PIN); } return (sum / (float)samples) * VREF / ADC_STEPS; } void setup() { Serial.begin(9600); // the load must be OFF here, so no current flows through the sensor Serial.println("Calibrating zero point. Keep the load OFF..."); delay(1000); zeroVoltage = readSensorVoltage(1000); Serial.print("Zero point: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float voltage = readSensorVoltage(NUM_SAMPLES); float current = (voltage - zeroVoltage) / SENSITIVITY; // in amps Serial.print("OUT voltage: "); Serial.print(voltage, 3); Serial.print(" V | Current: "); Serial.print(current, 2); Serial.println(" A"); delay(500); }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano, veja como configurar o ambiente para o Arduino Nano na Arduino IDE.
  • Ligue os componentes como mostrado no diagrama. Mantenha o adaptador de 12V desconectado por enquanto.
  • Conecte a placa Arduino Nano ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador e selecione a placa Arduino Nano e sua porta COM.
  • Copie o código acima e cole-o na Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor e defina o baud rate como 9600. Espere até que o ponto zero seja impresso. A carga deve permanecer DESLIGADA durante esse tempo.
  • Agora conecte o adaptador de 12V. O dispositivo DC liga.
  • Se o seu dispositivo DC for um motor, segure o eixo do motor com os dedos, de leve, por um instante e veja a corrente subir.
  • Veja o resultado no Serial Monitor:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
Calibrating zero point. Keep the load OFF... Zero point: 2.507 V OUT voltage: 2.510 V | Current: 0.05 A OUT voltage: 2.505 V | Current: -0.03 A OUT voltage: 2.508 V | Current: 0.02 A OUT voltage: 2.619 V | Current: 1.70 A OUT voltage: 2.567 V | Current: 0.91 A OUT voltage: 2.563 V | Current: 0.85 A OUT voltage: 2.566 V | Current: 0.89 A OUT voltage: 2.592 V | Current: 1.29 A OUT voltage: 2.598 V | Current: 1.38 A OUT voltage: 2.565 V | Current: 0.88 A
Ln 11, Col 1
Arduino Nano on COM15
2

As primeiras linhas mostram apenas ruído, porque o adaptador ainda está desconectado. Nesta execução, o dispositivo DC é um motor DC de 12V. O valor de 1.70A é o pico curto de partida do motor. Depois o motor se estabiliza perto de 0.9A, e a corrente sobe para cerca de 1.3A enquanto você reduz a velocidade do eixo com os dedos.

Se você vir valores negativos enquanto o dispositivo DC funciona, a corrente flui de IP− para IP+. Troque os dois fios no borne de parafuso ou simplesmente ignore o sinal de menos.

Medindo Corrente AC

Uma corrente AC muda de sentido muitas vezes por segundo (50 ou 60 vezes, dependendo do seu país). O pino OUT oscila acima e abaixo do ponto zero, então a média simples é cerca de zero e não diz nada. Em vez da média, calculamos o valor RMS (root mean square, valor quadrático médio), que é o número que o seu multímetro mostra para AC.

O código amostra o sensor o mais rápido que pode durante 200 ms. Essa janela cobre 10 ciclos completos a 50 Hz ou 12 ciclos a 60 Hz. Para cada amostra, ele pega a distância até o ponto zero, eleva ao quadrado e soma. No fim da janela:

current_rms = sqrt(sum_of_squares / sample_count) / 0.066

A ligação do lado do Arduino Nano continua a mesma. O borne de parafuso vai em série com um dos fios do dispositivo AC.

WARNING

A rede elétrica AC (110V ou 220V) é perigosa e pode matar. Pratique primeiro com a carga DC de baixa tensão acima. O lado de cobre e de parafusos do módulo carrega toda a tensão da rede, então nunca toque no borne de parafuso nem nos fios da carga enquanto o circuito estiver energizado. Coloque o módulo em uma caixa fechada e não condutora antes de conectar um dispositivo à rede elétrica.

Código Arduino Nano para o Sensor de Corrente ACS712 - Corrente AC

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-acs712-current-sensor */ const int SENSOR_PIN = A0; // Arduino Nano pin connected to the OUT pin of the ACS712 module const float VREF = 5.0; // ADC reference voltage of Arduino Nano (V) const float ADC_STEPS = 1024.0; // Arduino Nano has a 10-bit ADC const float SENSITIVITY = 0.066; // ACS712 30A version: 66 mV per amp const unsigned long WINDOW_MS = 200; // 200 ms = 10 cycles at 50 Hz, 12 cycles at 60 Hz float zeroVoltage = 2.5; // output voltage at 0 A, measured again in setup() void setup() { Serial.begin(9600); // the load must be OFF here, so no current flows through the sensor Serial.println("Calibrating zero point. Keep the load OFF..."); delay(1000); long sum = 0; for (int i = 0; i < 1000; i++) { sum += analogRead(SENSOR_PIN); } zeroVoltage = (sum / 1000.0) * VREF / ADC_STEPS; Serial.print("Zero point: "); Serial.print(zeroVoltage, 3); Serial.println(" V"); } void loop() { float sumOfSquares = 0; long count = 0; unsigned long startTime = millis(); // sample the sensor as fast as possible during the time window while (millis() - startTime < WINDOW_MS) { float voltage = analogRead(SENSOR_PIN) * VREF / ADC_STEPS; float offset = voltage - zeroVoltage; // distance from the zero point sumOfSquares += offset * offset; count++; } // RMS voltage swing around the zero point, then convert it to amps float rmsVoltage = sqrt(sumOfSquares / count); float rmsCurrent = rmsVoltage / SENSITIVITY; Serial.print("AC current (RMS): "); Serial.print(rmsCurrent, 2); Serial.println(" A"); delay(300); }

Passos Rápidos

  • Certifique-se de que o dispositivo AC está desconectado e depois ligue o borne de parafuso em série com ele.
  • Copie o código acima e cole-o na Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino Nano.
  • Abra o Serial Monitor e espere pelo ponto zero.
  • Ligue o dispositivo AC, por exemplo um secador de cabelo na posição baixa, sem tocar no módulo.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
Calibrating zero point. Keep the load OFF... Zero point: 2.493 V AC current (RMS): 0.07 A AC current (RMS): 0.06 A AC current (RMS): 2.31 A AC current (RMS): 2.36 A AC current (RMS): 2.33 A AC current (RMS): 2.35 A
Ln 11, Col 1
Arduino Nano on COM15
2

Com o dispositivo DESLIGADO, o valor RMS não é exatamente 0. O ruído é elevado ao quadrado, então ele nunca pode se cancelar, e um valor pequeno como 0.07A permanece. Trate qualquer valor abaixo de cerca de 0.1A como zero.

Conhecimento Adicional

ACS712 5A vs 20A vs 30A: Qual Escolher

As três versões têm os mesmos pinos, a mesma ligação e o mesmo código. Só muda o valor de SENSITIVITY no código.

ACS712 5A ACS712 20A ACS712 30A
Faixa de corrente ±5A ±20A ±30A
Sensibilidade 185 mV/A 100 mV/A 66 mV/A
SENSITIVITY no código 0.185 0.100 0.066
Um passo do ADC do Arduino Nano (4.9 mV) cerca de 26 mA cerca de 49 mA cerca de 74 mA

É evidente que a versão de 5A dá os passos mais finos para cargas pequenas, enquanto a versão de 30A é a escolha certa quando a corrente pode passar de 20A. Escolha a menor faixa que ainda cobre a maior corrente do seu projeto.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!