0

Como controlar Entradas e Saídas Digitais do Arduino

Neste tutorial será ensinado como configurar e controlar as entradas e saídas digitais no Arduino. No decorrer do post desenvolveremos um programa para piscar um LED num período definido. Entretanto, para acompanhar este tutorial é necessário que o leitor saiba o que é uma grandeza digital e quais são as caraterísticas das entradas e saídas digitais.

O Arduino possui um LED integrado a ele que é internamente conectado ao pino 13. Por questões de conforto e facilidade, utilizaremos este LED no nosso exemplo.

Configurar um Pino Digital

Para configurar um pino como saída ou entrada nós devemos utilizar a função pinMode, que recebe dois parâmetros e não retorna nada. O primeiro parâmetro dessa função recebe o número do pino que desejamos configurar. O segundo parâmetro recebe o modo na qual gostaríamos de utilizar esse pino. Podemos escolher entre 3 modos.

INPUT – Configura o pino como entrada;
INPUT_PULLUP – Configura o pino como entrada e ativa a resistência de pull-up interno;
OUTPUT – Configura o pino como saída.

pinMode(13,OUTPUT); // Configura o pino 13 (LED) como saída digital.
pinMode(A0,INPUT); // Configura o pino A0 como entrada digital.

Alterar o estado de uma saída

Podemos alterar o estado de uma saída digital utilizando a função digitalWrite, que recebe dois parâmetros e não retorna nada. O primeiro parâmetro dessa função recebe o número do pino que desejamos configurar. O segundo parâmetro recebe o estado que desejamos que o pino tenha.

HIGH – Estado lógico alto (+5 V);
LOW – Estado lógico baixo (GND);

pinMode(13,OUTPUT); //Configura o pino 13 (LED) como saída digital
digitalWrite(13,HIGH); // Altera o pino 13 para o estado lógico alto (+5V) -> Acende o LED

 

Ler o estado de um pino

Podemos conhecer o estado de um pino utilizando a função digitalRead, que recebe um parâmetro e retorna um estado lógico. O primeiro e único parâmetro dessa função recebe o número do pino a ser lido.

PinMode(10,INPUT); // Configura o pino 10 como entrada
bool estado = digitalRead(10); // Lê o estado atual do pino 10 e armazena na variável estado

A função digitalRead também pode ser utilizada para ler o estado atual de uma saída digital. Podemos, por exemplo, inverter o estado de um LED escrevendo nele o inverso de seu estado atual:

digitalWrite(13,!digitalRead(13)); // Inverte o estado do LED

 

Pausas entre comandos

A maioria dos microcontroladores presentes nas placas Arduino possuem um clock de 16MHz. Isso faz com que ele possa executar instruções na ordem de 60 ns. Para “pausar” o programa por um certo período de tempo, usamos a função delay. Essa função recebe um inteiro como parâmetro, que simboliza o tempo em que ele permanecerá parado em milisegundos.

digitalWrite(13,HIGH); //Configura o pino 13 no estado lógico alto (+5V) -> Acende o LED
delay(1000); // Aguarda 1 segundo (1000 milisegundos)
digitalWrite(13,LOW); // Configura o pino 13 no estado lógico baixo (0V) -> Apaga o LED

 

Medindo o tempo de execução

O Arduino possui ainda recursos que informam quanto tempo se passou desde o início do programa.

A função millis retorna o número de milissegundos desde que o Arduino começou a executar o programa. O tipo de retorno dessa função possui tamanho de 32 bits, sendo assim capaz de guardar um valor em milissegundos equivalente a aproximadamente 50 dias. Depois desse período, o tempo volta para zero e a função reinicia a contagem.

tempo = millis(); // Retorna o tempo em milissegundos e armazena na variável tempo

Caso se necessite de uma maior precisão, a função micros pode ser utilizada. Sua funcionamento é semelhante ao da função millis, porém o valor retornado representa o tempo desde o início do programa em microssegundos. Por possuir maior precisão, essa função é capaz de contar por aproximadamente 70 minutos. Após esse período, o tempo contado volta para zero e a função reinicia a contagem.

tempo = micros(); // Retorna o tempo em milissegundos e armazena na variável tempo

Esses dois recursos do Arduino possibilitam a criação de delays mais “inteligentes”. O microcontrolador consegue executar instruções em alguns microssegundos, por isso é geralmente necessário fazer com o mesmo espere alguns segundos antes de executar um conjunto de instruções. Para isso contamos com as funções delay e delayMicroseconds.

Entretanto,o uso de funções de delay fazem com que o microcontrolador não execute a próxima instrução enquanto o tempo determinado seja atingido, o que geralmente é um problema. Imagine, por exemplo, que desejamos piscar dois LEDs, um LED a cada 60s e outro a cada 1s. Neste caso o uso de delay não é interessante.
Uma solução para este problema é através da criação de uma referência. Imagine que pergunta ao seu colega que horas são e que deseja saber se já se passaram 10 minutos desde que aula começou. Para isso basta saber a que horas é que aula foi começou e a hora atual fazendo assim a subtração desses dois valores é possível concluir quanto tempo se passou. O mesmo pode ser feito no microcontrolador através do uso das funções millis e micros, como no exemplo a seguir:

tempoAtual = millis(); // Captura o tempo atual
// Verifica se já se passaram 1 segundo (1000 milissegundos)
// desde a última vez em que o LED foi invertido
if(tempoAtual - referencia > 1000) {
// Se sim, inverte o LED e atualiza a referencia
digitalWrite(13,!digitalRead(13));
referencia = millis();
}

 

Funções setup e loop

As funções setup e loop são necessárias em qualquer programa de Arduino. Sem qualquer uma delas, o programa apresentará erro de compilação. Após ligarmos o Arduino a função setup será executada primeiro e somente uma vez. Nela, em geral, são definidas configurações referentes ao programa, como definições de entradas e saídas.

Mais adiante veremos outros parâmetros que podem ser definidos no setup, como a taxa de comunicação com a porta serial, por exemplo. Após a execução da função setup a função loop será chamada. Como o nome sugere, assim que essa função terminar sua execução, ela será chamada novamente permanecendo então rodando infinitamente. Agora podemos, finalmente, finalizar o nosso projeto do pisca LED:

// Variáveis de 32 bits sem sinal
uint32_t referencia = 0;
uint32_t tempoAtual;
void setup() {
pinMode(13,OUTPUT); // Configura o pino 13 (LED) como saída
}
 
void loop()
{
     tempoAtual = millis(); // Captura o tempo atual
// Verifica se já se passaram 1 segundo (1000 milissegundos)
// desde a última vez em que o LED foi invertido
     if(tempoAtual - referencia >= 1000) {   // Se sim, inverte o LED e atualiza a referencia
        digitalWrite(13,!digitalRead(13));
        referencia = millis();
     }
}

 

Análise do Código

Ao iniciar o programa, o Arduino chama a função setup e configura o pino do LED como saída. Em seguida a função loop é chamada e permanece rodando infinitamente, sempre verificando se já se passou 1 segundo desde a última alteração.

Quando isso acontecer, o programa altera o estado do LED e atualiza a referência para a próxima contagem.

 

Artigo gentilmente cedido por Vida de Silicio

 

Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.

Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.

Não se esqueçam de fazer like na nossa Página no Facebook.

Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?

Comments

Comentários

mariana guedes

Deixar uma resposta