STM32F429I Discovery 보드를 활용해 Simon Says 기억력 게임을 구현했습니다.
3개의 LED가 생성하는 무작위 패턴을 기억하여 동일한 순서로 버튼을 입력하는 게임으로, FreeRTOS 기반 멀티태스킹과 메시지 큐를 통한 실시간 이벤트 처리를 구현했습니다.
- 무작위 LED 시퀀스 생성 : 4~20개 길이, LED가 랜덤하게 점등
- 동적 난이도 조절 : 성공 시 자동 시퀀스 길이 증가, 실패 시 초기화
- 버튼 입력 감지 : 플레이어가 LED 점등에 반응해 버튼 입력
- MCU: STM32F429ZIT6
- RTOS: FreeRTOS
- IDE: STM32CubeIDE / STM32CubeMX
이 프로젝트는 단순한 LED–버튼 제어를 넘어, 실시간성 보장·멀티태스킹·이벤트 기반 아키텍처까지 고려한 구조로 설계되었습니다. 주요 기술 요소는 다음과 같습니다:
- GameLogic_Task: 상태 머신 제어 및 게임 로직 처리 (IDLE → SHOW → INPUT → OVER 전이).
- LED_Task: LED 시퀀스 재생 및 비블로킹 타이밍 제어 수행.
- Button_Task: GPIO 폴링(10ms 주기).
- 우선순위 분리: GameLogic/Button은 Normal, LED는 Low로 설정해 사용자 입력에 즉각 반응하도록 실시간성 보장.
- 버튼 입력은 GPIO 폴링을 통해 감지하고, FreeRTOS Queue로 이벤트 전달.
- Button_Task에서 비트 플래그(0x01~0x08) 로 4개 버튼 상태를 1바이트로 효율적 표현 → GameLogic_Task가 큐에서 이벤트 소비.
- 이 구조 덕분에 false start(잘못된 조기 입력) 처리와 비동기 통신 문제를 안정적으로 해결.
- 4개 상태(IDLE, SHOW_SEQUENCE, PLAYER_INPUT, GAME_OVER) 로 게임 흐름 제어.
- 각 상태별로 허용되는 입력만 처리하여 의도하지 않은 동작 방지.
- 입력 검증 로직:
ledSequence[playerIndex]와 사용자 입력을 비교 → 정답 시 난이도 증가, 오답 시 초기화.
osDelay()사용 시 전체 시스템이 멈추는 문제 해결을 위해 상태 기반 타이밍 구현.osKernelGetTickCount()로 경과 시간 측정 → LED ON(500ms) / OFF(200ms) 정밀 제어.- LED 애니메이션 중에도 Button_Task는 10ms마다 입력 감지 가능.
- LCG(Linear Congruential Generator) 기반
my_rand()구현. - 시작 버튼 누를 때마다 시스템 틱을 시드로 사용해 매번 다른 LED 시퀀스(1~3 범위) 생성.
- 사용자의 패턴 예측을 방지하여 게임의 공정성 확보.
printf()리다이렉션을 통해 실시간 게임 상태 모니터링.__io_putchar()함수로stdio.h의 출력을 UART1로 전송 → 버튼 입력 시각, LED 시퀀스, 상태 전이 추적 가능.