아두이노 나노 + 128x64 OLED로 실시간 셀룰러 오토마타 (생명 게임) 구현
부품 및 소모품
부품
수량
아두이노 나노 R3 (우노도 가능)
1
128x64 I2C OLED 디스플레이 (SSD1306)
1
하프 사이즈 브레드보드
1
점퍼 와이어
4
프로젝트 소개
콘웨이의 생명 게임(Conway's Game of Life)을 아두이노 나노와 128x64 OLED로 구현한 프로젝트입니다. 128×64 = 8,192개 셀의 세대 교체가 실시간으로 표시됩니다. 아다프루트 GFX + SSD1306 라이브러리만 있으면 간단히 구현 가능합니다.
생명 게임 규칙
각 셀은 생존(1) 또는 사망(0) 상태를 가지며, 8개 이웃 셀을 기준으로 다음 세대 상태가 결정됩니다.
탄생: 죽은 셀 주위에 정확히 3개 살아있는 이웃 → 다음 세대 생존
생존: 살아있는 셀 주위에 2~3개 살아있는 이웃 → 생존 유지
사망: 그 외(고립 0~1, 과밀 4+) → 다음 세대 사망
배선 (I2C)
아두이노
OLED
3.3V (또는 5V, 모듈 사양 확인)
VCC
GND
GND
A4
SDA
A5
SCL
필수 라이브러리
라이브러리 설치: 아두이노 IDE → 스케치 → 라이브러리 포함 → 라이브러리 관리 → 검색 후 설치
코드 (핵심 로직)
전체 코드는 GitHub 에서 다운로드 가능합니다. 주요 부분 설명:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C // 모듈에 따라 0x3D일 수 있음
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
bool grid[SCREEN_WIDTH][SCREEN_HEIGHT];
bool newGrid[SCREEN_WIDTH][SCREEN_HEIGHT];
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
randomSeed(analogRead(0));
// 초기 패턴 랜덤 생성
for(int x=0; x
주의사항
OLED I2C 주소가 0x3C가 아닐 수 있음 (I2C 스캐너로 확인)
SRAM 제약: 128×64 bool 배열 2개 = 16KB, 나노(2KB)로는 불가능 → 비트 단위 압축 또는 PROGMEM 사용 필요. 실제 구현에서는 1차원 배열 + 비트 연산으로 최적화
화면 주사율과 카메라 프레임 레이트 차이로 수평 줄무늬가 보일 수 있음 (실제로는 깜빡임 없음)
확장 아이디어
버튼으로 초기 패턴 선택 (글라이더, 오실레이터, 랜덤 등)
잠자리/글라이더 건 등 유명 패턴 프리셋 내장
세대 수, 생존 개체 수 통계 표시
더 큰 디스플레이(128x128) 또는 다중 OLED로 확장
참고 자료