Esteira de transporte – Aula 3

Continuando com as aulas que explicam o funcionamento da esteira de transporte educacional, nesta aula vamos abordar como é feito o registro da passagem das caixas em memórias para funcionar a expulsão ao final da esteira.

Se você ainda não acompanhou as aulas anteriores comece pela aula 1 .

Este tipo de tarefa é muito comum em programas de automação, onde a ocorrência de um evento (como por exemplo, a passagem de uma caixa pelo sensor) provoca uma ação que será executada em um tempo futuro (a expulsão da caixa).

Mas além da simples contagem de tempo para a execução da expulsão, este tipo de aplicação deve prever que mesmo antes da ação ser efetivada, outras ocorrências do evento de entrada podem acontecer. Esse tipo de memória é chamada de memórias em cascata ou com deslocamento no tempo.

O diagrama de tempo a seguir exemplifica uma aplicação deste tipo:

carta tempo1

No diagrama podemos ver que o evento “passagem da caixa branca” irá provocar uma ação (A) no tempo futuro t1. Outro evento é a “passagem da caixa preta” que por sua vez provocará outra ação (B) no tempo futuro t1.

Na aula 1 desta série sobre a esteira, mostramos como funciona o sensor que faz a leitura da cor da caixa. Você pode dar uma olhada naquela aula para entender como é feita a leitura da cor da caixa pelo sensor.

Como pode ser visto no vídeo que mostra a esteira em funcionamento, o tempo t1 entre a passagem da caixa pelo sensor e a expulsão da caixa é razoavelmente grande. Desta forma nossa memória em cascata deve ser capaz de armazenar e controlar as várias caixas que passam pelo sensor durante este tempo t1.

Agora eu gostaria de propor um exercício prático extremamente fácil de fazer e que dará ao leitor uma compreensão total de como funciona e com fazer uma aplicação com memórias em cascata.

Com apenas uma placa Arduino Uno, um led, uma tecla e 2 resistores, iremos montar um circuito que simula exatamente como funciona a expulsão retardada das caixas na esteira de transporte.

O esquema proposto está desenhado na figura abaixo:

esquema1

A tecla T1 utilizada aqui possui 2 terminais e fecha contato entre eles quando pressionamos a tecla. Um dos terminais está ligado ao GND e o outro pode ser ligado em qualquer pino de entrada do Arduino. No esquema este terminal está ligado ao pino 9 do Arduino.

O resistor R2 fica ligado ao mesmo terminal 9 do Arduino e também ao +5V da placa. Este resistor serve para manter o sinal da tecla em nível lógico 1 (VCC) quando a tecla não está sendo pressionada.

O LED está ligado no pino 8 do Arduino e o resistor R1 que fecha o circuito e polariza o LED fica ligado no GND da placa. Observe a polaridade do LED e faça a ligação correta para que ele acenda corretamente. Se ligarmos o LED invertido o mesmo não irá acender.

Feita a montagem, só precisamos escrever o programa que realiza a função proposta neste exercício. A função proposta é que ao ligar a placa nada acontece e o LED permanece apagado.

Ao pressionarmos a tecla uma vez marcamos este evento na memória em cascata e depois de um tempo, que pode ser definido no próprio programa, o LED dá uma piscada com tempo de duração também definido no programa.

No video que fizemos para mostrar como este exercício deve funcionar, deixamos o tempo de atraso para o LED piscar em 5 segundos e o tempo que o LED fica aceso em 0,3 segundo.

A seguir temos o programa completo descrito. O leitor pode simplesmente copiar na IDE do Arduino e carregar em sua placa Arduino Uno. Se não houver nenhum erro de digitação, o leitor poderá ver como funcionam as memórias em cascata.

Abaixo do código, darei algumas dicas de como funciona cada parte do programa para o leitor que desejar se aprofundar e aprender exatamente como fazer este tipo de estrutura de programa.

codigo1

codigo2

codigo3

O leitor que já acompanha nosso site já pode ver que a parte inicial do programa não tem nada de novo para ser explicado, pois já mostramos esta parte do programa em outras aulas.

É dentro da rotina loop ( ) que fazemos todo o controle.

Começamos a partir da linha 29 definindo uma estrutura com a instrução “if” que controla o tempo para que todas as instruções sejam executadas somente a cada 10ms. Esta estrutura cria uma base de tempo para o programa rodar e desta forma a contagem do tempo é bem precisa e fácil de ser executada. A instrução da linha 31 também pertence a essa estrutura que controla a base de tempo do programa.

Na linha 33 realizamos a leitura do estado da entrada de tecla e guardamos o resultado em uma memoria local “entrada”.

A estrutura entre as linhas 35 e 39 é usada para detectar a transição do sinal da tecla. Assim nosso evento que controla o LED é o momento que apertamos a tecla. Já mostramos como fazer a detecção de transição de sinal de entrada em aula passada.

Nas linhas 37 e 38 fazemos o registro do evento nas memórias chamadas shift (shift é outro nome para descrever memorias em cascatas).

Observe que estamos usando aqui um vetor de memorias chamada shift. Na definição da memoria lá no inicio do programa (linha 10) definimos o tamanho do vetor shift, 10 elementos. Isso quer dizer que temos na verdade 10 memorias chamadas shift e fazemos referência a elas usando colchetes [ ].

Temos então a memoria shift [0], shift [1], shift [2]… shift [9]. Sempre começando com o índice 0.

A variável indexShift controla qual variável shift estamos usando nesta parte do programa.

Quando apertamos a tecla pela primeira vez vamos registrar na memória shift [0], porque indexShift está com valor 0. Logo em seguida fazemos o incremento da variável e comparamos para ver se ela ficou com valor maior que 9. Caso positivo temos que retornar seu valor para 0.

Com este esquema, a cada vez que apertamos a tecla, estaremos usando uma variável diferente para contar o tempo.

A quantidade de elementos do vetor depende da quantidade de cliques ou, no caso da esteira de transporte, a quantidade de caixas que podemos ter em cima da esteira durante um ciclo completo de passagem das caixas.

No diagrama abaixo temos um exemplo de uma esteira onde podemos ter até 8 caixas sobre a esteira. Isso quer dizer que temos que ter 8 memórias para poder armazenar o estado das 8 caixas que estão sendo transportadas por vez para não perdermos a informação de nenhuma caixa.

carta tempo3

Em nosso caso real estamos utilizando 10 elementos no vetor shift para garantir que não haverá perda de informação.

Na linha 37 colocamos o valor 500 na memoria shift. Esse é o tempo de atraso para o LED piscar. Como nossa base de tempo é 10ms, teremos um tempo de atraso de 500* 10ms= 5000ms ou 5 segundos. Este tempo tem que ser ajustado para a expulsão acontecer no momento certo.

No bloco de programa entre as linhas 42 a 52 fazemos a contagem de tempo para as memórias shift que estão com valor diferente de 0. Para isso testamos os 10 elementos do vetor shift e quando encontramos algum que esteja com valor maior que 0 decrementamos seu valor (linha 46).

Quando o número que está na memória atingir o valor igual a 1 é o momento de tomar a ação, em nosso caso, acender o LED.

Para fazer o LED acender vamos usar outra variável de memória que controla o acionamento do LED: tempoLedAceso.

Colocando o valor 30 nesta variável o LED ficará aceso por 300ms. Este tempo pode ser ajustado também para atender as necessidades da aplicação.

Agora é com vocês. Experimente fazer este circuito simples e veja como é fácil fazer coisas realmente importante com o Arduino.

Abraços a todos e até a próxima aula.

Um comentário sobre “Esteira de transporte – Aula 3

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