Manual

do

Maker

.

com

Sensor de corrente, tensão e potência INA219

Sensor de corrente, tensão e potência INA219

Quando comprei esse dispositivo, focava somente em corrente e o que mais me atraiu nele de imediato foi sua interface I²C, que me permite controlá-lo por dois fios (SDA e SCL) em qualquer hardware que tenha suporte a I²C.

Sensor de corrente INA219

O sensor de corrente INA219 é um monitor de corrente e potência com barramento I²C ou SMBUS. Possui um valor de calibração programável que combinado com um multiplicador interno ativa leituras diretas de corrente em amperes, dispensando assim que você faça cálculos no seu Arduino/PIC/Raspberry, etc.

Também conta com um registro multiplicador adicional que calcula potência em watts. A interface I²C do INA219 possui 16 endereços programáveis.

Esse CI está disponível em dois formatos, sendo A e B, onde B possui maior precisão.

Por fim, esse dispositivo pode interagir em barramentos entre 0 e 26V e medir correntes de até 3.5A. Se alimenta entre 3 e 5.5V e consome no máximo 1mA de corrente. Pode operar em temperaturas entre -40 e 125 graus celsius.

Modo de operação recomendado

O datasheet também faz referência ao modo de operação, sugerido com tensão de 12V, alimentação do circuito em 3.3V e faixa de temperatura entre -25 e 85 graus celsius,

Uso típico

Tem boa aplicabilidade em servidores, equipamentos de telecom, notebooks, gerenciadores de energia, carregadores de bateria etc. - ou seja - nesse ponto você já deve ter percebido que é um dispositivo para utilização em corrente contínua, certo?

Calibração

Quase sempre é necessário calibrar dispositivos de medição, exceto ele seja apenas medidor de estado (0 ou 1 para ausente e presente respectivamente). Para fazer essa calibragem, você não precisa saber de muitos detalhes além do processo, mas é bom ter em mente o que envolve o processo.

Primeiro, a resolução do sensor é de 12 bits, logo, você tem 4096 valores possíveis. A equação (não inventei, ela está no datasheet) usa o termo Current_LSB (último bit significante), que é o valor programado para o LSB no registrador de corrente (0x04).

Cal = trunc\Biggl(\frac{0.04096}{Current\_LSB\*R\_shunt}\Biggl)

Nessa fórmula:

  • 0.04096 é um valor interno fixo utilizado para garantir o escalonamento
  • [latex]Current_LSB = \frac{Corrente maxima esperada}{2^15}[/latex]
  • Power_LSB = 20 Current_LSB

O shunt é calculado pela multiplicação do desvio do registrador de tensão com o desvio da tensão de LSB de 10µV.

Devido aos bits do registrador de tensão não serem alinhados à direita, se faz necessário um shift right de 3 bits. Esse shift coloca o BD0 na posição do LSB para que o conteudo possa ser multiplicado pelo barramento de tensão.

Após programar o registrador de calibração, o valor esperado no registrador de corrente (0x04) pode ser calculado multiplicando o conteúdo do registrador de desvio pelo registrador de calibração e então dividir o valor por 4096. Mas a fórmula é mais simples que a explicação:

Current\_Register = \frac{val do reg de desvio de tensao \* reg de calib}{4096}

É bastante simples, como se pode notar.

O valor esperado no registrador de potência (0x03) pode ser calculado pela multiplicação do registrador de corrente * o registrador de tensão e então dividido por 5k. O conteúdo do registrador de potência é multiplicado pelo Current_LSB em 20 vezes para obter o valor de de potência em watts.

[latex] Current Register = \frac{registrador de corrente * registrador de tensao}{5000}[/latex]

De maneira bem resumida, cito o datasheet, que informa sobre o registrador de calibração. Ele habilita o escalonamento do registrador de corrente (0x04) e do registrador de potência (0x03). A fórmula para calibrar com precisão é:

cal\_escala\_compl\_corrigida =\Biggl(\frac{Cal \* MeasShuntCurrent}{INA219\_Current}\Biggl)

Não quero pensar

