Como comparar tensão com arduino

Durante o desenvolvimento de algum dos seus projetos você já deve ter tido a necessidade de medir a tensão ou a corrente consumida pelo seu projeto ou parte dele. Normalmente utilizamos um multímetro e medimos uma grandeza por vez (algo não muito prático). Neste artigo veremos como montar um simples e prático medidor de tensão e corrente DC utilizando como componente principal o current monitor módulo INA219 da Texas Instruments.

Como comparar tensão com arduino

Para apresentar as leituras utilizaremos um Display de LCD 16×2 com um adaptador i2c, o que irá minimizar bastante a quantidade de pinos necessários, se comparado a tradicional utilização com interface paralela, seja de 4 bits ou 8 bits.

PRINCIPAIS MATERIAIS UTILIZADOS

O SENSOR DE CORRENTE DC MODULO INA219

O INA219 é um componente extremamente versátil para o monitoramento de grandezas elétricas DC. Permite o monitoramento de linhas com alimentação de 0 a 26 Vdc, corrente com limite máximo dependente do resistor shunt utilizado, conversor ADC interno de 12 bit e interface i2c para comunicação. O método de medição de corrente utilizado é o high-side, onde o resistor shunt é colocado entre a fonte de alimentação e a carga. Este método permite que o dispositivo meça tanto a corrente circulante, como a tensão na carga. O datasheet do componente pode ser encontrado neste LINK.

Como comparar tensão com arduino
Medição em High-Side e Low-Side

Como mencionado anteriormente, a medição da corrente é realizada através de um resistor shunt, ou seja, nossa boa e velha Lei de Ohm. Lembre-se que quando uma corrente elétrica atravessa um resistor surge em seus terminais uma diferença de potencial, ou seja, surge uma tensão que é proporcional a corrente circulando através do resistor.

 U = R x I

Ao medirmos a tensão sobre um resistor qualquer, de posse da resistência do mesmo podemos substituir os valores na equação e com isso obter a corrente elétrica.

A placa Sensor de Corrente DC INA219 I2C facilita muito os projetos envolvendo este componente pois já engloba o circuito integrado, os componentes passivos necessários para seu funcionamento, um resistor shunt de 0.100R (100 miliOhm) que permite medição de correntes máximas de +- 3,2 A (tensão máxima de +-320 mV no resistor shunt) e também terminais para conexão com o microcontrolador e com a fonte que irá alimentar a carga a ser monitorada. A placa possui também dois conjuntos de pads/jumpers que permitem modificar o endereço i2c do dispositivo, ou seja, podemos utilizar até 4 dispositivos ao mesmo tempo em uma mesma linha i2c.

Como comparar tensão com arduino
Placa INA219 DC Current Sensor

A alimentação do módulo INA219 é realizada através dos terminais Vcc e Gnd, podendo variar de 3 V a 5,5 Vdc, ou seja, dentro dos limites da maiorias das placas disponíveis atualmente, incluindo a placa Nano V3.0 utilizada neste projeto.

Os pinos Sda e Scl são referentes a comunicação i2c, e devem ser conectados respectivamente aos pinos A4 e A5 da placa Nano. Os pinos Vin+ e Vin- presentes tanto na barra de pinos, como no conector parafusável, são utilizados para monitorar a carga. A fonte que alimenta a carga (com tensões de 0 a 26 V) entra no terminal Vin+, atravessa o resistor shunt e sai pelo terminal Vin-, indo para a carga a ser monitorada. Aqui fica uma dica, para cargas que consumam pouca corrente você pode utilizar os terminais na barra de pinos inferior, na dúvida, utilize o terminal parafusável superior.

Uma consideração importante, o Gnd do nosso circuito de medição deverá estar conectado ao Gnd da nossa carga, por exemplo, se você estiver monitorando o consumo de um motor conectado a uma bateria de 9V, o terminal “” da bateria deverá ser conectado ao Gnd geral. Isto garante que os circuitos operem sob mesmo referencial, ao mesmo tempo que assegura que a tensão será medida corretamente.

DISPLAY DE LCD 16X2 E ADAPTADOR I2C

Iremos utilizar um tradicional display LCD 16×2 para apresentar as medições. nativamente este display utiliza uma interface paralela, necessitando de pelo menos 6 pinos na versão 4 bits, conforme pode ser visto neste artigo do blog,  ou até 11 pinos na versão 8 bits.

Como comparar tensão com arduino

Para minimizar a quantidade de pinos necessários iremos utilizar um Módulo Serial I2C para Display LCD. Este módulo permite comunicar com o LCD através da interface serial I2C, utilizando apenas 2 terminais (SDA e SCL). O módulo pode ser soldado diretamente ao display de LCD ou então pode-se cortar e soldar uma barra de pinos fêmea. permitindo que você altere a interface de acordo com suas necessidades.

Como comparar tensão com arduino

CIRCUITO MODULO INA219 COM ARDUINO

Para montagem básica precisaremos de uma protoboard, uma fonte para alimentar nosso circuito e alguns jumpers. Indico utilizarem jumpers rígidos pois além da estética melhor, eles acabam evitando problemas de mau contato.

Iremos alimentar as linhas superior e inferior do protoboard com 5 V. Essa alimentação será útil para alimentar a placa Nano, o módulo INA219 e também nosso LCD via adaptador i2c.

Os pinos SDA e SCL, tanto da placa INA219 como do adaptador i2c deverão ser conectados respectivamente os pinos A4 e A5, que neste projetos serão utilizados para comunicação i2c.

O circuito a seguir apresenta as conexões básicas necessárias.

Como comparar tensão com arduino

Veja que é um circuito bastante simples, restando apenas conectar a fonte que irá alimentar a carga ao conector Vin+, conectar Vin- a carga e lembrar de interconectar o Gnd dos circuitos.

BIBLIOTECAS NECESSÁRIAS

Para realização deste projeto será necessário adicionar duas novas bibliotecas, a Adafruit_INA219 e a LiquidCrystal_I2C. Aconselho utilizar o utilitário de gerenciamento de bibliotecas para facilitar o processo. Clique em Sketch >> incluir Biblioteca >> Gerenciar Bibliotecas…. No campo de busca insira o nome das bibliotecas Adafruit INA219 e LiquidCrystal I2C. Na lista que aparecer, selecione a biblioteca indicada e então clique em “Instalar”.

Como comparar tensão com arduino

CÓDIGO FONTE

As bibliotecas utilizadas para o INA219 e para o LCD via i2c possuem exemplos de sua utilização que serviram como base para este projeto.

A seguir é apresentado o código que une as funcionalidade do nosso sensor de corrente e tensão e do nosso LCD via serial I2C.

/*  * DC Current and Voltage Meter - Basic Code * - Use one INA219, an i2c current monitor from TI * with 12 bit ADC, capable to monitor Voltage and * Current  *  * -------------------------------------------------  * Medidor corrente e tensão DC - Código Básico * - Utiliza um modulo INA219, um monitor de corrente i2c * com um ADC de 12 bit, capaz de monitorar Tensão * e Corrente * * developed by: Haroldo Amaral * 2017/03/26 - v 1.0 */ #include <Wire.h> #include <LiquidCrystal_I2C.h> // lcd i2c lib #include <Adafruit_INA219.h> // ina219 lib // Define some constants used in code const int LED1 = 2; // the number of the LED pin const int LED2 = 3; // the number of the LED pin const int ON = 1; // on state const int OFF = 0; // off state const int LCD_addr = 0x3F; // LCD i2c address const int LCD_chars = 16; // number of characters const int LCD_lines = 2; // number of lines const int INA_addr = 0x40; // INA219 address // set the LCD address to 0x3F for a 16 chars and 2 line display // indica o endereço do LCD - 0x3F, com 16 caracteres e 2 linhas LiquidCrystal_I2C lcd(LCD_addr, LCD_chars, LCD_lines); // set the INA219 to address 0x40 // indica o endereço do INA219 - 0x40 Adafruit_INA219 ina219(INA_addr); // global variables float shuntvoltage = 0; float busvoltage = 0; float current_mA = 0; float loadvoltage = 0; // Prototype of functions void Read_INA219_Values(void); void LCD_Update(void); void Serial_Send(void); void setup() { // configure LED pins pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); // configure the serial to 9600bps Serial.begin(9600); Serial.println("Hello!"); Serial.println("Measuring voltage and current with INA219 ..."); // initialize the INA219 ina219.begin(); // initialize the lcd lcd.init(); lcd.clear(); // Print a message to the LCD. lcd.backlight(); // set the cursor and write some text lcd.setCursor(0,0); lcd.print("Tensao Corrente"); } /* * MAIN LOOP * - change the led state, measure the values and update LCD */ void loop() { // read values from INA219 // lê os valores do INA219 Read_INA219_Values(); // update the LCD // atualiza o LCD LCD_Update(); // send data over the serial // envia os dados pela serial Serial_Send(); // change the value to increase/decrease the update rate // mude o valor para alterar a taxa de atualização delay(250); } /* * Functions */ // Read the values from INA219 // lê os valores convertidos pelo modulo INA219 void Read_INA219_Values(void) { shuntvoltage = ina219.getShuntVoltage_mV(); busvoltage = ina219.getBusVoltage_V(); current_mA = ina219.getCurrent_mA(); loadvoltage = busvoltage + (shuntvoltage / 1000); } // update the LCD with values // atualiza o LCD com os valores void LCD_Update(void) { lcd.setCursor(0,1); lcd.print(busvoltage); lcd.print("V "); lcd.setCursor(7,1); lcd.print(current_mA); lcd.print("mA "); } // Send data over the serial // envia os valores pela serial void Serial_Send(void) { 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(""); }

Com o exemplo rodando serão apresentadas no LCD a tensão e corrente da carga. Neste exemplo utilizei 1 LED vermelho como carga teste.

UM SEGUNDO TESTE COM O MODULO INA219

Para fixarmos os conceitos irei demonstrar um exemplo medindo a tensão e a corrente consumida por todo o circuito de medição e mais dois LED’s controlados pela própria sketch.

