Uma grande parte das vezes, será necessário usar algum pino analógico para fazermos leitura de algum sensor ou até para ler algum componente. E pra isso, a gente precisa entender como os pinos analógicos funcionam e como essas leituras são feitas. Na aula de hoje vamos ver um pouco sobre isso.

Na aula anterior, vimos como fazer a leitura digital das portas do Arduino.


Princípio de funcionamento

Definições

Os pinos analógicos, que também podem atuar como pinos digitais, possuem um conversor de sinal analógico para uma representação digital. Que é também conhecido como conversor AD. Mas antes de entender como essa conversão ocorre, precisamos entender o que é um sinal analógico e um digital. O sinal analógico basicamente é um sinal puro que, dependendo, varia em relação ao tempo. Por exemplo, a tensão em cima de algum componente, ou até de um sensor de temperatura. Veja a imagem abaixo para entender melhor.

sinal analógico

Já a representação digital, é um sinal binário que é formado por um conjunto de 0s e 1s. Ele representa um determinado valor em forma de número binário. Se pegássemos um determinado ponto no gráfico anterior, a conversão seria algo como:

00110001

O valor depende da escala de conversão e do valor limite.

Como funciona

O conversor AD que existe no Arduino é um conversor de 10 bits, ou seja, um conversor que comporta valores de 0 a 1023. Além disso, esse conversor funciona de 0 a 5V. (NÃO ALIMENTE O PINO ANALÓGICO COM TENSÕES ACIMA DISSO). Sendo assim, se fizermos uma conta básica, ele é capaz de medir de 5mV em 5mV (aproximado). Portanto um valor binário, por exemplo, “0000000001” representa 5mV. E um outro “1111111111” representa 5V.

Mas como o conversor interpreta o sinal analógico? Ele analisa o sinal analógico em vários instantes e, pra cada um, gera um sinal digital (um número binário). Pegando a imagem abaixo como exemplo:

Sinal analogico sendo convertido
Fonte: Wikipedia

Os pontos azuis representam a conversão em diversos momentos. E se considerarmos o valor máximo (15 na imagem) como 5V e o mínimo (0 na imagem) como 0V. A conversão, da esquerda para direita serial algo como: 0111111111 (511 em decimal que é “metade” de 1023),‭ 1001001000‬ (584 em decimal), ‭1010010001‬ (657 em decimal), … até o 5v, 1111111111 (1023 em decimal), … e assim em diante até o 0000000000. A imagem abaixo mostra a conversão de maneira simplificada (só de alguns pontos).

sinal analógico conversão pra digital


Circuito

Para aprender a usar a conversão AD, vamos ler a tensão em cima de um potenciômetro.

circuito Arduino lendo potenciômetro

O circuito é bem fácil de entender, caso não saiba como funciona o potenciômetro, veja o post sobre. É só ligar uma extremidade do potenciômetro no 5v e a outra no GND. Feito isso, o pino central deve ser ligado em qualquer pino analógico do Arduino (A0 ao A5).


Programação

Vamos imprimir no monitor serial os valores de tensão lido pelo pino A0.

Explicação detalhada

Primeiro, vamos nomear nosso pino e definir ele como saída. Além disso, como vamos usar o monitor Serial, temos que inicializar ele

1
2
3
4
5
6
int sensor = A0; //Pode ser qualquer outro pino analógico

void setup() {
  pinMode(sensor, INPUT);
  Serial.begin(9600); //Inicializa o monitor Serial
}

Agora, em nosso loop, nós precisamos ler o valor analógico do pino A0 e o comando para isso é o “analogRead(pino)“, que retorna (como foi dito antes) o valor lido em forma de um número decimal de 0 a 1023. E com isso, para fazer uma conversão para valores de tensão, precisamos aplicar uma simples regra de 3.

5 –       1023

v – valor lido

Resumindo: 5v equivale a 1023 e ‘v’ volts equivalem ao valor lido. Portanto, nossa fórmula final é:

v = \frac{valorlido*5}{1023}

Escrevendo isso em forma de código, temos:

1
2
3
4
5
6
void loop() {
  float tensao = analogRead(sensor)*5.0/1023.0;
  Serial.print("Tensao do pino A0 em Volts: ");
  Serial.println(tensao);
  delay(1000);
}

Usei uma variavel float pra tensão, pois quero que o programa escreva valores decimais. Com isso, foi necessário escrever 5.0/1023.0 (adicionar o .0 no final).

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
13
int sensor = A0;

void setup() {
  pinMode(sensor, INPUT);
  Serial.begin(9600);
}

void loop() {
  float tensao = analogRead(sensor)*5.0/1023.0;
  Serial.print("Tensao do pino A0 em Volts: ");
  Serial.println(tensao);
  delay(1000);
}

Controlando o brilho de um LED (PWM) – Aula 6 – AI