프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

LED x 푸시버튼-주사위 만들기

2018-12-27 11:52:56

개요

 

세계에는 다양한 주사위 게임들이 있습니다. (대표적으로 부루마불 같은 게임들) 많은 사람이 주사위 게임들을 즐겨 하는데, 게임에 필요한 주사위를 아두이노와 LED, Push Button을 가지고 한번 만들어 보겠습니다.




(주사위 사진 출처 : http://tech-tots.blogspot.kr/)

 



 

 

 

 

 

 

부품 목록

 

N O 부품명 수량 상세설명
1 오렌지보드 1 아두이노
2 5mm LED(색상 무관) 7 LED
3 330Ω 저항 7 저항
4 Push Button 1 푸쉬 버튼
5 브레드 보드 1 브레드 보드
6 점퍼케이블 11 점퍼케이블

 

부품명 오렌지 보드 5mm LED 330Ω 저항 Push Button 점퍼케이블 브레드보드
파  트 X1 X7  X 7 X1  X11


 

 

 

하드웨어 making

 

회로도

브레드보드 레이아웃



* LED 연결 시 꼭 저항을 연결하시기 바랍니다. (220Ω이나 330Ω). 연결하지 않으셨을 경우 LED나 아두이노의 수명이 줄어들 수 있습니다.

 

 

 

소프트웨어 coding

 

/*
 제목		: LED 주사위
 내용		: 버튼과 LED를 이용해 LED 주사위를 만들어 봅시다. 
 */

// 7개의 LED와 연결된 핀 번호를 저장하는 배열을 선언합니다.
int ledPins[7] = {2, 3, 4, 5, 7, 8, 6};
// 7X7 이중배열을 선언합니다.(가로 0~6, 세로 0~6)
int dicePatterns[7][7] = {  
  {0, 0, 0, 0, 0, 0, 1}, // 주사위 1
  {1, 0, 0, 0, 0, 1, 0}, // 주사위 2
  {1, 0, 0, 0, 0, 1, 1}, // 주사위 3
  {1, 0, 1, 1, 0, 1, 0}, // 주사위 4
  {1, 0, 1, 1, 0, 1, 1}, // 주사위 5
  {1, 1, 1, 1, 1, 1, 0}, // 주사위 6
  {0, 0, 0, 0, 0, 0, 0} // LED 전부 꺼짐
};
// push button을 디지털 9번 핀에 연결합니다.
int switchPin = 9;
// LED를 전부 꺼지게 하는 상태 값을 선언합니다.
int blank = 6;

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
void setup() {
	// for문을 이용해 ledPins 배열에 해당하는 핀을 출력 핀으로 설정합니다.
	for(int i = 0; i < 7; i++){
		pinMode(ledPins[i], OUTPUT);
		// 모든 LED를 OFF 시킵니다.
		digitalWrite(ledPins[i], LOW);
	}
	// 9번 핀을 입력 핀으로 설정합니다.
	pinMode(switchPin, INPUT_PULLUP);
	// 매번 재시작 할 때 마다 주사위를 랜덤으로 만들기 위한 함수입니다.
	// 이 함수를 제거하면 재시작 할 때마다 같은 순서로 주사위 눈이 출력됩니다.
	randomSeed(analogRead(0));
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행합니다.
void loop() {
	// 버튼을 눌렀을 경우 
	if(!digitalRead(switchPin)){ 
		// 주사위를 굴립니다.
		rollTheDice();
	}
	// 0.1동안 대기합니다.
	delay(100);
}


void rollTheDice() {
	// 결과 저장 변수를 선언합니다.
	int result = 0; 
	// 주사위를 몇 번 굴릴 것인지 정하는 난수를 생성(15~25번 사이)합니다.
	int lengthOfRoll = random(15, 25);
	// 위에서 나온 숫자만큼 주사위를 돌립니다.
	for(int i = 0; i < lengthOfRoll; i++){ 
		// 매번 나오는 주사위를 저장합니다. 
		result = random(0, 6); 
		// 나온 주사위 눈을 LED 로 표시합니다.
		show(result); 
		// 주사위를 굴릴 때마다 돌아가는 속도를 느리게 해서 실제와 비슷하게 만듭니다.
		delay(100 + i * 20); 
	}

	// 최종 주사위 눈이 결정되었을 때 강조 하기 위해 blink를 줍니다.
	for(int j = 0 ; j < 3 ; j++){ 
		// 모든 LED 불을 OFF 시킵니다.
		show(blank); 
		// 0.5초간 대기합니다.
		delay(500);
		// 결과 숫자의 눈을 LED로 표시합니다.
		show(result);
		// 0.5초간 대기합니다. 
		delay(500);
	}
	// 끝났으면 모든 LED를 OFF 시킵니다.
	show(blank); 
}

// 숫자를 LED로 표시하는 함수
void show(int result ){ 
	for(int i = 0 ; i < 7 ; i++){
		// 나온 결과에 따라서 각각의 LED의 점등을 정해줍니다.
		digitalWrite(ledPins[i], dicePatterns[result][i]); 
	}
}

 

 

 

소프트웨어 & 하드웨어 설명

 

// 7개의 LED와 연결된 핀 번호를 저장하는 배열을 선언합니다.
int ledPins[7] = {2, 3, 4, 5, 7, 8, 6};
// 7X7 이중배열을 선언합니다.(가로 0~6, 세로 0~6)
int dicePatterns[7][7] = {  
  {0, 0, 0, 0, 0, 0, 1}, // 주사위 1
  {1, 0, 0, 0, 0, 1, 0}, // 주사위 2
  {1, 0, 0, 0, 0, 1, 1}, // 주사위 3
  {1, 0, 1, 1, 0, 1, 0}, // 주사위 4
  {1, 0, 1, 1, 0, 1, 1}, // 주사위 5
  {1, 1, 1, 1, 1, 1, 0}, // 주사위 6
  {0, 0, 0, 0, 0, 0, 0} // LED 전부 꺼짐
};
// push button을 디지털 9번 핀에 연결합니다.
int switchPin = 9;
// LED를 전부 꺼지게 하는 상태 값을 선언합니다.
int blank = 6;

 

ledPins[7] 는 각각의 LED와 연결된 핀들을 선언합니다. (밑에 표는 각 LED 별 연결된 핀 번호)

dicePatten[7][7] 배열은 옆에 주사위 그림처럼 해당 숫자가 나왔을 경우 그 숫자에 맞는 LED의 상태를 저장하고 있는 배열입니다. (ex : 주사위가 3이 나올 경우, 8, 6, 2번 LED 를 켜주면 됩니다.)

 

void setup() {
  // for문을 이용해 ledPins 배열에 해당하는 핀을 출력 핀으로 설정합니다.
  for(int i = 0; i < 7; i++){
    pinMode(ledPins[i], OUTPUT);
    // 모든 LED를 OFF 시킵니다.
    digitalWrite(ledPins[i], LOW);
  }
  // 9번 핀을 입력 핀으로 설정합니다.
  pinMode(switchPin, INPUT_PULLUP);
  // 매번 재시작 할 때 마다 주사위를 랜덤으로 만들기 위한 함수입니다.
  // 이 함수를 제거하면 재시작 할 때마다 같은 순서로 주사위 눈이 출력됩니다.
  randomSeed(analogRead(0));
}

 

위에서 선언한 각각의 LED 핀번호를 for문을 이용하여 처음부터 끝까지 출력모드로 설정하고, push button은 입력 모드로 설정합니다.

그다음 randomSeed(analogRead(0)) 함수를 통하여 재 시작후 매번 같은 결과 패턴을 가지게 되는 것을 방지합니다.

이 함수를 제외하게 되면 아두이노 재시작을 했을 때 매번 같은 값이 나오게 됩니다.

예를 들어 주사위를 굴렷더니 6,3,1 이 나왓는데, 재시작후 다시 돌리면 그대로 6,3,1이 나오게 됩니다.(한번 함수를 제외하고 Test 하여 확인하는 것도 좋은 방법입니다.)

 

 

void loop() {
  // 버튼을 눌렀을 경우 
  if(!digitalRead(switchPin)){ 
    // 주사위를 굴립니다.
    rollTheDice();
  }
  // 0.1동안 대기합니다.
  delay(100);
}

 

if문을 이용하여 버튼을 눌렀는지 확인한 후 눌렀으면(!digitalRead(switchPin) == true 일 때) 주사위를 돌리는 함수(rollTheDice())를 실행한다.

 

 

void rollTheDice() {
  // 결과 저장 변수를 선언합니다.
  int result = 0; 
  // 주사위를 몇 번 굴릴 것인지 정하는 난수를 생성(15~25번 사이)합니다.
  int lengthOfRoll = random(15, 25);
  // 위에서 나온 숫자만큼 주사위를 돌립니다.
  for(int i = 0; i < lengthOfRoll; i++){ 
    // 매번 나오는 주사위를 저장합니다. 
    result = random(0, 6); 
    // 나온 주사위 눈을 LED 로 표시합니다.
    show(result); 
    // 주사위를 굴릴 때마다 돌아가는 속도를 느리게 해서 실제와 비슷하게 만듭니다.
    delay(100 + i * 20); 
  }

  // 최종 주사위 눈이 결정되었을 때 강조 하기 위해 blink를 줍니다.
  for(int j = 0 ; j < 3 ; j++){ 
    // 모든 LED 불을 OFF 시킵니다.
    show(blank); 
    // 0.5초간 대기합니다.
    delay(500);
    // 결과 숫자의 눈을 LED로 표시합니다.
    show(result);
    // 0.5초간 대기합니다. 
    delay(500);
  }
  // 끝났으면 모든 LED를 OFF 시킵니다.
  show(blank); 
}

 

rollTheDice() 함수는 직접 주사위를 굴리는 함수입니다.

우선 결과를 저장할 변수 하나를 생성한 후 초기화해줍니다. (int result = 0)

최종 결과를 구할 때 까지 얼마나 굴릴지 정하는 난수를 생성한 후(15~25번 사이) 나온 숫자만큼 주사위를 굴립니다.

각각 나온 주사위 수를 show 함수로 보내어 표현합니다. 

매번 주사위를 표현 후 그 사이의 정한 delay를 점점 늘려 주사위가 굴러가는 속도를 늦추게 합니다. (현실성을 높이기 위한 방법)

마지막으로 나온 숫자를 강조하기 위에 3번 깜빡여 주고, LED를 전부 끄면 1회 주사위가 끝납니다.

깜빡이는 속도를 조절하고 싶으면 for문 안에 delay를 조절 하면 되고, 더 많이 깜빡이고 싶으시면 for문의 j < 3 이 부분을 늘리시면 됩니다. 

 

// 숫자를 LED로 표시하는 함수
void show(int result ){ 
  for(int i = 0 ; i < 7 ; i++){
    // 나온 결과에 따라서 각각의 LED의 점등을 정해줍니다.
    digitalWrite(ledPins[i], dicePatterns[result][i]); 
  }
}

 

show함수는 rollTheDice 에서 보낸 숫자를 LED로 표현하는 함수입니다.

인자값으로 숫자을 받아서 그 숫자을 표현하기 위해 각각의 LED의 점등 여부를 확인하여 점등합니다.

(숫자의 따른 LED의 점등 여부는 맨 위에 dicePatterns[7][7] 배열에서 선언했습니다. )

 

 

 

kocoafab

LED, Push Button, 아두이노, 오렌지보드