Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

De Protoboard para PCB: Jogo Simon Says – Parte 1

Componentes e Materiais

ComponenteQuantidade
Arduino UNO1
Protoboard Grande1
LED (genérico)4
Chave Pushbutton 12mm SparkFun4
Buzzer1
Jumpers (genéricos)12
Resistor 10k ohm4
Resistor 330 ohm4
Cabo USB-A para B1

Aplicativos e Serviços Online

Sobre o Projeto

Introdução

Todos conhecem o jogo Simon Says: repetir sequência de luzes pressionando botões correspondentes. Para Hackster Live, mostramos ferramenta de design PCB chamada Upverter. Projeto divertido e simples para criar e transformar em PCB. Abaixo, projeto básico com hardware e código.

Série em três partes:

  1. Parte 1: Fazendo o Jogo Simon Says (este artigo)
  2. Parte 2: Projetar PCB no Upverter baseado no jogo
  3. Parte 3: Fresar sua própria PCB a partir do design no Upverter

O que você aprenderá

Software

Baixe Arduino IDE mais recente para seu SO aqui.

Montagem do Hardware

Baseado no exemplo do SparkFun Inventor's Kit, com ajustes. Veja diagrama Fritzing abaixo.

De Protoboard para PCB: Jogo Simon Says – Parte 1
De Protoboard para PCB: Jogo Simon Says – Parte 1

Código

O legal é que há muitas variações. Usei hardware do SparkFun como base e escrevi código do zero. Se não quiser escrever, use o meu abaixo, o do SparkFun (com ajustes) ou busque outros códigos Simon Says compatíveis.

Incluí comentários detalhados e prints de debug no Serial Monitor. Veja vídeo do jogo em ação!

Vídeo do Simon Says

Nota: No vídeo, configurei 5 acertos para vencer. Ajuste para dificultar.

Agora você está pronto para transformar sua protoboard em PCB! Aprenda na Parte 2 – Projetando PCB com Upverter.

Código

Código Arduino Simon Says
int ledArray[] = {12, 9, 5, 2}; // 0=verde, 1=vermelho, 2=amarelo, 3=azul
int buttonArray[] = {13, 10, 6, 3}; // mesma ordem
int pinCount = 4;
int buzzer = 8;
int ledState = 0;
int gameState = 0;
#define NUMBERTOWIN 5 // Luzes para vencer – altere para mudar dificuldade
int gameValues[NUMBERTOWIN];
int roundNum = 0;
unsigned long previousMillis = 0;
unsigned long interval1 = 500;

void setLed(int ledNum);
void displayClue(int roundNum);
boolean waitForInput(int buttonNum);

void setup() {
  Serial.begin(9600);
  Serial.println("setup");
  for (int Pin = 0; Pin < pinCount; Pin++) pinMode(ledArray[Pin], OUTPUT);
  for (int Pin = 0; Pin < pinCount; Pin++) pinMode(buttonArray[Pin], INPUT_PULLUP);
  randomSeed(analogRead(0));
}

void loop() {
  if (gameState == 0) {
    int b0 = digitalRead(buttonArray[0]);
    int b1 = digitalRead(buttonArray[1]);
    int b2 = digitalRead(buttonArray[2]);
    int b3 = digitalRead(buttonArray[3]);
    if (b0 && b1 && b2 && b3) pre_game();
    else {
      Serial.println("button Pressed");
      setLed(-1);
      roundNum = 0;
      delay(1000);
      gameState = 1;
    }
  }
  if (gameState == 1) gamePlay();
  if (gameState == 2) { // Vitória
    delay(500); winning_sound(); winDisplay(); winDisplay(); winDisplay(); loseDisplay();
    Serial.println("winDisplay"); delay(1000); gameState = 0;
  }
  if (gameState == 3) { // Derrota
    delay(500); losing_sound(); loseDisplay(); loseDisplay(); loseDisplay();
    Serial.println("loseDisplay"); delay(1000); gameState = 0;
  }
}

void pre_game() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval1) {
    if (ledState == 0) { Serial.println("pre green"); setLed(0); ledState = 1; }
    else if (ledState == 1) { Serial.println("pre red"); setLed(1); ledState = 2; }
    else if (ledState == 2) { Serial.println("pre yellow"); setLed(2); ledState = 3; }
    else if (ledState == 3) { Serial.println("pre blue"); setLed(3); ledState = 0; }
    previousMillis = currentMillis;
  }
}

