O Amperímetro é o medidor utilizado para mensurar um fluxo de elétrons, ou seja, uma corrente, cuja unidade de medida é o ampere. Tendo isto em vista, será desenvolvido neste post um amperímetro usando o Arduino e alguns componentes. Este projeto foi desenvolvido por um dos parceiros da Eletrogate, o Wagner do canal WR Kits. Acesse seu canal no Youtube e confira também abaixo o vídeo em que este post será baseado:
Os materiais necessários para esta prática são os seguintes:
O diagrama projeto desenvolvido aqui é o seguinte:
É importante salientar algumas coisas. O LM358 disponível em nossa loja é um pouco diferente do apresentado aqui no post, e, apesar de sua funcionalidade ser exatamente a mesma, é necessário prestar atenção nas novas portas de entrada do módulo LM358 e suas conexões, e também que sua amplificação é variável, portanto será preciso fazer algumas alterações no código, que será explicado abaixo. Outro aspecto do diagrama que precisa de atenção é o Resistor Shunt, que, por conta da falta de um desenho seu no fritzing, ele foi substituído pelo resistor azul no esquemático, porém, em seu lugar, deve ser utilizado o resistor shunt. Por fim, é importante frisar que a corrente que está sendo medida é a do resistor de 100 Ω, portanto se o leitor quiser descobrir o fluxo de corrente em outros componentes ou dispositivos, basta substituir o resistor mencionado pelo que deseja ser medido.
O código que será utilizado nesta prática está detalhado abaixo:
/* ===================================================================================== Curso de Arduino e AVR WR Kits Channel Aula 277: Amperímetro com Display LCD 16x2 sem biblioteca Autor: Eng. Wagner Rambo Data: Janeiro de 2021 ===================================================================================== */ // ===================================================================================== // --- Mapeamento de Hardware --- #define db7 7 #define db6 6 #define db5 5 #define db4 4 #define db3 11 #define db2 10 #define db1 9 #define db0 8 #define rs 13 #define en 12 // ===================================================================================== // --- Constantes do Projeto --- #define rshunt 100 //resistor de shunt para mA (0,10 Ohms x 1000) // ===================================================================================== // --- Protótipo das Funções --- void char_pos(char row, char col); void set_col(char address); void send_char(char character, char row, char col); void lcd_init(); void lcd_clear(); void ammeter(); float average_volt(); void serial_debug(); // ===================================================================================== // --- Variáveis Globais --- float content; unsigned m_amps; char mil, cen, dez, uni; // ===================================================================================== // --- Configurações Iniciais --- void setup() { Serial.begin(9600); //configura saídas pinMode(db0, OUTPUT); pinMode(db1, OUTPUT); pinMode(db2, OUTPUT); pinMode(db3, OUTPUT); pinMode(db4, OUTPUT); pinMode(db5, OUTPUT); pinMode(db6, OUTPUT); pinMode(db7, OUTPUT); pinMode(rs, OUTPUT); pinMode(en, OUTPUT); //inicializa saídas digitalWrite(db0, LOW); digitalWrite(db1, LOW); digitalWrite(db2, LOW); digitalWrite(db3, LOW); digitalWrite(db4, LOW); digitalWrite(db5, LOW); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); digitalWrite(rs, LOW); delay(2); lcd_init(); send_char('A',1,4); send_char('M',1,5); send_char('P',1,6); send_char('S',1,7); send_char(':',1,8); } //end setup // ===================================================================================== // --- Loop Infinito --- void loop() { ammeter(); serial_debug(); delay(741); } //end loop // ===================================================================================== // --- Desenvolvimento das Funções --- void ammeter() { //content = analogRead(A0)*5000.0/1023.0; content = (average_volt()/11.0)*(5000.0/1023.0); content *=1000.0; m_amps = (unsigned)(content/rshunt); cen = (char)(m_amps/100); dez = (char)((m_amps%100)/10); uni = (char)(m_amps%10); send_char(cen+48,2,5); send_char(dez+48,2,6); send_char(uni+48,2,7); send_char('m' ,2,8); send_char('A' ,2,9); } //end ammeter void char_pos(char row, char col) { col -= 1; switch(row) { case 1: set_col(col); break; case 2: set_col(col+0x40); break; } //end switch } //end char_pos // ===================================================================================== // --- Função para Envio de Caracteres --- void set_col(char address) { digitalWrite(rs, LOW); digitalWrite(db7, (address >> 7) | 0x01); digitalWrite(db6, (address >> 6) & 0x01); digitalWrite(db5, (address >> 5) & 0x01); digitalWrite(db4, (address >> 4) & 0x01); digitalWrite(db3, (address >> 3) & 0x01); digitalWrite(db2, (address >> 2) & 0x01); digitalWrite(db1, (address >> 1) & 0x01); digitalWrite(db0, (address >> 0) & 0x01); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); } //end set_col void send_char(char character, char row, char col) { char_pos(row, col); digitalWrite(db7, (character >> 7) & 0x01); digitalWrite(db6, (character >> 6) & 0x01); digitalWrite(db5, (character >> 5) & 0x01); digitalWrite(db4, (character >> 4) & 0x01); digitalWrite(db3, (character >> 3) & 0x01); digitalWrite(db2, (character >> 2) & 0x01); digitalWrite(db1, (character >> 1) & 0x01); digitalWrite(db0, (character >> 0) & 0x01); digitalWrite(rs, HIGH);delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); } //end send_char // ===================================================================================== // --- Função para Inicializar LCD --- void lcd_init() { // LIMPA LCD digitalWrite(db0, HIGH); digitalWrite(db1, LOW); digitalWrite(db2, LOW); digitalWrite(db3, LOW); digitalWrite(db4, LOW); digitalWrite(db5, LOW); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); // MODO DE 8 BITS digitalWrite(db0, LOW); digitalWrite(db1, LOW); digitalWrite(db2, LOW); digitalWrite(db3, HIGH); digitalWrite(db4, HIGH); digitalWrite(db5, HIGH); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); // LIGA LCD, LIGA CURSOR, DESLIGA BLINK digitalWrite(db0, LOW); digitalWrite(db1, HIGH); digitalWrite(db2, HIGH); digitalWrite(db3, HIGH); digitalWrite(db4, LOW); digitalWrite(db5, LOW); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); // HABILITA INCREMENTO, DESLIGA SCROLL digitalWrite(db0, LOW); digitalWrite(db1, HIGH); digitalWrite(db2, HIGH); digitalWrite(db3, LOW); digitalWrite(db4, LOW); digitalWrite(db5, LOW); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); } //end lcd_init void lcd_clear() { // LIMPA LCD digitalWrite(rs, LOW); digitalWrite(db0, HIGH); digitalWrite(db1, LOW); digitalWrite(db2, LOW); digitalWrite(db3, LOW); digitalWrite(db4, LOW); digitalWrite(db5, LOW); digitalWrite(db6, LOW); digitalWrite(db7, LOW); digitalWrite(en, LOW); delay(2); digitalWrite(en, HIGH); delay(2); digitalWrite(en, LOW); delay(2); } //end lcd_clear float average_volt() //Função que calcula a média de 100 leituras de tensão { //Garante maior precisão na medida unsigned char i; //Variável de iterações float volt_store = 0; //Variável local para armazenar o valor da tensão for(i=0; i<100; i++) //Somatório de 100 leituras { volt_store += analogRead(A0); //faz o somatório das 100 iterações } return(volt_store/100.0); //retorna a média das iterações } //end average_temp void serial_debug() { Serial.print("analogRead(0)= "); Serial.print(analogRead(A0)); Serial.print(" | "); Serial.print("average_volt= "); Serial.print(average_volt()); Serial.print(" | "); Serial.print("content= "); Serial.print(content); Serial.print(" | "); Serial.print("mAmps= "); Serial.print(m_amps); Serial.print(" mA"); Serial.println(" | "); } //end serial_debug // ===================================================================================== // --- Final do Programa ---
O projeto aqui desenvolvido utiliza um LM358 simples, porém nossa loja disponibiliza um Módulo Amplificador Operacional LM358, com ganho variável de até 100 vezes, portanto é necessário fazer um pequeno ajuste no nosso código para que ele funcione com este módulo. Basta modificar um valor dentro da função ammeter. Na conta ‘content = (average_volt()/11.0)*(5000.0/1023.0)’, substitua o valor 11.0 por 100.0. Pronto, agora basta manter o módulo sempre no máximo da amplificação e o projeto funcionará perfeitamente.
void ammeter() { //content = analogRead(A0)*5000.0/1023.0; content = (average_volt()/11.0)*(5000.0/1023.0); content *=1000.0; m_amps = (unsigned)(content/rshunt); cen = (char)(m_amps/100); dez = (char)((m_amps%100)/10); uni = (char)(m_amps%10); send_char(cen+48,2,5); send_char(dez+48,2,6); send_char(uni+48,2,7); send_char('m' ,2,8); send_char('A' ,2,9); } //end ammeter
É importante lembrar que o projeto desenvolvido aqui não utiliza nenhuma biblioteca referente ao display LCD. Para compreender como isto pode ser possível, basta acessar o vídeo abaixo ou conferir a playlist do WR Kits no Youtube.
Tendo montado e rodado o projeto, pode-se chegar no seguinte resultado:
O gif acima mostra a comparação entre a leitura do amperímetro desenvolvido aqui e a real corrente que ele está medindo. É possível perceber que a leitura não é perfeita e possui alguns erros, principalmente quando o valor da corrente sobe acima de determinados valores. Isso ocorre devido a alguns erros dos próprios componentes que estão sendo utilizados nesta prática. Porém, o amperímetro desenvolvido aqui é bem simples e serve mais como experimento prático, portanto seus valores de saída ainda são satisfatórios.
Ao final deste post, é esperado que o leitor tenha compreendido como montar seu próprio amperímetro utilizando apenas o Arduino e seus componentes. O objetivo aqui é incentivar a implementação prática de experimentos interessantes com o Arduino. Se se interessou pelo conhecimento aqui aprendido, acesse também os posts relacionados abaixo:
Curtiu o post? Avalie e deixe um comentário!
Siga-nos também no Instagram e nos marque quando fizer algum projeto nosso: @eletrogate.
Até mais!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!