게임 메이커: 아두이노 게임기 만들기
강좌 시리즈:
.
아두이노가 대중화 된지 꽤 시간이 지나다보니 아두이노를 이용한 다양한 시도가 있었습니다. 게임도 그 중 하나입니다. 아두이노를 이용한 게임기, 그것도 휴대가 가능한 게임기라면 구미가 당기지 않습니까?
2014년에 미국의 한 메이커가 신용카드 사이즈의 아두이노 게임기를 만들어 주목받은 적이 있습니다. 아두이보이라는 이름으로 제작된 게임기인데요, 0.96” OLED와 버튼 그리고 아두이노를 결합해만든 휴대용 게임기였습니다.
그리고 올해 아두보이는 제품으로 만들어져 킥 스타터에서 펀딩을 받게 되었습니다. 펀딩은 현재 한창 진행중인데 모금액이 이미 30만불을 넘길 정도로 인기입니다.
개인적으로도 아두보이는 굉장히 좋아하는 프로젝트입니다. 하지만 해외에서 이런 사례들을 보면서 항상 손가락만 빠는건 아니다 싶어서 직접 아두이노 게임기 프로젝트를 시작하려고 합니다. 이름하여 게임 메이커(Game Maker): 아두이노 게임기 만들기 프로젝트 입니다.
총 3회에 걸쳐 아두이노 게임기 프로젝트를 위한 포스트를 올릴려고 합니다.
- Part1 : 아두이노 게임기를 위한 사전지식, 하드웨어 준비사항, 데모게임 테스트
- Part2 : 게임을 만들기 위한 프로그래밍 노하우
- Part3 : 게임 만드는 과정 따라하기
이번 포스트는 이 중 첫 번째 Part1 입니다.
.
게임 메이커: 아두이노 게임기 만들기 Part1
사전지식
앞서 소개한 아두보이 이전에도 아두이노를 이용한 게임기는 있었습니다. GAMEBY, GAMEBUINO 가 대표적인 아두이노 게임기입니다. 각각의 게임기들은 나름대로의 특징이 있는데 정리하면 아래와 같습니다.
- GAMEBY : 아두이노 우노(Uno) 혹은 메가(Mega) 보드에 실드 형태로 올려서 사용할 수 있습니다. 96×64 LCD를 사용하는 것이 특징이며 DIY 킷을 팔기도 하지만 오픈 소스, 오픈 하드웨어로 관련 자료가 공개되어 있습니다. 그리고 전용 게임 제작을 위한 프로그래밍 매뉴얼을 제공합니다. 홈페이지에서 지금까지 개발된 전용 게임들을 내려받아 업로드 후 즐길 수 있습니다.
- GAMEBUINO : 84×48 LCD (Nokia3310 이라 알려진) 를 사용하며 아두이노 Uno 기반(Atmega328) 입니다. Gamebuino는 스피커와 배터리를 포함한 완성품 형태로 판매하는 것이 기본이지만 제작을 위한 관련 자료가 모두 공개되어 있습니다. 특이한 점은 SD 카드 모듈을 탑재하고 있어서 게임을 HEX 바이너리로 받은 뒤 SD 카드에 넣어 실행합니다. 아두이노에서 원하는 HEX 파일을 로드해서 실행하는 형식이라 여러 게임을 넣어 사용할 수 있습니다. 꽤 많은 게임이 개발되어 있습니다.
- 아두보이(Arduboy) : 아두이노 레오나르도(Atmega32u4) 보드를 사용하며 128×64 OLED 를 사용해서 화면 해상도가 뛰어납니다. 카드사이즈로 만들어져 휴대용으로 좋은 장점이 있습니다. 킥 스타터 펀딩이 성공적이니 다양한 게임 타이틀이 나올것 같습니다. 각 게임이 제공하는 스케치를 다운로드 받아 컴파일-업로드 해서 사용합니다.
각각의 프로젝트들이 장단점이 있겠지만 게임 메이커(Game Maker) 프로젝트에서는 아두보이와 같은 아두이노 레오나르도 보드를 사용할겁니다. 아두이노 레오나르도 보드가 대중적이지 않은 것이 단점이지만 아두이노 우노 보드보다 램 용량이 25% 더 크고 별도의 FTDI 모듈이 필요 없으며 아두보이가 제공하는 게임 타이틀을 그대로 사용할 수 있기 때문입니다. 디스플레이도 비교적 구하기 쉬운 OLED 디스플레이를 사용할 수 있습니다. 하지만 아두보이와는 다르게 조이스틱 모듈을 사용할 예정입니다.
.
OLED와 아두이노 램 크기
OLED 디스플레이는 128×64 해상도를 가지고 있으며 각 픽셀의 on/off만 컨트롤이 가능합니다. 따라서 OLED 화면 전체를 채우는 이미지 파일 (1bit bitmap)을 만들면 1KB 사이즈가 됩니다. 그런데 표준 아두이노 보드인 우노(Uno) 보드는 달랑 2KB 램을 가지고 있습니다. 모든 문제는 여기서부터 출발합니다.
디스플레이를 컨트롤하기 위해서는, 특히 빠르게 업데이트 되는 게임화면을 그리기 위해서는 디스플레이 해상도와 같은 크기의 그래픽 버퍼를 사용해야 합니다. 앞서 화면을 꽉 채우는 이미지 파일이 1KB 라고 했으니 그래픽 버퍼로 1KB가 필요한겁니다. 만약 아두이노 우노보드를 사용한다고 하면, 램이 2KB이니 절반은 그래픽 버퍼가 잡아먹고 아두이노 자체에서 사용하는 램도 상당량 될겁니다. 따라서 게임 만들기에 사용할 수 있는 램이 500~600 byte 정도밖에 되질 않습니다. 이미지와 같은 read-only 데이터는 32KB인 flash memory를 사용하긴 하지만 그래도 턱없이 작은 메모리 때문에 게임이 조금만 복잡해져도 메모리 문제가 발생할 가능성이 높습니다.
그래서 잘 사용하지 않는 아두이노 레오나르도 보드를 사용하는 것입니다. 아두이노 레오나르도 보드가 탑재한 Atmega32u4 칩은 램 용량이 2.5KB 이기 때문에 운신의 폭이 더 넓습니다. 그래서 아두보이가 레오나르도 보드 기반일 것입니다.
알림!!! 추후를 위해 여기서는 아두이노 레오나르도 보드를 사용하지만 램 용량을 많이 차지하는 게임이 아닌 경우 Atmega328 기반의 아두이노 우노, 나노, 프로 미니 보드도 사용이 가능합니다. 디스플레이 모듈을 I2C 로 연결하는 부분만 살짝 다르고 나머지는 똑같이 사용이 가능합니다.
.
아두이노 게임기를 만들기 위한 하드웨어 준비
준비물은 다음과 같습니다.
- 아두이노 레오나르도 보드 : 아두이노 레오나르도 혹은 마이크로(Micro) 보드를 사용하면 됩니다. 아래 사진은 아두이노 Nano 보드인데.. 아두이노 Uno, Nano 보드도 사용 가능하지만 디스플레이를 연결하는 부분이 틀립니다. 가급적 아두이노 레오나르도 보드를 준비하시고 없으면 우노, 나노 보드를 사용하세요.
- OLED 디스플레이 : OLED 디스플레이는 SSD1306 칩을 사용하고 I2C 인터페이스를 사용하는 모듈을 기준으로 삼겠습니다. SH1106 칩을 사용하는 경우 문제가 발생할 수 있으며, 이 부분은 본인이 해결해야 합니다. SPI 인터페이스도 모듈도 지원합니다만 레오나르도 보드에서 SPI 디스플레이 사용법은 여기서 자세히 소개하지 않습니다. OLED 디스플레이의 사이즈는 중요하지 않습니다. 0.96”, 1.3”, 2.42” 모두 크기만 다를 뿐 사용법은 같습니다. 1.3” 디스플레이가 휴대용으로 적당해보입니다. 여기서는 2.42” 디스플레이로 테스트합니다.
- 조이스틱 모듈 : 저렴하게 구매할 수 있는 조이스틱 모듈을 사용합니다. 버튼 4개로 대체할 수도 있으나 이 경우 소스코드는 직접 수정하셔야 합니다. 조이스틱 모듈에 대한 상세내용은 링크를 참고하세요.
- 버튼 2개 : 버튼 2개를 준비합니다.
- 저항 2개 : 사진에는 없는데 1.5K ohm 이상인 저항 2개를 준비합니다. 버튼에 사용하는게 아니라 OLED 디스플레이를 I2C 로 연결할 때 사용합니다.
- 브레드 보드, 점퍼선, 인두기 등등 : 필요한 경우 납땜 도구들도 준비하면 좋습니다.
.
연결 방법
아두이노 레오나르도 – OLED 연결
GND —–> | GND |
3.3V —–> | VCC |
SDA —–> | SDA (저항을 이용해 VCC에 연결) |
SCL —–> | SCL (저항을 이용해 VCC에 연결) |
주의!!! OLED의 SDA, SCL 핀은 데이터 전송이 없을 때 pull-up 상태가 유지되도록 2개의 저항(1.5K ohm 이상)을 이용해 VCC에 연결해주세요.
주의!!! 아두이노 우노, 나노, 프로 미니 보드를 사용하는 경우는 SDA, SCL 을 순서대로 A4, A5 핀에 연결하면 됩니다. 이때 저항을 필요 없습니다.
아두이노 레오나르도 – 조이스틱 연결
5V —–> | 5V |
GND | GND |
SW (Button, 연결하지 않음) | |
A0 | VRx(X-axis offset) |
A1 | VRy(Y-axis offset) |
아두이노 레오나르도 – 버튼 연결
D5(D6) —–> | 버튼 한 쪽 다리 |
GND | 버튼 한 쪽 다리 |
버튼 하나는 D5 핀과 GND 핀에 연결하고 다른 버튼은 D6, GND 핀에 연결합니다. 아두이노 내부 풀업저항을 사용하므로 별도의 저항은 필요하지 않습니다.
모두 연결되면 아래처럼 됩니다.
.
게임 테스트
하드웨어 연결이 완료되면 이제 테스트도 해볼 겸 예제 게임을 올려 보겠습니다. 예제라고 하기엔 이미 잘 만들어진 게임으로… 한 때 인기있었던 Flppy Bird 의 아두이노 버전 Floaty Ball 입니다. 원 제작자가 공개하는 소스는 아래 링크에서 받으실 수 있습니다.
https://codebender.cc/sketch:35593#FloatyBall.ino
이 소스를 I2C OLED, 조이스틱 환경에서 사용가능하도록 수정한 소스가 아래 링크에 있습니다.
https://github.com/godstale/game-maker
링크의 우측 하단 ‘Download ZIP’으로 소스코드를 모두 받은 후 Arduino 폴더에서 FloatyBall 폴더를 사용하시면 됩니다.
아두이노 레오나르도 보드는 업로드 할 때 PC에서 Reset 신호가 전해지면 보드의 연결이 끊어집니다. 이 때 업로드에 문제가 생기는 경우는 아래와 같이 업로드를 해보세요.
- 아두이노 개발환경에서 업로드 버튼을 클릭
- 미리 아두이노 레오나르도 보드의 Reset 버튼을 누른 상태로 유지
- 아두이노 개발환경에서 [컴파일] -> [업로딩] 상태가 변하는 순간 Reset 버튼에서 손을 뗌
- PC에서 레오나르도 보드를 다시 인식하고 이때 연결된 포트로 업로드가 진행됨
- 정상적으로 업로드 된 경우 에러 메시지 없이 [업로드 완료] 메시지가 표시됨.
레오나르도 보드의 사용법과 상세한 특징은 링크를 참고하세요.
게임이 실행되면 아래와 같은 화면이 보입니다. 조이스틱이나 버튼 어떤 것으로든 게임 진행이 가능합니다.
게임이 사용하는 RAM 메모리 문제가 없는 경우 아두이노 우노, 나노, 프로 미니 3.3V/5V 혹은 Mega 보드를 사용하셔도 됩니다. 디스플레이 모듈을 해당 보드의 I2C로 지정된 핀에 연결만 정확히 해주면 됩니다. 아래는 아두이노 나노 보드를 이용해서 게임기를 만든 예입니다.
.
게임 만들기
다음 포스트부터 본격적으로 게임 만들기 위한 과정을 살펴보도록 하겠습니다. 그 전에 FloatyBall 소스를 분석해 보시는 것도 좋겠네요 🙂
.
참고자료 :
아두이노 카드 게임기 아두보이(Arduboy)
- http://www.arduboy.com/
- https://www.tindie.com/products/bateske/arduboy/
- https://codebender.cc/search/find/?query=arduboy
GAMEBY
- http://www.team-arg.org/TEAM-arg/MORE-history.html
- http://logicalzero.com/gamby/reference/
- http://logicalzero.com/gamby/assembly/
GAMEBUINO
- http://gamebuino.com/
- http://gamebuino.com/wiki/index.php?title=Download
Hackvision
- https://nootropicdesign.com/hackvision/games.html