Projeto 60 - Dado eletrônico com Arduino (uso de manipulação direta de portas)

Básico - Projeto 60

Dado eletrônico com display 7 segmentos e manipulação direta de portas

Objetivo

Neste projeto vamos criar um "dado eletrônico" que irá sortear números de 1 a 6 em um display de 7 segmentos. Cada jogada é realizada ao pressionar um botão. Iremos também apresentar o conceito de manipulação direta de portas do Arduino onde mostraremos como utilizar um registrador de portas DDR e PORT.

Definições

1. Neste projeto você poderá utilizar um display catodo comum ou anodo comum (invertendo os valores 0 e 1 dos bits)

2. O conceito apresentado para DDR e PORT é específico para Arduino UNO R3 que utiliza o microcontrolador ATmega328.  Outros microcontroladores podem ter configurações diferentes.

3. ATENÇÃO: Tome muito cuidado em utilizar o conceito de manipulação direta de portas. Qualquer erro pode danificar permanentemente o seu Arduino.

Display de 7 segmentos: é um componente eletrônico utilizado para apresentar informações visuais. Possui apenas 1 dígito, formado por 7 segmentos de leds acionados de forma independente mais o led do ponto que fica no canto inferior direito do display.

Desta forma é possível formar caracteres de 0 a 9, hexadecimais de A a F, e algumas letras do alfabeto latino. O display e formado pelo arranjo de LEDs (diodos emissores de luz) encapsulados em um invólucro apropriado, controlados individualmente, que podem estar acesos ou apagador, formando assim o caractere desejado. É possível encontrar no mercado, displays de catodo comum e de anodo comum.

Registradores de portas (PORT) do Arduino Uno R3

Registradores de portas (PORT) permitem o acesso direto às portas do Arduino. Veja abaixo a imagem que mostra todas portas disponíveis do Arduino UNO:

Nos microcontroladores Arduino Uno, existem 3 canais de portas:

  • B (portas digitais de 8 a 13)
  • C (entradas analógicas)
  • D (portas digitais de 0 a 7)

Vamos utilizar neste projeto apenas as portas do canal D que são referentes às portas digitais de 0 a 7 do Arduino ( PORTPD).

Também podemos utilizar os registradores:

  • DDR que configura o sentido da porta se ela é saída (OUTPUT) ou entrada (INPUT). Substitui a função pinMode().
  • PORT que controla se a porta está no estado lógico alto (HIGH) ou baixo (LOW).
  • PIN que efetua a leitura das portas configuradas como INPUT pela função pinMode().

No nosso projeto vamos utilizar os registradores DDR e PORT conforme as instruções abaixo:

DDR

  • No caso do registrador DDR, vamos acrescentar o canal de portas D, ficando portanto como DDRD (portas digitais de 0 a 7 no Arduino Uno).
  • Definimos para cada porta se é saída (OUTPUT), usando o 1 ou se é entrada (INPUT), usando o 0.
  • A ordem das portas é decrescente e vai de PD7 até PD0.
  • Como é um número binário, devemos colocar o modificador "B" na frente, veja o exemplo a seguir:

Ex.:

DDRD = B11111110;  // configura portas 1 ate 7 como saídas,e a porta 0 como entrada

PORT

  • Como no registrador DDR, vamos acrescentar no PORT o canal de portas D, ficando portanto como PORTD (portas digitais de 0 a 7 do Arduino Uno).
  • Definimos para cada porta, se está no estado lógico HIGH, usamos 1 ou se está no estado lógico LOW, usamos 0.
  • A ordem das portas vai de PD7 até PD0.
  • Como é um número binário, devemos colocar o modificador "B" na frente, veja o exemplo a seguir:
PORTD = B10101000;  // registra valor HIGH nas portas digitais 7,5 e 3

Aplicação

Para fins didáticos e projetos com relógios digitais e equipamentos com contadores.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Display de 7 segmento Display de 7 segmentos (catodo comum) 1

Somente utilizar display catodo comum com CD4511.

O display poderá ser de qualquer cor.

(datasheet)

Resistor Resistor 1

1 Resistor de 150Ω ou superior

  Push Button  Push button 6X6X5mm 1

 

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.

Montagem com display 7 segmentos (catodo comum) - Simulação

 

Atenção

1. Conheça a disposição dos pinos do display:

2. Faça a ligação do display com o arduino conforme a tabela abaixo:

