Tratamento de sinal de entrada

Em um projeto comum com o Arduino normalmente teremos um ou mais sinais de entrada e um ou mais sinais de saída. É comum também, querermos controlar o acionamento das saídas de acordo com o estado das entradas:

diagrama1

Quando estamos lidando com sinais digitais temos apenas 2 estados possíveis (0 e 1). Uma das primeiras etapas de um projeto é definir se iremos usar o nível ou a transição dos sinais de entrada para atuar no sinal de saída.

Nesta aula vamos ver como é que esta definição interfere no funcionamento do projeto e também como fazer os programas conforme estas definições.

 

CARTA DE TEMPO

Vamos começar esta aula descrevendo o que é,  e para que serve uma carta de tempo.

Carta de tempo é um tipo de gráfico 2D que mostra a variação de um sinal qualquer (digital ou analógico) ao longo do tempo. Neste gráfico temos o eixo vertical mostrando a amplitude do sinal e o eixo horizontal mostrando o tempo.

cartaTempoExemplo2

A carta de tempo é uma ferramenta muito útil, especialmente durante o desenvolvimento de projetos.

Na figura acima podemos ver o que significa os termos “nível” e “transição”. Nível é o trecho do sinal em que a amplitude é constante enquanto que transição é o trecho em que ocorre a mudança de amplitude. A transição é positiva quando o sinal vai de 0 para 1 e é negativa quando o sinal vai de 1 para 0.

 

USANDO O TRECHO DE NÍVEL

Podemos utilizar o trecho de nível de um sinal de entrada, por exemplo para fazer um interruptor comum, do tipo liga/desliga de parede das casas.

Neste caso o programa é bem simples:

if  ( digitalRead ( E1) )

     digitalWrite ( S1, HIGH);

else 

     digitalWrite ( S1, LOW);

 

Apesar de simples, este programa atende bem este tipo de aplicação.

No exemplo acima, fazemos a leitura do estado da entrada digital E1 na instrução de “if”. Quando a entrada está ligada, colocamos a saída S1 em “HIGH”, caso contrário colocamos em “LOW”.

Com este programa podemos controlar o led do diagrama abaixo.

diagrama2

Por outro lado, se estivermos usando um botão do tipo push-button para ligar e desligar um led, vamos precisar fazer a detecção da transição do sinal de entrada.

 

DETECÇÃO DA TRANSIÇÃO DE SINAL

O que queremos fazer agora é um circuito com um botão do tipo push-button e um led. Quando apertamos uma vez o botão, o led acende e fica aceso. Ao apertarmos novamente o botão, o led apaga e permanece apagado.

Vamos representar este comportamento em uma carta de tempo:

cartaTempoExemplo3

A representação na carta de tempo (setas vermelhas) indica que a transição positiva do sinal de entrada E1 provoca a inversão do estado da saída S1.

Um programa que faz esta função tem que usar a detecção da transição positiva do sinal de entrada.

Para fazer a detecção de transição de um sinal digital vamos continuar usando a mesma função “digitalRead(sinal)”.

Esta função nos informa o estado atual do sinal de entrada. Vamos imaginar a carta de tempo de um sinal de entrada e as setas indicam os momentos que usamos a função “digitalRead” ao longo do tempo:

cartaTempo2

Vamos criar duas variáveis do tipo booleana: uma chamaremos de estadoE1 e outra chamaremos de memoriaE1.

A cada instante de tempo indicado pelas setas na carta de tempo faremos 2 coisas:

  1. Passaremos o valor da variável estadoE1 para a variável memoriaE1;
  2. Faremos a leitura do estado da entrada E1 com a função digitalRead(E1) guardando o resultado na variável estadoE1.

Vamos agora colocar em uma tabela os valores adquiridos ao longo do tempo:

tabela2

Agora podemos identificar facilmente as condições para termos as transições positiva e negativa em função dos estados das variáveis estadoE1 e memoriaE1.

A transição positiva acontece quando temos:

estadoE1= 1 (true)    e     memoriaE1= 0 (false)

A transição negativa acontece quando temos:

estadoE1= 0 (false)   e    memoriaE1= 1 (true)

Agora ficou bem fácil. Vamos fazer um “if” com a condição da transição positiva e vamos usar outra variável tipo booleana para indicar o estado da saída S1 (led).

if ( estadoE1 && !memoriaE1 )

{

estadoS1 = !estadoS1;

digitalWrite ( S1, estadoS1);

}

 

Neste exemplo não usaremos a transição negativa, mas poderia ser usada sem problemas. Vai depender da aplicação mesmo. Neste caso só teríamos que alterar as condições testadas no “if”.

Um outro exemplo interessante com este tipo de estrutura de programa seria uma aplicação que fizesse a contagem de pessoas que passam em um corredor.

Usando um sensor de presença ligado a nossa entrada E1 usamos o mesmo código para incrementar uma variável do tipo int que representa o número de pessoas que circulam em um corredor, por exemplo.

O código completo para este contador está transcrito abaixo:

codigo1

 

Neste exemplo estamos usando o interface serial do Arduino para enviar o número de pessoas contadas cada vez que uma pessoa passa pelo sensor. Para visualizar no computador abrimos o Monitor serial da IDE do Arduino:

tela8

 

Era isso que eu tinha para ensinar a vocês nesta aula.

Se vocês conseguirem usar estas informações em algum projeto, podem colocar nos comentários.

Abraços

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s