상세 컨텐츠

본문 제목

[한화비전 VEDA 4기] 11주차 리뷰

VEDA

by 전산거북이 2026. 6. 7. 23:44

본문

11주차 화요일 ~ 금요일까지 심화실습평가2 가 있었습니다.
심화 실습 평가 2에서, 라즈베리파이를 이용하여 각종 디바이스를 제어하였습니다.

자세한 내용은 제 github에 올려두었습니다.

총 5개의 디바이스를 제어하는 서버/클라이언트 프로그램입니다.

  1. pwm을 이용하여 LED 제어
  2. 부저
  3. 조도 센서
  4. 7447 IC 칩을 이용하여 Anod FND 제어
  5. AD/DA 컨버터를 이용하여 온도 측정

프로세스는 데몬화를 하였고, 디바이스 제어는 모두 동적 라이브러리를 사용하였습니다.

서버

서버는 해당 장치들에 대한 처리를 담당합니다. Daemon 프로세스로 제작하여 터미널 실행과 무관하게 실행되도록 제작합니다.
stdin, stdout, stderr 역시 모두 정리합니다.

클라이언트

원하는 실행 내용을 서버에 요청합니다. 위에서 언급한 LED, 부저, 조도센서, 7segment, AD/DA컨버터를 작동하여 각각의 실행을 할 수 있습니다.

개발 일정

1일차

  • 서버-클라이언트의 TCP 통신 환경 구축 ✅ 2026-06-02
    • 서버 TCP 소켓 생성 ✅ 2026-06-02
    • 클라이언트 TCP 소켓 생성 ✅ 2026-06-02
    • 서버에서 무한으로 값을 받기 ✅ 2026-06-02
    • 클라이언트에서 무한으로 값을 보내기 ✅ 2026-06-02
  • Makefile 간단 제작 ✅ 2026-06-02
  • Thread 제어 ✅ 2026-06-02
  • Daemon 프로세스로 제어 ✅ 2026-06-02
    • 파일 디스크립터 삭제 ✅ 2026-06-02
    • 시그널 핸들링 ✅ 2026-06-02
    • 부모 프로세스 종료 ✅ 2026-06-02
  • README.md 관리 시작 ✅ 2026-06-02
  • Client Signal 제어 ✅ 2026-06-02
  • 개발 문서 초안 작성 ✅ 2026-06-02

2일차

  • LED 제어(pwm) ✅ 2026-06-03
  • 조도 센서 제어 ✅ 2026-06-04
  • 7 segment 제어 ✅ 2026-06-04
  • 부저 제어 ✅ 2026-06-03
  • Shared Library로 작성 ✅ 2026-06-03
  • README.md 기술 ✅ 2026-06-04
  • 온도 센서 제어 ✅ 2026-06-04

3일차

  • README.md 마무리 ✅ 2026-06-05
  • 대몬 로그파일 만들기 ✅ 2026-06-05
  • 개발 문서 정리 ✅ 2026-06-05
  • 최종 코드 정리 ✅ 2026-06-05

세부 구현 내용

장치 구현 사항

모든 장치는 thread를 이용하여 처리합니다. LED, 부저, 7segment는 모두 detach하여 사용하며, 조도 및 온도 센서는 join으로 값을 받아 처리하도록 되어있습니다.

LED

LED는 가장 기본적인 장치 중 하나입니다. 해당 프로젝트에서는 LED 밝기를 100%, 75%, 50%, 25%, 0%로 구분합니다.
PWM을 이용하여 LED의 밝기를 제어할 수 있습니다.
클라이언트에서 LED의 밝기를 제어할 수 있습니다.

---------- LED Control Mode ----------
Select your mode:
1. LED 100% ON
2. LED 70% ON
3. LED 50% ON
4. LED 25% ON
5. LED OFF
What do you want to see:

부저

클라이언트에서 부저 재생을 할 수 있습니다. 단순한 beep 소리가 아닌, 음악 소리가 나오도록 제작합니다. 클라이언트에서 부저를 끌 수 있습니다.

---------- BUZZER Control Mode ----------
Select your mode:
1. BUZZER ON
2. BUZZER OFF
What do you want to see:

조도 센서

