Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 61 - Dado eletrônico com leds e uso de manipulação direta de portas do Arduino
Projeto 61 - Dado eletrônico com leds e uso de manipulação direta de portas do Arduino
Angelo Luis Ferreira | 26/07/2019
Acessos: 10.418
Básico - Projeto 61
Dado eletrônico com leds e manipulação direta de portas
Objetivo
Como no projeto anterior vamos criar um "dado eletrônico" que irá sortear números de 1 a 6 só que agora com leds. Cada jogada é realizada ao pressionar um botão. Iremos também, como no projeto anterior, apresentar o conceito de manipulação direta de portas do Arduino onde mostraremos como utilizar um registrador de portas DDR e PORT.
ATENÇÃO: Tome muito cuidado em utilizar o conceito de manipulação direta de portas. Qualquer erro pode danificar permanentemente o seu Arduino.
Definições
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 |
 |
No mínimo utilizar protoboard com 830 pontos
|
Jumpers |
Kit cabos ligação macho / macho |
1 |
 |
|
Led Difuso 5mm |
LEDs 5mm alto brilho |
7 |
 |
7 LEDs alto brilho vermelho
Você poderá utilizar também LEDs de qualquer outra cor ou LEDs difuso de 3 ou 5mm nas cores que desejar.
|
Resistor |
Resistor |
7 |
 |
7 Resistores 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. Simulação

Atenção
1. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

1.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).
1.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.
2. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Como calcular o resistor adequado para o led e Leds ligados em série e em paralelo.
Obs.: Resistores iguais ou superiores a 150 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V.
2.1 . Se você não tiver os dados do componente, utilize um resistor maior ou igual a 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.
3. Faça a ligação dos leds com o arduino conforme a tabela abaixo:
ARDUINO |
Led |
Pino 1 |
Pino 7 |
Pino 2 |
Pino 6 |
Pino 3 |
Pino 4 |
Pino 4 |
Pino 2 |
Pino 5 |
Pino 1 |
Pino 6 |
Pino 9 |
Pino 7 |
Pino 10 |
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.
4. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Veja o projeto Projeto 02b - Led apaga com push button pressionado (pull-up interno do Arduino) ou assista o vídeo Arduino: Botão e Resistor de Pull Up Interno

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:
Tabela para montagem dos leds e definição dos valores binários

Obs1.: A tabela acima foi definida tomando como premissa a posição dos leds conforme as faces do dado abaixo:

Obs2.: Veja como fica a montagem dos leds neste projeto:

Portando, para disponibilizar o dígito 1 no display, por exemplo, precisaríamos acender apenas o led 7. Para isto, definiremos como 1 (HIGH) apenas a porta DP7 do Arduino, resultando no binário: 10000000
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] = {
B10000000, // = Digito 1
B01000010, // = Digito 2
B11000010, // = Digito 3
B01011010, // = Digito 4
B11011010, // = Digito 5
B01111110 // = Digito 6
};
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
1. Faça o dowload e abra o arquivo projeto61.ino no IDE do Arduino: DOWNLOAD - projeto61.ino
Se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 61: Dado eletrônico com ldeds - Arduino
* http://squids.com.br/arduino
*
*******************************************************************************/
byte estadoBtn = 0;
const byte btPin = 12;
const byte face [6] = {
B10000000, // = Digito 1
B01000010, // = Digito 2
B11000010, // = Digito 3
B01011010, // = Digito 4
B11011010, // = Digito 5
B01111110 // = 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 os leds não acenderem, verifique todas as ligações do circuito.
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.
Obs. Utilize uma placa translucida sobre os leds para que a imagem do dado fique mais legível. No nosso exemplo utilizamos uma divisória de caixa organizadora.

Desafios
Com base neste projeto, resolva o seguinte desafio: Desafio 48
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários