printf("ho_tari\n");

Mini Project2 - Elevator Project 본문

(Telechips) AI 시스템 반도체 SW 개발자 교육/STM32CubeIDE mini Project

Mini Project2 - Elevator Project

호타리 2025. 4. 11. 10:31

2025.04.09 ~ 2025.04.11

 

- RTOS 기반 실행

- I2CLCD : HAL func쓰지 말고 I2C protocol 구현

- DS1302 활성화 : 시계를 LCD에 표시

- BUZZER 동작

- LED BAR 동작

- Dotmatrix 동작

- BUTTON 제어 : 층수 선택 / 복수층 선택 / 층수 선택 취소 기능

 

1. 시스템 구성 및 각 모듈의 역할

1.1. 스텝 모터 및 층 선택 모듈

  • 주요 기능:
    • 엘리베이터의 이동을 위해 스텝 모터를 제어합니다.
    • 사용자의 버튼 입력을 통해 여러 층을 선택하거나 취소할 수 있도록 합니다.
    • 현재 위치와 목표 층을 비교하여 모터가 전진(FORWARD) 또는 후진(BACKWARD)하도록 방향을 결정합니다.
    • 선택된 층 목록은 고정 크기 배열로 관리되며, 도착 시 부저 알림을 발생시키고 다음 층으로 이동합니다.
  • 배운 점:
    • 실시간 입력(버튼)을 처리하여 모터 동작 상태를 즉시 업데이트하는 로직을 작성할 수 있었습니다.
    • 모터 제어와 층 선택 알고리즘을 구현하면서, 중간 삭제와 배열 재정렬 같은 자료구조 처리에 대한 한계와, 향후 동적 자료구조 도입의 필요성을 고민해볼 수 있었습니다.

1.2. 버튼 입력 및 외부 인터럽트 모듈

  • 주요 기능:
    • 사용자 인터페이스로서, 각 버튼은 특정 층 선택 혹은 선택 취소를 유도합니다.
    • 외부 인터럽트(EXTI)를 통해 센서나 기계적 스위치로부터의 신호를 빠르게 감지하여 현재 층(또는 엘리베이터의 위치)을 업데이트합니다.
  • 배운 점:
    • 인터럽트 서비스 루틴(ISR)은 짧고 간결하게 작성해야 하며, 빠른 반응과 최소한의 처리로 중요한 상태 변화(현재 층 업데이트 등)를 수행하는 방법을 배웠습니다.
    • 인터럽트와 태스크 간 데이터 공유 시 동기화 문제 및 임계 구역 처리의 중요성을 인식하였습니다.

1.3. 디스플레이 관련 모듈 (FND, DotMatrix, I2C LCD)

  • 주요 기능:
    • FND(Seven-Segment Display): 엘리베이터의 상태(정지/이동)를 숫자 또는 기호로 표시합니다.
    • DotMatrix: 층 선택 정보를 시각적으로 표시하고, 스크롤 효과 등을 통한 동적 메시지 출력을 구현합니다.
    • I2C LCD: DS1302 RTC 모듈로부터 받은 시간/날짜 정보를 화면에 출력하며, 간단한 테스트 및 디버깅 목적으로 사용됩니다.
  • 배운 점:
    • I2C 통신을 통한 LCD 제어 방법과, 4비트 모드를 활용하여 명령 및 데이터 전송의 타이밍을 맞추는 기술을 습득했습니다.
    • LED와 7-세그먼트, 그리고 dotmatrix 디스플레이를 제어하기 위한 하드웨어 신호 생성 및 하드웨어 추상화 계층(HAL) 사용법에 익숙해졌습니다.
    • 각 디스플레이 모듈이 독립적인 태스크로 구성될 때, non-blocking 방식과 RTOS의 지연 함수(osDelay)를 사용하여 전체 시스템의 응답성을 확보하는 방법을 배웠습니다.

1.4. DS1302 RTC 모듈

  • 주요 기능:
    • DS1302 Real-Time Clock을 통해 현재 시간과 날짜를 읽어오고, 이를 LCD 디스플레이에 출력합니다.
    • BCD(2진수-십진수) 변환 함수를 통해 RTC에서 받은 데이터를 사람이 읽을 수 있는 형식으로 변환합니다.
  • 배운 점:
    • 비트뱅잉 기법을 사용한 RTC와의 통신에서 타이밍 제어의 중요성을 깨달았으며, BCD 변환 처리의 기본 원리를 습득했습니다.
    • RTC 모듈의 초기화, 데이터 읽기/쓰기 로직을 통해 하드웨어 초기화 및 통신 프로토콜 설계의 기초를 배웠습니다.

1.5. 부저 (Buzzer) 모듈

  • 주요 기능:
    • PWM을 활용한 부저 제어로, 도착 알림, 경고음, 학교 종 소리 등 다양한 음향 효과를 발생시킵니다.
    • 다양한 음계 및 주파수에 따른 음을 생성하는 함수를 구현했습니다.
  • 배운 점:
    • 타이머(PWM)를 활용하여 원하는 주파수와 듀티 사이클로 부저 소리를 제어하는 방법에 대해 깊이 있게 학습했습니다.
    • 부저를 이용한 사운드 애니메이션(예: siren 효과)을 구현하면서, 시간 기반 동적 변화 구현의 어려움과 응용 방안을 고민해보았습니다.

