No artigo anterior descrevemos os pinos de entrada e saída digitais abordando as suas características e as funções para trabalhar com escrita e leitura de sinais digitais na plataforma Arduino. Nesse artigo vamos aprender sobre as entradas analógicas e compreender seu funcionamento para no futuro aplicar essa técnica para seus projetos.
Entradas Analógicas
As entradas digitais só podem assumir dois estados, HIGH e LOW, ou seja, 0 V ou 5 V. Dessa forma só é possível ler apenas dois estados. Por exemplo, verificar se uma porta está aberta ou fechada, identificar se um botão está pressionado ou solto, etc. Com as entradas digitais você aplica em lógica discreta para controle de seus projetos, porém em muitas situações a variação das grandezas envolvidas acontece de forma analógica. Ou seja, variam continuamente em relação ao tempo e podem assumir infinitos valores dentro de uma faixa. Como exemplo a temperatura, pressão e umidade são grandezas que variam dessa forma.
O microcontrolador da Arduino trabalha internamente com dados digitais, portanto é necessário traduzir um sinal analógico para um valor digital. A técnica utilizada para leitura de um sinal analógico pelo Arduino é a conversão analógica digital. Essa técnica consiste em converter o sinal analógico para um valor digital, dessa forma se pode quantificar o sinal presente no pino. Esse processo é feito pelo conversor Analógico digital, ADC ou conversor A/D.
Um conversor A/D quantifica o valor analógico conforme a quantidade de bits da sua resolução. A resolução de um conversor A/D é dada pela seguinte equação:
onde:
Vref: tensão de referência do conversor A/D;
n: número de bits do conversor.
Conversor A/D do Arduino
O conversor A/D do microcontrolador ATmega328 possui 10 bits de resolução, a sua tensão de entrada pode variar de 0 V até o valor de VCC e possui referência interna selecionável de 1,1 V.
Dessa forma quando está trabalhando com a referência em VCC o menor valor que pode ser lido será:
Resolução = 5 V/1024 = 4,88 mV
esse é o valor de degrau para uma conversão em 10 bits com referência em 5 V.
Caso trabalhe com a referência interna de 1,1V a resolução será:
Nota-se que o passo é bem menor para esse valor de referência.
Se a referência externa for selecionada, a resolução dependerá do valor de tensão aplicada ao pino AREF.
A placa Arduino UNO possui 6 canais de conversor analógico digital. Essas entradas são nomeadas de A0 a A5 e são exibidas na figura a seguir:
Funções da plataforma Arduino para Entradas Analógicas
A plataforma Arduino possui funções para trabalhar com entradas analógicas, as quais abstraem a configuração dos registradores de configuração do conversor A/D, assim como selecionam o canal conforme o pino passado como parâmetro. São apenas duas funções e são exibidas a seguir:
-
analogReference(tipo)
Descrição
Configura a referência de tensão para a conversão analógica/digital, usando esse valor como o máximo para a entrada analógica.
Os tipos possíveis de configurações são:
-
DEFAULT: a tensão padrão para conversão é a tensão de alimentação da placa. 5 V para placas alimentadas com 5 V e 3,3 V para placas alimentadas com 3,3 V;
-
INTERNAL: referência interna de 1,1V no Atmega168 e Atmega328, e 2,56 V no ATmega8;
-
INTERNAL1V1: referência de 1,1V, apenas no Arduino Mega;
-
INTERNAL2V56: referência interna de 5,6 V, apenas no Arduino Mega;
-
EXTERNAL: referência de tensão aplicada no pino AREF (valor entre 0 e 5V).
Sintaxe:
analogReference(tipo);
Parâmetros:
tipo: DEFAULT, INTENAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL.
Retorno:
Essa função não tem retorno algum.
-
int analogRead(pino)
Descrição
Lê o valor presente em um pino configurado como entrada analógica. Internamente o Arduino possui um conversor A/D de 10 bits. Dessa forma o valor retornado por esta função estará na faixa de 0 a 1023 conforme o valor presente no pino.
O tempo para leitura pela função analogRead() é por volta de 100 micro segundos, dessa forma a máxima frequência de leitura que se pode ter é de 10000 vezes por segundo.
Sintaxe:
analogRead(pino);
Parâmetros:
pino: valor do pino configurado como entrada analógica (0 a 5 na maioria da placas, 0 a 7 na MINI e NANO, 0 a 15 na MEGA).
Retorno
int (0 a 1023)
Exemplo – Entradas Analógicas com Arduino
Para iniciar o estudo da entrada analógica, a maneira mais simples e rápida é ligando um potenciômetro a uma entrada analógica, conforme esquema apresentado em seguida:
Se girarmos o cursor do potenciômetro, alteramos a resistência em cada lado do contato elétrico que está conectado ao terminal central do botão. Isso provoca a mudança na proximidade do terminal central aos 5 volts ou GND, o que implica numa mudança no valor analógico de entrada. Quando o cursor for levado até o final da escala, teremos, por exemplo, 0 V a ser fornecido ao pino de entrada do Arduino e, assim, ao lê-lo obtém-se 0. Quando giramos o cursor até o outro extremo da escala, haverá 5 V a ser fornecido ao pino do Arduino e, ao lê-lo, teremos 1023. Em qualquer posição intermediaria do cursor, teremos um valor entre 0 e 1023, que será proporcional à tensão elétrica sendo aplicada ao pino do Arduino.
A ligação no Arduino UNO pode ser feita conforme a figura abaixo:
O exemplo a seguir lê o valor no potenciômetro. O tempo que o LED permanece ligado ou desligado depende do valor obtido pelo analogRead().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* * Entrada analógica * Liga e desliga um LED conectado ao pino digital 13. O tempo * que o LED permanece ligado ou desligado depende do valor * obtido pelo analogRead(). */ int potPin = 0; // selecione o pino de entrada ao potenciômetro int ledPin = 13; // selecione o pino ao LED int val = 0; // variável a guardar o valor proveniente do sensor void setup() { pinMode(ledPin, OUTPUT); // declarar o pino ledPin como saída } void loop() { val = analogRead(potPin); // ler o valor do potenciômetro digitalWrite(ledPin, HIGH); // ligar o led delay(val); // espera tempo ajustado no potenciometro digitalWrite(ledPin, LOW); // desligar o led delay(val); // espera tempo ajustado no potenciometro } |
O exemplo apresentado tem estrutura bem simples e serve para fixar os conceitos sobre o conversor A/D do Arduino. Aproveitaremos essa estrutura para artigos futuros onde faremos a leituras de sensores.
Saiba mais
Placas Arduino – trajetória até o UNO
Referências
Só tem um problema, se usar uma fonte de DC externa o arduino liga mesmo sem estar alimentado, ou seja, só funciona se a fonte de tensão for a mesma do arduino.
Preciso mediar 4 entradas (0~10) volts DC de uns sensores
A tensão vem do sensor, usando o GND comum, quando ligo essa tensão na entrada AD (qualquer uma delas) o UNO liga, mesmo não estando alimentado
Jorge, Você pode ajustar o seu hardware para não dar esse “problema”.
tensão max de 5V no Uno
Olá, excelente artigo. Eu estou com um projeto e que pretendo usar um
TC ( Transformador de corrente ) Afim de monitorar a corrente elétrica de um sistema.
A minha duvida é a seguinte:
Posso usar um TC com saída de 10 mA nas entradas analógicas do Arduíno
Geralmente fazemos isso em um CLP que permite esse tipo de leitura.
Obrigado
Pode sim. Você só precisa condicionar o sinal para leitura. Com um resistor você já consegue fazer a leitura através da entrada analógica
Ola caro Fabio, tudo bem?Gosto muito dos seus artigos, sempre acompanho.
Poderia tirar uma grande dúvida? Todas as entradas analógicas podem receber dados ao mesmo tempo (paralelo) ou somente uma entrada por vez (serial)? Estou projetando um dispositivo com Arduíno Mega que recebera dados de 16 potenciometros, mas precisa ser todos juntos. É possível?
Grato
Daniel Gussoni
Daniel, todas podem ser usadas. porém só existe um conversor AD internamente. Você precisará chavear entre os canais e só conseguirá ler um por vez.
preciso de um converssor de leitura analogica para digital, qual empresa vende?????????
Talvez a Microchip possa lhe atender: https://www.microchip.com/design-centers/analog/data-converter/analog-to-digital-converter
Fabio, boa tarde!
Consigo fazer o arduino reconhecer uma faixa de frequencia captada por um microfone(filtro passa faixa), e me responder qts pulsos desta frequencia recebeu.
faixa de 5khz a 8khz?
Pergunta interessante. Conseguiu descobrir?
Boa tarde a todos. Oi Fábio. Tenho uma dúvida, e agradeço, desde já, se alguém puder esclarecê-la. Estou fazendo um projeto com Arduino UNO, utilizando, em resumo, um LED, um POTENCIÔMETRO e um SENSOR HALL. O que pretendo fazer é: ao aproximar o imã do sensor hall, o LED acenda (até aqui, eu consegui fazer a programação – sketch). O que não estou conseguindo fazer, é ao aproximar o imã do sensor hall, eu possa controlar a luminosidade do LED com o potenciômetro (tudo, ao mesmo tempo). Ou seja, com o LED ligado em razão da proximidade do imã ao… Leia mais »
Para controlar a luminosidade do led diretamente pelo Arduino a sua ativação deve ser feita com função PWM (Pulse Width Modulation) cujo Duty Cycle (percentual em que uma onda quadrada fica ON em relação ao seu período) deve ser proporcional à leitura do potenciometro, variando de 0% a 100%. Veja o texto da Internet: “The Arduino IDE has a built in function “analogWrite()” which can be used to generate a PWM signal. … analogWrite(255) means a signal of 100% duty cycle. On Arduino Uno, the PWM pins are 3, 5, 6, 9, 10 and 11. The frequency of PWM signal… Leia mais »
tem que ligar o LED numa porta com PWM
Olá. Alguém pode tira minha duvida, entre leituras consecutivas de 2 ou mais portas analógicas.. qual o tempo para que a porta esteja apta a ler valores reais. por exemplo:
a = analogRead(A0);
b = analogRead(A1);
c = analogRead(A2);
Os valores de a, b e c serão valores reais dos pinos ? Ou é necessário um tempo para que algo se estabilize antes da leitura, pelo fato de ter mudado a porta de leitura..
Olá Tiago, teoricamente não há necessidade de delay entre as conversões pois a função analogRead() aguarda até que o ADC termine a conversão:
// ADSC is cleared when the conversion finishes
while (bit_is_set(ADCSRA, ADSC));
Porém, quando se troca de canal, dependendo da impedância de entrada, a confiabilidade da conversão pode ser afetada.
Para garantir, você pode fazer duas leituras no mesmo canal, descartando a primeira.
Abraços,
boa tarde, estou iniciando nesse arte de usar o arduino, gostaria de saber se tem como utilizar porta digital como analógica, se não for uma pergunta absurda, gostrai de uma respota
Uma porta digital não pode ser usada para leitura de sinal analógico usando o conversor A/D. Verifique se no pino há um canal para o conversor A/D e faça a configuração do mesmo. Recomendo a leitura do capitulo sobre conversor A/D desse livro: https://www.embarcados.com.br/livro-avr-e-arduino/
gostaria de saber até quantos sensores de proximidade e pressão o Raspberry PI e o Arduino suporta? para interligar 500 sensores como posso fazer para controla-los e centralizar os dados em algum hardware ou outro processador?
grato
Rafael Voigt
Se for usar entrada analógica você esta limitado a quantidade de canais analógicos do microcontrolador e a taxa de amostragem para os sensores. Para sensores com comunicação digital você está limitado ao barramento. Para essa quantidade você pode separar em módulos com X sensores e enviar os valores via comunicação serial para um módulo central.
eu estou com uma dúvida
posso usar dois sensores em uma entrada anlógica?
Pode, porém tem que multiplexar a entrada para esse fim. Recomendo uma canal para cada sensor.