[반응속도 게임기]

  • 반응속도 게임기 만들기 부품 List
순번부품명수량
1MDF 판6장
2고무마개12EA
3아두이노 나노1개
4브레드 보드1개
5푸쉬 버튼2EA
68×8 도트 매트릭스1개
7아두이노 나노 케이블1
  • 8×8 도트 매트릭스 설명 : 8×8 도트 매트릭스는 아두이노와 같은 마이크로컨트롤러를 이용하여 다양한 시각적인 출력을 만들기 위해 사용되는 디지털 디스플레이입니다. 이러한 도트 매트릭스는 8개의 열과 8개의 행으로 구성되어 있으며, 각 행과 열의 교차점에는 LED가 있어서 총 64개의 LED로 구성됩니다. 8×8 도트 매트릭스는 다양한 프로젝트에 활용될 수 있으며, 주로 아래와 같은 목적으로 사용됩니다:
  • 텍스트 표시: 간단한 메시지나 숫자를 표시할 수 있습니다. 이를 통해 시간, 온도, 습도 등의 정보를 표시할 수 있습니다.
  • 그래픽 표시: 간단한 그래픽 패턴이나 아이콘을 표시할 수 있습니다. 이를 통해 게임, 시각적 효과 등을 구현할 수 있습니다.
  • 애니메이션 표시: 여러 개의 이미지를 연속적으로 표시하여 애니메이션을 만들어낼 수 있습니다.
  • 시각적 응용 프로그램: 빛 감지, 움직임 감지, 음향 등과 연계하여 다양한 시각적 응용 프로그램을 구현할 수 있습니다.
  • 아두이노와 8×8 도트 매트릭스를 함께 사용할 때는 주로 LED를 켜고 끄는 방법을 제어하기 위해 특정 라이브러리를 사용합니다. 대표적으로는 Adafruit의 MAX7219 라이브러리나 LedControl 라이브러리 등이 있습니다. 이러한 라이브러리를 사용하면 간단한 코드로도 도트 매트릭스를 제어할 수 있습니다.
  • 회로도
  • 코드 : 소스코드는 아래와 같은데 도트 매트릭스를 사용하기 위한 라이브러리를 다운로드 받아야합니다. 아두이노의 라이브러리 매니저를 이용해서 다운받도록 합시다. 라이브러리명 : LedControl by Eberhard Fahle
#include "LedControl.h"  //dot matrix를 사용하기 위한 라이브러리 호출

#define dataIn 12  //DIN 12번 핀으로 사용
#define cs 11      //CS 11번 핀으로 사용
#define clk 10     //CLK 10번 핀으로 사용
#define Player1 4  //button 핀번호
#define Player2 6  //button 핀번호

LedControl lc = LedControl(dataIn, clk, cs, 1);  //LedControl('DIN핀 번호', 'CLK핀 번호', 'CS핀 번호', 'dot matrix 갯수')

bool stateCheck = 0;
bool Matrix_off[8][8] = {
  0,
};
bool MatrixInput_1[8][8] = {
  { 1, 0, 0, 0, 0, 0, 0, 1 },
  { 0, 1, 0, 0, 0, 0, 1, 0 },
  { 0, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 1, 0, 0, 0, 0, 1, 0 },
  { 1, 0, 0, 0, 0, 0, 0, 1 }
};

bool MatrixInput_2[8][8] = {
  { 0, 0, 1, 1, 1, 1, 0, 0 },
  { 0, 1, 0, 0, 0, 0, 1, 0 },
  { 1, 0, 0, 0, 0, 0, 0, 1 },
  { 1, 0, 0, 0, 0, 0, 0, 1 },
  { 1, 0, 0, 0, 0, 0, 0, 1 },
  { 1, 0, 0, 0, 0, 0, 0, 1 },
  { 0, 1, 0, 0, 0, 0, 1, 0 },
  { 0, 0, 1, 1, 1, 1, 0, 0 }
};

bool MatrixInput_3[8][8] = {
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 1, 1, 1, 1, 1, 1, 1, 1 },
  { 0, 1, 1, 1, 1, 1, 1, 0 },
  { 0, 0, 1, 1, 1, 1, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 }
};

bool MatrixInput_4[8][8] = {
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 1, 1, 1, 1, 0, 0 },
  { 0, 1, 1, 1, 1, 1, 1, 0 },
  { 1, 1, 1, 1, 1, 1, 1, 1 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0 }
};

bool btnFlg1 = 0;
bool btnFlg2 = 0;
int btn1Chk() {
  if (digitalRead(Player1) == 0) {
    btnFlg1 = 1;
    return 0;
  }
  if (btnFlg1 == 1) {
    btnFlg1 = 0;
    return 1;
  }
  return 0;
}

int btn2Chk() {
  if (digitalRead(Player2) == 0) {
    btnFlg2 = 1;
    return 0;
  }
  if (btnFlg2 == 1) {
    btnFlg2 = 0;
    return 1;
  }
  return 0;
}

void MatrixLoop(bool matinput[8][8]) {
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      lc.setLed(0, i, j, matinput[i][j]);
    }
  }
}

void setupfunc() {
  MatrixLoop(MatrixInput_1);
  randomSeed(analogRead(0));
  int randomTime = random(3, 6);
  delay(randomTime * 1000);
  MatrixLoop(MatrixInput_2);
}

void setup() {
  pinMode(Player1, INPUT_PULLUP);
  pinMode(Player2, INPUT_PULLUP);
  lc.shutdown(0, false);  //dot matrix를 깨우는 코드. shutdown('지정할 dotmatrix의 주소', 'false : 깨우기')
  lc.setIntensity(0, 8);  //밝기 설정. setIntensity('지정할 dotmatrix의 주소','밝기값(0~15)')
  lc.clearDisplay(0);     //사용하기 전 초기화. clearDisplay('지정할 dotmatrix의 주소')
}

void loop() {
  if (stateCheck == 1) {
    if (btn1Chk() == 1) {
      btnFlg2 = 0;
      MatrixLoop(MatrixInput_3);
      delay(1500);
      MatrixLoop(Matrix_off);
      stateCheck = 0;
    } else if (btn2Chk() == 1) {
      btnFlg1 = 0;
      MatrixLoop(MatrixInput_4);
      delay(1500);
      MatrixLoop(Matrix_off);
      stateCheck = 0;
    }
  } else if (stateCheck == 0) {
    if (btn1Chk() == 1 || btn2Chk() == 1) {
      setupfunc();
      stateCheck = 1;
    }
  }
  delay(1);
}
  • 하드웨어 조립

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다