Nesta aula sobre o shield Multi-function nós vamos ver como usar o conversor analógico-digital do Arduino para ler a variação do ajuste do trimpot da placa Multi-function.

Vamos começar pela definição de sinais digitais e analógicos.

Dentro de qualquer microprocessador ou microcontrolador os números que são processados estão na forma digital. Um sinal digital possui apenas 2 estados: 0 e 1. Algumas vezes chamamos estes estados com nomes diferentes (true e false, low e high, off e on) mas são apenas nomes diferentes para designar o mesmo tipo de sinal digital.

Já um sinal analógico pode ter infinitos valores, dependendo da resolução que queremos obter deste sinal. A figura abaixo mostra um gráfico de tempo com os dois tipos de sinal a que nos referimos.

sinais1

O sinal digital pode ser usado para representar eventos com apenas 2 estados. Um exemplo deste tipo de evento é uma lâmpada elétrica com interruptor na parede. Um dos estados da lâmpada é apagada e o outro estado é acesa. Já os sinais analógicos podem representar eventos com variação gradual. Um exemplo de evento de variação gradual é a temperatura de uma sala.

Para que uma variável gradual possa ser manipulada dentro de uma CPU de microcomputador ela deve ser digitalizada, ou seja, convertida de sinal analógico para sinal digital. Essa é a função do conversor analógico-digital presente dentro do microcontrolador do Arduino.

Foi falado aqui que o sinal digital possui apenas 2 estados, 0 e 1. Este é o comportamento de um bit. Por outro lado podemos usar uma sequência de bits para formar números digitais com maior alcance. Da mesma forma que um dígito que varia de 0 a 9, combinado com mais dígitos conseguem representar números maiores que 9, vamos usar uma combinação de bits para representar números maiores que 1.

A quantidade de bits combinados é uma das características mais importantes em um circuito conversor analógico-digital (AD). Quanto maior a quantidade de bits maior a resolução ou precisão do conversor. O Arduino possui um conversor AD de 10 bits que é capaz de dividir o sinal analógico em 1024 partes. Assim o valor de tensão máximo será representado pelo numero 1023 enquanto que o valor de tensão 0 será representado pelo número 0.

Para fazer a leitura do sinal analógico dentro do programa é muito simples. A função analogRead(canal) retorna o valor convertido. Os limites do valor são aqueles descritos no paragrafo anterior.

Na placa Multi-function o esquema de ligação do trimpot é o que está na figura abaixo. O trimpot é um resistor com valor variável. Conforme ajustamos o parafuso sobre o trimpot, alteramos o valor de resistência entre o cursor (seta) e os outros terminais. Segundo o esquema abaixo, quando o trimpot está com o valor mínimo de resistência, a tensão no ponto A0 é igual a 0 volts. Quando o trimpot está com o valor máximo de resistência, a tensão no ponto A0 é igual a 5 volts.

FIG4

O programa transcrito a seguir faz a leitura do valor analógico A0 e mostra o valor convertido no display da placa Multi-function. Usamos a mesma base de programa usado na aula 1 com um contador de tempo para fazer a conversão AD a cada 100 ms para dar maior estabilidade ao sistema.

Em relação ao programa usado na aula 1, acrescentamos o #define TRIMPOT 0 na linha 25. Com esta linha definimos a entrada analógica A0 para a leitura do valor do trimpot da placa Multi-function. Retiramos a variável contador e acrescentamos a variável valorAnalog (linha 35) onde ficará armazenado o valor do trimpot após a conversão. Na rotina setup() não alteramos nada.

Na rotina loop() temos as chamadas de função WriteNumberToSegment() nas linhas 63 a 66. Como já foi explicado na aula 1, estas chamadas são responsáveis por fazer a multiplexação dos displays, mostrando as variáveis digito1, digito2, digito3 e digito4 no display.

A partir da linha 69 temos a instrução if que controla a contagem de tempo de 100 ms, dentro do scopo da instrução if temos a chamada de função analogRead(TRIMPOT) que faz a leitura do resultado da conversão e guarda na variável valorAnalog (linha 74).

Nas linhas 77 a 83 é feita a extração de cada digito do número guardado em valorAnalog para poder mostrar o milhar, centena, dezena e unidade.

prog1

prog2

prog3

prog4

Ao carregar este programa no Arduino, o leitor irá visualizar o valor convertido no display. Ao girar o parafuso do trimpot na placa o valor mostrado no display varia de 0000 a 1023.

Podemos alterar o programa para mostrar no display o valor de tensão do sinal A0. O valor máximo de tensão é 5 volts que equivale ao valor convertido de 1023. Com a resolução disponível podemos mostrar a tensão com 2 casas decimais, ou seja 5.00 volts.

Para fazer esta conversão vamos imaginar que iremos mostrar o valor máximo de 500 e depois colocamos o ponto decimal. Posto isso, o que iremos fazer é uma regra de três simples, sendo Y o valor convertido e X o valor da tensão.

Quando Y = 1023 -> X= 500 (valores máximos)

Portanto: X= (Y * 500) / 1023

Essa é a conta que precisamos fazer no programa para passar a mostrar o valor de tensão de 0.00 a 5.00 no display. Abaixo está transcrita a alteração necessária no programa para fazer esta conversão. Mas para dar certo temos que alterar o tipo da variável valorAnalog para long na linha 35:

long valorAnalog=0;

 

prog5

Com estas alterações já estamos mostrando no display o valor da tensão no ponto A0. Só falta acrescentarmos o ponto decimal no digito 3  do display. Para isso, temos que fazer uma alteração na rotina WriteNumberToSegment para fazer acender o ponto decimal. É importante acrescentarmos outro parâmetro na função para que o ponto decimal aparece somente no digito que queremos. Este parâmetro será de tipo bool e terá o nome pd. Quando pd= true a rotina acende o ponto decimal, e quando pd=false a rotina apaga o ponto decimal. As linhas de chamada da rotina ficam assim:

prog6

Enquanto que a função WriteNumberToSegment fica com as seguintes alterações:

prog7

Com isso completamos esta aula sobre o conversor AD do Arduino com o shield Multi-function. Eu gostaria de deixar agora um desafio para o aluno:

  • Que alterações temos que fazer no programa para poder mostrar o valor da tensão com 3 casas decimais ao invés das 2 que nosso programa está mostrando?
  • O que acontece com o valor mostrado quando tentamos fazer isso?
  • Tem alguma vantagem com este resultado?

 

Na próxima aula eu comento os resultados.

Foi bastante informação nesta aula e pode ser que ainda não tenha ficado claro algum detalhe. Neste caso, eu ficaria muito agradecido se o aluno enviasse um email pedindo maiores esclarecimentos sobre o que não ficou claro ainda.

Abraços.