Raspberry Pi 4์์ ๋์ํ๋ TCP ๊ธฐ๋ฐ ๋ฉํฐ์ค๋ ๋ IoT ์ฅ์น ์ ์ด ์์คํ ์ ๋๋ค. ์น ๋์๋ณด๋์ CLI ํด๋ผ์ด์ธํธ๋ฅผ ํตํด LED, ๋ถ์ , 7์ธ๊ทธ๋จผํธ, ์กฐ๋์ผ์๋ฅผ ์๊ฒฉ์ผ๋ก ์ ์ดํ๊ณ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ poll() ๊ธฐ๋ฐ I/O ๋ค์คํ, pthread ๊ธฐ๋ฐ ์์ฒญ ์ฒ๋ฆฌ, dlopen/dlsym ๊ธฐ๋ฐ ์ฅ์น ๋๋ผ์ด๋ฒ ๋์ ๋ก๋ฉ, GPIO ๊ณต์ ์ํ ๋๊ธฐํ, ๋ฐ๋ชฌ ์คํ์ ํ์ตํ๊ธฐ ์ํ ์์คํ
ํ๋ก๊ทธ๋๋ฐ ํ๋ก์ ํธ์
๋๋ค.
| ์ ์ถ๋ฌผ | ํ์ผ | ๋ด์ฉ |
|---|---|---|
| ๊ฐ๋ฐ๋ฌธ์ | ๊ฐ๋ฐ๋ฌธ์.md | ํ๋ก์ ํธ ๊ฐ์, ๊ฐ๋ฐ ์ผ์ , ์ธ๋ถ ๊ตฌํ ๋ด์ฉ, ๋ฌธ์ ์ ๋ฐ ๋ณด์ ์ฌํญ |
| README | README.md | ์์ค ๊ตฌ์กฐ, ๋น๋ ๋ฐฉ๋ฒ, ๋ฐฐํฌ ๋ฐ ์คํ ๋ฐฉ๋ฒ |
| ์คํ ๊ณผ์ ๋ฌธ์ | ์คํ_๊ณผ์ .md | ๋น๋, ๋ฐฐํฌ, ์๋ฒ ์คํ, ์น/CLI ์ฅ์น๋ณ ์์ฐ ์์ |
| ์์ฐ ํญ๋ชฉ | ๋งํฌ |
|---|---|
| ์ ์ฒด ์์ฐ | โถ YouTube์์ ๋ณด๊ธฐ |
| ํ๊ฐ ํญ๋ชฉ | ๋์ ๋ด์ฉ |
|---|---|
| LED ์ ์ด | /led/on, /led/mid, /led/off, /led/brightness?value=0..1024 ๋ฐ CLI LED ๋ฉ๋ด |
| ๋ถ์ ์ ์ด | /buzz/do ๋ฑ ๊ณ์ด๋ฆ, ์ซ์ ์๊ณ, ์ง์ ์ฃผํ์, /buzz/off, /buzz/fein |
| ์กฐ๋์ผ์ | /pr ์๋ ๋ก๊ทธ ADC ์กฐํ, /pr/digital ๋์งํธ ์กฐํ, /pr/auto/start ์๋ LED ์ ์ด |
| 7์ธ๊ทธ๋จผํธ | /segment/start, /segment/<0..9>, /segment/show/<0..9>, /segment/off |
| ๊ตฌํ ๋ด์ฉ | poll() ์ฐ๊ฒฐ ๊ฐ์, ์์ฒญ๋ณ pthread_detach, ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฆฌ, GPIO ๋ฎคํ
์ค, ๋ฐ๋ชฌ ๋ชจ๋, ์๋ชป๋ ๋ช
๋ น 400 ์๋ต, ๊ฒฝ๋ก ์ํ ์ฐจ๋จ |
| ์ฌ์ฉ์ ํธ์์ฑ | ์น ๋์๋ณด๋์ CLI ํด๋ผ์ด์ธํธ ๋ณํ ์ ๊ณต, -f ์ ๊ฒฝ ๋๋ฒ๊ทธ ๋ชจ๋, SIGINT ์ข
๋ฃ ์ฒ๋ฆฌ |
| ๋ฌธ์ | README, ๊ฐ๋ฐ๋ฌธ์, ์คํ ๊ณผ์ text ํ์ผ ์์ฑ |
| ์ถ๊ฐ ๊ธฐ๋ฅ | PWM ๋ฐ๊ธฐ ์ ์ด, FEIN ์๋ฆผ ๋ฉ๋ก๋, ์กฐ๋ ๊ธฐ๋ฐ ์๋ฒ ์๋ LED ์ ์ด, ์ค์๊ฐ ํ์ฑ ์ค๋ ๋ ๋ชจ๋ํฐ, GitHub Issues ๊ธฐ๋ฐ ๋ฌธ์ ์ถ์ |
| ๋ฌธ์ | ๋งํฌ |
|---|---|
| ๊ธฐํ์ | TCP ์๊ฒฉ ์ฅ์น ์ ์ด ํ๋ก๊ทธ๋จ |
| ๊ฐ๋ฐ ๋ช ์ธ์ | TCP ์๋ฒ/ํด๋ผ์ด์ธํธ ๋ฐ ์ฅ์น ์ ์ด |
| ๊ฐ๋ฐ๋ฌธ์ | ํ๋ก์ ํธ ๊ฐ์, ์ผ์ , ๊ตฌํ ๋ด์ฉ, ๋ฌธ์ ์ ๋ฐ ๋ณด์ |
gantt
title VEDA Multi-Sensor TCP Control System ๊ฐ๋ฐ ์ผ์
dateFormat YYYY-MM-DD
axisFormat %m/%d
section 1๋จ๊ณ - ์ค๊ณ
TCP ์๋ฒ/ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ์ค๊ณ :done, d1-1, 2026-06-01, 1d
์ฅ์น๋ณ ํ์ผ ๋ถ๋ฆฌ ๋ฐฉํฅ ์๋ฆฝ :done, d1-2, 2026-06-01, 1d
section 2๋จ๊ณ - ๊ธฐ๋ณธ ๊ตฌํ
LED ์ ์ด ๊ตฌํ :done, d2-1, 2026-06-02, 1d
๋ถ์ ์ ์ด ๊ตฌํ :done, d2-2, 2026-06-02, 1d
์กฐ๋์ผ์ ์ ์ด ๊ตฌํ :done, d2-3, 2026-06-02, 1d
7์ธ๊ทธ๋จผํธ ์ ์ด ๊ตฌํ :done, d2-4, 2026-06-02, 1d
์น ๋์๋ณด๋ ๋ฆฌ์์ค ์ฐ๊ฒฐ :done, d2-5, 2026-06-02, 1d
section 3๋จ๊ณ - ๊ตฌ์กฐ ๋ณด๊ฐ
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ ํ์ (dlopen) :done, d3-1, 2026-06-03, 1d
GPIO ๊ณต์ ์ํ/๋ฎคํ
์ค ๋ณด๊ฐ :done, d3-2, 2026-06-03, 1d
๋ฐ๋ชฌ ๋ชจ๋ ๊ตฌํ :done, d3-3, 2026-06-03, 1d
์๊ทธ๋ ์ฒ๋ฆฌ ๋ณด์ :done, d3-4, 2026-06-03, 1d
section 4๋จ๊ณ - ์์ ํ ๋ฐ ๋ฌธ์
ํด๋ผ์ด์ธํธ ์
๋ ฅ ๊ฒ์ฆ ๊ฐํ :done, d4-1, 2026-06-04, 1d
์๊ทธ๋ ์์ ์ฑ ๊ฐ์ (sigaction) :done, d4-2, 2026-06-04, 1d
์ฐ๊ฒฐ ์ฌ์๋ (์ง์ ๋ฐฑ์คํ) :done, d4-3, 2026-06-04, 1d
ํ์ฑ ์ค๋ ๋ ๋ชจ๋ํฐ๋ง ๊ตฌํ :done, d4-4, 2026-06-04, 1d
๋ฌธ์ ์ ๋ฆฌ ๋ฐ GitHub Issues ๋ฐ์ :done, d4-5, 2026-06-04, 1d
section 5๋จ๊ณ - ๋ฒ๊ทธ ์์
์๋ชป๋ ๋ช
๋ น 400 ์๋ต ์ฒ๋ฆฌ :done, d5-1, 2026-06-05, 1d
์ ์ ํ์ผ ๊ฒฝ๋ก ์ํ ์ฐจ๋จ :done, d5-2, 2026-06-05, 1d
VEDA_4Sensor_TCP_Control/
โโโ Makefile # ํฌ๋ก์ค ์ปดํ์ผ ๋น๋ ์คํฌ๋ฆฝํธ (sysroot ์ค์ ์ ์ฉ)
โโโ Makefile.simple # ์ผ๋ฐ ํ๊ฒฝ์ฉ ๋จ์ ๋น๋ ์คํฌ๋ฆฝํธ
โโโ README.md # ํ๋ก์ ํธ ์๊ฐ ๋ฐ ๋น๋/์คํ ์๋ด
โโโ ๊ฐ๋ฐ๋ฌธ์.md # ๊ฐ๋ฐ ๊ณผ์ ๋ฐ ์ธ๋ถ ๊ตฌํ ๋ฌธ์
โโโ ์คํ_๊ณผ์ .md # ๋น๋~์์ฐ ์ ์ฒด ์ ์ฐจ
โ
โโโ src/ # ์์ค ์ฝ๋
โ โโโ main.c # TCP ์๋ฒ (poll + pthread, ๋ฐ๋ชฌ, ๋์ ๋ก๋ฉ)
โ โโโ client.c # CLI ํด๋ผ์ด์ธํธ (Ubuntu Linux์ฉ)
โ
โโโ include/ # ๊ณต์ ํค๋ ํ์ผ
โ โโโ rpi_common.h # GPIO ์ด๊ธฐํ, ๋ฎคํ
์ค, ๊ณต์ ์ํ ์ ์ธ
โ โโโ led.h # LED ๋๋ผ์ด๋ฒ ์ธํฐํ์ด์ค
โ โโโ buzzor.h # ๋ถ์ ๋๋ผ์ด๋ฒ ์ธํฐํ์ด์ค
โ โโโ photoresistor.h # ์กฐ๋์ผ์ ๋๋ผ์ด๋ฒ ์ธํฐํ์ด์ค
โ โโโ segment.h # 7์ธ๊ทธ๋จผํธ ๋๋ผ์ด๋ฒ ์ธํฐํ์ด์ค
โ
โโโ lib/ # ์ฅ์น ๋๋ผ์ด๋ฒ ์์ค (โ .so ๋น๋)
โ โโโ rpi_common.c # wiringPi ์ด๊ธฐํ, GPIO ๋ฎคํ
์ค ๊ตฌํ
โ โโโ led.c # LED ON/MID/OFF/PWM ์ ์ด
โ โโโ buzzor.c # ๋ถ์ ๊ณ์ด๋ฆ/์ฃผํ์/์๋ฆผ ๋ฉ๋ก๋
โ โโโ photoresistor.c # ADC ์๋ ๋ก๊ทธ + ๋์งํธ ์กฐ๋ ์ฝ๊ธฐ
โ โโโ segment.c # 7์ธ๊ทธ๋จผํธ ์นด์ดํธ๋ค์ด/๋จ๋ฐ ํ์
โ
โโโ resources/ # ์น ๋์๋ณด๋ HTML
โ โโโ index.html # ๋ฉ์ธ ํ์ด์ง (์ฅ์น ๋ฉ๋ด)
โ โโโ led.html # LED ์ ์ด UI
โ โโโ buzzer.html # ๋ถ์ ์ ์ด UI
โ โโโ segment.html # 7์ธ๊ทธ๋จผํธ ์ ์ด UI
โ โโโ pr.html # ์กฐ๋์ผ์ ์กฐํ/์๋ ์ ์ด UI
โ
โโโ docs/ # ๋ฌธ์ ๋ฐ ์ด๋ฏธ์ง
โโโ images/
โ โโโ raspberry-pi-4-sensor-output-circuit.png
โโโ issue_report.md # ์ด์ ํด๊ฒฐ ๋ณด๊ณ ์
๋น๋ ํ ํ๋ก์ ํธ ๋ฃจํธ์ server, client, lib*.so ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ฑ๋๋ฉฐ, .gitignore์ ์ํด Git ์ถ์ ์์ ์ ์ธ๋ฉ๋๋ค.
Web Browser / CLI Client
|
| HTTP-like TCP request (:8000)
v
src/main.c
- poll() ๊ธฐ๋ฐ ์ฐ๊ฒฐ ๊ฐ์
- ์์ฒญ๋ณ detached pthread ์ฒ๋ฆฌ
- ์ ์ HTML ๋ฆฌ์์ค ์ ๊ณต
- ์ฅ์น ์ ์ด API ๋ผ์ฐํ
- ์กฐ๋์ผ์ ๊ธฐ๋ฐ ์๋ LED ์ ์ด ์ค๋ ๋
|
+-- libled.so
+-- libbuzzor.so
+-- libsegment.so
+-- libphotoresistor.so
|
v
lib/rpi_common.c / include/rpi_common.h
- wiringPi ์ด๊ธฐํ
- GPIO ๋ฎคํ
์ค
- LED ์ํ ๋ฐ ์นด์ดํธ๋ค์ด ์ทจ์ ํ๋๊ทธ ๊ณต์
|
v
Raspberry Pi 4 GPIO / I2C
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ๋ช
์ ํ์ฌ ์ฝ๋์ ๋์ผํ๊ฒ libbuzzor.so๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ฒ๋ ๋น๋๊ธฐ์์ผ๋ก ๋ค์์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๊ณ ์ ์ดํ๊ธฐ ์ํด 3๊ฐ์ง ์ข ๋ฅ์ ์ค๋ ๋๋ก ์ค๊ณ๋์ด ๋์ํฉ๋๋ค.
| ์ค๋ ๋ ํ์ | ์์ฑ ๋ฐ ๊ด๋ฆฌ ๋ฐฉ์ | ์ฃผ์ ์ญํ ๋ฐ ์๋ช |
|---|---|---|
| ๋ฉ์ธ ์ค๋ ๋ (Main Thread) | ํ๋ก์ธ์ค ๊ธฐ๋ ์ ๊ธฐ๋ณธ ์์ฑ | * poll()์ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ ์์ผ ์ฐ๊ฒฐ ์์ * ์ ๊ท ์ ์ ์ด๋ฒคํธ ๋ฐ์ ์ clnt_connection ์ค๋ ๋ ์์ฑ ๋ฐ pthread_detach* ์๋ฒ ์ข ๋ฃ( SIGINT/SIGTERM) ์์ ์ auto_pr_thread๋ฅผ joinํ๊ณ , ํ์ฑ ์์ฒญ ์ค๋ ๋๋ค์ด ์์์ ๋ฐํํ ๋๊น์ง ์์ ํ๊ฒ ๋๊ธฐ(Graceful Shutdown) |
| ํด๋ผ์ด์ธํธ ์ค๋ ๋ (Client Thread) | ์ฐ๊ฒฐ ์์ ์ pthread_create๋ก ๋์ ์์ฑ |
* **๋ถ๋ฆฌ ์ํ(Detached)๋ก ์คํ๋์ด ์ค์ค๋ก ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๋ฆฌthread_list_mutex ๋๊ธฐํ ํ์ ์ ์ญ ์ค๋ ๋ ์ ๋ณด ๋ฐฐ์ด(active_threads)์ ์์ ์ ์ ๋ณด(TID, Client IP, Command, Start Time)๋ฅผ ๋ฑ๋ก/ํด์ ์ธ๊ทธ๋จผํธ ์นด์ดํธ๋ค์ด( segment/start)๊ณผ ๊ฐ์ด ์ง์ฐ ์๊ฐ(delay(1000))์ด ํฌํจ๋ ๋ช
๋ น ์ํ ์, ์คํ ์๊ฐ๋งํผ ์ค๋ ๋๊ฐ ์ ์ง๋์ด ๋ชจ๋ํฐ๋ง ํ
์ด๋ธ์ ์ค์๊ฐ ๋
ธ์ถ |
| ์๋ ์กฐ๋ ์ ์ด ์ค๋ ๋ (Auto PR Thread) | /pr/auto/start ์์ฒญ ์ pthread_create๋ก ์์ฑ |
* **์กฐ์ธ ๊ฐ๋ฅ ์ํ(Joinable)๋ก ์์ฑ๋์ด ๋จ ํ๋๋ง ๋
๋ฆฝ์ ์ผ๋ก ๊ตฌ๋auto_pr_running ํ๋๊ทธ๊ฐ ํ์ฑํ๋ ๋์ 1์ด ์ฃผ๊ธฐ๋ก ์กฐ๋์ผ์ ๋์งํธ ๊ฐ์ ์ฝ์ด LED๋ฅผ ์๋ ์ ์ด/pr/auto/stop ์์ฒญ ๋๋ ์๋ฒ ์ข
๋ฃ ์ ํ๋๊ทธ๊ฐ 0์ผ๋ก ๊บผ์ง๋ฉด์ ๋ฃจํ ํ์ถ ํ ์ข
๋ฃ๋๋ฉฐ pthread_join์ผ๋ก ์๊ฑฐ๋จ |
์ค์ ํ ์ฐ๊ฒฐ ๋ฐ ์ธ๊ทธ๋จผํธ ํ์
์ ์๋ ํ๋งต๊ณผ ์ฝ๋ ์ค์ (include/rpi_common.h, lib/segment.c)์ ์ฐ์ ํฉ๋๋ค.
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ์น ๋์๋ณด๋ | resources/ ์๋ HTML ํ์ด์ง๋ก LED, ๋ถ์ , 7์ธ๊ทธ๋จผํธ, ์กฐ๋์ผ์๋ฅผ ์ ์ด |
| CLI ํด๋ผ์ด์ธํธ | client <RPI_IP>๋ก ์๋ฒ์ ์ ์ํด ์ฅ์น ์ ์ด ๋ช
๋ น ์ ์ก |
| LED ์ ์ด | ON, MID, OFF ๋ฐ 0~1024 ๋ฐ๊ธฐ ๊ฐ ์
๋ ฅ (์๋ฒ ๋ด๋ถ์์ softPwm 0~100์ผ๋ก ๋งคํ) |
| ๋ถ์ ์ ์ด | ๊ณ์ด๋ฆ, ์ซ์ ์๊ณ, ์ง์ ์ฃผํ์, ์๋ฆผ ๋ฉ๋ก๋ ์ ์ด |
| 7์ธ๊ทธ๋จผํธ | ์นด์ดํธ๋ค์ด, ๋จ์ผ ์ซ์ ํ์, OFF ์์ฒญ ๊ธฐ๋ฐ ์ทจ์ ์ฒ๋ฆฌ |
| ์กฐ๋์ผ์ | PCF8591 I2C ADC ๊ฐ ์กฐํ, ๋์งํธ ์กฐ๋ ๊ฐ ์กฐํ, ์๋ LED ์ ์ด |
| ์ค๋ ๋ ๋ชจ๋ํฐ๋ง | ์น ๋ฉ์ธ ๋์๋ณด๋์์ ์๋ฒ ๋ด ๋น๋๊ธฐ ํ์ฑ ์ค๋ ๋ ๋ชฉ๋ก(TID, IP, ์์ , Uptime)์ ์ค์๊ฐ์ผ๋ก 1.5์ด ์ฃผ๊ธฐ ๋ ๋๋ง |
| ๋ฐ๋ชฌ ๋ชจ๋ | ๊ธฐ๋ณธ ์คํ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ๋ชฌ์ผ๋ก ์คํ, -f ๋๋ --foreground๋ก ์ ๊ฒฝ ์คํ |
| ๊ฒฝ๋ก | ๋์ |
|---|---|
/ |
resources/index.html ์ ๊ณต |
/led/on |
LED ์ต๋ ๋ฐ๊ธฐ ON |
/led/mid |
LED ์ค๊ฐ ๋ฐ๊ธฐ |
/led/off |
LED OFF ๋ฐ ์นด์ดํธ๋ค์ด ์ทจ์ ํ๋๊ทธ ์ค์ |
/led/brightness?value=0..1024 |
PWM ๋ฐ๊ธฐ ์ ์ด |
/led/state |
์๋ฒ๊ฐ ์ถ์ ์ค์ธ LED ์ํ ์กฐํ |
/buzz/do, /buzz/re, ... |
๋ถ์ ๊ณ์ด๋ฆ ์ฌ์ |
/buzz/1 ~ /buzz/8 |
๋ถ์ ์ซ์ ์๊ณ ์ฌ์ |
/buzz/<frequency> |
์ง์ ์ฃผํ์ ์ฌ์ |
/buzz/off |
๋ถ์ ์ ์ง |
/buzz/fein ๋๋ /buzz/alert |
์๋ฆผ ๋ฉ๋ก๋ ์ฌ์ |
/segment/start |
9๋ถํฐ 0๊น์ง ์นด์ดํธ๋ค์ด |
/segment/<0..9> |
์ง์ ์ซ์๋ถํฐ 0๊น์ง ์นด์ดํธ๋ค์ด |
/segment/show/<0..9> |
์ง์ ์ซ์ ๋จ๋ฐ ํ์ |
/segment/off |
7์ธ๊ทธ๋จผํธ ๋ฐ LED OFF |
/ldr/start |
/segment/start์ ๋์ผํ ํธํ ๊ฒฝ๋ก |
/pr |
PCF8591 ADC ์๋ ๋ก๊ทธ ์กฐ๋ ๊ฐ ์กฐํ |
/pr/digital |
๋์งํธ ์กฐ๋ ๊ฐ ์กฐํ |
/pr/auto/start |
์๋ฒ ์ธก ์๋ LED ์ ์ด ์์ |
/pr/auto/stop |
์๋ฒ ์ธก ์๋ LED ์ ์ด ์ค์ง |
/api/threads |
ํ์ฌ ํ์ฑ ์ค๋ ๋๋ค์ ์ํ ๋ชฉ๋ก(TID, IP, ๋ช ๋ น์ด, Uptime)์ JSON ๋ฐฐ์ด๋ก ์๋ต |
์๋ ๋ก๊ทธ ์กฐ๋ ๊ฐ์ lib/photoresistor.c์ get_cds_value()๊ฐ PCF8591 I2C ADC์์ ์ฝ์ด ์ต๋๋ค.
| ๊ฐ | ๊ธฐ์ค |
|---|---|
| ADC ๊ฐ | 0~255 ๋ฒ์์ ์๋ ๋ก๊ทธ ์กฐ๋ ๊ฐ |
| ๊ธฐ๋ณธ ์๊ณ๊ฐ | threshold = 200 |
| ๋ฐ์ ํ๋จ | ADC ๊ฐ์ด ์๊ณ๊ฐ๋ณด๋ค ์์ ๋ |
| ์ด๋์ ํ๋จ | ADC ๊ฐ์ด ์๊ณ๊ฐ ์ด์์ผ ๋ |
๋์งํธ ์กฐ๋ ๊ฐ์ get_pr_value()๊ฐ digitalRead(PR_PIN)์ผ๋ก ์ฝ์ต๋๋ค.
์๋ฒ ์๋ LED ์ ์ด๋ ํ์ฌ ๋์งํธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋์ํฉ๋๋ค.
| ๋์งํธ ๊ฐ | ์๋ฏธ | ์๋ ์ ์ด |
|---|---|---|
0 / LOW |
์ด๋์ | LED ON |
1 / HIGH |
๋ฐ์ | LED OFF |
CLI ํด๋ผ์ด์ธํธ๋ ๋ฉ๋ด ๊ธฐ๋ฐ์ผ๋ก ์๋ฒ API ๊ฒฝ๋ก๋ฅผ ์์ฑํฉ๋๋ค.
| ๋ฉ๋ด | ์ ๋ ฅ ์ | ์๋ฒ ์์ฒญ |
|---|---|---|
| LED | ON, MID, OFF, 300 |
/led/on, /led/mid, /led/off, /led/brightness?value=300 |
| Buzzer | do, 5, 880, off |
/buzz/do, /buzz/5, /buzz/880, /buzz/off |
| 7-Segment | start, off, 5, show/5 |
/segment/start, /segment/off, /segment/5, /segment/show/5 |
| Photoresistor | ๋ฉ๋ด ๋ฒํธ 1~5 |
/pr, /pr/digital, /pr/auto/start, /pr/auto/stop |
7์ธ๊ทธ๋จผํธ๋ 1์๋ฆฌ ์ฅ์น์ด๋ฏ๋ก 0~9 ๋จ์ผ ์๋ฆฟ์๋ง ํ์ฉํฉ๋๋ค. 00 ๊ฐ์ ๋ค์ค ์๋ฆฟ์ ์
๋ ฅ์ ํด๋ผ์ด์ธํธ์์ ์ฐจ๋จ๋ฉ๋๋ค.
CLI ํด๋ผ์ด์ธํธ์ ์ ๋ ฅ ๊ฒ์ฆ ํํฉ:
| ๋ฉ๋ด | ๊ฒ์ฆ ๋ด์ฉ |
|---|---|
| LED | ON/MID/OFF ๋ฌธ์์ด ๋๋ 0~1024 ๋ฒ์ ์ซ์๋ง ํ์ฉ |
| 7-Segment | start, off, 0~9(1์๋ฆฌ), show/0~9(1์๋ฆฌ)๋ง ํ์ฉ. ๊ทธ ์ธ ์
๋ ฅ ์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ํ ๋ฉ๋ด ๋ณต๊ท |
| Photoresistor | ์๋ธ ๋ฉ๋ด ๋ฒํธ 1~5 ์ด์ธ ์
๋ ฅ ์ Invalid option ์ถ๋ ฅ |
| ์ฅ์น | wPi Pin | BCM GPIO | Physical Pin | ๋น๊ณ |
|---|---|---|---|---|
| LED | 1 | 18 | 12 | PWM, 220ฮฉ |
| Buzzer | 2 | 27 | 13 | softTone |
| CDS SDA | 8 | 2 | 3 | PCF8591 ADC, I2C 0x48 |
| CDS SCL | 9 | 3 | 5 | PCF8591 ADC, I2C 0x48 |
| CDS Digital | 0 | 17 | 11 | Pull-up, 10kฮฉ |
| 7-Segment A | 21 | 5 | 29 | Common Anode |
| 7-Segment B | 22 | 6 | 31 | Common Anode |
| 7-Segment C | 23 | 13 | 33 | Common Anode |
| 7-Segment D | 24 | 19 | 35 | Common Anode |
| 7-Segment E | 25 | 26 | 37 | Common Anode |
| 7-Segment F | 27 | 16 | 36 | Common Anode |
| 7-Segment G | 28 | 20 | 38 | Common Anode |
| 7-Segment DP | 29 | 21 | 40 | Common Anode |
| Default VCC | - | - | 1 | 3.3V |
| 7-Segment VCC | - | - | 2 | 5V |
| Default GND | - | - | 9 | GND |
Makefile์ ์๋ฒ์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Raspberry Pi์ฉ AArch64 ๋ฐ์ด๋๋ฆฌ๋ก ํฌ๋ก์ค ์ปดํ์ผํ๊ณ , CLI ํด๋ผ์ด์ธํธ๋ ํธ์คํธ PC์ฉ gcc๋ก ๋น๋ํฉ๋๋ค.
ํ์ํ ๋๊ตฌ์ ๊ฒฝ๋ก:
aarch64-linux-gnu-gcc
gcc
make
~/rpi-sysroot
~/rpi-sysroot/usr/local/include
~/rpi-sysroot/usr/local/lib~/rpi-sysroot์๋ Raspberry Pi์ wiringPi ํค๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค.
๋น๋ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ํฉํ Makefile์ ์ ํํฉ๋๋ค.
- ๊ฐ์ธ ๊ฐ๋ฐ ํ๊ฒฝ (sysroot ์ ์ฉ): ๊ธฐ๋ณธ ์ ๊ณต๋๋
Makefile์ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค. - ๋ฐฐํฌ ๋ฐ ์ผ๋ฐ ํ๊ฒฝ (sysroot ๋ฏธ์ ์ฉ):
Makefile.simple์ ๋ณต์ฌํ์ฌ ์ฌ์ฉํฉ๋๋ค.rm -f Makefile cp Makefile.simple Makefile
ํ๋ก์ ํธ ๋ฃจํธ์์ ์คํํฉ๋๋ค.
make clean && make๋น๋ ๊ฒฐ๊ณผ:
| ํ์ผ | ์ค๋ช |
|---|---|
server |
Raspberry Pi์์ ์คํํ TCP ์น ์๋ฒ |
client |
ํธ์คํธ PC์์ ์คํํ CLI ํด๋ผ์ด์ธํธ |
libled.so |
LED ์ ์ด ๋๋ผ์ด๋ฒ |
libbuzzor.so |
๋ถ์ ์ ์ด ๋๋ผ์ด๋ฒ |
libphotoresistor.so |
์กฐ๋์ผ์ ๋๋ผ์ด๋ฒ |
libsegment.so |
7์ธ๊ทธ๋จผํธ ๋๋ผ์ด๋ฒ |
๋ฐฐํฌ ๊ธฐ์ค ๊ฒฝ๋ก๋ /home/sunbi/prj๋ก ํต์ผํฉ๋๋ค.
์๋ฒ๋ ๋ฐ๋ชฌ ์คํ ์ /proc/self/exe๋ฅผ ํตํด ์คํ ํ์ผ์ด ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ๋ฏ๋ก, ์คํ ํ์ผ๊ณผ lib*.so, resources/๊ฐ ๊ฐ์ ๋๋ ํ ๋ฆฌ ์๋์ ์์ผ๋ฉด ๋ฉ๋๋ค.
# ๊ธฐ๋ณธ ๋ณ์(RPI_USR=sunbi, RPI_IP=192.168.0.100, RPI_DIR=/home/sunbi/prj)๋ฅผ ์ฌ์ฉ
make deploy
# ํน์ IP, ๊ณ์ , ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ๋ฐฐํฌ
make deploy RPI_IP=192.168.1.50 RPI_USR=pi RPI_DIR=/home/pi/myprojectssh sunbi@<RPI_IP> "mkdir -p /home/sunbi/prj"
scp server lib*.so sunbi@<RPI_IP>:/home/sunbi/prj/
scp -r resources sunbi@<RPI_IP>:/home/sunbi/prj/Raspberry Pi์์ ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
cd /home/sunbi/prj
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./server์ ๊ฒฝ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด์ ๋๋ฒ๊น ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.
cd /home/sunbi/prj
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./server -fํธ์คํธ PC์์ CLI ํด๋ผ์ด์ธํธ๋ฅผ ์คํํฉ๋๋ค.
./client <RPI_IP>์น ๋์๋ณด๋๋ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์ฃผ์๋ก ์ ์ํฉ๋๋ค.
http://<RPI_IP>:8000/
| ์๊ทธ๋ | ์ฒ๋ฆฌ ๋ฐฉ์ |
|---|---|
SIGINT, SIGTERM, SIGHUP |
sigaction()์ผ๋ก ๋ฑ๋ก. volatile sig_atomic_t server_running ํ๋๊ทธ๋ฅผ 0์ผ๋ก ์ค์ ํ์ฌ ๋ฉ์ธ ๋ฃจํ๋ฅผ ์์ ํ๊ฒ ์ข
๋ฃ |
| ์๊ทธ๋ | ์ฒ๋ฆฌ ๋ฐฉ์ |
|---|---|
SIGINT |
sigaction()์ผ๋ก ๋ฑ๋ก. volatile sig_atomic_t server_running ํ๋๊ทธ ๋ฐฉ์์ผ๋ก ๋ฉ์ธ ๋ฃจํ๋ฅผ ํ์ถํ ๋ค, ๋ฉ์ธ ์ค๋ ๋์์ pr/auto/stop ์์ฒญ ์ ์ก ๋ฐ ์์ผ ์ ๋ฆฌ ํ ์์ ์ข
๋ฃ |
SIGTSTP |
๋ฌด์ (SIG_IGN) |
SIGQUIT |
๋ฌด์ (SIG_IGN) |
์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋ ์๊ทธ๋ ํธ๋ค๋ฌ ๋ด๋ถ์์๋ volatile sig_atomic_t ํ๋๊ทธ๋ง ์ค์ ํ๊ณ , I/O ์์
์ ๋ฉ์ธ ์ค๋ ๋์์ ์ํํ์ฌ POSIX ๋น๋๊ธฐ ์๊ทธ๋ ์์ ์ฑ์ ์ค์ํฉ๋๋ค.
CLI ํด๋ผ์ด์ธํธ์ send_command() ํจ์๋ ์๋ฒ ์ฐ๊ฒฐ ์คํจ ์ ์ต๋ 3ํ ์๋(์ด๊ธฐ 1ํ + ์ฌ์๋ 2ํ)๋ฅผ ์ง์ ๋ฐฑ์คํ(Exponential Backoff) ๋ฐฉ์์ผ๋ก ์ํํฉ๋๋ค.
| ์๋ | ๋๊ธฐ ์๊ฐ |
|---|---|
| 1์ฐจ ์๋ ์คํจ | 1์ด ๋๊ธฐ ํ ์ฌ์๋ |
| 2์ฐจ ์๋ ์คํจ | 2์ด ๋๊ธฐ ํ ์ฌ์๋ |
| 3์ฐจ ์๋ ์คํจ | ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ํ ๋ฉ๋ด ๋ณต๊ท |
ํ๋ก์ ํธ ๊ฐ๋ฐ ์ค ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ์ ๊ฐ์ ์ฌํญ์ GitHub Issues์์ ๊ด๋ฆฌํฉ๋๋ค.
| ์ด์ ๋ฆฌํฌํธ | ๋ด์ฉ |
|---|---|
| issue_report.md | Active Thread Monitor API ์ค์ฒฉ ์ค๋ฅ ํด๊ฒฐ |
| issue_report_response_code.md | ์๋ชป๋ ๋ช ๋ น 400 ์๋ต ๋ฐ ๊ฒฝ๋ก ์ํ ์ฐจ๋จ |
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์๋ชป๋ ๋ช ๋ น์ 200 OK ๋ฐํ | ์ฅ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐํ ํ์
์ void โ int๋ก ๋ณ๊ฒฝํ์ฌ ์คํจ ์ 400 Bad Request๋ฅผ ๋ฐํํ๋๋ก ์์ |
| ์ ์ ํ์ผ ๊ฒฝ๋ก ์ํ ์ทจ์ฝ์ | sendData()์์ .. ๊ฒฝ๋ก๋ฅผ ์ฐจ๋จํ๊ณ , ํ์ผ ์ด๊ธฐ ์ฑ๊ณต ํ์ 200 OK ํค๋๋ฅผ ์ ์กํ๋๋ก ์์ ๋ณ๊ฒฝ |
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ์กฐ๋์ผ์ ์๋ ์ ์ด ์ข ๋ฃ์ฑ | cdsControl()์ ๋ฌดํ ๋ฃจํ ๊ตฌ์กฐ์ด๋ฏ๋ก ์๋ฒ ์๋ ์ ์ด๋ get_pr_value()๋ฅผ ์ฃผ๊ธฐ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋์ฒด๋์ด ์์ต๋๋ค. |
| ์นด์ดํธ๋ค์ด ์ ๋ฐ๋ | delay(1000)๊ณผ GPIO ๋ฎคํ
์ค ์ฌํ๋ ํ์ด๋ฐ์ ๋ฐ๋ผ ์งํฐ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. |
| ๋ผ์ด์ ์ค ํ์ผ | README์๋ MIT License๋ก ํ๊ธฐ๋์ด ์์ผ๋, ๋ณ๋ LICENSE ํ์ผ ์ถ๊ฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. |
- ์์ฒญ ๊ธฐ๋ฐ ์ค์๊ฐ ๋ก๋ (On-Demand Loading): ์๋ฒ๋ ๊ตฌ๋ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ตฌ ๋ก๋ํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ฐ์ํ๊ฑฐ๋ ์ ์ด ๋ฃจํ๊ฐ ์คํ๋ ๋๋ง๋ค
dlopen()์ ํตํด.soํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ ์ ์ด ์๋ฃ ์dlclose()๋ก ์ฆ์ ๋ด๋ฆฝ๋๋ค. - ๋ฌด์ค๋จ ์ค์๊ฐ ๋ฐ์: ์๋ฒ๊ฐ ์คํ ์ค์ธ ์ํ์์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ ์ฉ๋
.so๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋น๋ ๋ฐ ๋ฎ์ด์ฐ๊ธฐํ๋ฉด, ์๋ฒ ์ฌ์์์ด๋ ๋ฆด๋ก๋ ์กฐ์ ์์ด ๋ค์ ์ฅ์น ์ ์ด ์์ฒญ ์์ ๋ถํฐ ์ฆ์ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ฌด์ค๋จ(Hot-swap)์ผ๋ก ๋ฐ์๋ฉ๋๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๊ฐ๋ฐ์ | sunbi, VEDA 4๊ธฐ |
| ๋ชฉ์ | Raspberry Pi 4 ํ๊ฒฝ์์ TCP ํต์ , ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๋ฉ, ๋ฉํฐ์ค๋ ๋ GPIO ์ ์ด ํ์ต |
| ๋ผ์ด์ ์ค | MIT License |
