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

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
  • Current_LSB = \frac{Corrente maxima esperada}{2^15}
  • 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.

 Current Register = \frac{registrador de corrente * registrador de tensao}{5000}

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
ina219 addresses

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

ina219 wiring
ina219 wiring

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.