void gamePlay() {
  Serial.println("gamePlay");
  for (int i = 0; i < NUMBERTOWIN; i++) gameValues[i] = floor(random(0, 4));
  for (int i = 0; i < NUMBERTOWIN; i++) Serial.println(gameValues[i], DEC);
  Serial.print("Starting Round "); Serial.println(roundNum, DEC);
  for (int r = 0; r < NUMBERTOWIN; r++) {
    displayClue(roundNum);
    for (int i = 0; i <= roundNum; i++) {
      Serial.print("Waiting for input "); Serial.print(i + 1, DEC);
      Serial.print(" of "); Serial.print(roundNum + 1, DEC); Serial.println();
      if (waitForInput(gameValues[i])) {
        if (i == roundNum) {
          Serial.println("Correct");
          if (roundNum == NUMBERTOWIN - 1) {
            Serial.println("You Win!"); gameState = 2; return;
          } else Serial.println("Continue");
        }
      } else {
        Serial.println("You Lose!"); gameState = 3; return;
      }
    }
    roundNum++;
    delay(1000);
  }
}

void setLed(int ledNum) {
  if (ledNum < 0) {
    for (int i = 0; i < pinCount; i++) digitalWrite(ledArray[i], LOW);
  } else {
    for (int i = 0; i < pinCount; i++) {
      digitalWrite(ledArray[i], (i == ledNum) ? HIGH : LOW);
    }
  }
}

void displayClue(int roundNum) {
  setLed(-1);
  for (int i = 0; i <= roundNum; i++) {
    setLed(gameValues[i]); delay(750); setLed(-1); delay(250);
  }
}

boolean waitForInput(int buttonNum) {
  while (true) {
    int b0 = digitalRead(buttonArray[0]);
    int b1 = digitalRead(buttonArray[1]);
    int b2 = digitalRead(buttonArray[2]);
    int b3 = digitalRead(buttonArray[3]);
    if (!b0 || !b1 || !b2 || !b3) {
      delay(250);
      if (buttonNum == 0) { digitalWrite(ledArray[0], HIGH); delay(250); digitalWrite(ledArray[0], LOW); }
      else if (buttonNum == 1) { digitalWrite(ledArray[1], HIGH); delay(250); digitalWrite(ledArray[1], LOW); }
      else if (buttonNum == 2) { digitalWrite(ledArray[2], HIGH); delay(250); digitalWrite(ledArray[2], LOW); }
      else if (buttonNum == 3) { digitalWrite(ledArray[3], HIGH); delay(250); digitalWrite(ledArray[3], LOW); }
      if (buttonNum == 0 && b0 == 0) { Serial.println("0 Pressed"); return true; }
      else if (buttonNum == 1 && b1 == 0) { Serial.println("1 Pressed"); return true; }
      else if (buttonNum == 2 && b2 == 0) { Serial.println("2 Pressed"); return true; }
      else if (buttonNum == 3 && b3 == 0) { Serial.println("3 Pressed"); return true; }
      else return false;
    }
  }
}

void winDisplay() {
  for (int i = 0; i < 4; i++) { digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75); }
  for (int i = 2; i >= 0; i--) { digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75); }
}

void winning_sound() {
  Serial.println("buzzer1");
  tone(buzzer, 294, 250); delay(200);
  tone(buzzer, 294, 250); delay(200);
  tone(buzzer, 294, 250); delay(200);
  tone(buzzer, 392, 500); delay(500);
  tone(buzzer, 392, 250); delay(200);
  tone(buzzer, 440, 250); delay(200);
  tone(buzzer, 392, 250); delay(200);
  tone(buzzer, 440, 250); delay(200);
  tone(buzzer, 494, 500);
}

void loseDisplay() {
  for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], HIGH);
  delay(200);
  for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], LOW);
  delay(200);
}

void losing_sound() {
  Serial.println("losing_sound");
  tone(buzzer, 98, 250); delay(250);
  tone(buzzer, 93, 250); delay(250);
  tone(buzzer, 87, 250); delay(250);
}

Esquemáticos

Arquivo Fritzing: simon_says_fritzing_Yb8EdKPqD4.fzz

Processo de manufatura

  1. Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
  2. Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
  3. Construa Seu Próprio Jogo de Roleta com 37 LEDs e Arduino Nano
  4. Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
  5. Jogo Interativo com Joystick e Arduino – Feedback com LEDs
  6. Detector de Alcance Portátil – Kit DIY Arduino Nano com HC-SR04, Bateria 18650 e Gabinete 3D
  7. Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
  8. Projeto de Galvanoplastia de Cobre: Construa um Sistema Inteligente com Arduino UNO
  9. Fabricação Aeroespacial para Pequenas Oficinas: Um Guia Prático
  10. Guia Completo de Fabricação de PCB de 4 Camadas – Processo Passo a Passo