Arduino 7: Entrada analógica

As entradas analógicas podem ser usadas para ler valores produzidos por sensores e potenciômetros. A instrução é analogRead(Número-do-pino). O valor lido é de 0 a 1023 (correspondente a valores intermediários de tensão entre 0 e 5V). Os pinos de entrada analógica são A0 – A7. Eles podem ser identificados no programa com ou sem prefixo A (ex: pode-se usar A0 ou simplesmente 0):

int valor = analogRead(3); // lê do pino A3

É uma boa prática usar sempre o prefixo A ao declarar pinos analógicos, já que deixa o código mais legível e fácil de entender, evitando confusão com pinos digitais.

Os pinos de entrada analógica não podem ser usados para saída analógica. Eles não suportam PWM. Mas os seis primeiros (A0 a A5) podem ser usados para saída digital (digitalWrite), se necessário. Neste caso eles podem ser identificados com o nome analógico prefixado (A0, A1, etc.) ou com os números 14 a 19 (que correspondem aos pinos A0 a A5, respectivamente). Ou seja,

digitalWrite(A5, HIGH);

é o mesmo que

digitalWrite(19, HIGH);

Experimento 28 – “Theremin” com LDR e potenciômetro

Material necessário:

  • Arduino Nano + cabo USB + computador
  • Potenciômetro de qualquer valor (ex: 10k, 100k)
  • Resistor de 1k ohms
  • LDR
  • Alto-falante
  • Protoboard, fios e jumpers

O circuito abaixo usa duas entradas analógicas. Uma para obter a leitura de luz, e a outra para obter a posição do potenciômetro que será usada para especificar um intervalo de tempo. A quantidade de luz no LDR irá variar a tensão sobre o resistor de 1k (e consequentemente no pino A0). O mesmo ocorre no pino A1, que obtém seu valor do divisor de tensão formado pelo potenciômetro.

A saída PWM varia de 0 a 255, portanto em um circuito perfeitamente calibrado, dividiríamos o valor lido em qualquer uma das entradas analógica por 4 (1024/4 = 256) para usá-lo diretamente na saída. 

No programa abaixo dividimos por 4 o valor lido no potenciômetro. Mas a tensão no pino A1 que varia com a luz aplicada ao LDR tem valor indefinido (que provavelmente nunca será zero ou 1023).

#define FTE 12
#define LDR A0
#define POT A1

void setup() {} // pinMode é opcional com analogRead

void loop() {
    int luz   = analogRead(LDR);
    int pausa = analogRead(POT);
    delay(pausa * .25);
    int tom = luz * luz * luz / 16; // experimente outros valores
    tone(FTE, tom);
}

O comando tone() gera uma onda quadrada em frequência especificada como parâmetro. As frequências suportadas (até 65kHz) incluem frequências audíveis (20Hz a 20kHz). O valor proporcional ao cubo do valor lido pelo LDR permite que a frequência varie bastante alternando entre sons agudos e graves.