Sem programação, a corrente é medida pela leitura do desvio de tensão. O registrador de corrente e o registrador de potência estarão disponíveis somente se o registrador de calibração possuir um valor programado, portanto, você deverá optar em ganhar por um lado e perder pelo outro, caso deseje o meio mais simples (não que o outro seja complicado). Enfim, basta ler o registrador de tensão com resolução de 12bits.

Endereçamento

Esse dispositivo é bastante amplo em relação ao endereçamento. Ele possui 2 pinos de endereço, sendo A0 e A1, possibilitando 16 endereçamentos. O único problema (já falando da board em sí) é que os endereçamentos devem ser feitos na base da solda, pois não tem um seletor ou pinos para jumping.

ina219-addresses.webp

Registradores voláteis

A cada novo start do dispositivo, a configuração deve ser refeita, portanto, já crie um recurso para fazer a configuração em seu código.

Lendo e escrevendo do INA219

Para acessar o dado de um registrador específico, deve-se escreve o valor apropriado para o ponteiro do registrador. Cada operação de escrita para o INA219 requer um valor para o ponteiro do registrador.

O processo de escrita começa com o primeiro byte sendo transmistido pelo master, que é justamente o seu programa. Esse primeiro byte é o endereço do slave - no caso, o INA219. O byte subsequente transmitido pelo master é o endereço do registrador para qual o dado será escrito. Os próximos dois bytes são escritos no registrador endereçado pelo registrador ponteiro. O master pode terminar a transferência de dados pela geração da condição de START ou STOP - isso já cabe ao protocolo I²C.

Blabla, blablabla-bla. Bla. E aí você tem 2 opções; ou ler o datasheet, ou pegar uma biblioteca pronta pra Arduino ou, se quiser esse dispositivo funcionando no ESP8266 ou Raspberry, pode portar a biblioteca. Vamos migrar para Python utilizando a técnica da 'kibada master camuflada'.

Primeiro, vou deixar o modo simples para Arduino.

INA219 com Arduino

A biblioteca pode ser baixada nesse link. No exemplo da adafruit, simplesmente use o seguinte código:

#include <Wire.h>
#include <Adafruit_INA219.h>
 
Adafruit_INA219 ina219_A;
Adafruit_INA219 ina219_B(0x41);
 
 
void setup(void) 
{
  ina219_A.begin();  // Initialize first board (default address 0x40)
  ina219_B.begin();  // Initialize second board with the address 0x41
}

  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); 
  Serial.print(busvoltage); 
  Serial.println(" V");
  Serial.print("Shunt Voltage: "); 
  Serial.print(shuntvoltage);
  Serial.println(" mV");
  Serial.print("Load Voltage:  "); 
  Serial.print(loadvoltage);
  Serial.println(" V");
  Serial.print("Current:       "); 
  Serial.print(current_mA);
  Serial.println(" mA");
  Serial.println("");

O que permite essa facilidade é justamente a biblioteca. Acho fantástico encontrar bibliotecas prontas para facilitar o uso de sensores, mas o problema disso é que ficamos longe de saber como as coisas funcionam nos bastidores, pois ainda que a biblioteca esteja em seu poder, dificilmente ela será editada para apreciação. E é por isso que tenho escrito tutoriais com MicroPython e para Raspberry, que não possuem as mesmas facilidades do Arduino em todos os casos.

INA219 com Raspberry

Para utilizar o I²C em Raspberry temos duas grandes opções. Uma delas é utilizando Python com a SMBus. A outra opção é escrever em C++ utilizando o suporte a I²C da WiringPi. Eu estava escrevendo um porte da biblioteca da Adafruit para Raspberry, mas obviamente alguém já fez isso e só me dei conta antes de publicar esse artigo. Removi o código que escreví e aqui está o link da biblioteca portada.

Wiring

O wiring de qualquer dispositivo I²C é igual. Se você observar em outros artigos aqui no site, notará isso. Repare que no canto direito do sensor tem um A0 e A1, que se referem aos endereçamentos do dispositivo, caso deseje utilizar mais que um no mesmo barramento (porque são possíveis até 127 dispositivos no barramento I²C).

ina219-wiring.webp

Estou com mais alguns sensores aqui escrevendo artigos no tempo livre, mas também estou montando um robô quadrupede bem interessante, logo mais teremos novidades por aqui.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Manual do Maker Brasil 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.