1.6. LED 모듈

  • 주요 기능:
    • LED를 사용하여 시각적 피드백 및 다양한 애니메이션(shift, flower 등)을 구현합니다.
    • LED 제어는 HAL_GPIO_WritePin과 직접 레지스터 조작을 혼용하여 수행되며, 간단한 애니메이션 효과를 통해 사용자 인터페이스를 보조합니다.
  • 배운 점:
    • LED를 통한 상태 표시 및 애니메이션 구현에서, 직접 레지스터 조작과 HAL 함수 사용의 차이를 이해하고, 일관된 코드 작성의 필요성을 느꼈습니다.

2. RTOS 통합 및 태스크 기반 설계

2.1. 태스크 분리 및 스케줄링

  • 구현 내용:
    • 각 기능(스텝 모터 제어, 디스플레이 업데이트, RTC 읽기, 부저 제어 등)을 독립적인 태스크로 분리하여 처리하였습니다.
    • RTOS 태스크들은 각기 다른 우선순위와 스택 크기를 가지고 실행되어, 우선 순위가 높은 작업(예: 모터 제어, 인터럽트 처리)과 상대적으로 부하가 적은 작업(예: 디스플레이 갱신)을 적절히 분리하였습니다.
  • 배운 점:
    • RTOS를 활용한 멀티태스킹 환경에서, 태스크 사이의 동기화와 통신(뮤텍스, 세마포어, 메시지 큐 등)을 통해 데이터 무결성을 유지하는 방법의 중요성을 배웠습니다.
    • 블로킹 함수 사용의 문제점을 확인하고, osDelay()와 같은 RTOS 전용 딜레이 함수를 사용해 시스템 전체의 응답성을 높이는 방법을 학습했습니다.

2.2. 외부 인터럽트와 RTOS 태스크의 상호 연동

  • 구현 내용:
    • 외부 인터럽트는 센서나 스위치의 변화에 빠르게 응답하여 현재 층(current_state) 등의 중요한 정보를 업데이트합니다.
    • 업데이트된 정보는 태스크들이 주기적으로 읽어 모터 제어나 디스플레이에 반영되며, 인터럽트와 태스크 간 최소한의 연산과 데이터 전달만을 수행하도록 하여 ISR의 지연을 최소화하였습니다.
  • 배운 점:
    • 인터럽트 서비스 루틴(ISR)과 태스크 간 데이터 공유 시 동기화 문제, 그리고 간단한 플래그 업데이트 또는 이벤트 전달을 통해 복잡한 작업을 태스크로 넘기는 설계 패턴에 대해 이해하게 되었습니다.
    • 인터럽트를 통한 빠른 하드웨어 이벤트 감지와, 그 결과를 RTOS 태스크로 전달하여 전체 시스템 상태를 업데이트하는 효율적인 방법을 체험했습니다.

3. 프로젝트 진행 과정에서 느낀 개선 사항 및 미래 발전 방향

  • 글로벌 변수 관리:
    • 여러 모듈 간의 상태 전달에 전역 변수를 광범위하게 사용한 부분은 향후 동기화 문제를 유발할 수 있으므로, 데이터 캡슐화와 RTOS 동기화 프리미티브(예: 뮤텍스, 큐)를 통한 안전한 접근이 필요합니다.
  • 하드코딩된 타이밍 값:
    • 각 모듈에서 사용되는 딜레이 값이나 주파수 관련 계산은 상수화하고, 구성 파일 또는 매크로를 통해 쉽게 조정할 수 있도록 개선하면 시스템 확장성과 유지보수성이 향상될 것입니다.
  • 모듈화 및 코드 재사용:
    • 버튼 입력 처리, LED 제어, 디스플레이 업데이트 등 유사한 기능의 중복 코드가 존재하는 경우, 공통 함수로 추출하는 등 모듈화가 필요합니다.
  • 동적 자료구조 고려:
    • 층 선택 기능과 같이 사용자가 선택한 항목의 삽입과 삭제가 빈번한 경우, 고정 배열 대신 연결리스트나 큐 같은 동적 자료구조의 도입을 고민해볼 수 있으나, 임베디드 환경에서의 메모리 단편화 및 안정성 문제를 고려해야 합니다.
  • RTOS 태스크 및 인터럽트 설계:
    • 태스크와 인터럽트 간의 역할 분리를 명확히 하고, ISR에서는 반드시 최소한의 작업만을 수행하여 전체 시스템의 실시간 응답성을 보장하는 설계를 강화할 필요가 있습니다.

 

<실행 결과>

https://youtube.com/shorts/CmRM8bwtMbY

 

99.ELEVATOR.zip
10.60MB