quarta-feira, 12 de outubro de 2016

O contador binário



Objetivo de compreensão deste post:

  • Sequencia da numeração binária
  • Contagem com número limitado de bits
  • Efeito do tempo de pressionamento de um botão
  • Efeitos de debousing



Abaixo temos um sketch que implementa um contador binário de 4 bits

  


/*

  Objetivo: Escrever um nibble (4 bits) em leds
*/

// cria os "apelidos" para os pinos
#define led_bit_0 10
#define led_bit_1 11
#define led_bit_2 12
#define led_bit_3 13

byte contador=0;              // cria uma variável do tipo byte (0 a 255) e iniciliza com valor 0

void escreve_byte (byte x){
  if ( x & 0b00000001) digitalWrite(led_bit_0, HIGH); else digitalWrite (led_bit_0, LOW);
  if ( x & 0b00000010) digitalWrite(led_bit_1, HIGH); else digitalWrite (led_bit_1, LOW);
  if ( x & 0b00000100) digitalWrite(led_bit_2, HIGH); else digitalWrite (led_bit_2, LOW);
  if ( x & 0b00001000) digitalWrite(led_bit_3, HIGH); else digitalWrite (led_bit_3, LOW);
}

void setup() {  // esta função é executada uma única vez quando o microcontrlador inicia (ao pressionar o reset)
  pinMode(led_bit_0, OUTPUT);  // iniciliaza o pino 0 como saída
  pinMode(led_bit_1, OUTPUT);  // iniciliaza o pino 1 como saída
  pinMode(led_bit_2, OUTPUT);  // iniciliaza o pino 2 como saída
  pinMode(led_bit_3, OUTPUT);  // iniciliaza o pino 3 como saída
}

void loop() { // função que repete infinitamente os passos listados
  escreve_byte (contador);      // escreve o byte na saída
  delay (1000);                 // espera 1 segundo
  contador++;                   // incrementa a variável contador em 1 unidade
}

  



Esquemático para funcionamento do sketch

Atividades:


  1. Crie um sketch com o código acima, e implemente a ligação e observe o funcionamento:
    • Qual a contagem realizada?
    • Qual o ponto de início?
    • O que acontece depois do número 15?
  2. Crie um novo sketch modificando o início da contagem.
  3. Crie um novo sketch para contagem seja decrescente.
    • O que acontece depois do número 0?
  4. Crie um novo sketch para estender a contagem para 8 bits.

  5. Crie um novo sketch inserindo um botão que controla o incremento.
  6. Crie um novo sketch inserindo mais 3 botões. um para o decremento, um para zerar e um para setar em 128.



  



Sequenciamento - O semáforo


Semáforo - Wikipédia

A Origem do Semáforo - Origem das coisas





1. Semáforo simples




Funcionamento de um semáforo de forma individual

1ª etapa - Acionamento do Verde

2ª etapa - Tempo de verde (15s por exemplo)

3ª etapa - Acionamento do Amarelo

4ª etapa - Tempo de amarelo (2s po exemplo)

5ª etapa - Acionamento do vermelho

6ª etapa - Tempo do vermelho (13s por exemplo)

Para completar o ciclo, volta a 1ª etapa


Atividade

Desenvolver um sketch utilizando uma placa Arduíno, para controlar um semáforo individual com o circuito correspondente.

  • Ligar o semáforo a saídas digitais
  • Escolher tempos para
    • Aberto (verde)
    • Atenção (amarelo)
    • Pare (vermelho)


Exemplo de montagem de um semáforo simples


2. Semáforo cruzamento

Quando temos o cruzamento de duas vias, a preferência de tráfego corresponde a via de maior importância, ou seja, a que possui maior tráfego.

Quando as duas vias possuem a mesma importância trona-se necessário organizar o tempo em que cada uma delas terá a passagem. Isso é coordenado por um semáforo.

Cruzamento de duas vias


Diagrama de estados para os semáforos A e B






Atividade

Desenvolver um sketch utilizando uma placa Arduíno, para controlar um cruzamento de 2 vias.
Escolha os pinos de saída 

Sugestão de montagem dos dois semáforos



3. Semáforo cruzamento com tempos diferentes


Em alguns cruzamentos é necessário organizar com temporizações diferentes dependendo do sentido de fluxo.



Note na figura acima que é necessário termos tempos que organizem cada um dos fluxos para cada um deles (1, 2 e 3) ocorrer em tempos diferentes para cada um poder ter acesso as duas vias.

Diagrama de estados para os semáforos A B e C









Sugestão de montagem



Os primeiros passos - BLINK


A IDE  do Arduino já vem "recheada" de exemplos.

O exemplo clássico é "Blink", que é um led piscante.


  • Piscar um LED corresponde a mudar o estado lógico de uma saída
  • Para termos o efeito visual de piscar um LED é necessário ligar e em sequência desligar uma saída lógica.
  • Esta ação deve acontecer de forma repetitiva (loop)

  • Como o microcontrolador trabalha sob um circuito de clock elevado (16MHz), as ações efetuadas ocorrem em um tempo muito pequeno, de forma que o olho humano não percebe essas mudanças.
  • Visualmente é como se o LED estivesse permanentemente ligado.
  • Para poder ver o efeito é necessário incluir um tempo visível ao olho humano .


  


  

Construindo um sketch através de um exemplo


Arduino.cc - Blink

Com seu Arduino conectado ao computador e devidamente configurado, abra o
menu Arquivo > Examplos > 01. Basics > Blink.



Uma nova janela deve ser aberta com um programa carregado.



Na "Área de programação" teremos um logo comentário explicando o que faz o programa como ele está configurado e dados sobre o autor e data.

O programa consiste em

  


  
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

  


  

Transferindo o programa para placa


Clique no botão "Gravar o programa na placa", que o Sketch será compilado e transferido para a placa.

Botão "Gravar o programa na placa" marcado em vermelho

As placas UNO e MEGA tem um led ligado ao pino digital 13, por não há necessidade de ligar nenhum hardware externo a placa. Após a compilação e carga do programa o led começará a piscar com tempos de on e off de 1 segundo.



   

Placas UNO e Mega com led conectado a saída digital 13 marcado em vermelho 

 
Ligando a placa a um hardware externo (resistor e led) montado na protoboard



  

  

Usando um simulador

Clique no Menu  "Sketch/Exportar Binário Compilado"



A IDE compila o Sketch, verifica erros e gera um arquivo ".HEX" que contém o programa no formato que o microcontrolador entende. Esse aquivo pode ser utilizado no simulador.


  
  


Entendendo o Código


O código do exemplo Blink é relativamente simples, porém apresenta a estrutura básica de um programa desenvolvido na IDE Arduino. Inicialmente nota-se que existem duas funções obrigatórias em um programa Arduino, setup() e loop().

A função setup () é executada na inicialização do programa e é responsável pelas configurações iniciais do microcontrolador, tal como definição dos pinos de I/O, inicialização da comunicação serial, entre outras.

A função loop () será onde ocorrerá o laço infinito da programação, ou seja, onde será inserido o código que será executado continuamente pelo microcontrolador.

Dentro do loop principal está o código que fará o led ligado pino 13 piscar em intervalos de 1 segundo.

A função digitalWrite(led, HIGH); coloca o pino em nível lógico 1, ligando o led.

A função delay(1000); aguarda o tempo de 1000 ms, ou seja, 1 segundo para que possa ser executada a próxima instrução.

A função digitalWrite(led, LOW); coloca o pino em nível lógico 0, desligando o led.

E novamente é esperado 1 segundo com a função delay();

O loop é repetido infinitamente enquanto a placa estiver ligada.