게임 메이커: 아두이노 네트워크 게임 만들기
이전에 아두이노를 이용한 게임패드 만들기 프로젝트 시리즈 “게임 메이커”를 올린 바 있습니다. 아두이노 레오나르도(혹은 우노, 나노 등 Atmega328 기반 보드) 보드와 조이스틱을 이용해서 게임패드를 만들고 8비트 게임 만드는 방법을 알려주는 프로젝트입니다. 그리고 예제로 횡스크롤 액션 게임 “러닝맨” 을 제공 했습니다.
이미 아두이노를 이용한 게임기 만들기 프로젝트는 해외에서 몇 차례 시도된 바 있기 때문에 “게임 메이커” 프로젝트는 하드웨어적인 구성이 그 틀에서 크게 벗어나질 않습니다. 그래서 좀 더 색다르게 게임패드를 만들어 즐길 수 있는 방법이 없을까 생각하다가 네트웍 게임패드를 만들게 되었습니다.
아두이노로 네트웍 게임기를 만들기 위해서는 기존 “게임 메이커” 프로젝트가 제공하는 하드웨어 구조에 통신 모듈만 하나 더하면 됩니다. 여러가지 통신 방법이 가능하겠지만 아두이노의 성능을 고려할 때 복잡한 1:1 연결 과정이 필요한 모듈들은 컨트롤 하기도 어렵고 문제도 많이 발생합니다. 그래서 여기서는 HC-11 433MHz RF 모듈을 사용했습니다. HC-11 433MHz RF 모듈은 별도의 연결 설정이 필요없고 사용법도 간단하며 가격도 저렴한 장점이 있습니다.
네트웍 게임 : 오셀로
네트웍 게임 패드만 만들어서는 아무 소용이 없겠죠. 그 위에서 돌아갈 게임이 있어야죠. 어떤 게임이 네트웍 용으로 어울릴까 곰곰히 생각해 보다가 예제로 만들기 적당한 게임을 하나 찾았습니다. 바로 오셀로(오델로?) 입니다.
고전 보드 게임이기도하고 규칙도 간단하고 대전 게임이라 네트웍 특성에 맞기도 합니다. 구현이 그리 어려운 편이 아니어서 프로그래밍 연습용으로도 만들어 볼만 한 게임입니다.
게임의 규칙은 간단합니다. 흰색 두 개, 검은색 두 개의 바둑알이 가운데 배치되고 플레이어가 자기 차례에 돌을 하나씩 놓습니다. 돌을 놓은 위치에서부터 상하좌우-대각선 방향으로 새로 놓은 돌과 자신의 돌 사이에 있는 상대변 돌은 모두 자신의 돌로 바뀌게 됩니다. (단 사이에 공백이 없어야 함) 아래 이미지를 보면 대충 룰을 아실 수 있을겁니다.
이 게임을 두 개의 네트웍 게임패드를 이용해 즐길 수 있도록 만들어 보겠습니다.
하드웨어 구성
네트웍 게임패드를 만드는데 사용되는 부품들은 아래와 같습니다.
- Arduino Pro Micro
아두이노 중에서도 Pro Micro 보드를 사용했습니다. 추후 포터블 버전으로 만들기 위해 사이즈가 작은 Leonardo 호환 보드가 필요했기 때문입니다. Pro Micro 보드는 국내에서 구하기 쉽지 않을 것 같으니 Leonardo 또는 Micro 보드를 사용하셔도 됩니다. 혹은 Uno, Nano 보드를 사용하셔도 되긴 합니다만.. 이 경우는 소스코드를 변경해줘야 합니다. - OLED display
128×64 해상도를 가진 OLED 디스플레이가 필요합니다. 특히 SSD1306 드라이버 칩을 사용하는 모듈을 구매하시는 것이 좋습니다. 왜냐면 소스코드에서 사용하는 Adafruit 그래픽 라이브러리가 SSD1306 드라이버 칩만을 지원하기 때문입니다. SH1106 드라이버를 사용하는 OLED 디스플레이도 가능은 하지만 소스코드를 직접 수정하셔야 합니다. - HC-11 433MHz RF module
433MHz RF 모듈을 사용해 아두이노간 통신을 합니다. 1:1 연결을 위한 제어가 필요 없기 때문에 컨트롤하기 쉽습니다. 대신 주변에 네트웍 게임패드가 많아지면 오류가 발생할 가능성이 커집니다. 이 부분은 SW 적으로 처리해줘야 하는데.. 아직 그 정도까지 복잡한 내용을 구현하진 않았습니다. - Joystick module & Button
시중에 판매되는 조이스틱 모듈과 버튼입니다. 조이스틱 모듈이 상하좌우 움직임을 담당하고 2개의 버튼이 선택/확인 키 역할을 합니다.
만약 포터블 용으로 게임패드를 만들고 싶다면 여기에 추가로 아래 부품들을 더해줘야 합니다.
- LiPo charger module
LiPo 배터리를 충전하기 위한 모듈입니다. 아래와 같이 충전/전원공급이 동시에 가능한 모듈을 구매하시면 됩니다.
- LiPo battery
적당한 용량의 LiPo 배터리를 사용하세요. 전 240mAh 정도의 배터리를 사용하고 있습니다.
연결 방법
부품들을 아래와 같이 연결해주면 됩니다. (이미지를 클릭하면 확대됨)
- 아두이노 – OLED
3.3V-VCC, GND-GND, SDA-SDA, SCL-SCL - 아두이노 – HC-11
3.3V-VCC, GND-GND, TX(D1)-RX, RX(D0)-TX - 아두이노 – 조이스틱
5V-VCC, GND-GND, A1-VER, A0-HOR - 아두이노 – 버튼
D5, D6 사용 (아두이노 내부 풀업저항 사용)
포터블 형태로 만들고 싶으신 경우 LiPo 충전 모듈과 배터리를 아래와 같이 추가로 연결하세요. (이미지를 클릭하면 확대됨)
오셀로 게임 다운로드 및 업로드
게임은 아래 페이지에서 직접 다운로드 받으실 수 있습니다.
https://github.com/godstale/game-maker/tree/master/Arduino
아두이노 UNO 보드를 위한 소스와 Leonardo 보드를 위한 소스 두 가지 버전이 있습니다. 원하시는 버전을 사용하시면 됩니다.
주의!!! 소스코드를 다운로드 받아 보시면 InputController.cpp 파일이 있습니다. 조이스틱과 버튼 상태를 읽어서 up/down/left/right/Akey/Bkey 입력으로 변환해주는 파일입니다. 조이스틱 모듈 종류나 연결 상태에 따라 입력값이 제대로 받아지지 않거나 방향이 틀리게 받아지는 경우가 있는데, 이 경우 이 파일을 수정해서 정상적으로 입력되도록 수정해 줘야 합니다.
소스코드를 받으셨으면 아두이노 개발환경(IDE)을 이용해 업로드 해주면 됩니다. 테스트를 위해 2대를 만들어 같은 소스코드를 올려주면 됩니다.
게임 진행 방법
게임은 아래와 같이 진행할 수 있습니다.
- 게임기 A, B 두 대를 준비해서 전원을 on
- 로고 화면에서 아무키나 입력
- A 게임기를 host 로 설정하고 B 게임기를 client로 설정
- (client-B 게임기가 신호를 보내고 A 게임기가 신호를 받습니다.)
- A, B 게임기가 게임화면으로 전환
- client 로 설정한 B 게임기가 먼저 돌을 놓을 수 있습니다.
- B 게임기가 돌을 놓으면 통신을 한 후 A 게임기가 돌을 놓을 수 있습니다.
- 이후 화면에 돌이 다 차거나 화면의 모든 돌을 획득했을 때 게임이 끝납니다.
기타 정보
프로젝트를 하면서 아두이노로도 네트웍 게임이 충분히 가능함을 알 수 있었습니다. 그리고 이를 위해 하드웨어, 소프트웨어를 만드는 것이 그리 어렵지만도 않습니다. 친구들과 혹은 아이들과 함께 게임패드를 만들어서 같이 게임을 즐겨보세요. 프로그래밍이 가능하시다면 원하시는 게임을 만들어 즐기시는 것도 좋겠습니다.
이 프로젝트는 메이커 페어 심천 2015에 전시가 되었으며 추후 메이커 페어 서울 2015 에도 전시될 예정입니다. 프로젝트에 사용된 소스코드 및 관련 DIY 매뉴얼은 오픈소스 라이센스에 따라 자유롭게 사용이 가능합니다.
게임패드 제작, 8비트 게임 프로그래밍 상세정보는 아래 링크를 참고하세요.