Antes de iniciarmos o desenvolvimento de aplicações práticas com o Arduino, é necessário que saibamos diferenciar uma grandeza analógica de uma grandeza digital. Além disso, também é importante que aprendamos como o Arduino funciona com essas grandezas e os conceitos básicos envolvidos no processo de conversão entre elas.
Digital vs Analógico
Grandezas digitais são aquelas que não variam continuamente no tempo, mas sim em saltos entre valores bem definidos. Um exemplo são os relógios digitais: apesar do tempo em si variar continuamente, o visor do relógio mostra o tempo em saltos de um em um segundo. Um relógio desse tipo nunca mostrará 12,5 segundos, pois, para ele, só existem 12 e 13 segundos. Qualquer valor intermediário não está definido.
Grandezas analógicas são aquelas que, ao contrário das grandezas digitais, variam continuamente dentro de uma faixa de valores. O velocímetro de um carro, por exemplo, pode ser considerado analógico, pois o ponteiro gira continuamente conforme o automóvel acelera ou trava. Se o ponteiro girasse em saltos, o velocímetro seria considerado digital.
Outra analogia interessante pode ser feita comparando uma escada com uma rampa: enquanto uma rampa sobe de forma contínua, assumindo todos os valores de altura entre a base e o topo, a escada sobe em saltos, com apenas alguns valores de altura definidos entre a base e o topo. A escada representa, portanto, uma grandeza digital, enquanto a rampa representa uma grandeza analógica.
A quantidade de degraus numa escada define quais posições podemos escolher. Por exemplo se uma escada tem um degrau em 1,00 m de altura do solo e o próximo está a 1,50 m nós não podemos ocultar a posição 1,38 m do solo porque não existe um degrau lá. Quanto mais degraus adicionamos em um intervalo de altura menor mais perto da rampa nos aproximamos.
Os circuitos e equipamentos elétricos ditos digitais trabalham com apenas dois valores de tensão definidos:
Um nível lógico alto, que no caso do Arduino é 5V;
Um nível lógico baixo, que no caso do Arduino é 0V.
Na prática existem faixas de valores próximos a esses números em que o circuito digital entende como nível alto ou baixo. Também existe uma faixa intermediária não definida que pode gerar resultados inesperados e que, portanto, deve ser evitada.
As placas Arduino possuem uma clara divisão entre os pinos de entrada e saída digitais/analógicos, porém em algumas placas como o Arduino Uno qualquer pino pode ser utilizado como entrada ou saída digital
Caraterísticas de uma Entrada Digital (pull-up e pull-down)
Quando configuramos um pino como entrada digital ele apresentará uma caraterística chamada alta impedância. Isso significa que uma pequena corrente consegue fazer com que seu estado mude. Podemos usar essa configuração, por exemplo, para ler botões, fotoresistências entre outros componentes e a partir do estado lido ou das mudanças desses estados concluir o que está a acontecer no mundo externo e então tomar ações baseadas nessas medidas.
Caso o pino seja configurado como entrada mas sem estar ligado a nada, poderá alterar seu estado aleatoriamente por ser afetado pelo ruído elétrico do ambiente. Para evitar esse problema podemos utilizar uma resistência de pull up ou pull down. Essas resistências farão com que a tensão em nossa entrada esteja bem definida quando o mesmo não esteja ligado a nada. As figuras mostram três ligações de um botão a um pino do microcontrolador configurado como entrada digital. Para cada caso temos:
Figura 1: O estado do pino não estará bem definido fazendo com que este esteja suscetível a ruído.
Figura 2: Neste caso devido à presença da resistência de pull-down seu estado está bem definido em GND consequentemente o estado normal será como baixo.
Figura 3: Neste caso devido à presença da resistência de pull-up seu estado está bem definido em +5 V consequentemente o estado normal será como alto.
Os microcontroladores presentes nas placas Arduino possuem resistências de pull-up construídos internamente que podem ser acedidos por software.
Caraterísticas de uma Saída Digital
Quando configurados nesse estado os pinos podem fornecer 0 ou 5 V fazendo com que eles drenem ou forneçam corrente. O valor máximo dessa corrente varia de placa para placa, mas, em geral, é de 30mA. Essa corrente é mais do que suficiente para ligar um LED de alto-brilho e alguns sensores, porém não é suficiente para ligar a maioria dos relés e motores. Caso uma corrente maior que o limite passe por um pino, este poderá ser danificado.
Entradas e saídas analógicas
Se observarmos um pouco, o mundo é quase todo formado por variáveis analógicas, tais como posição, temperatura e pressão, de forma que é necessário saber trabalhar com esses tipos de grandezas. O Arduino possui um conjunto de pinos destinados a serem utilizados como entradas analógicas e outros pinos que podem ser usados como saídas PWM (Simulam uma saída analógica).
Como tudo no Arduino é processado de forma digital, é necessário converter as grandezas analógicas em digitais e vice-versa. Esses conversores já estão embutidos no Arduino, de forma que é necessário apenas que compreenda o básico do processo de conversão para poder utilizar essas portas analógicas. De volta ao exemplo da escada e da rampa, a quantidade de degraus que temos em uma escada nos podemos associar o conceito de resolução. A resolução de um conversor indica o número de valores discretos (degraus) que ele pode produzir. Quanto mais intervalos conseguimos produzir mais perto do sinal analógico nos chegamos. A resolução de um conversor analógico digital e vice-versa é geralmente expressa em bits, portanto um conversor de 8 bits é um conversor que consegue representar 2^8 degraus.
Entradas Analógicas
Como o conversor analógico-digital do Arduino possui uma resolução de 10 bits, o intervalo de tensão referência, que no nosso caso é 0 a 5 V, será dividido em 1024 pedaços (2^10) e o valor discreto mais próximo da tensão no pino será atribuído a essa tensão. Com 10 bits de resolução e um intervalo de 0 a 5V de tensão podemos representar tensões em degraus de (5-0)/1024 volts. Supondo uma tensão de 3,25 V o valor retornado pela conversão será:
3,25 x 1024 / 5 = 665,6
O resultado deve ser inteiro para que nosso conversor consiga representá-lo, logo o valor 666 será escolhido por ser o degrau mais próximo. Esse valor representa a tensão 3,251953125 inserindo um erro de 0,001953125 em nossa medida devido a limitação de nossa resolução.
Saídas PWM
PWM (Pulse Width Modulation – Modulação por Largura de Pulso) é uma técnica para obter resultados analógicos por meios digitais. Essa técnica consiste na geração de uma onda quadrada em uma frequência muita alta em que pode ser controlada a percentagem do tempo em que a onda permanece em nível lógico alto.
Esse tempo é chamado de Duty Cycle e sua alteração provoca mudança no valor médio da onda, indo desde 0V (0% de Duty Cycle) a 5V (100% de Duty Cycle) no caso do Arduino.
O duty cycle é a razão do tempo em que o sinal permanece na tensão máxima (5V no Arduino) sobre o tempo total de oscilação, como está ilustrado na figura abaixo:
Duty Cycle (%) = (x/x+y)*100% = (x/T)*100%
Vmédio = Vmax*Duty Cycle(%)
O valor do Duty Cycle usado pelo Arduino é um inteiro armazenado em 8 bits, de forma que seu valor vai de 0 (0%) a 255 (100%).