ARDUINO DISPLAY 7 SEGMENTOS SEGMENTOS
Pino 1 Pino 7 A
Pino 2 Pino 6 B
Pino 3 Pino 4 C
Pino 4 Pino 2 D
Pino 5 Pino 1 E
Pino 6 Pino 9 F
Pino 7 Pino 10 G
Pino 9 Pino 5 DP (PONTO) - opcional

 Nota: Observe que utilizamos o pino 1 do Arduino neste projeto. Entretanto, a utilização do pino 1 só é recomendável quando não houver transmissão de dados (uso do Monitor Serial) pois faz com que o led (segmento A no nosso exemplo) acenda durante a transmissão. Isto faz com que a visualização no display de 7 segmentos fique confusa. Portanto, só use o pino 1 quando não utilizar o Monitor Serial.

3. Para a montagem do circuito é necessário saber se o display de 7 segmentos utilizado é catodo comum ou anodo comum. Esta informação você poderá obter no momento da compra do componente ou através da datasheet do mesmo.

2. Se você não possui a datasheet e não sabe se o display é catodo comum ou anodo comum, veja a seguir como identificar um display de 7 segmentos:

2.1. Conecte o pino 8 (ou o pino 3) do display de 7 em uma fonte de 3,3V ou 5V (colocar um resistor de 150 ohms ou superior em série) e o pino 5 ao terra (por exemplo, o GND do Arduino). Veja a montagem abaixo:

2.2. Se tivermos um display de 7 segmentos anodo comum o led do ponto, como mostra a figura acima, se acenderá.

2.3. Se tivermos um display de 7 segmentos catodo comum o led não acenderá (lembre-se de que, em um led, a corrente contínua flui em um única direção, ou seja, o led possui polaridade).

3. Agora que já foi identificado o componente display como catodo comum ou anodo comum, vamos entender como funciona o display de 7 segmentos.

3.1. Como já vimos, o display de 7 segmentos é formado por leds dos 7 segmentos e do ponto. De acordo com a imagem abaixo, observe que os pinos 3 e 8 são referentes à conexão do display com o Vcc (5V) ou (3,3V) do Arduino para display anodo comum e com o GND do Arduino para display catodo comum. Já os demais pinos são referentes aos leds dos segmentos A, B, C, D, E, F, G e DP (ponto):

Portanto, o pino 1 controla o segmento E do display, o pino 2 o segmento D e assim por diante. Desta forma se quisermos mostrar o número 1, por exemplo, deveremos ligar apenas os segmentos B e C. Portanto, a combinação de de 0's e 1's na entrada do display representam os número e letras visualizados. Veja abaixo a combinação dos bits que formarão os decimais:

Agora, veja a combinação dos bits que formarão as letras:

3.2. Para ligarmos os leds do display catodo comum ou anodo comum, precisaremos conectar os pinos 3 ou o 8 na porta GND do Arduino:

Display Catodo Comum: Acionar por nível lógico alto em cada segmento, ou seja, HIGH ou 1. Os pinos 3 ou o 8 deverão estar conectados no GND do Arduino.

Atenção: A ligação entre o display e o GND do Arduino deve ser precedida de um resistor para evitar danos aos leds do componente.

Display Anodo Comum: Acionar por nível lógico baixo em cada segmento, ou seja, LOW ou 0. Os pinos 3 ou o 8 deverão estar conectados no Vcc (5V) do Arduino.

Atenção: A ligação entre o display e o Vcc do Arduino deve ser precedida de um resistor para evitar danos aos leds do componente.

4. Para calcular o valor do resistor necessário para o nosso componente vamos utilizar a lei de Ohm, sendo:

4.1. Dados do display do nosso exemplo (valores retirados da datasheet do componente utilizado):

  • Tensão direta: 2,2 V (p/ segmento)
  • Corrente máxima: 30 mA (p/ segmento)

4.2. Desta forma, utilizando-se a tensão de 5,0V do Arduino, teremos:

R = (5,0V - 2,2V) / 0,03A => R = 93,33 Ω => Portanto, por segurança, utilizaremos um resistor de no mínimo 150 Ω.

4.3 . Se você não tiver os dados do componente, utilize um resistor maior que 150 Ω. Lembre-se, quanto maior o valor do resistor menor será a intensidade do brilho dos leds do display.

Atenção: Para evitar danos no componente, não utilize resistores menores que 150 Ω. Para saber mais como calcular o resistor, leia Teste 02 - Leds ligados em série e em paralelo.

5. Para usarmos o recurso de registros de portas para um display, vamos definir os valores binários que usaremos para acender (HIGH) ou apagar (LOW) os segmentos para cada porta "D" do Arduino Uno. Para isso, vamos fazer uma tabela:

Obs.: Esta tabela foi definida tomando como premissa que usamos um display 7 segmentos catodo comum e que os pinos do display foram conectados nas portas de 1 a 7 do Arduino.

