전자 게임에 질려 물리적 기술 게임을 찾던 중 '라비린스(Labyrinth)'를 발견했습니다. 1946년 스웨덴 BRIO사에서 출시된 이 게임은 상자 위 미로에 강철 구슬을 기울여 구멍에 빠뜨리지 않고 골인시키는 게임입니다. 아두이노와 서보로 이 기울기를 제어해 골판지로 직접 만들어 보았습니다.
설계 (SketchUp으로 모델링)
아이들도 만들 수 있게 20x20cm 크기로 단순화했습니다. 설계 파일 다운로드 후 1시간 만에 완성 가능.
재료 및 부품
골판지 3mm
글루건, 커터칼, 자, 연필
아두이노, 미니 브레드보드, 점퍼 와이어
SG90 서보 2개, 조이스틱 모듈
M3x12mm 볼트/너트 2개 (서보 혼 고정용)
골판지 재단 및 조립 순서
바닥: 20cm x 20cm 정사각형 1개
양쪽 옆면: 14cm x 16cm 이등변 사다리꼴 2개 (한쪽엔 서보 장착용 직사각형 구멍, 반대편엔 서보 축 맞춤용 3mm 구멍)
내부 지지대: 14cm x 4cm 직사각형 4개 (하나는 Y축 서보 장착용 구멍, 중앙에 3mm 구멍)
미로 판: 12cm x 12cm 정사각형 (첨부된 미로 도안 중 선택 후 종이 출력해 붙이고 벽 재단 가이드로 사용)
미로 벽: 1.5cm x 12cm 직사각형 8개 이상 (미로 도안에 맞게 잘라 붙이기)
서보 모터 장착: X축(좌우 기울임), Y축(앞뒤 기울임) 서보를 지정된 구멍에 고정
서보 혼(혼)을 지지대/미로 판 연결부에 볼트/너트로 고정
배선도
서보 X축(좌우) 신호선 → 아두이노 Pin 8
서보 Y축(앞뒤) 신호선 → 아두이노 Pin 9
서보 전원(적/갈) → 브레드보드 5V/GND 레일
조이스틱 VRx → 아두이노 A0
조이스틱 VRy → 아두이노 A1
조이스틱 VCC/GND → 브레드보드 5V/GND
아두이노 5V/GND → 브레드보드
코드 업로드
아두이노를 USB로 PC 연결
아두이노 IDE 열기 → 새 스케치에 코드 복사
툴 → 보드 → 아두이노 우노 선택, 포트 선택
업로드 버튼 클릭
"Done uploading" 메시지 확인 후 플레이!
코드: 조이스틱으로 미로 기울이기
#include <Servo.h>
Servo myServoX; // X축 서보
Servo myServoY; // Y축 서보
int ServoXPin = 8;
int ServoYPin = 9;
int ServoXHomePos = 90; // 중립 위치
int ServoYHomePos = 90;
int ServoXPos = 103; // 초기 오프셋 보정값
int ServoYPos = 135;
int XAxlePin = A0; // 조이스틱 X
int YAxlePin = A1; // 조이스틱 Y
int XAxleValue = 0;
int YAxleValue = 0;
int range = 12; // 조이스틱 출력 범위 (-6 ~ +6)
int center = range/2; // 중립값
int threshold = range/4; // 데드존 임계값
void setup() {
myServoX.attach(ServoXPin);
myServoY.attach(ServoYPin);
ServoXPos = ServoXHomePos;
ServoYPos = ServoYHomePos;
myServoX.write(ServoXPos);
myServoY.write(ServoYPos);
Serial.begin(9600);
}
void loop() {
XAxleValue = readAxis(XAxlePin);
YAxleValue = readAxis(YAxlePin);
Serial.print(XAxleValue); Serial.print(" - "); Serial.println(YAxleValue);
// 조이스틱 입력에 비례해 서보 각도 증감 (부드러운 움직임을 위해 지연 조절)
if (XAxleValue > 0) { ServoXPos++; myServoX.write(ServoXPos); delay(100*(7-XAxleValue)); }
if (XAxleValue < 0) { ServoXPos--; myServoX.write(ServoXPos); delay(100*(7+XAxleValue)); }
if (YAxleValue > 0) { ServoYPos++; myServoY.write(ServoYPos); delay(100*(7-YAxleValue)); }
if (YAxleValue < 0) { ServoYPos--; myServoY.write(ServoYPos); delay(100*(7+YAxleValue)); }
// 서보 각도 제한 (±20도)
ServoXPos = constrain(ServoXPos, ServoXHomePos-20, ServoXHomePos+20);
ServoYPos = constrain(ServoYPos, ServoYHomePos-20, ServoYHomePos+20);
delay(10);
}
// 조이스틱 아날로그 값을 -6~+6 범위의 정수로 매핑 및 데드존 처리
int readAxis(int thisAxis) {
int reading = analogRead(thisAxis);
reading = map(reading, 0, 1023, 0, range);
int distance = reading - center;
if (abs(distance) < threshold) distance = 0;
return distance;
}
확장 아이디어
골인 지점에 근접 센서/부저 추가 → 도착 시 알림
미로 판에 구멍 뚫어 빠지면 게임 오버
난이도 다른 미로 도안 여러 개 준비
타이머 기능 추가로 기록 경쟁
회로도
골판지와 서보 2개만으로 아날로그 감성의 게임기를 만들 수 있습니다. 아이들과 함께 만들어 보세요!