trabalho 05 genius game ff JK
📌 Resumo Circuitos Sequencias
- Conceito de Memória: Circuitos combinacionais não guardam dados. Circuitos sequenciais usam Flip-Flops (FF) para armazenar o histórico (estados anteriores). Cada FF armazena exatamente 1 bit.
Trabalho Grupo 05
Jogo de Memória Utilizando Flip-Flops e LEDs
-
Apresentar o conceito de memória em circuitos digitais e o papel dos flip-flops no armazenamento de informações.
-
O grupo deverá descrever as etapas necessárias para o desenvolvimento de um jogo de memória inspirado no “Genius”, utilizando LEDs para exibir uma sequência previamente definida e botões para interação do usuário.
-
O trabalho deve explicar como os flip-flops ou registradores podem ser utilizados para armazenamento e controle da sequência apresentada. Também deverão ser discutidos os desafios, limitações e aspectos de projeto envolvidos na construção desse tipo de sistema digital.”
-
O Jogo Genius: Funciona como uma Máquina de Estados Finitos (FSM) com 4 estágios: Espera Mostrar Sequência Ler Jogador Comparar/Resultado (Ganhou ou Game Over).
-
Desafios Reais: Debounce (ruído mecânico nos botões que gera cliques falsos) e a sincronização do clock (tempo de resposta do circuito).
❓ Respondendo às suas Dúvidas Técnicas## 1. Mudar de 2 para 4 LEDs altera a complexidade?
Sim, drasticamente se fosse feito apenas com CIs discretos, mas muda pouco usando o Arduino.
- Com 4 LEDs, o Arduino apenas usará mais 2 pinos de saída e mais 2 pinos de entrada para os botões. A lógica do código permanece quase a mesma (apenas aumenta o tamanho do vetor da sequência).
- Recomendação para 2 dias: Use 4 LEDs e 4 botões. Visualmente fica idêntico ao “Genius” original e o código no Arduino é simples de expandir.
2. Jogo da memória com FF JK junto com o Arduino? Como funciona?
Na prática, o Arduino possui sua própria memória interna (SRAM). Se você usar o Arduino para processar o jogo, você não precisa de chips de Flip-Flop físicos (como o 7473) na protoboard, pois o Arduino faz isso via programação (criando variáveis que funcionam como registradores de deslocamento). Contudo, como o seu trabalho exige explicar o papel dos Flip-Flops, você deve abordar o projeto de duas formas:
- No CircuitVerse (Lógica Pura): Você monta o circuito clássico usando blocos de Flip-Flops JK para mostrar que entende a teoria digital.
- No Tinkercad (Prática com Arduino): Você usa o Arduino controlando os LEDs e Botões, explicando no relatório que o código replica o comportamento dos Flip-Flops em software através de variáveis de estado.
🎛️ Mapeamento de Entradas e Saídas (Arduino)
Considerando o modelo padrão de 4 cores (Verde, Vermelho, Azul, Amarelo):
| Componente | Tipo | Pino no Arduino | Função |
|---|---|---|---|
| Botão 1 (Verde) | Entrada | Pino 2 | Detecta o clique na cor Verde |
| Botão 2 (Vermelho) | Entrada | Pino 3 | Detecta o clique na cor Vermelha |
| Botão 3 (Azul) | Entrada | Pino 4 | Detecta o clique na cor Azul |
| Botão 4 (Amarelo) | Entrada | Pino 5 | Detecta o clique na cor Amarela |
| LED 1 (Verde) | Saída | Pino 8 | Acende para indicar a cor Verde |
| LED 2 (Vermelho) | Saída | Pino 9 | Acende para indicar a cor Vermelha |
| LED 3 (Azul) | Saída | Pino 10 | Acende para indicar a cor Azul |
| LED 4 (Amarelo) | Saída | Pino 11 | Acende para indicar a cor Amarela |
| Buzzer (Opcional) | Saída | Pino 12 | Emite o som do jogo |
Nota: Todos os botões precisam de resistores de Pull-Down (10kΩ) ligados ao GND para evitar flutuação de sinal
📐 Expressão Booleana e Equação de Estado do FF JK
Como o jogo possui comportamento sequencial (depende do tempo e da ordem), ele não é representado por uma única expressão booleana estática, mas sim pela Equação Característica do Flip-Flop JK, que determina o próximo estado do circuito (): No contexto do jogo, a validação do acerto do jogador (Comparador) utiliza a lógica da porta XNOR (Coincidência). A expressão booleana para verificar se o botão pressionado pelo jogador () é igual ao LED correto da sequência () é:
- Se : O jogador acertou a cor corrente, o sistema avança.
- Se : O jogador errou, o sistema ativa o estado de Game Over.
💻 Código Pronto para o Tinkercad (Arduino)
Copie e cole este código no editor de texto do Tinkercad. Ele gerencia o jogo para 4 LEDs e 4 Botões:
// Definição dos pinosconst int botoes[] = {2, 3, 4, 5}; const int leds[] = {8, 9, 10, 11}; const int MAX_RODADAS = 100;int sequencia[MAX_RODADAS];int rodada_atual = 0;int passo_jogador = 0; void setup() { for (int i = 0; i < 4; i++) { pinMode(leds[i], OUTPUT); pinMode(botoes[i], INPUT); } randomSeed(analogRead(0)); // Inicializa gerador aleatório } void loop() { // Inicializa a primeira rodada if (rodada_atual == 0) { novaRodada(); }
mostrarSequencia(); aguardarJogador(); } void novaRodada() { sequencia[rodada_atual] = random(0, 4); rodada_atual++; passo_jogador = 0; delay(1000); } void mostrarSequencia() { for (int i = 0; i < rodada_atual; i++) { digitalWrite(leds[sequencia[i]], HIGH); delay(600); digitalWrite(leds[sequencia[i]], LOW); delay(200); } } void aguardarJogador() { while (passo_jogador < rodada_atual) { int botaoPressionado = -1;
// Verifica qual botão foi pressionado
while (botaoPressionado == -1) {
for (int i = 0; i < 4; i++) {
if (digitalRead(botoes[i]) == HIGH) {
botaoPressionado = i;
digitalWrite(leds[i], HIGH);
delay(300); // Debounce e feedback visual
digitalWrite(leds[i], LOW);
while(digitalRead(botoes[i]) == HIGH); // Aguarda soltar o botão
}
}
}
// Equação de comparação (Lógica do circuito comparador)
if (botaoPressionado == sequencia[passo_jogador]) {
passo_jogador++; // Acertou, vai para o próximo passo
} else {
gameOver(); // Errou a sequência
return;
}
} novaRodada(); // Acertou toda a sequência da rodada } void gameOver() { rodada_atual = 0; // Reinicia o jogo // Pisca todos os LEDs indicando erro for (int i = 0; i < 5; i++) { for(int j=0; j<4; j++) digitalWrite(leds[j], HIGH); delay(200); for(int j=0; j<4; j++) digitalWrite(leds[j], LOW); delay(200); } delay(1000); }
Para garantir que você feche a montagem a tempo, você prefere focar agora no esquema de ligação dos resistores de pull-down no Tinkercad ou na estrutura de blocos do CircuitVerse?