Arduino – Conhecendo as funções analogRead, analogWrite e analogReference

Funções analogRead, analogWrite e analogReference

Nesta lição vamos conhecer mais três funções muito importantes usadas no desenvolvimento de software para o Arduino: analogRead(), analogWrite() e analogReference(). Essas funções permitem usar os pinos de entrada e saída analógicas da placa.

Função analogRead()

A função analogRead() lê o valor de um pino analógico especificado. O Arduino Uno possui um conversor analógico-digital de 10 bits e seis canais (O Arduino Mega possui 16 canais e as placas Mini e Nano, 8 canais). 10 bits significa que as tensões de entrada entre 0 e 5 volts aplicadas ao pino serão mapeadas em valores inteiros entre 0 e 1023 (210). Dessa forma, temos uma resolução de leitura de 5 V / 1024 = 4,9 mV por unidade de medida. Essa resolução é devida ao conversor analógico-digital (ADC) utilizado na placa do Arduino.

Quanto maior o número de bits, maior será a resolução, e mais precisos os valores mensurados nos pinos. Tanto a faixa de tensão de entrada quanto a resolução dos pinos pode ser alterada com a função analogReference(), discutida mais à frente neste artigo.
Uma entrada analógica demora cerca de 100 μs para ser lida, então a taxa máxima de leitura é de cerca de 10.000 vezes por segundo.

Essa função retorna um número inteiro entre 0 e 1023, por padrão. a figura a seguir mostra a localização dos pinos de entrada analógica em uma placa Arduino Uno:

Entradas Analógicas no Arduino Uno

Entradas Analógicas no Arduino Uno

Na figura a seguir, a localização das entradas analógicas em uma placa Arduino Mega:

Entradas Analógicas no Arduino Mega

Entradas Analógicas no Arduino Mega

E na figura abaixo, a localização das entradas analógicas em uma placa Arduino Nano:

Entradas Analógicas no Arduino Nano

Entradas Analógicas no Arduino Nano

Sintaxe da Função:

analogRead(pino);

Parâmetros:

  • pino: número do pino analógico de entrada que será lido (pinos de A0 a A5 na maioria das placas, sendo de 0 a 15 no Arduino Mega e de 0 a 7 nos Arduinos Nano e Mini).

Exemplo: Vamos efetuar a leitura de um sinal aplicado à entrada analógica A2 do Arduino, por meio de um resistor, sensor ou potenciômetro, armazenando o valor lido na variável valor e mostrando no Serial Monitor os valores lidos.:

int pino = 2;
int valor = 0;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  valor = analogRead(pino);
  Serial.println(valor);
}

Função analogWrite()

A função analogWrite() permite escrever um valor analógico (na verdade, um sinal PWM) em um pino. Geralmente usamos essa função para ativar / desativar dispositivos conectados ao Arduino, como LEDs, atuadores, motores, entre outros.
A chamada à função analogWrite() gera um sinal de onda quadrada de uma razão cíclica (duty cicle) especificada, até que uma nova chamada à função seja realizada. A frequência do sinal PWM na maioria dos pinos é de cerca de 490 Hz. No Arduino Uno e placas similares, os pinos 5 e 6 possuem uma frequência de cerca de 980 Hz. No Arduino Leonardo os pinos 3 e 11 também possuem a frequência de 980 Hz.
Essa função opera nos pinos 3, 5, 6, 9, 10 e 11 na maioria das placas de Arduino (as que possuem os chips ATmega168 ou ATmega328). No Arduino Mega, funciona nos pinos 2 a 13 e 44 a 46. Você pode identificar facilmente esses pinos na placa por possuirem o sinal ~ ao lado do número do pino, indicando a funcionalidade de PWM presente.
Uma característica interessante dessa função é a de que não é necessário chamar a função pinMode() para configurar o pino como saída antes de chamar a função analogWrite(), e a função não retorna valor algum.
Tome cuidado para não se confundir: a função analogWrite() não tem nada a haver com os pinos analógicos da placa, nem com a função analogRead()!!!

