Manual
do
Maker
.
com
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.
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.
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,
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?
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:
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)
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.
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.
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.
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.
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.
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.
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.
Prefere twitter? @DobitAoByte.
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.