Tabela para display catodo comum

Portando, para disponibilizar o dígito 1 no display, por exemplo, precisaríamos acender apenas os segmentos B e C. Para isto, definiremos como 1 (HIGH) apenas as portas 3 e 2 do Arduino, resultando no binário: 00001100

Desta forma, podemos montar o vetor para os dígitos 1 a 6 do nosso dado eletrônico:

Obs.: Acrescentamos o modificador "B" para definir os elementos do vetor como binários (Constantes Inteiras)

const byte face [6] = {     
B00001100,  // = Digito 1   
B10110110,  // = Digito 2   
B10011110,  // = Digito 3   
B11001100,  // = Digito 4   
B11011010,  // = Digito 5   
B11111010  // = Digito 6  
};

Observação:

Para utilizar todos os dígitos hexadecimais em um display de 7 segmentos catodo comum, podemos montar o seguinte vetor:

byte tabela_7_seg [16] = {   
B01111110,  // = Digito 0   
B00001100,  // = Digito 1   
B10110110,  // = Digito 2   
B10011110,  // = Digito 3   
B11001100,  // = Digito 4   
B11011010,  // = Digito 5   
B11111010,  // = Digito 6   
B00001110,  // = Digito 7   
B11111110,  // = Digito 8   
B11001110,  // = Digito 9   
B11101110,  // = Digito A   
B11111000,  // = Digito B   
B01110010,  // = Digito C   
B10111100,  // = Digito D   
B11110010,  // = Digito E   
B11100010   // = Digito F
};

ATENÇÃO: Para utilizar um display de 7 segmentos anodo comum, basta inverter os zeros de cada dígito por um e vice versa. Portanto, como exemplo, o dígito 1 ficará da seguinte forma: B11110011.

6. Veja abaixo como realizamos a montagem do nosso projeto utilizando um protoboard. Observe que utilizamos um display catodo comum e ligamos o pino 8 no GND do Arduino.

Sketch do projeto (display catodo comum)

1. Faça o dowload e abra o arquivo projeto60.ino no IDE do Arduino:  DOWNLOAD - projeto60.ino

ATENÇÃO: O código apresentado foi desenvolvido para um display catodo comum. Para executar este projeto para um display de 7 segmentos anodo comum, basta inverter, para cada dígito, os zeros por um e vice versa. Por exemplo, o dígito 1 ficará da seguinte forma: B11110011. Também não esqueça de alterar o circuito, conectando o pino 3 do display no Vcc (5V) do Arduino.

Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 60: Dado eletrônico - Arduino
*        http://squids.com.br/arduino                
*
*******************************************************************************/
byte estadoBtn = 0; 
const byte btPin = 12;

const byte face [6] = {     
B00001100,  // = Digito 1   
B10110110,  // = Digito 2   
B10011110,  // = Digito 3   
B11001100,  // = Digito 4   
B11011010,  // = Digito 5   
B11111010  // = Digito 6  
};

void setup() {
  pinMode(btPin , INPUT_PULLUP); // difine entrada do push button como pull up interno     
  DDRD = B11111110; //Configura os pinos digitais de 1 até 7 como saída digital    
  PORTD = 0; // apaga todos os leds  
  randomSeed(analogRead(0)); // inicializa o ramdom sem repetição de séries
}

void loop() { 
estadoBtn = digitalRead(btPin);
  if(!estadoBtn){    
    rodadada(); // gera a rodada do dado 
    delay(150);
}

}
void rodadada(){
  byte result = 0; // inicializa a variável "result" com 0
  byte rodada = random(15, 35); // gera comprimento da rodada, quantos números passarão
  for (byte i = 0; i < rodada; i++) // loop de 0 até comprimento da rodada
    {
      result = random(0, 6); // gera número de 0 a 6, devido à matriz face começar em 0                             
      show(result); // mostra resultado
      delay(50 + i * 10); // espera para passar cada número (varia velocidade)
    }
}

// mostra o resultado da face do dado no display
void show(int result) {
  PORTD = face[result];   
}

ATENÇÃO: Se o display não acender verifique todas as conexões dos segmentos.

Vídeo


Como o projeto deve funcionar

1. Ao iniciar o programa, o display irá ficar totalmente apagado.

2. Para gerar uma rodada do dado basta pressionar o botão.

3. Os números são passados de forma aleatória e com quantidade e velocidade variável.

4. Finalmente um número ficará fixo mostrando supostamente a face do dado.

5. Clique no botão para gerar uma nova rodada.

Desafios

Com base neste projeto, resolva o seguinte desafio: Desafio 47

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores