리그캣의 개발놀이터

아두이노로 만드는 리듬게임. 본문

팀 활동/프로젝트

아두이노로 만드는 리듬게임.

리그캣 2018. 1. 23. 21:04

아두이노로 만드는 리듬게임.


선택이유


식상한 아이디어의 아두이노 활용보다. 좀 더 재밌고, 인터넷에도 구현방법이나 소스가 없는

아두이노 활용 머신을 만들고 싶었다. 그러던 중 카멜레온 LED를 이용한 리듬게임을 한번

도전해 보기로 하였다.(검색을 해서 소스나, 하드웨어 구현방법이 나와있지 않아 마음에 들었음.)

꾀나 노가다 성 작업이 예상되지만 즐겁게 프로젝트를 임할 수 있을 것 같다.

 

구현방법  


아두이노를 이용하여 오락기기를 만든다. OLED를 통해 메뉴선택 및 난이도를 제어하고 해당

게임을 선택하게 될시 .MP3 파일이 play, 스피커로 음향이 out put. 그에 따라 박자에 맞추어

LED가 아래로 한칸 씩 빠른 속도로 내려오게 된다. 그 LED가 해당 위치 +- 1 안에 들어왔을 때

플레이어가 해당하는 버튼을 클릭하게 되면 임펙트와 함께 점수가 +되며 사라진다.

 

재료

총 구입 가격.

스피커 모듈 8천원

카멜레온 led 6만원

0.96인치 led 1만원

미니 mp3 플레이어 모듈 6500원

= 84500원.


구현이미지


실제 리듬게임 화면


노드의 역할은 jled 즉 카멜레온 led가 수행할 것. jled는 각 led를 제어할수있으며 빨주노촉파남보의 색을 나타낼 수 있고, 그것을 이용하여 빈공간은 불빛을 없애거나 특정 색을 나타내며 노드는 초록색으로 구현할 예정 . 일반 게임에서 데이터 값이 이동하면서 화면에 해당 이미지를 뿌려주는 것과 같이. 초록색 led는 한칸씩 아래로 딜레이를 주어 이동할 것이며 발판은 파란색이나 특정색상으로 고정을 시킬 예정이다. 많은 led를 제어하여야 함으로 힘든작업이 예상되어짐.


 

노래의 선택과 화면 진행을 알려줄 0.96인치 led. 게임이 끝나고 스코어 표시 기능을 넣을 예정이다.


마이크로 sd카드에있는 mp3파일을 dfplayer모듈을 사용하고 이것을 스피커 모듈로 출력할 예정이다. 현재 음악이 나오는 것은 성공했으나. 코딩 문제인지 모듈문제인지 자꾸 음악 출력 쪽에서 오류가나오고 있는 상황이다. 그것 때문에 시간소요가 많이 될 것으로 예상된다.


 

키보드 역할을 할 push버튼 5개. 음악 시작과 노드가 패드 위치에왔을 때 클릭으로 게임 컨트롤에 중요한 역할을 한다. 처음엔 아두이노 나노나 미니를 사용할 예정이였으나 다루어야 할 데이터(신호를 꽂을 공간)가 많아 아두이노 우노를 사용하기로 하였다.



소스코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 
//OLED 사용위한 헤더함수
#include <SPI.h>          
#include <Wire.h>         
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//NEOPIXEL 사용위한 헤더함수
#include <Adafruit_NeoPixel.h>       //네오픽셀 라이브러리(카멜레온led 사용)
#include "U8glib.h"                     //Oled사용 라이브러리.
//mp3재생하귀위한 헤더함수.
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
 
//OLED 정의.
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
//카멜레온 LED 정의.
#define ALED 2     //카멜레온 led1
#define BLED 3     //카멜레온 led2
#define BLED 4     //카멜레온 led3
#define BLED 5     //카멜레온 led4
#define ELED 6     //카멜레온 led5
#define ARROWNUM 13 //화살표 LED 숫자.
Adafruit_NeoPixel aled = Adafruit_NeoPixel(ARROWNUM, ALED, NEO_GRB + NEO_KHZ800);// 네오픽셀
Adafruit_NeoPixel eled = Adafruit_NeoPixel(ARROWNUM, ELED, NEO_GRB + NEO_KHZ800);// 네오픽셀
 
//변수 설정
//색상 변수 설정
#define    RED   0x00ff0000  // 빨강
#define   GREEN   0x0000ff00  // 녹색
#define   BLUE    0x000000ff  // 파랑
#define   YELLOW    0x00ffff00  // 노랑
#define   SKYBLUE   0x0073d1f7  // 하늘색
#define   PINK    0x00f69fa8  // 분홍
#define   BLACK   0x00000000  // 검정(OFF)
#define   BROWN   0x0088563f  // 갈색
#define   ORANGE  0x00f3753a  // 오렌지색
#define   DEEPBLUE  0x002a365c  // 남색
 
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); //OLED 사용하기 위해서
 
 
 
void setup() {
  //mp3 제어
  Serial.begin (9600);
  mp3_set_serial (Serial);     // DFPlayer-mini mp3 module 시리얼 세팅
  delay(1);                     // 볼륨값 적용을 위한 delay
  mp3_set_volume (20);          // 볼륨조절 값 0~30
  //led 화면 제어
  aled.begin();//aled 시작
  eled.begin();//eled 시작
  aled.show();
  eled.show();
 
 
  //첫 화면 제어
  display.begin(SSD1306_SWITCHCAPVCC);
}
 
void loop() {
  startWindow(); //첫실행 화면 및 배경음악 설정.
  acolorWipeFT(0,ARROWNUM,GREEN,0);
  ecolorWipeFT(0,ARROWNUM,GREEN,0);
  while(1){
    mp3_next ();  //노래출력
  }
}
void startWindow(void){
  mp3_next ();  //노래출력
  display.clearDisplay();//화면 초기화
  display.setTextSize(1);//글자 사이즈 설정
  display.setTextColor(WHITE);//글자 색상 설정
  display.setCursor(0,0);//글자가 표시될 위치 설정
  display.println("Rhythm Power");//출력할 문자 설정
  display.display();//화면에 출력
  delay(1000);
  //글자사이즈나, 색상 등을 설정하지않으면 이전 상태를 유지합니다.
  display.setCursor(0,10);//커서 위치 변경
  display.println("Kwak's Game");//글자 출력
  display.display();//화면에 출력
  delay(1000);
  display.setCursor(0,20);
  display.println("Makers");//글자 출력
  display.display();//화면에 출력
  delay(1000);
  display.startscrollright(0x0, 0xFF);//화면을 오른쪽으로 밀어냅니다.
  delay(3000);
  display.stopscroll();//스크롤 멈춤.
  display.clearDisplay();
  display.invertDisplay(true);//배경 색칠
  delay(1000); 
  display.invertDisplay(false);//배경 색칠 없앰
  delay(1000);
  display.clearDisplay();
  testscrolltext();//MAKERS SCROLL
  delay(1000);
  display.clearDisplay();
  display.setCursor(0,0);//글자가 표시될 위치 설정
  display.println("MUSIC1 <-");//출력할 문자 설정
  display.setCursor(0,12);//글자가 표시될 위치 설정
  display.println("MUSIC2");//출력할 문자 설정
  display.display();//화면에 출력
}
void testscrolltext(void) { //MAKERS SCROLL 출력
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(10,0);
  display.clearDisplay();
  display.println("MAKERS");
  display.display();
 
  display.startscrollright(0x00, 0x0F);
  delay(2000);
 
 
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);    
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
}
 
void acolorWipeFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait) //aled 색상 전체 표시
{
  uint16_t i;
  for (i=from; i<=to; i++)  // 원래 범위가 (0~끝)인 것을 (from~to)로 수정
  {
     aled.setPixelColor(i, color);
     aled.show();
     delay(wait);
  }
}
 
void ecolorWipeFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait) //eled 색상 전체 표시
{
  uint16_t i;
  for (i=from; i<=to; i++)  // 원래 범위가 (0~끝)인 것을 (from~to)로 수정
  {
     eled.setPixelColor(i, color);
     eled.show();
     delay(wait);
  }
}
 
cs


Comments