README 문장 정리 되돌림
This commit is contained in:
1 parent
f19aeacacf
commit
9aebf68aa3
1 file changed
+41
-47
@@ -1,55 +1,49 @@
|
|||||||
# Linux Kernel Driver 기반 시계와 불쾌지수 표시기
|
# Linux Kernel Driver 기반 시계 & 불쾌지수 측정기
|
||||||
|
|
||||||
Raspberry Pi 4에서 커널 모듈과 유저 프로그램을 나눠 작성한 임베디드 프로젝트입니다.
|
본 프로젝트는 리눅스 커널 드라이버를 직접 설계하여 하드웨어를 제어하고, 실시간 시계(RTC), 온습도 데이터 처리 및 불쾌지수(THI) 시각화를 구현한 임베디드 시스템 프로젝트입니다.
|
||||||
|
|
||||||
커널 모듈은 GPIO, I2C, 센서 입력을 처리합니다. 유저 프로그램은 커널 모듈에서 값을 읽어 OLED에 시간, 온습도, 불쾌지수를 표시합니다.
|
---
|
||||||
|
|
||||||
## 사용한 것
|
## 프로젝트 개요
|
||||||
|
단순히 라이브러리를 사용하는 수준을 넘어, 커널 공간에서 직접 GPIO 인터럽트를 핸들링하고 디바이스 드라이버를 작성하여 유저 공간 애플리케이션과 데이터를 주고받는 전체 프로세스를 구현했습니다.
|
||||||
|
|
||||||
- `C`
|
## 주요 하드웨어 구성
|
||||||
- `Linux Kernel Module`
|
- **Main Board:** Raspberry Pi 4 (64-bit Kernel)
|
||||||
- `GPIO`
|
- **Sensors:** - `DHT11`: 온습도 데이터 수집
|
||||||
- `I2C`
|
- `DS1302`: 실시간 시간 정보(RTC) 제공
|
||||||
- `ioctl`
|
- `Rotary Encoder`: 페이지 전환 및 시간 설정 인터페이스
|
||||||
- `DS1302`
|
- **Display & Output:**
|
||||||
- `DHT11`
|
- `OLED (I2C)`: 정보 출력 (시간, 온습도, 불쾌지수)
|
||||||
- `SSD1306`
|
- `8-Channel LED`: 불쾌지수 단계별 시각화
|
||||||
- `Rotary Encoder`
|
|
||||||
|
|
||||||
## 하드웨어
|
## 시스템 아키텍처
|
||||||
|
1. **Kernel Space (`driver.c`)**:
|
||||||
|
- GPIO 제어 및 인터럽트(IRQ) 핸들링 (로터리 엔코더 디바운싱 처리 등)
|
||||||
|
- DS1302 및 DHT11 제어 로직 구현
|
||||||
|
- `ioctl` 및 `read/write` 인터페이스 제공
|
||||||
|
2. **User Space (`application.c`)**:
|
||||||
|
- 커널 드라이버로부터 데이터를 받아 OLED 화면 구성
|
||||||
|
- 불쾌지수(THI) 산출 및 LED 레벨 제어 로직 실행
|
||||||
|
|
||||||
- Raspberry Pi 4
|
## 핵심 기술 포인트
|
||||||
- DS1302 RTC
|
- **Interrupt Handling & Debouncing**: 로터리 엔코더의 기계적 떨림 현상을 커널 내에서 타이머를 활용해 방지.
|
||||||
- DHT11 온습도 센서
|
- **Context Management**: 뮤텍스를 사용하여 커널 내 공유 자원 보호.
|
||||||
- 로터리 엔코더
|
- **Custom Character Device**: 시스템 고유의 메이저 번호를 할당받아 장치 파일 생성.
|
||||||
- I2C OLED
|
- **I2C & GPIO Protocol**: 센서별 통신 프로토콜을 드라이버 레벨에서 직접 제어.
|
||||||
- 8채널 LED
|
|
||||||
|
|
||||||
## 파일
|
## 파일 구조
|
||||||
|
- `driver.c`: 리눅스 커널 모듈 소스 코드
|
||||||
|
- `application.c`: 유저 애플리케이션 (OLED 및 메인 로직)
|
||||||
|
- `Makefile`: 커널 빌드 환경(`ARCH=arm64`) 설정
|
||||||
|
|
||||||
- `driver.c`: 커널 모듈 코드
|
## 실행 방법
|
||||||
- `application.c`: OLED 화면과 불쾌지수 계산 코드
|
1. **커널 모듈 빌드 및 로드**
|
||||||
- `Makefile`: 커널 모듈 빌드 설정
|
```bash
|
||||||
|
make
|
||||||
## 동작
|
sudo insmod driver.ko
|
||||||
|
```
|
||||||
- DS1302에서 시간을 읽습니다.
|
2. **애플리케이션 실행**
|
||||||
- DHT11에서 온도와 습도를 읽습니다.
|
```
|
||||||
- 로터리 엔코더 입력으로 화면 페이지를 바꿉니다.
|
gcc -o application application.c
|
||||||
- 커널 모듈은 character device를 만들고 `read/write/ioctl` 인터페이스를 제공합니다.
|
sudo ./application
|
||||||
- 유저 프로그램은 커널 모듈에서 받은 값으로 OLED 화면을 갱신합니다.
|
```
|
||||||
- 불쾌지수 단계에 따라 LED 출력을 바꿉니다.
|
|
||||||
|
|
||||||
## 빌드
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make
|
|
||||||
sudo insmod driver.ko
|
|
||||||
gcc -o application application.c
|
|
||||||
sudo ./application
|
|
||||||
```
|
|
||||||
|
|
||||||
## 메모
|
|
||||||
|
|
||||||
- 로터리 엔코더 입력은 커널 쪽에서 디바운싱합니다.
|
|
||||||
- 센서와 디스플레이 핀은 `driver.c` 안의 정의를 기준으로 합니다.
|
|
||||||
Reference in new issue
Block a user