아두이노 나노로 테트리스 게임 만들기: DIY 16×8 LED 매트릭스
부품 및 소모품
| 부품 | 수량 |
| 아두이노 나노 R3 | 1 |
| 12mm 푸시버튼 스위치 | 4 | 좌/우/하/회전 |
| 74HC595 시프트 레지스터 (직렬-병렬) | 2 | 열 제어용 |
| 슬라이드 스위치 (전원) | 1 |
| 5mm 황색 LED | 128 | 16열 × 8행 |
필요 도구
앱 및 온라인 서비스
프로젝트 소개
직접 납땜한 16×8 LED 매트릭스(2개 74HC595로 열 제어, 8개 행 애노드 직접 구동)와 아두이노 나노로 테트리스 게임을 구현했습니다. 버튼 입력 시 비프음 발생.
하드웨어 구조
- 행(Row) 애노드: 아두이노 핀 5~12 (8개) 직접 구동
- 열(Column) 캐소드: 74HC595 2개 직렬 연결로 16비트 제어 (Data=4, Clock=2, Latch=3)
- 버튼: A4(좌), A5(하), A6(우), A7(상/회전) - 아날로그 핀을 디지털 입력으로 사용
- 타이머1 인터럽트(2kHz)로 LED 매트릭스 스캔 새로고침
소스 코드
/* Author: Jae Yeong Bae, UBC ECE, 2013.01.18 */
unsigned char latchPin = 3, clockPin = 2, dataPin = 4, rowPin = 5;
long delays = 0; short delay_ = 500;
long bdelay = 0; short buttondelay = 150, btdowndelay = 30, btsidedelay = 80;
unsigned char blocktype, blockrotation;
int lines = 0;
boolean block[8][18], pile[8][16], disp[8][16];
boolean lib[10][5][7]; // 0~9 숫자 폰트 (게임오버 점수 표시용)
void setup() {
// lib[] 배열에 0~9 숫자 5x7 패턴 정의
// 랜덤 시드 생성 (아날로그 핀 노이즈 활용)
// 타이머1 설정: 2kHz 인터럽트 → LEDRefresh() 호출
// 핀 모드 설정, newBlock(), updateLED(), Serial.begin(9600);
}
void loop() {
// 자동 낙하 타이밍
if (delays < millis()) { delays = millis() + delay_; movedown(); }
// 버튼 읽기 (아날로그 임계값 500)
int button = readBut();
if (button == 1) rotate(); // 상/회전
if (button == 2) moveright(); // 우
if (button == 3) moveleft(); // 좌
if (button == 4) movedown(); // 하/즉시 낙하
}
// 블록 이동/회전/충돌 체크/라인 클리어/게임오버/점수 표시 등 구현
// LEDRefresh(): 타이머 인터럽트에서 행별 스캔 (핀 배선 오류 소프트웨어 보정 포함)
회로도