Sintaxe da Função:

analogWrite(pino, valor);

Parâmetros:

  • pino: número do pino que receberá o sinal de saída
  • valor: razão cíclica (duty cicle), um valor entre 0 e 255 (de sempre desligado a sempre ligado)

Exemplo: Vamos iluminar um LED de acordo com um valor de entrada lido a partir de um potenciômetro. Em outas palavras, vamos construir um dimmer extremamente simples. O potenciômetro será ligado ao pino 3, um pino de entrada analógica, e o LED ao pino de saída PWM 10. A variável valor irá armazenar o valor lido a partir do potenciômetro e seu valor será usado para definir o grau de iluminação do LED.

int entradaPotenciometro = 3
int LED = 10
int valor = 0
void setup()
{
  pinMode(LED, OUTPUT);
}
void loop()
{
  valor = analogRead(entradaPotenciometro);
  analogWrite(LED, valor / 4)
}

Note que ao chamarmos a função analogWrite(), definimos o pino que será escrito (LED, pino 10), e o valor que será escrito é o valor lido do potenciômetro dividido por 4. Fazemos essa divisão pois a entrada recebe valores que vão de 0 a 1023, porém a saída da função somente pode entregar valores entre 0 e 255, ou seja, um quarto da resolução de leitura.

Função analogReference()

A função analogReference() é utilizada para configurar a tensão de referência usada nas entradas analógicas – mais precisamente, o valor superior da faixa de valores de entrada. Quando o Arduino realiza uma leitura analógica, ele efetua ma comparação entre a tensão medida no pino analógico utilizado com um valor de tensão denominado Tensão de Referência Analógica, que por padrão é o valor de tensão de operação normal da placa, 5 volts.

Assim, como vimos anteriormente, ao usar uma tensão de referência de 5V, cada unidade retornada na leitura de valores pela função analogRead() terá o valor de 4,9mV (0,00488V, mais precisamente). porém, algumas vezes precisamos medir valores de tensão em uma faixa distinta, por exemplo, entre 0 e 3V, ou entre 0 e 4,5V. Nesse caso, para que o ADC saiba qual é o valor superior da faixa (o inferior é zero), usamos a função analogReference(). O valor mais baixo de tensão de referencia possível no Arduino é de 1,1V.

Desta forma, se, por exemplo, precisarmos medir valores em uma faixa de tensão entre 0 e 3V, ajustamos o valor de referência para 3V, e a partir daí cada unidade de medida do ADC será interpretada pelo Arduino como sendo 3 V / 1024 = 2,9 mV (0,0292V) por unidade de medida.

Essa função possui cinco opções de configuração, que são as seguintes:

  • DEFAULT: A tensão de referência analógica padrão, que é de 5 volts, em placas Arduino de 5V, ou 3,3 volts, nas placas de 3,3V (por exemplo, Arduino Due).
  • INTERNAL: Referência interna, que equivale a 1,1 volts nos chips ATmega168 e ATmega328, ou 2,56 volts no Atmega8. Não está disponível no Arduino Mega.
  • INTERNAL1V1: Tensão de referência interna de 1,1V, somente para o Arduno Mega.
  • INTERNAL2V56: Tensão de referência interna de 2,56V, também somente para o Arduno Mega.
  • EXTERNAL: Este é um valor de tensão aplicada no pino AREF da placa, no intervalo de 0 a 5 volts apenas, que será usada como referência externa.

Esta função não retorna nenhuma informação ao programa. Abaixo vemos a localização do pino AREF em uma placa Arduino Uno:

Pino AREF no Arduino

Pino AREF no Arduino

Sintaxe da Função:

analogReference(tipo);

Parâmetros:

  • tipo: é o tipo da referência que será usada, podendo ser DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2v56 ou EXTERNAL