클라이언트에서 조도 센서의 값을 확인할 수 있습니다. 이 때, 조도 센서는 밝기 값을 파악하여 클라이언트에 돌려줍니다.
LED와 연계하여 만약 밝다면 LED를 끄고, 어둡다면 LED를 켤 수 있습니다.

---------- CDS Control Mode ----------
Select your mode:
1. Check CDS value
2. Control LED with CDS
What do you want to see:

7 segment

디지털 숫자를 표시할 수 있는 장치입니다. 클라이언트에서 요청 시 매 초 9부터 0까지 거꾸로 숫자를 셉니다. 0에 도달하면 동시에 부저를 울립니다.

---------- FND Control Mode ----------
Select Integer Number(0~9):

AD/DA 컨버터

현재 온도를 측정하여 클라이언트에 반환합니다.

What do you want to see: 5
CURRENT TEMPERATURE: 23 C

시그널 처리

클라이언트는 인터럽트 시그널(SIG_INT) 를 제외한 모든 시그널을 무시하도록 합니다.
서버는 Daemon 프로세스로, 터미널 관련 시그널(SIG_HUP) 를 무시하도록 합니다.

동적 라이브러리

동적 라이브러리의 위치를 daemon 프로세스가 되기 전에 잡아두었습니다. lib 폴더 안에 라이브러리를 수정하여 넣으면 서버를 다운하지 않고도 장치 변경 사항을 처리할 수 있습니다.

서버 로그 확인

서버는 daemon 프로세스로 실행되므로 로그를 통해 실행 상태를 확인할 수 있습니다.
journalctl -f -t devicd_control 을 통해 로그를 볼 수 있습니다.
로그에는 클라이언트 연결 여부, 현재 클라이언트에게 입력받은 값 등을 받을 수 있습니다.

로그는 다음과 같이 나옵니다.

Jun 05 12:26:20 jhBerry device_control[13940]: Daemon Process
Jun 05 12:26:31 jhBerry device_control[13940]: server: got connection from 100.69.83.76
Jun 05 12:26:36 jhBerry device_control[13940]: input: 42
Jun 05 12:26:36 jhBerry device_control[13940]: fnd trhead start: inputNUM=2
Jun 05 12:26:39 jhBerry device_control[13940]: input: 50
Jun 05 12:26:39 jhBerry device_control[13940]: temperature thread start
Jun 05 12:26:39 jhBerry device_control[13940]: temperature thread finish
Jun 05 12:26:39 jhBerry device_control[13940]: send temperature data
Jun 05 12:26:43 jhBerry device_control[13940]: input: 11
Jun 05 12:26:43 jhBerry device_control[13940]: led thread start
Jun 05 12:26:43 jhBerry device_control[13940]: led thread detach
Jun 05 12:26:50 jhBerry device_control[13940]: input: 31
Jun 05 12:26:50 jhBerry device_control[13940]: cds thread start
Jun 05 12:26:50 jhBerry device_control[13940]: cds: bright
Jun 05 12:26:50 jhBerry device_control[13940]: send cds data
Jun 05 12:39:13 jhBerry device_control[13940]: input: 0
Jun 05 12:39:13 jhBerry device_control[13940]: client LOGOUT

문제점 및 보완 사항

  • CMake를 사용하여 제작을 완료하고 싶었지만, CMake는 기본적으로 컴파일러를 여러개 지정하는 것이 불편하여 Makefile로 제작하게 되었습니다. 추후 CMake에 대해 더 알아본 뒤, CMake로 빌드 프로세스를 구축하고자 합니다.
  • CDS 센서를 AD/DA 컨버터가 아닌 일반 조도 센서를 사용하였습니다. 이에 따라 밝기 값을 밝다/어둡다 로만 판단할 수 있어 컨버터를 통해 바꾸어주도록 보완할 수 있습니다.
  • 부저가 실행중일 때, 다시 부저를 울리면 부저가 중복되어 실행됩니다.
  • 다중 클라이언트가 접속할 수 없습니다. 한 번에 한 클라이언트만 접속할 수 있습니다.
  • SIG_INT를 통해 클라이언트 종료 시, 로그가 비정상적으로 나타날 수 있습니다.

관련글 더보기

댓글 영역