Como queremos medir o consumo da placa Nano, do Display LCD e de mais dois LED’s, serão necessárias alguma modificações pontuais no circuito. A principal delas é que a alimentação de 5V fornecida pela fonte ajustável, será conectada apenas as linhas de alimentação superiores, na parte interior iremos deixar o jumper da fonte na posição “off”. A alimentação de 5V será aplicada ao pino Vin+ e o pino Vin- será conectado a linha de alimentação inferior, permitindo alimentar a placa Nano e também o Display de LCD.

O circuito de teste é apresentado a seguir.

Como comparar tensão com arduino

CÓDIGO FONTE

Neste teste o código irá controlar o backlight e os dois leds para demonstrar a medição de tensão e corrente. Inicialmente é mostrada a medição com backlight aceso e com os leds apagados, após um delay o backlight é apagado, o backlight é novamente aceso e um dos LEDs também, o segundo LED é aceso. Entre cada etapa ocorre a leitura dos valores medidos pelo INA219, atualização do display e geração de um delay de 2 segundos.

O código é apresentado a seguir.

/*  * DC Current and Voltage Meter - LED test * - Use one INA219, an i2c current monitor from TI * with 12 bit ADC, capable to monitor Voltage and * Current * - In the test, the LEDs and the backlight are * switched to verify the current consumption * * -------------------------------------------------  * Medidor corrente e tensão DC - LED test * - Utiliza um modulo INA219, um monitor de corrente i2c * com um ADC de 12 bit, capaz de monitorar Tensão * e Corrente * - No teste, os led e o backlight são chaveados * para verificar a corrente consumida * * developed by: Haroldo Amaral * 2017/03/26 - v 1.0 */ #include <Wire.h> #include <LiquidCrystal_I2C.h> // lcd i2c lib #include <Adafruit_INA219.h> // ina219 lib // Define some constants used in code const int LED1 = 2; // the number of the LED pin const int LED2 = 3; // the number of the LED pin const int ON = 1; // on state const int OFF = 0; // off state const int LCD_addr = 0x3F; // LCD i2c address const int LCD_chars = 16; // number of characters const int LCD_lines = 2; // number of lines const int INA_addr = 0x40; // INA219 address // set the LCD address to 0x3F for a 16 chars and 2 line display // indica o endereço do LCD - 0x3F, com 16 caracteres e 2 linhas LiquidCrystal_I2C lcd(LCD_addr, LCD_chars, LCD_lines); // set the INA219 to address 0x40 // indica o endereço do modulo INA219 - 0x40 Adafruit_INA219 ina219(INA_addr); // global variables float shuntvoltage = 0; float busvoltage = 0; float current_mA = 0; float loadvoltage = 0; // Prototype of functions void Read_INA219_Values(void); void LCD_Update(void); void Serial_Send(void); void setup() { // configure LED pins pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); // configure the serial to 9600bps Serial.begin(9600); Serial.println("Hello!"); Serial.println("Measuring voltage and current with INA219 ..."); // initialize the INA219 ina219.begin(); // initialize the lcd lcd.init(); lcd.clear(); // Print a message to the LCD. lcd.backlight(); // set the cursor and write some text lcd.setCursor(0,0); lcd.print("Tensao Corrente"); } /* * MAIN LOOP * - change the led state, measure the values and update LCD */ void loop() { // test 1 - backlight on, leds off // teste 1 - backlight aceso, leds apagados digitalWrite(LED1, OFF); digitalWrite(LED2, OFF); Read_INA219_Values(); LCD_Update(); Serial_Send(); delay(2000); // test 2 - backlight off, leds off // teste 2 - backlight apagado, leds apagados lcd.noBacklight(); Read_INA219_Values(); LCD_Update(); Serial_Send(); delay(2000); // test 3 - backlight on, led 1 ON // teste 3 - backlight aceso, led 1 aceso lcd.backlight(); digitalWrite(LED1, ON); Read_INA219_Values(); LCD_Update(); Serial_Send(); delay(2000); // test 4 - backlight on, led 1 and 2 ON // teste 4 - backlight aceso, led 1 e 2 aceso digitalWrite(LED2, ON); Read_INA219_Values(); LCD_Update(); Serial_Send(); delay(2000); } /* * Functions */ // Read the values from INA219 // lê os valores convertidos pelo modulo INA219 void Read_INA219_Values(void) { shuntvoltage = ina219.getShuntVoltage_mV(); busvoltage = ina219.getBusVoltage_V(); current_mA = ina219.getCurrent_mA(); loadvoltage = busvoltage + (shuntvoltage / 1000); } // update the LCD with values // atualiza o LCD com os valores void LCD_Update(void) { lcd.setCursor(0,1); lcd.print(busvoltage); lcd.print("V "); lcd.setCursor(7,1); lcd.print(current_mA); lcd.print("mA "); } // Send data over the serial // envia os valores pela serial void Serial_Send(void) { 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 resultado deste teste você confere na imagem do início do post, e os arquivos deste projeto (sketches e esquemático do Fritzing) podem ser baixados no meu repositório GitHub.

Gostou do Medidor de tensão e corrente DC com módulo INA219? Deixe seu comentário logo abaixo.