Um ponto importante a se notar quando a função analogReference() for usada é de que você não deve usar valores menores que 0V ou maiores do que 5V com a opção de referência externa no pino AREF. Além disso, se for usar a opção EXTERNAL não se esqueça de configurar essa opção ANTES de chamar a função no programa, sob pena de danificar o chip microcontrolador de seu Arduino.

Exemplo: Precisamos ligar um sensor ao Arduino que gera sinais de saída entre 0 e 4V. Para que a precisão das leituras seja a melhor possível, vamos alterar a opção de tensão de referência analógica para o intervalo entre 0 e 4V, usando uma fonte de tensão externa:

void setup()
{
  analogReference(EXTERNAL);
}

Agora basta aplicar uma tensão de exatos 4V ao pino AREF da placa para usar esse valor de tensão como referência analógica. Tome cuidado para não usar valores de tensão abaixo de 1,1V ou maiores do que 5V, para não danificar sua placa.

Referência da Linguagem do Arduino

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

6 Comentários em Arduino – Conhecendo as funções analogRead, analogWrite e analogReference

  1. MUITO BOM.

  2. Jorge Luiz. // 22/06/2018 em 20:59 // Responder

    Obrigado por compartilhar seus conhecimentos conosco. Me ajudou bastante com um projeto da universidade. Parabéns.

  3. Davidson fellipe pena // 05/07/2018 em 21:17 // Responder

    ola eu estou com uma duvida aqui que ja tentei varias coisas mas por não ter conhecimento sufuciente estou bem perdido estou começando agora neste fantastico mundo do arduino e olhei em um site um ohmmimetro que faz um divisor de tensão e atraves de um resitor pre determinado faz a leitura de um outro resistor com uma precisão interessante. efim o que quero é tirar uma média pois o resistor que estou medindo é de uma bóia com uma resistencia variável, mas pra isso preciso de uma média de valores pois o liquido é instavel e qualquer pertubação faz o liquido se mover, vou deixar ae o codigo se puder me ajudar eu sou muito grato.
    int analogPin= 0;
    int raw= 0;
    int Vin= 5;
    float Vout= 0;
    float R1= 1000;
    float R2= 0;
    float buffer= 0;

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    raw= analogRead(analogPin);
    if(raw)
    {
    buffer= raw * Vin;
    Vout= (buffer)/1024.0;
    buffer= (Vin/Vout) -1;
    R2= R1 * buffer;
    Serial.print(“Vout: “);
    Serial.println(Vout);
    Serial.print(“R2: “);
    Serial.println(R2);
    delay(1000);
    }
    }

  4. Fabio Barros // 06/07/2018 em 10:27 // Responder

    Bom dia Fábio,
    Suas informações sobre arduíno estão me ajudando muito para o meu conhecimento.
    Meu nome é Fábio Barros, e estou começando agora no arduíno. Comprei alguns sensores para fazer testes, e estou com uma dificuldade no sensor de gas MQ135. Eu consigo fazer a leitura dele normalmente. Então eu estou fazendo teste agora para o envio dos dados desse sensor para um banco de dados, especificamente estou utilizando o xamp com php. E não funciona. Será que vc poderia me ajudar?
    Fico no aguardo.

  5. Fabio Barros // 06/07/2018 em 10:28 // Responder

    Bom dia Fábio,
    Suas informações sobre arduíno estão me ajudando muito para o meu conhecimento.
    Meu nome é Fábio Barros, e estou começando agora no arduíno. Comprei alguns sensores para fazer testes, e estou com uma dificuldade no sensor de gas MQ135. Eu consigo fazer a leitura dele normalmente. Então eu estou fazendo teste agora para o envio dos dados desse sensor para um banco de dados, especificamente estou utilizando o xamp com php. E não funciona. Será que vc poderia me ajudar?
    Fico no aguardo.

Escreva um comentário

Seu e-mail não será divulgado


*