- Project Synopsis
- Tools
- Platform
- Sensor
- Software
- Big Picture
- Project Details
- ํ๋์จ์ด ๊ตฌ์ถ
- ์ปจ๋ฒ ์ด์ด ๋ฒจํธ
- ์ ์ธ์ ์ผ์ ์ฐ๊ฒฐ
- ์นด๋ฉ๋ผ ์คํ์ฉ ์ผ์
- ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์ ์ด์ฉ ์ผ์
- ์๋ณด๋ชจํฐ ์ ์ด์ฉ ์ผ์
- ์๋ณด๋ชจํฐ
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ
- ๊ฒ์ถ๋ ์๊ณผ ์ค์ ์ ํ ํ ๋๋ฆฌ์ ๋์ด ์ฐจ์ด ๋น๊ต๋ฅผ ํตํ ์ค์ฐจ์จ ๊ณ์ฐ
- 10์ฅ์ ์ฌ์ง์ ์ฐ์ด ๊ฐ ์ฌ์ง์ ๋ํด ์์ ๊ฒ์ถ, ์ต์ข ์ ๊ฒ์ถ์จ์ด 90% ์ด์์ผ ๊ฒฝ์ฐ ์ ์ํ
- Hough circle ๋ฉ์๋ ๋ด ์ฌ๋ฌ ๋ณ์๋ค์ ํตํ ์ ์ธ์
- ์์ฑ ์ธ์
- ํ๋์จ์ด ๊ตฌ์ถ
- Demo
- Review
- ํ์ฌ๋ช : 2018 ์ฑ๊ท ๊ด๋ํ๊ต ์ค์ ๋ฌธ์ ํด๊ฒฐํ S-HERO
- ์ฃผ์ต : ์ฑ๊ท ๊ด๋ํ๊ต ์ค์ ๋ฌธ์ ํด๊ฒฐํ S-HERO ๊ณตํ์ธ์ฌ ์์ฑ ์ฌ์ ๋จ
- ์งํ ๊ธฐ๊ฐ : '18.3.1 ~ '18.12.7
- ๋ชฉ์ : Vision ๋ฐ ์์ฑ์ธ์ ๊ธฐ์ ์ ํ์ฉํ์ฌ, ์บ ์ ์กฐ ๊ณต์ ์์ ๋ฐ์ํ ์ ์๋ ๋ถ๋ํ์ ์ ๋ณํ๊ณ , ๋ก๊ทธ ๊ธฐ๋ก ๋ฐ ๊ณต์ ์ ์ด๊ฐ ๊ฐ๋ฅํ ์ ํ ํ์ง ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถํ์ฌ ์ง์ ๊ฐ๋ฅํ ์์ฐ ๋ฐฉ์์ ๊ดํ ์ฐ๊ตฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ์์ต๋๋ค.
- ๋ด์ฉ : ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ํ๊ฒฝ์์ OpenCV๋ฅผ ํตํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ก ๋ถ๋ํ ๊ฒ์ถ, Snowboy ๋ชจ๋์ ํตํ ์์ฑ์ธ์, ์์ฑ์ธ์์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ณต์ฅ์ ์ ์ด, ๋ถ๋ํ ๊ฒ์ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ถ๋ํ์ ๊ฒ์ถํด๋ด๋ ๊ณต์ฅ ์์คํ ์ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์ฐํด๋ณด๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ถํ ์ค์ ๊ณต์ฅ์ ์ ์ฉ๋ ์ ์๋๋ก ์๋ฒ, ๋๋ฐ์ด์ค, ํ๋์จ์ด ๊ฐ๊ฐ์ ํ ์คํธํ์ต๋๋ค.
- ๊ฒฐ๊ณผ
- ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ํ๊ฒฝ์์ OpenCV๋ฅผ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ํตํด ์บ์ ๋ถ๋ํ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์์์ต๋๋ค.
- ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์๋ณด๋ชจํฐ๊ฐ ๋ถ๋ํ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ถ๋ํ์ ๊ฒ์ถํ ์ ์๋๋ก ํ์์ต๋๋ค.
- ์์ฑ์ธ์ ๋ชจ๋์ Snowboy๋ฅผ ํตํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ ์ด๊ฐ ๊ฐ๋ฅํ์ต๋๋ค.
- ์ด๋ ๊ณต์ฅ์ ํจ๊ณผ์ ์ธ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋๋ฐ์ด์ค์์ ์์ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ์๋ํ๋ฉฐ, ์ ์ง ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด ๋ฉ์ถ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์์คํ ์ ์ํ ์๋ฒ๋ ๊ตฌ์ถํ์ต๋๋ค.
- ์์ฑ์ธ์ ์ ํธ๋ฅผ ์ ์ดํ ๋ฟ๋ง ์๋๋ผ, ๋ถ๋ํ ๊ฒ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ฒ๋ฅผ ๊ฑฐ์ณ ์นํ์ด์ง์ ๊ฒ์ถ๊ฒฐ๊ณผ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ์ ์ก์ ์ํด์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๊ฐ ์์ดํ์ด๋ฅผ ํตํ mqtt ํต์ ์ผ๋ก ๋๋ฐ์ด์ค ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ด ์ด๋ฃจ์ด์ง๊ฒ ํ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ๊ฐ์ ๋ถ์ผ๋ค์ด ํ๋์ ์๋ฒ๋ฅผ ํตํ์ฌ ์๋ก ์ฐ๊ฒฐ๋์ด ํ๋์ ๊ณต์ฅ์ ํํ๋ฅผ ์ด๋ฃจ๊ฒ ๋จ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค
- Raspberry Pi 3B
- Arduino Uno
- PiCamera
- IR Sensor
- Servo Motor - DC Motor
- Conveyer Belt - AC Motor
- ReSpeaker 4-Mic Array for Raspberry Pi
- Node-RED
- Arduino IDE
- MySQL
- phpMyAdmin
- Mosquitto
- ๊ฐ์ฅ ๋จผ์ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์ ์ด๋ฅผ ์ํด ์์ฑ์ธ์์ ๊ฒฐ๊ณผ๊ฐ์ ์๋ฒ๋ฅผ ํตํ์ฌ ์๋์ด๋ ธ๋ก ์ ์ก๋๋ฉฐ, ์ด ๊ฒฐ๊ณผ๋ก ์์ฑ์ธ์์ ํตํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ์ ์ด๋๋๋ก ํ์์ต๋๋ค. ๋ํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๊ฐ mqtt ํต์ ์ ํตํ์ฌ ์์ฑ์ธ์์ ๋ฐ์ดํฐ, ๋ถ๋ํ ๊ฒ์ถ์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ์ก์์ผ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์ ์ด ๋ฐ ์๋ณด๋ชจํฐ์ ๋ถ๋ํ ๊ฒ์ถ ๋ถ๋ฅ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋๋ก ํ์์ต๋๋ค. ์๋ฒ๋ฅผ ๊ตฌ์ถํจ์ผ๋ก ์ธํด ์ค๋งํธ ํฉํ ๋ฆฌ์ ์์คํ ์ฒ๋ผ ๊ฐ๋ํ์ฌ ๋ชจ๋ ๊ณต์ ์ ์ ์ดํ ์ ์๋๋ก ํ์์ต๋๋ค.
- ์๋์ System Architecture์์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์ฃ์ง #1์์ ์์ฑ์ธ์์ ํตํ ์ ์ด ๋ช ๋ น์ ์ ๋ฌํ๊ฒ ๋๋ฉด, ์์ฑ์ธ์ ํ ์ ์ด ๋ช ๋ น์ ๋ธ๋ฃจํฌ์ค๋ฅผ ํตํด ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค. ์ด ๊ฒฐ๊ณผ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ์ ์ด๋๋ฉฐ, ๋ํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๋๋ฐ์ด์ค#2์์ ๋ถ๋ํ ๊ฒ์ถ์ ๊ฒฐ๊ด๊ฐ์ ์๋ฒ๋ฅผ ํตํด ๋๋ฐ์ด์ค#3์ผ๋ก ์ ์กํ๊ณ ๊ทธ ๊ฒฐ๊ด๊ฐ์ ๋ฐ๋ผ ์๋ณด๋ชจํฐ๊ฐ ๋ถ๋ํ์ ๋ถ๋ฆฌํด ๋ด๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๊ฐ์ mqtt๋ ์์ดํ์ด๋ฅผ ํตํด์ ํต์ ํ๊ฒ ๋ฉ๋๋ค.
์ปจ๋ฒ ์ด์ด ๋ฒจํธ ๊ตฌ๋์ ์ํ ๋ฆด๋ ์ด์๋, ์นด๋ฉ๋ผ์คํ ๋ฐ ๋ฆด๋ ์ด์๋ ๋ฐ ์ ์ง๋ฅผ ์ํ ์ ์ธ์ ์ผ์, ๋ถ๋ํ ๊ฒ์ถ์ ์ํ ์๋ณด๋ชจํฐ ์๋์ ์ํด ์๋์ด๋ ธ๋ฅผ ์ฌ์ฉํ์๊ณ ์ด์ ์๋์์ํด IDLE๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์ดํ ํต์ ์ ์ํด ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ UART(Universal asynchronous receiver/transmitter)์ฐ๊ฒฐ์ ํตํด Serial ํต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๋๋ก ํ์์ต๋๋ค.
์์ฑ๋ช
๋ น์ด ๋ด๋ ค์ก์ ๋, ์ค๋น์ ์๋์ด ์์๋๊ธฐ ์ํด์๋ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ ์ด๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์ ์ดํ๊ธฐ ์ํด ์๋์ด๋
ธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์๋์ด๋
ธ๋ ๋ค์ํ ์ผ์๋ ๋ชจํฐ, ๋ฒจํธ์ ๊ฐ์ ๋ถํ์ด ์ฐ๊ฒฐ ๊ฐ๋ฅํ๊ณ ์
์ถ๋ ฅ, ์ค์์ฒ๋ฆฌ์ฅ์น๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ชฉ์ ์ ๊ฐ์ฅ ์๋ง์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์ ์ดํ๋ ค๋ฉด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ๊ตฌ๋ํ๋ ๋ชจํฐ๋ฅผ ์๋์ด๋
ธ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. DC๋ชจํฐ์ธ ๊ฒฝ์ฐ, ์๋์ด๋
ธ์ ์ง์ ์ฐ๊ฒฐ์ ํตํด ์ ์ด๊ฐ ๊ฐ๋ฅํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๊ตฌ์
ํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ AC๋ชจํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ง์ ์ฐ๊ฒฐ์ ํตํ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์ฌ๊ฒผ์ต๋๋ค. ๋ฐ๋ผ์ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์กฐ์ํ๋ ๋ณ๋์ ์ธ๋ฒํฐ๋ฅผ ์๋์ด๋
ธ์ ์ฐ๊ฒฐํ์ฌ ๋ฒจํธ๋ฅผ ์กฐ์ํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ๊ฒ ๋์์ต๋๋ค.
์๋ AC ์ธ๋ฒํฐ ๋ชจ์๋์์ ํ์ธํ ์ ์๋ฏ ์ค์์น๋ฅผ onํ๋ฉด ์ธ๋ฒํฐ๊ฐ ์๋ํ๊ณ , ์ค์์น๋ฅผ offํ๋ฉด ์ธ๋ฒํฐ ์๋์ด ๋ฉ์ถ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฐ๊ฒฐ์ ๋๋ค. ์ค์์น๋ ํ์ฌ ๋ฆด๋ ์ด๋ก์จ ์ด๋ฅผ ํตํ์ฌ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์๋ ํน์ ์ค์ง๋ฅผ ํ ๊ฒ์ ๋๋ค. ์๋ ์ธ๋ฒํฐ ์ฌ์ฉ ๋งค๋ด์ผ์ ํตํด ์ธ๋ฒํฐ์ ์๋ ๋ชจ๋์๋ ๋ค์ด์ผ ์กฐ์ ๋ชจ๋์ ์ธ๋ถ ๋จ์ ์กฐ์ ๋ชจ๋ 2๊ฐ์ง๊ฐ ์๋๋ฐ, ์ธ๋ฒํฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ธํ ๊ฐ ์ค 79๋ฒ ์ธํ ๊ฐ์ 1์์ 3์ผ๋ก ๋ณ๊ฒฝํจ์ผ๋ก์ ์ธ๋ถ ๋จ์ ์กฐ์ ๋ชจ๋๋ก ๋ฐ๊ฟ ์ ์์์ต๋๋ค. ์ด๋ก์จ ์ธ๋ถ ๋จ์ ์ฐ๊ฒฐ์ ํตํด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋์๊ณ , ๋ธ๋ ๋๋ณด๋๋ฅผ ํตํด ์๋์ด๋ ธ์ ์ง์ ์ ์ผํธ๋ฅผ ํด๋ณธ ๊ฒฐ๊ณผ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ์์ง์ด๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ํ๋ก์ on, off๋ฅผ ์ง์ ๋จ์๋ฅผ ๋บ๋ค, ๊ฝ์๋ค ํ๋ ๋ฐฉ์์ด์์๊ธฐ ๋๋ฌธ์ ์ ํธ๋ฅผ ํตํด ์๋์ผ๋ก ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ๋์, ์ค์งํ๋์ง ํ์ธ์ด ํ์ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ง์ ์ฐ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ์์ผ๋ก ๊ฐ์ ์ ์ฃผ์ํด์ผ ํ์ต๋๋ค. ์ดํ ์ค์์น ์ญํ ์ธ ๋ฆด๋ ์ด๋ฅผ ์๋์ ๊ฐ์ด ์ฐ๊ฒฐํ์ฌ ์ธ๋ฒํฐ์ ์ฐ๊ฒฐ ํ์์ผ๋ฉฐ, ๋ฆด๋ ์ด๋ฅผ ์๋์ด๋ ธ์ ์ฐ๊ฒฐํ์ฌ ์ค์์น๋ฅผ on/off ์ํค๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ฆด๋ ์ด๋ฅผ on/off ์์ผ์ค์ผ๋ก ์ปจ๋ฒ ์ด์ด์ ์๋/์ ์ง๊ฐ ๊ฐ๋ฅํ๋๋ก ํ์์ต๋๋ค.
AC ์ธ๋ฒํฐ ์ฐ๊ฒฐ ๋ชจ์๋
์ธ๋ฒํฐ ์ฌ์ฉ ๋งค๋ด์ผ
๋ํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์๋ ๋ฐ ์ ์ง ์ฌ๋ถ์ ์์ด ์์ฑ์ธ์์ ํตํ์ฌ ์ ์ง ํน์ ์ฌ๊ฐ๋์ ํ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค. ์ด๋ ๋น์์ ์ง์ํฉ์ด๋ ๊ธฐํ ์๋์ ๋ฉ์ถฐ์ผ ๋ ๊ฒฝ์ฐ ์์ฑ์ธ์์ ํตํ์ฌ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์ ์ด ํ ์ ์๋๋ก ํ์์ต๋๋ค. ์ด๋ ๋จ์ํ ์ธ๋ถ ์ปดํจํฐ๋ก ์ ์ด ํ๋ ๊ฒ๋ณด๋ค ๋์ฑ ๊ฐ๋จํ๊ณ ์์ฌ์ด ๋ฐฉ๋ฒ์ด๋ผ ํ๋จํ๊ณ , ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ํ๋ ์ค๋งํธ ํฉํ ๋ฆฌ์ ์๋ง์ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค. ์์ฑ์ธ์์ ์ํ์ฌ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ๋ธ๋ฃจํฌ์ค๋ก Serial ํต์ ์ ํตํ์ฌ ์์ฑ์ธ์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ด๋ ธ์ ์ ๋ฌํ์ฌ ์ค์์น์ ์ญํ ์ธ ๋ฆด๋ ์ด๋ฅผ On/off ํ๊ฒ ํจ์ผ๋ก์จ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค. ์์ฑ๋ง์ดํฌ๊ฐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ๋ถ์ฐฉ๋์ด์๋ค๋ ์ ์ ๊ณ ๋ คํ์์ ๋ USB์ ์ ํตํ ์๋์ด๋ ธ-๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๊ฐ ์ ์ ํต์ ์ ํด๋์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ฉฐ ์ ํ์ ์ธ ์์น๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ๋ธ๋ฃจํฌ์ค ํต์ ์ ํตํ์ฌ, ๋ฌด์ ํต์ ์ ํน์ฑ์ ๋์ฑ ํธ๋ฆฌํ๊ณ ํด๋์ฑ์ด ๋์ ํน์ฑ์ ๊ฐ์ง๋ฉฐ, ์ ๊ทผ์ฑ ๋์ ์ค๋งํธ ํฉํ ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํ์์ต๋๋ค.
์๋์ด๋
ธ-๋ฆด๋ ์ด-์ธ๋ฒํฐ ์ฐ๊ฒฐ ํ๋ก๋
์ธ๋ฒํฐ์ ๋ฆด๋ ์ด ์ฐ๊ฒฐ
๋ค์์ผ๋ก ์์ฑ์ธ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๊ณ ๊ทธ์ ๋ฐ๋ผ ์ ์์ด ์ฃผ์ด์ง๋ฉด ์ค์์น๋ก ์๋ํ๋ ๋ฆด๋ ์ด๊ฐ ์ผ์ง์ผ๋ก ์ธํด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ์๋ํ๊ฒ ๋ฉ๋๋ค. ์์ ์ฝ๋๋ ์๋ฆฌ์ผ ํต์ ์ ํตํ์ฌ ์์ฑ์ธ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋จ๊ณผ ๋์์ ์ ์ธ์ ์ผ์๊ฐ ์บ์ ์ธ์ํ๋ฉด, ๋ถ๋ํ ๊ฒ์ถ์ ์ํ ์นด๋ฉ๋ผ ์ดฌ์์ ์ํด 3์ด๊ฐ ์๋์ ๋ฉ์ถ๊ณ , ์ดํ ๋ค์ ์ฌ๊ฐ๋ ๋๊ฒ ๋๋ ์ฝ๋์ ๋๋ค. ๋ํ ๋น์์ํฉ ๋ฐ์์ ์์ฑ์ธ์์ ํตํด โ์ ์งโ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด๊ฒ ๋๋ฉด ๊ทธ์ ๋์ํ์ฌ ์๋์ ๋ฉ์ถ๊ฒ ๋๋ฉฐ, โ์์โ์ด๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด๊ฒ ๋๋ฉด ๋ค์ ์ปจ๋ฒ ์ด์ด๊ฐ ์ฌ๊ฐ๋ ๋๊ฒ ๋๋ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์ํฉ์์ ์ปจ๋ฒ ์ด์ด๋ฒจํธ๋ฅผ ์ ์ดํ ์ ์์ผ๋ฉฐ ๋ธ๋ฃจํฌ์ค์ ๋ฌด์ ํต์ ์ด๋ผ๋ ํน์ฑ์ ํตํด ๋์ฑ ํธ๋ฆฌํ๊ฒ ์ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์์ต๋๋ค.
๋ฆด๋ ์ด๋ฅผ ํตํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ๊ตฌ๋
pinMode(cds, INPUT);//์ผ์๊ฐ์ ๋ฐ์๋ค์ธ๋ค
pinMode(relay, OUTPUT);//์ผ์ ๊ฐ์ด ๋ฐ์ ๋ค์์ ๋ฐ๋ผ ์ปจ๋ฒ ์ด์ด์๋์ ์ํ output์ ๋ณด๋ธ๋ค/
if(val == LOW){ //์ผ์๊ฐ ์ธ์ ๋๋ฉด
digitalWrite(relay, LOW);//์นด๋ฉ๋ผ ์ดฌ์์์ํด ์ปจ๋ฒ ์ด์ด ์๋ ๋ฉ์ถ๋ค
delay(3000);//์ดฌ์ ์ํ ๋๋ ์ด ์ดํ ๋ค์ ์ฌ๊ฐ๋ ๋๊ฒ ๋๋ค.
in_data = btSerial.read(); // ๋ธ๋ฃจํฌ์ค๋ก ์ ๋ฌ๋๋ ์์ฑ์ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ฑฐ์จ๋ค
if(in_data == '0'){
digitalWrite(relay,LOW);//๋ง์ฝ ๋ธ๋ฃจํฌ์ค๋ก โ์ ์งโ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด ๋ฉ์ถ๋ค
else if(in_data == '1'){ // ๋ธ๋ฃจํฌ์ค๋ก โ์์โ์ด๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด ์ฌ๊ฐ๋ ๋๋ค.์์ฑ์ธ์์ ํตํ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์ ์ด
def callback1():
ser.write(str.encode(โ0โ))//์ ์ง ๋ช
๋ น์ ์ปจ๋ฒ ์ด์ด๋ฒจํธ๋ฅผ ๋ฉ์ถค
def callback2():
ser.write(str.encode(โ1โ))//์์ ๋ช
๋ น์ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ์๋,์ ์ธ์ ์ผ์๋ ์ ํ์ด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์๋ฅผ ์ง๋๊ฐ ๋, ์ ํ์ ์์น๋ฅผ ํ์ธํ๊ณ ๊ณต์ ์ ๋ค์ ์์ ์ ์งํ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ ๊ณต์ ๋ชจ๋ธ์์ ์ฌ์ฉ๋๋ ์ ์ธ์ ์ผ์๋ ์ด 3๊ฐ์ ๋๋ค.
- ์ฒซ ๋ฒ์งธ, ์นด๋ฉ๋ผ ์คํ์ฉ ์ผ์ : ์ ํ์ด ๋ถ๋ํ ๊ฒ์ถ์ฉ ์นด๋ฉ๋ผ์ ๋๋ฌํ๋์ง๋ฅผ ํ์ธํ์ฌ, ์ ์ธ์ ์ผ์๊ฐ ๊ฐ์ง๋๋ฉด ์นด๋ฉ๋ผ์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค.
- ๋ ๋ฒ์งธ, ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์ ์ด์ฉ ์ผ์ : ์นด๋ฉ๋ผ ์คํ์ฉ ์ผ์์ ๋ถ์ฐฉ๋๋ ์์น๋ ๋์ผํ์ง๋ง, ๋ถ๋ํ ๊ฒ์ถ์ฉ ์นด๋ฉ๋ผ์ ์ดฌ์์ ์ํด ์ ๊น ๋ฉ์ถ๊ธฐ ์ํ ์ผ์๋ก, ์ผ์๊ฐ ์ธ์ํ๋ฉด 3์ด๊ฐ ๋ฉ์ถ ํ ๋ค์ ์ฌ๊ฐ๋ ๋ฉ๋๋ค.
- ์ธ ๋ฒ์งธ, ์๋ณด๋ชจํฐ ์ ์ด์ฉ ์ผ์ : ๋ถ๋ํ ๊ฐ์์ด ์๋ฃ๋ ์ ํ์ด ๋ถ๋ฅ๋๊ธฐ ์ํด ์๋ณด๋ชจํฐ๋ฅผ ์ง๋๊ฐ ๋, ์ ํ์ด ์๋ณด๋ชจํฐ์ ๋๋ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ, ๋ถ๋ํ์ธ ๊ฒฝ์ฐ ๋ถ๋ฅ๋ฅผ ํ๊ธฐ ์ํด ์กด์ฌํ๋ ์ผ์์ ๋๋ค.
์๋ ์ฝ๋๋ฅผ ํตํด ์ ํ์ด ์ ์ธ์ ์ผ์๋ฅผ ํต๊ณผํ๊ฒ ๋๋ฉด, ์นด๋ฉ๋ผ๋ฅผ ์คํํ๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ์ ํธ๊ฐ ๊ฐ๊ฒ ๋์ด ๋ถ๋ํ ๊ฒ์ถ ์์คํ
์ด ์คํ๋ฉ๋๋ค. ๋ถ๋ํ ๊ฒ์ถ ๊ณผ์ ์ ์ํด ์ ํ์ด ์ผ์๋ฅผ ํต๊ณผํ ๊ทธ ์ฆ์, ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ๋ํ ์๋์ 3์ด๊ฐ ๋ฉ์ถ๊ณ ๋ค์ ์๋ํฉ๋๋ค. ์ด ์๋์ด๋
ธ-๋ผ์ฆ๋ฒ ๋ฆฌ๊ฐ UART ํต์ ์ ์ํด์ ์๋์ด๋
ธ์ firmata๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์
๋ก๋ํ์ฌ ์ดํ ๋ผ์ฆ๋ฒ ๋ฆฌ์ ํ์ด์ฌ ํ๊ฒฝ์ ํตํด ์ผ์๋ฅผ ์ธ์ํ๋๋ก ํ์์ต๋๋ค.
์นด๋ฉ๋ผ๋ฅผ ์คํํ๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ํต์
board = Arduino('/dev/ttyUSB0')//์๋์ด๋
ธ์ ์ฐ๊ฒฐ
pin9_sensor = board.get_pin('d:9:i')//๋์งํธ ํ 9๋ฒ์ ์ผ์๋ฅผ ์ฐ๊ฒฐํ์ฌ
if pin_code.read() == False://์ผ์๊ฐ ์บ์ ์ธ์ํ๋ ๊ฒฝ์ฐ
camera.capture(image, 'bgr')//์นด๋ฉ๋ผ๋ฅผ ์บก์ณํ๊ฒ ๋๋ค์ ํ์ด ์นด๋ฉ๋ผ ์คํ์ฉ ์ผ์๋ฅผ ํต๊ณผํด ๋ถ๋ํ ๊ฒ์ถ์ ์ดฌ์ํ๋ ์ผ์์๋ ๋ณ๊ฐ๋ก ์นด๋ฉ๋ผ ์ดฌ์์ ์ํด ์ปจ๋ฒ ์ด์ด๋ฒจํธ๋ฅผ ๋ฉ์ถ๊ฒ ํ๋ ์ผ์์ ๋๋ค. ์บ์ด ์ผ์์ ์ธ์๋๋ฉด, ๋ถ๋ํ๊ฒ์ถ์ ์ํ ์ฌ์ง์ดฌ์์ ์ํด ์ฝ 3์ด๊ฐ ๋ฉ์ท๋ค๊ฐ ์ฌ๊ฐ๋ ๋๊ฒ ํฉ๋๋ค.
์๋ณด๋ชจํฐ๋ฅผ ์ ์ดํ๊ธฐ ์ํด์ ์ผ์ ์ธ์ ๋ํ ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ผ์๋ ์๋์ด๋
ธ์ ์ฐ๊ฒฐ๋๋ ๊ฒ์ด ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ง์ ์ฐ๊ฒฐํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ ์ธ์ ์ผ์์ ๊ฒฝ์ฐ ๋์งํธ ์ ํธ๋ฅผ ํตํด 0, 1 ๊ฐ์ ์ฃผ๊ณ ๋ฐ๊ธฐ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ง์ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ์ต๋๋ค. ๋ฐ๋ผ์ ์ผ์๊ฐ ์ธ์๋จ์ ๋ฐ๋ผ ์๋์ด๋
ธ์ ์ ํธ๋ฅผ ์ฃผ์ด ์๋ณด๋ชจํฐ๋ฅผ ๊ฐ๋ํ๋๋ก ํ์ต๋๋ค. ์ด ๊ฒฐ๊ณผ๋ก ๋ถ๋ํ์ ๊ฒ์ถ์ด ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค.
์๋ณด๋ชจํฐ ์ ์ด์ฉ ์ผ์ ์ธ์
if GPIO.input(11) == 0://์ผ์๊ฐ ์ธ์๋์์ ๋
if data_saved[n] == 2:
ser.write('2'.encode())
//๋ถ๋ํ ๊ฒ์ถ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ํ์ด๋ผ ์ธ์ํ์์ ๋ ์๋ณด๋ชจํฐ๋ฅผ ํ์ ์ํค๊ธฐ์ํ ํต์ ์ ํ๋ค.์๋ณด๋ชจํฐ์ ์๋์ ์ํด ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด-์๋์ด๋
ธ๊ฐ ์ฐ๊ฒฐ์ ํตํด, ๋ถ๋ํ์ ๊ฒ์ถ๊ฒฐ๊ณผ ๋ฐ์ดํฐ์, ์ผ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์ด๊ฒ ๋ฉ๋๋ค. ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ฅผ ํตํด ๋ค์ด์จ ๋ถ๋ํ ํ๋จ ์ฌ๋ถ ๋ฐ์ดํฐ๋ list์ ์์ด๊ฒ ๋๊ณ , ์ผ์๊ฐ ์ธ์๋จ์ ๋ฐ๋ผ(์บ์ด ์๋ณด๋ชจํฐ ์์ ์ง๋๊ฐ) list์ ์ ์ฅ๋์ด์ง ๋ถ๋ํ ์ฌ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋ก ๋ถ๋ฌ๋ค์ฌ ๋ถ๋ํ ์ฌ๋ถ์ ๋ฐ๋ผ ๊ฒ์ถํ๊ฒ ๋ฉ๋๋ค.
์๋ณด๋ชจํฐ ์ ์ด
if (in_data == '2'){
for (pos = 0; pos <= 180; pos += 5) {
EduServo.write(pos);
delay(10);}
//์ด๋ ๋ถ๋ํ ๊ฒ์ถ์ ๋ฐ์ดํฐ๊ฐ โ๋ถ๋ํ์ด๋ผ๊ณ ์ธ์ํ์์ ๋ ์๋ณด๋ชจํฐ๋ฅผ ํ์ ํ์ฌ ๋ถ๋ํ์ ๊ฒ์ถํ๋ ์์
์ ํ๋ค.๊ฐ๊ฐ์ ๊ตฌ์ฑ๋์ด์ง ํ๋์จ์ด๋ ๋ผ์ฆ๋ฒ ๋ฆฌ๊ฐ mqtt, ์๋์ด๋ ธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ UART ์๋ฆฌ์ผ ํต์ , ์๋์ด๋ ธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๊ฐ์ ๋ธ๋ฃจํฌ์ค ํต์ ์ ํตํ์ฌ ํ๋์ ๋ฉ์ปค๋์ฆ์ผ๋ก ์๋ํฉ๋๋ค. ๋ธ๋ฃจํฌ์ค ํต์ ์ผ๋ก์ ์์ฑ์ธ์์ ํตํด ์ ์ด๋๋ ๋ฆด๋ ์ด์ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์์ ์ผ์๊ฐ ์ธ์๋๋ฉด ์นด๋ฉ๋ผ ์๋์ ์ํด์ 3์ด๊ฐ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ ๋ฉ์ถ๊ณ ๋ถ๋ํ ๊ฒ์ถ์ ์ํ ์ฌ์ง์ดฌ์ ํ ๋ค์ ์ฌ์๋ํฉ๋๋ค. ์ดํ ์ ์ธ์ ์ผ์๊ฐ ์ธ์ ๋์์ ๋ ๋ถ๋ํ์ ํ๋จ ์ฌ๋ถ์ ๋ฐ๋ผ ์๋ณด๋ชจํฐ๊ฐ ์๋ํ๊ฒ ๋๋ฉฐ ๋ถ๋ํ์ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ถํ๊ฒ ๋๋ ํ๋์ ๋ฉ์ปค๋์ฆ์ ํ์ฑํ๊ฒ ๋ฉ๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์ ํ์ด์นด๋ฉ๋ผ ๋ชจ๋์ ๊ฒฐํฉํ์ฌ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์์ ๋ถ๋ํ ๊ฒ์ถ์ ํ์ํ ์ฌ์ง์ ์ฐ์ ์ ์์ต๋๋ค. ํ์ด์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฐ๋ก ์ค์นํด์ผ ํ๋ ๋ชจ๋์ ์์ผ๋ฉฐ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3 ๋ณด๋ ์์ ์ฝ๋์ ๊ฒฐํฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ถ๋ํ ๊ฒ์ถ์ ์ต์ข ๋ชฉ์ ์ด ์ ํํ์ ์ธ์ ์ฌ๋ถ์ด๊ธฐ ๋๋ฌธ์, ํน์ ์ฌ์ง์์ ์์ ํํ๋ฅผ ์ธ์ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ์ด์ฌ3 ํ๊ฒฝ์์ โOpenCVโ ๋ชจ๋์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. OpenCV ๋ชจ๋์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์ ์นด๋ฉ๋ผ๋ฅผ ํ์ฉํ์ฌ ์ฌ์ง์ ์ฐ๊ฑฐ๋, ์ ์ฅ, ๋ถ๋ฌ์ค๊ธฐ, ๋ณด์ฌ์ฃผ๊ธฐ, ์ ๊ทธ๋ฆฌ๊ธฐ, ํ ๋๋ฆฌ ๊ทธ๋ฆฌ๊ธฐ, ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๊ฐ ๋์ ๋ชจ๋์ ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ ํ์ด ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ณผ์ ์ ํ์ํ ๋ถ๋ถ์, โ์ฌ์ง์์ ์ ์ธ์โ, โ์ฌ์ง์์ ์ ๊ทธ๋ฆฌ๊ธฐโ์ ๋๋ค. โ์ฌ์ง์์ ์ ์ธ์โ์ ๋ฉ์๋ โHoughCirclesโ๋ฅผ, โ์ฌ์ง์์ ์ ๊ทธ๋ฆฌ๊ธฐโ๋ ๋ฉ์๋ โcircleโ์ ์ฌ์ฉํ์์ต๋๋ค. ํ์ด์นด๋ฉ๋ผ๋ฅผ ํตํด ์ฐ์ ์ ํ ์ฌ์ง์์ ๋ถ๋ํ์ธ์ง, ์ ์์ ํ์ธ์ง ํ๋จํ๋ ๊ธฐ์ค์ ํ๋ก์ ํธ ์งํ์ ์์ด์ ์ต์ ์ ๋ฐฉ์์ ์ฐพ๊ธฐ ์ํด ๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ํ์ต๋๋ค.
import cv2 as cv
import numpy as np
img1 = cv.imread('example.jpg', 0)
img1 = cv.medianBlur(img1,5)
img2 = img1.copy
circles = cv.HoughCircles(img1, cv.HOUGH_GRADIENT, 1, 10, np.array([]), 100, 30, 1, 30)
if circles is not None:
if len(circles.shape) < 3:
print('circles not detected')
else:
a, b, c = circles.shape
for j in range(b):
cv.circle(img3, (circles[0][j][0], circles[0][j][1]), circles[0][j][2], (0, 0, 255), 3, cv.LINE_AA)
print('expected area = ', 3.14159*circles[0][j][2]**2)
ret, th = cv.threshold(img1, 150, 255, cv.THRESH_BINARY)
image, contours, hierarchy = cv.findContours(th, 1, 2)
img3 = cv.drawContours(img1, contours, -1 (0, 255, 0), 3)
area = cv.contourArea(contours[0])
print('real area = ', area)์ฐ์ โexample.jpgโ๋ผ๋ ์ฌ์ง์์ Houghcircle ๋ฉ์๋๋ฅผ ํตํด ๊ฒ์ถ๋ ์์ ๋ฐ์ง๋ฆ์ ๊ตฌํ์ฌ, ์ ๋์ ํ์ฌ ์์ ๋์ด๋ฅผ ๊ตฌํฉ๋๋ค. ๋, ์ฌ์ง์ threshold ๋ฉ์๋๋ฅผ ํตํด ์์ผ๋ก ๋ณด์ด๋ ๋ถ๋ถ์ ์ค์ ๋ชจ์์ ๊ทธ๋๋ก ๋ฐ์ต๋๋ค. Threshold ๋ฉ์๋๋ ์ฌ์ง์์ rgb๊ฐ ์ค ์ง์ ๋ ๊ฐ ์ด์์ ์์ ์ ๋ถ ๊ฒ์์, ๊ทธ ์ธ๋ ๋ชจ๋ ํฐ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ํด์ค๋๋ค. ์ฆ, ์ ํ์ ์๋ฉด ์ ์ฒด์ ์๊ณผ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์๊ณผ ๋์กฐํ์ฌ, ์ ํ์ ์๋ฉด๋ง ๊ฒ์์์ผ๋ก ํ์๋๊ฒ ํ ํ, ๊ฒ์์์ผ๋ก ํ์๋ ๋ถ๋ถ์ ๋์ด๋ฅผ โcontourAreaโ ๋ฉ์๋๋ฅผ ํตํด ๊ตฌํฉ๋๋ค. ๊ฐ๊ฐ ๊ตฌํด์ง ์ด๋ก ๊ฐ๊ณผ ์ค์ ๋์ด๋ฅผ ๋น๊ตํ์ฌ, ์ด ์ค์ฐจ์จ์ด ํ์์ ์ ํ ํน์ % ์ด์์ด ๋ ์ ํ์ ๋ถ๋ํ์ผ๋ก ๊ท์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋ ์ฌ์ง์์ ํ๋์ ์์ ๋ํด HoughCircle, contourArea ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ฉด, ๋ ์์ ์ค์ฐจ๋ ์ฝ 17494.66 ์ด๊ณ , ์ด๋ ์ฝ 6.7%์ ์ค์ฐจ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ค์ ์ ๊ฒ์ถ ์ฌ์ง
์ค์ฐจ์จ ๊ณ์ฐ ์์ญ
2) 10์ฅ์ ์ฌ์ง์ ์ฐ์ด ๊ฐ ์ฌ์ง์ ๋ํด ์์ ๊ฒ์ถ, ์ต์ข ์ ๊ฒ์ถ์จ์ด 90% ์ด์์ผ ๊ฒฝ์ฐ ์ ์ํ
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2 as cv
import numpy as np
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
n = 0
m = 0
l = 0
for frame in camera.capture_continuous(rawCapture, format='bgr', use_video_port=True):
img = frame.array
image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
if signal == 1:
n = n + 1
if n == 1:
l = l + 1
name = print('product' + l)
cv.imwrite(name, img)
else:
break
circles = cv.HoughCircles(image, cv.HOUGH_GRADIENT, 1, 20, np.array([]), 50, 60, 20, 30)
if circles is not None:
if len(circles.shape) == 3:
a, b, c = circles.shape
m = m + 1
else:
b = 0
for i in range(b):
cv.circle(img, (circles[0][i][0], circles[0][i][1]), circles[0][i][2], (0, 0, 255), 3, cv.LINE_AA)
cv.imshow("tracking", img)
key = cv.waitKey(1)
rawCapture.truncate(0)
if key == 27:
break
cv.destroyAllWindows()
else:
if m / n > 0.9:
n = 1
else:
k = 0
n = 0
continue์ฐ์ ํ์ด์นด๋ฉ๋ผ๋ฅผ ํตํด ์ด๋น 32๋ฒ์ ์ฌ์ง์ ์ฐ์ด ์ฌ์ง๋ง๋ค Houghcircle ๋ฉ์๋๋ฅผ ํตํด ์์ ๊ฒ์ถํ๊ณ ์ด๋ฅผ ์คํฌ๋ฆฐ์ ํตํด ๋ณด์ฌ์ค๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ํตํด ์คํฌ๋ฆฐ์์๋ ๋ง์น ์ค์๊ฐ์ผ๋ก ์์ ํธ๋ํนํ๋ ์คํธ๋ฆฌ๋ฐ์ ๋ณผ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์๊ฐ์ ์ธ ํจ๊ณผ๊ฐ ๋ฐ์ด๋๊ธฐ ๋๋ฌธ์ ์ค์ฐจ์จ ๊ณ์ฐ์ด ์ ํฉํ๋ค๋ฉด ์ ์ธ์ ์ฝ๋๋ก ์ฌ์ฉ๋ ์์ ์ด์๋ ์ฝ๋์์ต๋๋ค.
ํ์ด์นด๋ฉ๋ผ ๋ชจ๋์๋ ์ค์๊ฐ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ์ ํ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๊ทธ ๋ฐฉ๋ฒ์ ์ค์ ๋ก ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3 ํ๊ฒฝ์์ ์คํํ๊ธฐ์๋ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง ์์, ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆด ๊ฐ๋ฅ์ฑ์ด ์ปธ๊ณ , ๋ฌด์๋ณด๋ค ์ค์ฐจ์จ ๊ณ์ฐ์ ์์ด์ ์ฌ์ง์ ํตํด ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋นํด ์ผ๊ด์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
์์
ํ๊ฒฝ์์ ์ ์ธ์ ์ผ์๋ก๋ถํฐ ์ ํ์ด ์นด๋ฉ๋ผ ์์ ๋๋ฌํ์๋ค๋ ์ ๋ณด๊ฐ ๋ค์ด์จ ์งํ์ 10๊ฐ์ ์ฌ์ง(ํ๋ ์)์ ๊ฒ์ฌํ์ฌ, 10์ฅ์ ์ฌ์ง ์ค 9์ฅ ์ด์์ ์ฌ์ง์์ ์์ด ๊ฒ์ถ๋ ์ ํ์ ์ ์์ ํ์ ๊ธฐ์ค์ผ๋ก ์ ํ์์ต๋๋ค.
์ด๋์ค์๋ ์ฐ์์ ์ผ๋ก ์ ๊ฒ์ถ
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์์ โ10์ฅ์ ์ฌ์ง ์ค 9์ฅโ์ด๋ผ๋ ๊ธฐ์ค์์ 9์ฅ์ด ๊ทธ๋ฆฌ ์ง๊ด์ ์ด์ง ์๊ณ , ์๋ง์ ์ ํ์ ํ๋จํ๋ ๊ณผ์ ์์ ์ ์ ํ์ง ๋ชปํ ๋ถ๋ํ ํ๋จ์ด ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ๋ํ, ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์์ 10์ฅ์ ์ฌ์ง์ ์ฐ๋ ๋์, ์ ํ์ด ์ด๋ํ์ฌ ์นด๋ฉ๋ผ ๋ฐ๋ก ๋ฐ์ด ์๋ ์ฝ๊ฐ ๋น์ค๋ฌํ ์์น์์ ์ฐํ ์ฌ์ง ๋ํ ์ค์ฐจ์จ ๊ณ์ฐ์ ํฌํจ๋๊ฒ ๋๋๋ฐ ์ด ๋, ์ ์์ ์ธ ์ ํ์์๋ ํ์ํ์ผ๋ก ์ฌ์ง์ด ์ฐํ ์ ์์ด, ์ ๊ฒ์ถ์ ์ ๋น์ฑ์ด ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ด ๋ฐฉ๋ฒ ๋ํ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
import picamera
import numpy as np
import cv2 as cv
from pyfirmata import Arduino, util
import time
import paho.mqtt.client as mqtt
def connect_connect(client, userdata, flags, rc):
print("Connected with voice ip_/start" + str(rc))
client.subscribe("/control")
def control_message(client, userdata, msg):
global sign
sign = msg.payload
if sign == b'111':
print("initiate detected_b\n")
elif sign == '111':
print("initiate detected_0\n")
elif sign == b'000' :
print("stop detected_b\n")
elif sign == '000' :
print("stop detected_0\n")
controlsub = mqtt.Client()
controlsub.connect("203.252.47.59", 1883)
controlsub.on_connect = control_connect
controlsub.on_message = control_message
servopub = mqtt.Client()
servopub.connect("localhost", 1883)
controlpub = mqtt.Client()
controlpub.connect("localhost",1883)
board = Arduino('/dev/ttyUSB0')
pin9_sensor = board.get_pin('d:9:i')
it = util.Iterator(board)
it.start()
pin9_sensor.enable_reporting
pin_code = pin9_sensor
sign = b'111'
if sign == '111':
sign = b'111'
n = 0
p = 0
while True:
controlpub.loop_start()
controlsub.loop_start()
servopub.loop_start()
if sign == b'111':
controlpub.publish("/conveyorstate", "111111")
if pin_code.read() == False:
n = n + 1
if n == 1:
p = p + 1
with picamera.PiCamera() as camera:
camera.resolution = (320, 240)
camera.framerate = 24
image = np.empty((240, 320, 3), dtype=np.uint8)
camera.capture(image, 'bgr')
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
circles = cv.HoughCircles(image_gray, cv.HOUGH_GRADIENT, 1, 20, np.array([]), 50, 60, 20, 30)
if circles is not None:
if len(circles.shape) == 3:
a, b, c = circles.shape
group = "1"
servopub.publish("/servo", "22")
else:
b = 0
group = "0"
servopub.publish("/servo", "33")
for i in range(b):
cv.circle(image, (circles[0][i][0], circles[0][i][1]), circles[0][i][2], (0, 0, 255), 3, cv.LINE_AA)
p1 = str(p)
log = open('/home/pi/coding/product_result/results.txt', "a")
log.write('product' + p1 + ' is ' + group + '\n')
log.close()
name = p1 + '.jpg'
cv.imwrite(name, '/home/pi/coding/product_result', image)
cv.destroyAllWindows()
else:
n = 0
controlpub.publish("/conveyorstate", "000000")
time.sleep(1)
controlpub.loop_stop()
controlsub.loop_stop()
servopub.loop_stop()์ ์ฝ๋๋ ์๋ ๋จ์ํ ํ๋์ ์ ํ ์ฌ์ง์ ๋ํด HoughCircle ๋ฉ์๋๋ฅผ ํตํด ์์ด ๊ฒ์ถ๋์๋๊ฐ, ๋์ง ์์๋๊ฐ๋ฅผ ํ๋จํ์ฌ ์ ์์ ํ, ๋ถ๋ํ์ผ๋ก ๊ฐ๊ฐ ๋ถ๋ฅํฉ๋๋ค. Houghcircle ๋ฉ์๋์ ์ ์ฉ๋๋ ๋ณ์๋ค์ ์์๋๋ก, (image, method, dp, minDist[, circles[, param1[, param2[,, minRadius[, maxRadius]]]]])๋ก ๋ํ๋ด์ด์ง๊ณ ๊ฐ๊ฐ์ ๋ณ์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- image : 8-bit single-channel ํ๋ฐฑ ์ด๋ฏธ์ง.
- method : ๊ฒ์ถ ๋ฐฉ๋ฒ. ํ์ฌ๋ HOUGH_GRADIENT๊ฐ ์์.
- dp : dp=1์ด๋ฉด Input Image์ ๋์ผํ ํด์๋.
- minDist : ๊ฒ์ถํ ์์ ์ค์ฌ๊ณผ์ ์ต์๊ฑฐ๋ฆฌ. ๊ฐ์ด ์์ผ๋ฉด ์์ด ์๋ ๊ฒ๋ค๋ ๊ฒ์ถ์ด ๋๊ณ , ๋๋ฌด ํฌ๋ฉด ์์ ๋์น ์ ์์.
- param1 : ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ canny edge ๊ฒ์ถ๊ธฐ์ ์ ๋ฌ๋๋ Paramter
- param2 : ์ด ๊ฐ์ด ์์ ์๋ก ์ค๋ฅ๊ฐ ๋์์ง. ํฌ๋ฉด ๊ฒ์ถ๋ฅ ์ด ๋ฎ์์ง.
- minRadius : ์์ ์ต์ ๋ฐ์ง๋ฆ.
- maxRadius : ์์ ์ต๋ ๋ฐ์ง๋ฆ.
์ด๋ค ์ค ์ ์์ ํ์์ ํ๋จํ ์ค์ํ ๋ณ์๋ param2, minRadius, maxRadius ์ธ ๊ฐ์ง์
๋๋ค. ์ด ์ธ ๊ฐ์ง ๋ณ์๋ค์ ์ค์ ๋ก ์ฌ์ง์ ๋ค์ ์ฐ์ด๋ณด๋ฉด์ ์ ์ ํ ๊ฐ์ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ์ ํตํด ๊ฐ๊ฐ 60, 20, 30์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ํํ๋ค๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค. ๊ฐ๊ฐ์ ๋จ์๋ pixel์ด๋ฉฐ, ํด๋น ๊ฐ์ ํ์ด์นด๋ฉ๋ผ๋ฅผ ํตํด ์ฐ๋ ์ฌ์ง์ ํฌ๊ธฐ(320x240)๊ณผ ์ด๋ฅผ ํตํด ์ค์ ๋ก ๋ณด์ด๋ ์ ํ์ ํฌ๊ธฐ๋ฅผ ํ ๋๋ก ๊ณ์ฐํ ๊ฐ์
๋๋ค.
์ฒ๋ฆฌ๋ ์ ํ์ ์ ์ธ์ ๊ฒฐ๊ณผ์ ํด๋นํ๋ ์ ํ ์ฌ์ง๊ณผ, ์ ํ์ ๋ก๊ทธ๋ ๊ฒ์ถ ์ฆ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3 ๋ด๋ถ ๊ฒฝ๋ก์ ์ ์ฅ๋๊ณ , ๊ณง๋ฐ๋ก ์๋ฒ์ ์
๋ก๋๋์ด, ์ฑ
์์ ๋ฑ์ด ์์ ๋กญ๊ฒ ์ด๋ํ ์ ์์ต๋๋ค.
์ ์ธ์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฃจํ๋ ์ฑ ์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋์ ์คํํ ์ ์๊ณ , ๋ ์ํ๋ ๋์ ์ค์งํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌํ on/off ์ค์์น ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ๋ค์์ ์ค๋ช ํ ์์ฑ์ธ์์ ๋๋ค.
์์ฑ์ธ์์ ์ ์ธ์ ์ฝ๋๊ฐ ์๋ํ๊ณ ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3๊ฐ ์๋ ๋ ๋ค๋ฅธ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์์ ์คํ๋๊ณ ์๋๋ฐ, ์ฌ๊ธฐ์ on์ ํด๋นํ๋ ๋ช
๋ น์ ๋ฐ์ผ๋ฉด ๋ฉ์ถฐ์๋ ๋ฃจํ๋ฅผ ์๋์ํค๊ฒ ํ๊ณ , off์ ํด๋นํ๋ ๋ช
๋ น์ ๋ฐ์ผ๋ฉด, ๋์ํ๊ณ ์๋ ๋ฃจํ๋ฅผ ๋ฌด์กฐ๊ฑด ์ ์ง์ํต๋๋ค. ์ด ๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3 ์ฌ์ด์ ํต์ ์ mqtt๋ฅผ ํตํด์ ์๋ํฉ๋๋ค. ๋ํ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3 ๋ด๋ถ์ ์ ์ฅ๋ ์ ํ ๋ก๊ทธ๋ ๊ณง๋ฐ๋ก ์๋ณด๋ชจํฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์๋ณด๋ชจํฐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3๋ก mqttํต์ ์ ํตํด ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
ReSpeaker 4-Mic Array for Raspberry Pi
์์ฑ์ธ์์ ํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ, ๊ตฌ๊ธ ์ด์์คํดํธ(Google assistant)์ ์ค๋ ธ์ฐ๋ณด์ด(Snowboy)๊ฐ ๊ทธ๊ฒ์ ๋๋ค.
- ๊ตฌ๊ธ ์ด์์คํดํธ๋ ์์ฑ์ธ์๊ณผ, ์ธ์๋ ์์ฑ์ ๋ฌธ์๋ก ๋ณํํ์ฌ, ์ด๋ฅผ ๊ตฌ๊ธ ์ด์์คํดํธ ์๋ฒ์ ๋ณด๋ด ์ ์ ํ ๋๋ต์ ํด ์ฃผ๋ โ๋น์โ์ญํ ์ ํฉ๋๋ค. ์ค์น๋ actions on google์ ํตํด ํ๋กํ์ผ์ ๋ฑ๋ก ํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์ ๊ฐ์ ๊ธฐ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ตฌ๊ธ ์ด์์คํดํธ๋ ์ธ๊ณต์ง๋ฅ์ผ๋ก์จ ํ์ํ ์ ๋ณด๋ค์ ์์ฑ ๋ช ๋ น์ ํตํด ์์งํ๋ ๋ฐ์ ํฐ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก, ์์ฑ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ํผ๋๋ฐฑ์ ์ฃผ๋ ๋จ์๋ช ๋ฃํ ์์ ์๋ ์ ์ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
- ์ค๋ ธ์ฐ๋ณด์ด๋ ์์ฑ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ํผ๋๋ฐฑ์ ์ฃผ๋ ๋จ์๋ช ๋ฃํ ์์ ์ ๋งค์ฐ ์ ์ ํ ๋ชจ๋์ ๋๋ค. ์ค๋ ธ์ฐ๋ณด์ด๋ Kitt.ai์์ ๊ฐ๋ฐํ ๋ฌด๋ฃ ๋ผ์ด์ผ์ค ํ๋ก๊ทธ๋จ์ผ๋ก, ๊ฐ์ธ ์ฌ์ฉ์๊ฐ ์์ฑ ๋ น์์ ํตํด ํน์ ๋จ์ด ํจํด์ ๋ํ ํ๋กํ์ผ์ ์์ฑํ๋ฉด, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์ ๊ฐ์ ๊ฐ์ธ ๊ธฐ๊ธฐ์์ ๋ค์ํ ํ๊ฒฝ(ํ์ด์ฌ2, ํ์ด์ฌ3, C, C+, ๋ฑ๋ฑ)์์ ํ๋กํ์ผ์ ํด๋นํ๋ ๋จ์ด๊ฐ ์ธ์๋๋ฉด ๊ทธ์ ๋ํ ์ฝ๋ฐฑ์ด ์๋ํฉ๋๋ค.
import snowboydecoder
import sys
import signal
import paho.mqtt.client as mqtt
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout = 1)
mqtt = mqtt.Client()
mqtt.connect("localhost", 1883)
interrupted = False
def signal_handler(signal, frame):
global interrupted
interrupted = True
def interrupt_callback():
global interrupted
return interrupted
models = sys.argv[1:]
signal.signal(signal.SIGINT, signal_handler)
sensitivity = [0.5]
detector = snowboydecoder.HotwordDetector(models, sensitivity=sensitivity)
def callback1():
mqtt.publish("/control", "111")
ser.write(str.encode('1'))
def callback2():
mqtt.publish("/control", "000")
ser.write(str.encode('0'))
mqtt.loop(2)
callbacks = [callback1, callback2]
detector.start(detected_callback=callbacks, interrupt_check=interrupt_callback, sleep_time=0.03)
detector.terminate()์ด ํ๋ก์ ํธ์์๋ ์ ์ฒด ๋์ ๊ณผ์ ์ โ์คํโํ๋ ๊ฒ๊ณผ, โ์ค์งโํ๋ ๊ฒ์ ์ฐ์ ์ฃผ์์ ์ ๋๊ณ , ๊ฐ๊ฐ์ ๋ช ๋ น์ด๋ฅผ โ์์ํดโ์ โ์ค์งํดโ๋ก ๋ น์ํ์ฌ ํ๋กํ์ผ์ ์์ฑํ์์ต๋๋ค. ๋, ๊ทธ ๋จ์ด๊ฐ ์ธ์๋์์ ๋ ์คํ์ ํด๋นํ๋ ์ ํธ์ ์ค์ง์ ํด๋นํ๋ ์ ํธ๋ฅผ ์๋ฆฌ์ผ ํต์ ์ผ๋ก๋ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ฐ๊ฒฐ๋ ์๋์ด๋ ธ ๋ณด๋์, mqttํต์ ์ผ๋ก๋ ์ ์ธ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์ ์ ๋ฌ๋๋๋ก ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ์ฒ์ ์์ ๋ช ๋ น์ ๋ฐ๊ฒ ๋๋ฉด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ ์ธ์ ์ฝ๋๊ฐ ์๋ํ๊ฒ ๋๊ณ , ๋์ค์ ์ค์งํด์ผ ํ ์ํฉ์์ ์ค์ง ๋ช ๋ น์ ๋ฐ๊ฒ ๋๋ฉด ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ์ ์ธ์ ์ฝ๋๊ฐ ์๋์ ์ค์งํ๊ฒ ๋ฉ๋๋ค.
์๋ฒ์์์ ๊ธฐ๋ณธ์ ์ธ ๋ชฉํ๋ ์คํผ์ปค์ ์นด๋ฉ๋ผ, ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๊ฐ์ ํต์ ์ ์ด์ด์ฃผ๋ ์ญํ ์ ํ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ ์ด ํต์ ์์ ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ์๊ฐํํ๋ ์ญํ ์ด ๋ํด์ง๋๋ค. ์ด ์ญํ ์ ํตํด์ ์ฌ์ฉ์๊ฐ ์ด ์์คํ
์ ๋ํ ์ ๊ทผ์ฑ์ ๊ฐ์ง ์ ์๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ์์คํ
์ด ์ ์๋๋๋์ง๋ฅผ ํ๋จํ ์ ์์ต๋๋ค.
๊ณต์ ๊ณผ์ ์์ ์ถ์ ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ โMySQLโ์ด๋ผ๋ ๋๊ตฌ์ php๋ผ๋ โHypertext preprocessorโ๋ผ๋ ์ธ์ด๋ฅผ ํตํด์ ๊ตฌ์ถํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์ข ๋ ์ข์ โphpMyAdminโ์ด๋ผ๋ ๋ฌด๋ฃ ์ํํธ์จ์ด๋ฅผ ํตํด์ ์๋ฒ์ ์ฐ๊ฒฐํ์ต๋๋ค. ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์๋ฒ์์ ์ ์ ์ผ๋ก ๋ฌถ์ฌ์๋ ์ํ๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์ ์ผ๋ก ๊ณ์ ์ถ์ ๋๋ ๋ณํ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์์ ์ด ๊ฐ๋จํฉ๋๋ค.
๋จผ์ , ์๋ ์ฌ์ง๋ค๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค. ๋ฐ์ดํฐ๋ ๋จ์ํ ํ ์ค ํ์์ ๊ธด ์ค ํ
์คํธ๊ฐ ์๋๋ผ ํ๋ก ์ ๋ฆฌํ์ฌ ๋ํ๋ด์ง๋๋ค. ์ด๋ โMySQLโ์์ query๋ฌธ์ ํตํด์ ํ
์ด๋ธ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ธ๋ฐ ์ด ๋ง๋ค์ด์ง ํ๋ โphpMyAdminโ์ ์๊ฐํ๋์ด ๋ํ๋๊ณ , ์ด ํ
์ด๋ธ์ ํตํด์ ์๋ฒ๋ก ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
phpMyAdimin
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํ ํ
์คํธ ์ฒ๋ฆฌ
์ฌ์ง ์ฒ๋ฆฌ Node-RED flow
์ฌ์ง ํ์ธ์ด ๊ฐ๋ฅํ UI
์ ์ฒด์ ์ธ ๊ณต์ ์งํ ๊ณผ์ ์ ์์ด์ ์๋ฒ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ด๋ฆฌ์ ์
์ฅ์์ ๋ชจ๋ ํ๋ก์ธ์ค์ ์ ์ด ๊ถํ๋ ๊ฐ์ ธ์ผ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ํต์ ๋ฐ ์ ๋ณด ์ ๋ฌ์ ๋ฉ์ธ ์๋ฒ๋ฅผ ํตํด ์ด๋ฃจ์ด์ ธ์ผ ํ๊ณ , ๊ฐ๊ฐ์ ์ ํธ๋ ๋ฌด์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์ผ ํฉ๋๋ค.
- Node-RED๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ_ํต์ ๋ถ๋ถ์ ๋จ๊ณ๋ณ๋ก ๊ตฌ์ถํ์์ต๋๋ค. Node-RED(์๋ฒ)์์ ์๋์ด๋ ธ I/O ํฌํธ๋ฅผ ์ ์ดํ์ต๋๋ค. ์๋ ์ฌ์ง์ ์๋์ด๋ ธ๋ฅผ ์ ์ดํ๋ ํ๋ก์ฐ์ ๋๋ค. 1๊ณผ 0์ ์ ํธ ๋ฐ ๋ฒํผ์ผ๋ก LED๋ฅผ ์ ์ดํ๊ณ , ์๊ฐ ๋ฃจํ๋ก ์๋ณด๋ชจํฐ๋ฅผ ๋์์ํค๋๋ก ํ์ต๋๋ค.
Node-RED๋ฅผ ํ์ฉํ I/O ํฌํธ ์ ์ด
- ์๋ฒ์์ MQTT broker๋ฅผ ์ด๊ณ , Node-RED๊ฐ MQTT client ์ญํ ์ ํ์ฌ ํต์ ํ๋ ๋ชจ์ต์ ๋๋ค. ์ฐจ๋ก๋๋ก json ํ์ผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋๋ฒ๊น ํ๋ ํ๋ก์ฐ, ์ธ๋ถ mqtt ๋ธ๋ก์ปค (websocket) ํต์ ํ๋ก์ฐ, ๋ด๋ถ mqtt(Node-RED) ํต์ ํ๋ก์ฐ์ ๋๋ค.
์ด์ ๊ฐ์ ํ๋ก์ฐ๋ค๋ก Node-RED๋ก ์๋์ด๋ ธ ํฌํธ๋ฅผ ์ฝ๊ฒ ์ ์ดํ ์ ์๋ ๊ฒ๊ณผ, mqtt ํต์ ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค.
- ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์๋์ด๋
ธ ๋ณด๋์์ ๋ธ๋ฃจํฌ์ค / ์์ดํ์ด ํต์ ํฌํธ ์ด์์ต๋๋ค. ๋ ๊ฐ์ง ํต์ ๋ฐฉ๋ฒ ์ค, ํ๋์ ์์ดํ์ด ๊ณต์ ๊ธฐ ์๋์ ์์ ์ ํต์ ์ด ํธ๋ฆฌํ๋ค๋ ์ ๋๋ฌธ์ ์์ดํ์ด ํต์ ์ผ๋ก ๊ฒฐ์ ํ๊ฒ ๋์์ต๋๋ค. MQTTํต์ ๋ฐฉ์์ผ๋ก ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์๋์ด๋
ธ๋ก ์ ์ด ์ ํธ๋ฅผ ๋ณด๋๋๋ฐ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๊ฐ MQTT broker, ๋
ธํธ๋ถ์ด MQTT client๋ก ์ค์ ํ์ฌ ์๋์ด๋
ธ ์ ์ด๋ฅผ ์๋ํ์์ต๋๋ค.
- ์ดํ mqttํต์ ์ ์ํด mosquitto๋ผ๋ ์คํ ์๋น์ค๋ฅผ ์ด์ฉํ์์ต๋๋ค. Mosquitto๋ mqtt์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์์๋ฅผ ๋ชจ๋ ์ง์ํ๋ฉฐ, ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์๋ mqttํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์ paho python client๋ผ๋ mqtt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๊ฐ์ ํต์ ๋ฐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์๋์ด๋
ธ์ ํต์ ์ ์ฒ๋ฆฌํ์ต๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด_1 (MQTT server & client)
โ
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด_2 (MQTT client & server)
โ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด_3 (broker & server with servo motor)
๊ตฌ๋ ํ๊ณ ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์๋ ๊ฐ์ topic๊ณผ ์ ํด์ง ip๋ก ๋ฐํํ๊ณ ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ์ ํธ๋ฅผ ์ฝ์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ ๊ตฌ์ถ๋ ์๋ฒ์์ ์ ์ด๊ถ์ ๊ฐ๊ฒ ํ์ต๋๋ค.
cmd์์ mqtt๋ฅผ ๊ตฌ๋
/๋ฐํ
์ดํ cmd์์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ ip๋ฅผ ๊ตฌ๋ ํจ์ผ๋ก์จ ์ด๋ฃจ๋ ํต์ ์ python ์ฝ๋๋ก ์งํ ๊ฐ๋ฅํ๋๋ก ๋ฐ๊พธ์์ต๋๋ค.
mqtt ๋ฐํ
import paho.mqtt.client as mqtt
mqtt = mqtt.Client("python_pub") #create mqtt client object
mqtt.connect("localhost",1883)
mqtt.publish("/world", "111")
mqtt.publish("/world", "000")
mqtt.loop(2) #timeout 2 secmqtt ๊ตฌ๋
import paho.mqtt.client as mqtt
#callback which is executed when get CONNTACK response from server
def on_connect(client, userdata, flags, rc):
print("connected with result code "+str(rc))
client.subscribe("/world") #subscribe "nodemcu"
#callback which is executed when get publish message from server
def on_message(client,userdata,msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client() #create client object
client.on_connect = on_connect #set callback
client.on_message = on_message #set callback
client.connect("localhosModbus Node-RED ๋ ธ๋๋ฅผ ํ์ฉํ์ฌ ์๋์ด๋ ธ-์๋ฒ-๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์ธ์ํ ๋ช ๋ น์ด ์๋์ด๋ ธ์ ์๋ฆฌ์ผ ํฌํธ๋ก ์ ์ก ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค.
Node-RED๋ฅผ ํตํ ์๋ฆฌ์ผ ํต์
ํด๋ฆญํ์ฌ ๋น๋์ค ์ฌ์
์ค์๊ธฐ์
๋ค์ ์ค๋งํธํฉํ ๋ฆฌ ๊ตฌ์ถ์ ์ํด ์ ๋ถ์ ์ค๋งํธํฉํ ๋ฆฌ ๊ด๋ จ ์ง์๊ธ์๋ ๋ถ๊ตฌํ๊ณ ๋๊ธฐ์
์ค์ฌ์ ์ต์๊ธ ์๋น์ค๋ณด๋ค๋ ์ค์๊ธฐ์
๋ง์ถคํ ์ค๋งํธ ํฉํ ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ์์ ์งํํ ์ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ ๋ ดํ ์ผ์ ๋ฐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ๋ฐ ์๋์ด๋
ธ๋ฅผ ํตํด ์ถฉ๋ถํ ์ค๋งํธ ํฉํ ๋ฆฌ ์ปจ์
์ ์์คํ
์ ๊ตฌ์ถ ํ ์ ์์์ต๋๋ค. ์ด๋ฒ ์ฐ๊ตฌ์์ ์ด์ฉํ ๋น์ ๊ณผ ๋ณด์ด์ค ์ธ์์ ํตํด์ ์ฌ๋๊ณผ ๊ธฐ๊ณ, ๊ธฐ๊ณ์ ๊ธฐ๊ณ ํต์ ๋ฐฉ์์ ๋ํด ์ดํดํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ์๋ก ์ฐ๊ฒฐ๋์ด ๋ฐ์ํ๋ ์ง๋ฅํ ๊ณต์ฅ ์์คํ
์ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถํด๋ณด์๊ณ , ์ค์๊ธฐ์
๋ง์ถคํ ์๋ฃจ์
์ ์ ์ ํ ์ ์๋ ๊ฒฐ๋ก ์ ๋์ถํ ์ ์์์ต๋๋ค.
๋์ ๊ณต์ฅ์ ๋ค๋ฅธ ๊ณต์ ์ ๋ํ ํ์ฅ์ด๋ ๋ค๋ฅธ ํํ์ ์ ์กฐ๊ณต์ฅ์ ๋ํ ๊ตฌ์ถ์ ์ํด ๋ชจ๋ํ์์ ์์คํ
๊ตฌ์ถ์ด ํ์ํ๊ณ , ์ฌ๋ฌ IoT ๋๋ฐ์ด์ค๋ค์ ์ฐ๊ฒฐํ๊ณ ๊ด๋ฆฌํ ์ ์๋ IoT ํ๋ซํผ์ ํตํด์ ๋์ฑ ๊ณ ๋ํ ๋ ๋ชจ๋ํฐ๋ง๊ณผ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐ ๋ถ๋์ ๋ํ ์์ง๋ณด์ ๊น์ง ํ ์ ์๋ ํตํฉ ์์คํ
์ ์ถ๊ฐ์ฐ๊ตฌ๋ก์จ ์งํ์ด ํ์ํฉ๋๋ค.
- ๋ณธ ํ๋ก์ ํธ์์ ์งํํ ์ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ ๋ ดํ ์ผ์ ๋ฐ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด, ์๋์ด๋ ธ๋ฅผ ํตํด ์ถฉ๋ถํ ์ค๋งํธ ํฉํ ๋ฆฌ ์ปจ์ ์ ์์คํ ์ ๊ตฌ์ถํ ์ ์์์ต๋๋ค. ์ด๋ฒ ์ฐ๊ตฌ์์ ์ด์ฉํ ๋น์ ๊ณผ ๋ณด์ด์ค ์ธ์์ ํตํด์ ์ฌ๋๊ณผ ๊ธฐ๊ณ, ๊ธฐ๊ณ์ ๊ธฐ๊ณ ํต์ ๋ฐฉ์์ ๋ํด์ ๋ฐฐ์ ๊ณ , ์๋ก ์ฐ๊ฒฐ๋์ด ๋ฐ์ํ๋ ์ง๋ฅํ ๊ณต์ฅ ์์คํ ์ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถํด๋ด์ผ๋ก์จ, ์ค์๊ธฐ์ ๋ง์ถคํ ์๋ฃจ์ ์ ์ ์ํ ์ ์๋ ๊ฒฐ๋ก ์ ๋์ถํ ์ ์์์ต๋๋ค.
- ๋์ ๊ณต์ฅ์ ๋ค๋ฅธ ๊ณต์ ์ ๋ํ ํ์ฅ์ด๋ ๋ค๋ฅธ ํํ์ ์ ์กฐ๊ณต์ฅ์ ๋ํ ๊ตฌ์ถ์ ์ํด์๋ ๋ชจ๋ํ์์ ์์คํ ๊ตฌ์ถ์ด ํ์ํ๊ณ , ์ฌ๋ฌ IoT ๋๋ฐ์ด์ค๋ค์ ์ฐ๊ฒฐํ๊ณ ๊ด๋ฆฌํ ์ ์๋ IoT ํ๋ซํผ์ ํตํด์ ๋์ฑ ๊ณ ๋ํ๋ ๋ชจ๋ํฐ๋ง๊ณผ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐ ๋ถ๋์ ๋ํด ์ ์ง๋ณด์ ๊น์ง ํ ์ ์๋ ํตํฉ ์์คํ ์ ์ถ๊ฐ์ฐ๊ตฌ๋ก์จ ์งํ์ด ํ์ํฉ๋๋ค.






















