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

ina219
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).

[latex]Cal = trunc\Biggl(\frac{0.04096}{Current_LSB*R_shunt}\Biggl) [/latex]

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:

[latex] Current_Register = \frac{val do reg de desvio de tensao * reg de calib}{4096}[/latex]

É 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 é:

[latex]cal_escala_compl_corrigida =\Biggl(\frac{Cal * MeasShuntCurrent}{INA219_Current}\Biggl)[/latex]

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.

[caption id="attachment_6634" align="aligncenter" width="300"]ina219 addresses ina219 addresses[/caption]

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:

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).

[caption id="attachment_6783" align="aligncenter" width="300"]ina219 wiring ina219 wiring[/caption]

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.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.