Skip to content

Sarahhan-one/Simon_Says

Repository files navigation

Simon Says Game

프로젝트 개요

Image Image

STM32F429I Discovery 보드를 활용해 Simon Says 기억력 게임을 구현했습니다.

3개의 LED가 생성하는 무작위 패턴을 기억하여 동일한 순서로 버튼을 입력하는 게임으로, FreeRTOS 기반 멀티태스킹과 메시지 큐를 통한 실시간 이벤트 처리를 구현했습니다.


주요 기능

  • 무작위 LED 시퀀스 생성 : 4~20개 길이, LED가 랜덤하게 점등
  • 동적 난이도 조절 : 성공 시 자동 시퀀스 길이 증가, 실패 시 초기화
  • 버튼 입력 감지 : 플레이어가 LED 점등에 반응해 버튼 입력

개발 환경

  • MCU: STM32F429ZIT6
  • RTOS: FreeRTOS
  • IDE: STM32CubeIDE / STM32CubeMX

기술적 구현

이 프로젝트는 단순한 LED–버튼 제어를 넘어, 실시간성 보장·멀티태스킹·이벤트 기반 아키텍처까지 고려한 구조로 설계되었습니다. 주요 기술 요소는 다음과 같습니다:

1. FreeRTOS 기반 태스크 구조

  • GameLogic_Task: 상태 머신 제어 및 게임 로직 처리 (IDLE → SHOW → INPUT → OVER 전이).
  • LED_Task: LED 시퀀스 재생 및 비블로킹 타이밍 제어 수행.
  • Button_Task: GPIO 폴링(10ms 주기).
  • 우선순위 분리: GameLogic/Button은 Normal, LED는 Low로 설정해 사용자 입력에 즉각 반응하도록 실시간성 보장.

2. 메시지 큐 기반 이벤트 처리

  • 버튼 입력은 GPIO 폴링을 통해 감지하고, FreeRTOS Queue로 이벤트 전달.
  • Button_Task에서 비트 플래그(0x01~0x08) 로 4개 버튼 상태를 1바이트로 효율적 표현 → GameLogic_Task가 큐에서 이벤트 소비.
  • 이 구조 덕분에 false start(잘못된 조기 입력) 처리와 비동기 통신 문제를 안정적으로 해결.

3. 상태 머신 게임 로직

  • 4개 상태(IDLE, SHOW_SEQUENCE, PLAYER_INPUT, GAME_OVER) 로 게임 흐름 제어.
  • 각 상태별로 허용되는 입력만 처리하여 의도하지 않은 동작 방지.
  • 입력 검증 로직: ledSequence[playerIndex]와 사용자 입력을 비교 → 정답 시 난이도 증가, 오답 시 초기화.

4. 비블로킹 타이밍 제어

  • osDelay() 사용 시 전체 시스템이 멈추는 문제 해결을 위해 상태 기반 타이밍 구현.
  • osKernelGetTickCount()로 경과 시간 측정 → LED ON(500ms) / OFF(200ms) 정밀 제어.
  • LED 애니메이션 중에도 Button_Task는 10ms마다 입력 감지 가능.

5. 난수 생성 (LCG 알고리즘)

  • LCG(Linear Congruential Generator) 기반 my_rand() 구현.
  • 시작 버튼 누를 때마다 시스템 틱을 시드로 사용해 매번 다른 LED 시퀀스(1~3 범위) 생성.
  • 사용자의 패턴 예측을 방지하여 게임의 공정성 확보.

6. UART 디버깅

  • printf() 리다이렉션을 통해 실시간 게임 상태 모니터링.
  • __io_putchar() 함수로 stdio.h의 출력을 UART1로 전송 → 버튼 입력 시각, LED 시퀀스, 상태 전이 추적 가능.

About

Simon Says button game using STM32F429

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors