
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.



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



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!
Bom dia! Parabéns pelo post. Poderia me ajudar estou tentando reproduzir seu post, más está aparecendo o erro: ‘shuntvoltage’ does not name a type.