Medir a tensão e a corrente são processos essenciais para se extrair informações de sensores. Medir tensão pode ser trivial, mas medir a corrente e a resistência não é tão óbvio assim. Portanto, neste post, vamos aprender uma forma de ler valores de tensão, corrente e resistência utilizando o Arduino.
Voltímetro CC
Medir a tensão (corrente contínua), conforme disse no início do post, é bem tranquilo. Tanto é que já vimos em vários posts do site. Entretanto, vou dar uma rápida explicada no assunto.
Informações importantes
Referencial
Para medir a tensão em algum ponto do circuito basta ligá-lo a algum pino analógico. Mas aqui cabem algumas ressalvas: a tensão é sempre medida entre dois pontos e, quando ligamos no pino A0 por exemplo, estamos ligando apenas um ponto. Neste caso, estamos medindo a tensão em relação ao nosso terra (GND), que já está ligado dentro do microcontrolador.
Então, caso o circuito que estamos querendo medir não tenha nenhuma ligação com o Arduino, não será possível fazer a leitura da tensão. Suponha que o circuito externo seja um LED ligado a uma bateria e o Arduino esteja sendo alimentado pela USB do computador. Para medir alguma tensão deste circuito externo, o GND do Arduino, deve estar ligado ao negativo da bateria.
Conversão
Em relação à conversão analógica-digital do Arduino, é importante saber que ele mede de 0 a 5v, e que o conversor é de 10bits. Isso quer dizer que os valores medidos serão representados entre 0 e 1023 (valor máximo com 10 bits) incluindo os dois limites. Ou seja, 0 representará 0 volts e 1023 representará 5 volts.
Portanto, para encontrar o valor lido em volts, podemos aplicar uma simples regra de 3:
1023 – 5 volts
Valor lido – V (tensao)
Logo:
Usar outros valores de tensão
Abaixo de 5v (e acima de 0)
É possível ler valores fora da faixa de 0 a 5v, mas, dependendo do caso, será necessário utilizar um circuito para adequar esta tensão para o Arduino. O próprio microcontrolador do Arduino UNO, permite trocar a tensão de referência, para que seja possível alcançar uma precisão melhor, medindo, por exemplo, tensões de 0 a 3.3v.
O procedimento para medir a tensão é o mesmo, o que muda é a regra de 3 mostrada anteriormente. E o comando para alterar a tensão de referência é:
analogReference(modo)
Dentre os modos possíveis para o Arduino UNO, de acordo com o site do Arduino, estão:
- DEFAULT: a tensão padrão de alimentação da placa (5v no caso do UNO).
- INTERNAL: uma referência interna igual a 1.1 volts.
- EXTERNAL: a referência se torna a tensão (0 a 5V apenas) aplicada ao pino AREF (próximo ao pino digital 13).
Acima de 5v
Para medir tensões acima de 5v, basta criar um divisor de tensão para que a tensão em cima do Arduino seja reduzida. A imagem abaixo mostra um exemplo de divisor de tensão.
O valor dos resistores do divisor de tensão vão depender do valor máximo de leitura. Por exemplo, se o valor máximo for 10 volts, então um divisor de 2/1 será adequado. Não mostrarei em detalhes esta parte, pois, com o post sobre divisor de tensão, você deverá ser capaz de entender o necessário.
Circuito de exemplo
Para mostrar a parte da programação, considere o circuito e o esquemático abaixo:
O circuito consiste apenas em um LED alimentado com 5v em série com um resistor de 220Ω. E entre os dois existe um fio que vai para o pino analógico A0. Nosso objetivo será medir a tensão neste ponto (entre este ponto e o GND, conforme dito no início do post). Esta tensão é justamente a tensão em cima do resistor.
Programação
A programação é bem simples, pois basta utilizar o comando de leitura analógica do Arduino, que já abordei em outro post. Leia os comentários para entender o código por completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void setup() { // O comando abaixo é desnecessário caso o modo seja o DEFAULT analogReference(DEFAULT); // Cria a comunicação serial para exibir os valores no monitor serial Serial.begin(9600); } void loop() { // Mede o valor de 0 a 1023 e converte para tensão float tensao = analogRead(A0); tensao = tensao*5/1023; // Exibe o valor lido Serial.println(tensao); // Cria um pequeno atraso entre cada medição delay(1000); } |
Resultados
Quando rodei o programa, o valor lido ficou oscilando entre 2,58 e 2,62. Como o valor lido é a queda de tensão em cima do resistor, basta considerar que a tensão em cima do LED é 5 menos esse valor. Considerando o valor médio como 2,6:
5-2,60 = 2,4
2,4 é justamente a queda de tensão máxima do LED vermelho. Sendo assim, o resultado foi próximo da realidade.
Pronto, com a lógica mostrada neste tópico já podemos criar um voltímetro com algumas limitações.
Ohmímetro
Lógica de funcionamento
Medir a resistência pode ser útil em situações onde as faixas de cores de um resistor são confusas ou então quando você quer saber a resistência de um outro componente (potenciômetro por exemplo). Em outro post, já cheguei medir a resistência de um LDR com o Arduino.
Para este caso, nos também mediremos a tensão, mas em um esquema um pouco diferente. Com a ajuda de um divisor de tensão com uma das resistências conhecidas, é possível saber qual o valor da outra resistência a partir da tensão de saída. Para exemplificar como, considere um divisor de tensão típico como o da imagem abaixo:
A tensão de saída do divisor é dada por:
Portanto, se sabemos quais são os valores de Vin, R2 e Vout, podemos determinar R1. Manipulando a equação, chegamos ao seguinte resultado:
Agora podemos passar para um circuito de exemplo:
Circuito de exemplo
Para achar o valor da resistência desejada, vamos considerar Vin como 5v, já que iremos alimentar o circuito utilizando o Arduino. O valor de R2 pode ser qualquer um, portanto usarei um resistor de 220Ω. O circuito resultante está representado abaixo:
Dessa forma, a fórmula que terei que usar para encontrar V1 será:
Lembrando que Vlido é a tensão, então é necessário converter o valor lido do Arduino para tensão, conforme visto no tópico do voltímetro.
Programação
Basta ler os comentários para entender o código, pois ele é bem simples.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void setup() { // Cria a comunicação serial para exibir os valores no monitor serial Serial.begin(9600); } void loop() { // Mede o valor de 0 a 1023 e converte para tensão // o (float) faz um coerção, pois o comando analogRead retorna um numero inteiro e a tensão é um float float tensao = (float)analogRead(A0)*5/1023; // Converte a tensao para resistencia float R1 = (220*5 - tensao*220)/tensao; // Exibe o valor de R1 Serial.println(R1); // Cria um pequeno atraso entre cada medição delay(1000); } |
Resultados
Medindo R1 com um testador que tenho, o valor real do resistor é de 819,7Ω. Entretanto, ao rodar o programa, o valor indicado foi um pouco diferente deste. Obtive valores entre 846,64 e 862,02. Ou seja, dependendo da aplicação, este método não é muito adequado.
É possível melhorar um pouco a precisão dos resultados considerando o valor real de R2. Que, de acordo com meu testador, é de 214,4Ω. Fazendo esta mudança, obtive resultados em torno de 835,03Ω, que foi melhor do que antes.
Pronto, com a lógica mostrada neste tópico já podemos criar um ohmímetro com algumas limitações.
Amperímetro
Lógica de funcionamento
Existem alguns tipos de sensores que transformam uma grandeza física em corrente elétrica de 4 a 20mA normalmente. Portanto, pode ser bem útil medir valores de corrente (além de outros casos).
Assim como no caso do Ohmímetro, precisaremos utilizar um pequeno truque para medir a corrente de um circuito. No caso do amperímetro, a lógica será utilizar, em série com o circuito desejado, um resistor de baixíssima resistência. Dessa forma, podemos medir a queda de tensão em cima dele e descobrir a corrente aplicando a Lei de Ohm:
Como a tensão é medida em relação ao GND, esse resistor precisa ficar no fim do circuito, para que a tensão medida seja justamente a queda de tensão em cima dele.
Além disso, ele precisa ter uma baixa resistência para que ele não faça influência alguma no circuito o qual ele está sendo ligado. Pois, com um valor relativamente grande de resistência, ele pode impedir significativamente o fluxo de corrente do circuito.
Dependendo da aplicação, este pequeno valor pode atrapalhar o circuito, então pode não ser recomendável utilizar este método para medir corrente.
Usando um resistor de baixa resistência
Comercialmente é possível achar resistores com valores bem baixos (1Ω), mas, como eu não tenho um à disposição, utilizarei um método alternativo. O método alternativo consiste em utilizar um fio como resistência, pois todo elemento condutor tem uma resistência, mesmo que bem pequena.
Entretanto, esse método precisa de um ohmímetro para saber qual é a resistência do fio. O fio que decidi usar foi um jumpers que vem em kit de Arduino. Usei meu testador para encontrar o fio com menor resistência, que foi um com 0,65Ω.
Desse modo, a corrente do circuito será:
Circuito de exemplo
Para exemplificar, vamos considerar o mesmo circuito do voltímetro, com o acréscimo do fio de 0,65Ω:
Para evitar imprecisão, usei o fio de 0,65Ω para ligar o resistor de 220Ω direto para o GND. Fiz isso para evitar usar outro fio, e assim evitar acréscimo de resistência. Então, no circuito acima, considere o fio de 0,65Ω como sendo toda a ligação da parte de baixo (R1 até GND).
Programação
Considerando um caso máximo, em que a corrente é de 1A, a tensão máxima no fio será abaixo de 1v (V=1*0,65 = 0,65v). Portanto, posso alterar a tensão de referência do conversor analógico-digital para 1.1v, utilizando o comando mostrado no tópico do voltímetro (analogReference).
Com isso, a conversão do valor lido para tensão fica:
E basta usar a tensão acima para achar o valor da corrente. A programação é bem tranquila, só com a leitura dos comentários já é possível entender como escrevi a lógica abordada acima.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void setup() { // Cria a comunicação serial para exibir os valores no monitor serial Serial.begin(9600); // Altera a tensão de referência para 1.1v analogReference(INTERNAL); } void loop() { // Mede o valor de 0 a 1023 e converte para tensão // o (float) faz um coerção, pois o comando analogRead retorna um numero inteiro e a tensão é um float float tensao = (float)analogRead(A0)*1.1/1023; // Encontra a corrente a partir da tensao float I = tensao/0.65; // Exibe o valor da corrente em mA, por isso multiplico por 1000 Serial.println(I*1000); // Cria um pequeno atraso entre cada medição delay(1000); } |
Resultados
Medindo a corrente do circuito com um multímetro, o valor obtido foi de 10,7mA. E, medindo pelo programa (ao mesmo tempo que o multímetro), o resultado foi de aproximadamente 8,2mA. Ou seja, é um valor próximo, mas totalmente inadequado para medir sensores que indicam as grandezas em faixas de 4 a 20mA. Pois, nestes casos é necessário ter uma precisão maior para obter os dados dos sensores corretamente.
Medindo a corrente do circuito do ohmímetro (um resistor de 820 e outro de 220) deu um valor de 4,96mA que está com uma pequena diferença do valor calculado (4,8mA). Portanto, os resultados são até bem impressionantes.
É possível melhorar a precisão dos resultados utilizando a referência de tensão no pino AREF. Dessa forma, alimentando esse pino com uma tensão bem pequena (0.3v por exemplo) com a ajuda de um divisor de tensão. Além disso, utilizar uma resistência menor ainda no lugar do fio (0,65Ω) ajuda.
Pronto, com a lógica mostrada neste tópico já podemos criar um amperímetro com algumas limitações.
Com estes três instrumentos, podemos transformar o Arduino em um multímetro utilizando cada medição em uma entrada analógica do Arduino.
MUITO BOM! SHOW
Muito obrigado, Renan!
Bom dia Fábio!
Cara, gostei demais da forma como explicou o Arduino. No circuito do Ohmimetro, fiquei pensando em uma forma de melhorar. Posso propor uma solução? Se ao invés de você colocar no programa que o valor de entrada é 5, se fizesse uma leitura da porta de saída do Arduino, assim alguns milivolts de diferença entre o real e o teórico, alcançaria o valor mais próximo do resistir.
Vou seguir essa página…serião, curti demais !!
Abraço!
Boa tarde, Mario!
Muito obrigado pelo seu retorno positivo, fico bastante contente de saber que você curtiu o post! E toda sugestão é bem vinda.
Bem, se eu entendi corretamente a sua proposta, a ideia seria ligar o 5V da alimentação diretamente em uma entrada analógica para medir o valor real da tensão. Caso a ideia seja esta mesmo, o valor medido nesta porta analógica será sempre 1023 (5.0V). Isto porque, o mesmo 5V utilizado na alimentação, é utilizado como referência para medir as tensões. Portanto, não há muito o que fazer a não ser medir a tensão da alimentação com um multímetro (ex: 5.023V) e colocar este valor no código ao invés do valor teórico (5.0V).
Abraço!
Recurso: pode usar o método do voltímetro para ler tensões acima de 5 volts. Um divisor de tensão em que pode ler direto a tensão com valor do AN.
Ex: um divisor de tensão que para 10.23V leia do AN 1023. Assim para 5.0V ler do AN 500.
Fábio, seu site é muito bom. Fica viciado. Fala direto, com lógica e linguagem clara.
Obrigado!
Ótima sugestão, Jose Luiz. Acredito que alguns voltímetros profissionais fazem algo nesse sentido também.
Fico extremamente feliz e grato em ler seu comentário. Ler isso me motiva a continuar produzindo conteúdo pro site/canal. Muito obrigado pelo comentário!
Se eu quiser ver as leituras de tesão na tela do pc em forma grafica, é possivel?
É sim, e a forma mais fácil de fazer isto é utilizando o “Plotter serial” do Arduino em “Ferramentas” -> “Plotter Serial”.
Excelente poster!!!
Não é possível apresentar uma tensão negativa, certo?
Olá, Jonathan. Obrigado! Infelizmente, da forma como o circuito foi feito, não é possível, pois o Arduino lê apenas tensões positivas. Entretanto, você poderia utilizar um amplificador operacional na configuração de inversor para converter a tensão negativa em positiva e, assim, fazer a leitura com o Arduino.
Muito bom esse artigo bem explicado parabéns por essa iniciativa
Olá, Jovan. Eu que agradeço pelo comentário!