Skip to content

0712023/Smart-Factory-Monitoring-System

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

59 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Smart Factory Monitoring System

Keywords

Contents

  • Project Synopsis
  • Tools
    • Platform
    • Sensor
    • Software
  • Big Picture
  • Project Details
    • ํ•˜๋“œ์›จ์–ด ๊ตฌ์ถ•
      • ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ
      • ์ ์™ธ์„  ์„ผ์„œ ์—ฐ๊ฒฐ
        • ์นด๋ฉ”๋ผ ์‹คํ–‰์šฉ ์„ผ์„œ
        • ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์ œ์–ด์šฉ ์„ผ์„œ
        • ์„œ๋ณด๋ชจํ„ฐ ์ œ์–ด์šฉ ์„ผ์„œ
      • ์„œ๋ณด๋ชจํ„ฐ
    • ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ
      • ๊ฒ€์ถœ๋œ ์›๊ณผ ์‹ค์ œ ์ œํ’ˆ ํ…Œ๋‘๋ฆฌ์˜ ๋„“์ด ์ฐจ์ด ๋น„๊ต๋ฅผ ํ†ตํ•œ ์˜ค์ฐจ์œจ ๊ณ„์‚ฐ
      • 10์žฅ์˜ ์‚ฌ์ง„์„ ์ฐ์–ด ๊ฐ ์‚ฌ์ง„์— ๋Œ€ํ•ด ์›์„ ๊ฒ€์ถœ, ์ตœ์ข… ์› ๊ฒ€์ถœ์œจ์ด 90% ์ด์ƒ์ผ ๊ฒฝ์šฐ ์ •์ƒํ’ˆ
      • Hough circle ๋ฉ”์†Œ๋“œ ๋‚ด ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋“ค์„ ํ†ตํ•œ ์› ์ธ์‹
    • ์Œ์„ฑ ์ธ์‹
  • Demo
  • Review

Project Synopsis

  • ํ–‰์‚ฌ๋ช… : 2018 ์„ฑ๊ท ๊ด€๋Œ€ํ•™๊ต ์‹ค์ „๋ฌธ์ œํ•ด๊ฒฐํ˜• S-HERO
  • ์ฃผ์ตœ : ์„ฑ๊ท ๊ด€๋Œ€ํ•™๊ต ์‹ค์ „๋ฌธ์ œ ํ•ด๊ฒฐํ˜• S-HERO ๊ณตํ•™์ธ์žฌ ์–‘์„ฑ ์‚ฌ์—…๋‹จ
  • ์ง„ํ–‰ ๊ธฐ๊ฐ„ : '18.3.1 ~ '18.12.7
  • ๋ชฉ์  : Vision ๋ฐ ์Œ์„ฑ์ธ์‹ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ, ์บ” ์ œ์กฐ ๊ณต์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆ๋Ÿ‰ํ’ˆ์„ ์„ ๋ณ„ํ•˜๊ณ , ๋กœ๊ทธ ๊ธฐ๋ก ๋ฐ ๊ณต์ • ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ œํ’ˆ ํ’ˆ์งˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌ์ถ•ํ•˜์—ฌ ์ง€์† ๊ฐ€๋Šฅํ•œ ์ƒ์‚ฐ ๋ฐฉ์•ˆ์— ๊ด€ํ•œ ์—ฐ๊ตฌ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋‚ด์šฉ : ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ํ™˜๊ฒฝ์—์„œ OpenCV๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋กœ ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ, Snowboy ๋ชจ๋“ˆ์„ ํ†ตํ•œ ์Œ์„ฑ์ธ์‹, ์Œ์„ฑ์ธ์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ณต์žฅ์˜ ์ œ์–ด, ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ๊ฒ€์ถœํ•ด๋‚ด๋Š” ๊ณต์žฅ ์‹œ์Šคํ…œ์˜ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์‹œ์—ฐํ•ด๋ณด๊ณ  ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ถ”ํ›„ ์‹ค์ œ ๊ณต์žฅ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„, ๋””๋ฐ”์ด์Šค, ํ•˜๋“œ์›จ์–ด ๊ฐ๊ฐ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ
    • ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ํ™˜๊ฒฝ์—์„œ OpenCV๋ฅผ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์บ”์˜ ๋ถˆ๋Ÿ‰ํ’ˆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์„œ๋ณด๋ชจํ„ฐ๊ฐ€ ๋ถˆ๋Ÿ‰ํ’ˆ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ์Œ์„ฑ์ธ์‹ ๋ชจ๋“ˆ์€ Snowboy๋ฅผ ํ†ตํ•œ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์˜ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ณต์žฅ์˜ ํšจ๊ณผ์ ์ธ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋””๋ฐ”์ด์Šค์—์„œ ์‹œ์ž‘ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋ฉฐ, ์ •์ง€ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์„œ๋ฒ„๋„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์Œ์„ฑ์ธ์‹ ์‹ ํ˜ธ๋ฅผ ์ œ์–ดํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ์›นํŽ˜์ด์ง€์— ๊ฒ€์ถœ๊ฒฐ๊ณผ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•ด์„œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ„ ์™€์ดํŒŒ์ด๋ฅผ ํ†ตํ•œ mqtt ํ†ต์‹ ์œผ๋กœ ๋””๋ฐ”์ด์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ๋ถ„์•ผ๋“ค์ด ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜์—ฌ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ๊ณต์žฅ์˜ ํ˜•ํƒœ๋ฅผ ์ด๋ฃจ๊ฒŒ ๋จ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

Tools

Platform

  • Raspberry Pi 3B
  • Arduino Uno

Sensor

  • PiCamera
  • IR Sensor
  • Servo Motor - DC Motor
  • Conveyer Belt - AC Motor
  • ReSpeaker 4-Mic Array for Raspberry Pi

Software

  • Node-RED
  • Arduino IDE
  • MySQL
  • phpMyAdmin
  • Mosquitto

Big Picture

  • ๊ฐ€์žฅ ๋จผ์ € ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์Œ์„ฑ์ธ์‹์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜์—ฌ ์•„๋‘์ด๋…ธ๋กœ ์ „์†ก๋˜๋ฉฐ, ์ด ๊ฒฐ๊ณผ๋กœ ์Œ์„ฑ์ธ์‹์„ ํ†ตํ•œ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ์ œ์–ด๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ„ mqtt ํ†ต์‹ ์„ ํ†ตํ•˜์—ฌ ์Œ์„ฑ์ธ์‹์˜ ๋ฐ์ดํ„ฐ, ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก์‹œ์ผœ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์ œ์–ด ๋ฐ ์„œ๋ณด๋ชจํ„ฐ์˜ ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ ๋ถ„๋ฅ˜๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•จ์œผ๋กœ ์ธํ•ด ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ์˜ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๊ฐ€๋™ํ•˜์—ฌ ๋ชจ๋“  ๊ณต์ •์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ System Architecture์—์„œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ์—ฃ์ง€ #1์—์„œ ์Œ์„ฑ์ธ์‹์„ ํ†ตํ•œ ์ œ์–ด ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, ์Œ์„ฑ์ธ์‹ ํ›„ ์ œ์–ด ๋ช…๋ น์„ ๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ์ œ์–ด๋˜๋ฉฐ, ๋˜ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๋””๋ฐ”์ด์Šค#2์—์„œ ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ๊ฒฐ๊ด๊ฐ’์„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋””๋ฐ”์ด์Šค#3์œผ๋กœ ์ „์†กํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ด๊ฐ’์— ๋”ฐ๋ผ ์„œ๋ณด๋ชจํ„ฐ๊ฐ€ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ๋ถ„๋ฆฌํ•ด ๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ„์˜ mqtt๋Š” ์™€์ดํŒŒ์ด๋ฅผ ํ†ตํ•ด์„œ ํ†ต์‹ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Project Details

1. ํ•˜๋“œ์›จ์–ด ๊ตฌ์ถ•

์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ๊ตฌ๋™์„ ์œ„ํ•œ ๋ฆด๋ ˆ์ด์ž‘๋™, ์นด๋ฉ”๋ผ์‹คํ–‰ ๋ฐ ๋ฆด๋ ˆ์ด์ž‘๋™ ๋ฐ ์ •์ง€๋ฅผ ์œ„ํ•œ ์ ์™ธ์„  ์„ผ์„œ, ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์„ ์œ„ํ•œ ์„œ๋ณด๋ชจํ„ฐ ์ž‘๋™์„ ์œ„ํ•ด ์•„๋‘์ด๋…ธ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  ์ด์˜ ์ž‘๋™์„์œ„ํ•ด IDLE๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ดํ›„ ํ†ต์‹ ์„ ์œ„ํ•ด ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์™€ UART(Universal asynchronous receiver/transmitter)์—ฐ๊ฒฐ์„ ํ†ตํ•ด Serial ํ†ต์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1) ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ

์Œ์„ฑ๋ช…๋ น์ด ๋‚ด๋ ค์กŒ์„ ๋•Œ, ์„ค๋น„์˜ ์ž‘๋™์ด ์‹œ์ž‘๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๋‘์ด๋…ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ๋Š” ๋‹ค์–‘ํ•œ ์„ผ์„œ๋‚˜ ๋ชจํ„ฐ, ๋ฒจํŠธ์™€ ๊ฐ™์€ ๋ถ€ํ’ˆ์ด ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•˜๊ณ  ์ž…์ถœ๋ ฅ, ์ค‘์•™์ฒ˜๋ฆฌ์žฅ์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชฉ์ ์— ๊ฐ€์žฅ ์•Œ๋งž์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ์ œ์–ดํ•˜๋ ค๋ฉด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋ชจํ„ฐ๋ฅผ ์•„๋‘์ด๋…ธ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 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โ€™))//์‹œ์ž‘ ๋ช…๋ น์‹œ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ์ž‘๋™,

2) ์ ์™ธ์„  ์„ผ์„œ

์ ์™ธ์„  ์„ผ์„œ๋Š” ์ œํ’ˆ์ด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„๋ฅผ ์ง€๋‚˜๊ฐˆ ๋•Œ, ์ œํ’ˆ์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ณต์ •์˜ ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ณต์ • ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ ์™ธ์„  ์„ผ์„œ๋Š” ์ด 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())
//๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ๋Ÿ‰ํ’ˆ์ด๋ผ ์ธ์‹ํ•˜์˜€์„ ๋•Œ ์„œ๋ณด๋ชจํ„ฐ๋ฅผ ํšŒ์ „์‹œํ‚ค๊ธฐ์œ„ํ•œ ํ†ต์‹ ์„ ํ•œ๋‹ค.

3) ์„œ๋ณด ๋ชจํ„ฐ

์„œ๋ณด๋ชจํ„ฐ์˜ ์ž‘๋™์„ ์œ„ํ•ด ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด-์•„๋‘์ด๋…ธ๊ฐ„ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด, ๋ถˆ๋Ÿ‰ํ’ˆ์˜ ๊ฒ€์ถœ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ์™€, ์„ผ์„œ์˜ ์ธ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ถˆ๋Ÿ‰ํ’ˆ ํŒ๋‹จ ์—ฌ๋ถ€ ๋ฐ์ดํ„ฐ๋Š” list์— ์Œ“์ด๊ฒŒ ๋˜๊ณ , ์„ผ์„œ๊ฐ€ ์ธ์‹๋จ์— ๋”ฐ๋ผ(์บ”์ด ์„œ๋ณด๋ชจํ„ฐ ์•ž์„ ์ง€๋‚˜๊ฐ) list์— ์ €์žฅ๋˜์–ด์ง„ ๋ถˆ๋Ÿ‰ํ’ˆ ์—ฌ๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ๋ถˆ๋Ÿ‰ํ’ˆ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฒ€์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ณด๋ชจํ„ฐ ์ œ์–ด

if (in_data == '2'){
       for (pos = 0; pos <= 180; pos += 5) {
          EduServo.write(pos);
          delay(10);}
//์ด๋Š” ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ โ€œ๋ถˆ๋Ÿ‰ํ’ˆ์ด๋ผ๊ณ  ์ธ์‹ํ•˜์˜€์„ ๋•Œ ์„œ๋ณด๋ชจํ„ฐ๋ฅผ ํšŒ์ „ํ•˜์—ฌ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ๊ฒ€์ถœํ•˜๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ๋˜์–ด์ง„ ํ•˜๋“œ์›จ์–ด๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌ๊ฐ„ mqtt, ์•„๋‘์ด๋…ธ์™€ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์˜ UART ์‹œ๋ฆฌ์–ผ ํ†ต์‹ , ์•„๋‘์ด๋…ธ์™€ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๊ฐ„์˜ ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์„ ํ†ตํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์œผ๋กœ์˜ ์Œ์„ฑ์ธ์‹์„ ํ†ตํ•ด ์ œ์–ด๋˜๋Š” ๋ฆด๋ ˆ์ด์™€ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์—์„œ ์„ผ์„œ๊ฐ€ ์ธ์‹๋˜๋ฉด ์นด๋ฉ”๋ผ ์ž‘๋™์„ ์œ„ํ•ด์„œ 3์ดˆ๊ฐ„ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ๋ฉˆ์ถ”๊ณ  ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์„ ์œ„ํ•œ ์‚ฌ์ง„์ดฌ์˜ ํ›„ ๋‹ค์‹œ ์žฌ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ ์™ธ์„ ์„ผ์„œ๊ฐ€ ์ธ์‹ ๋˜์—ˆ์„ ๋•Œ ๋ถˆ๋Ÿ‰ํ’ˆ์˜ ํŒ๋‹จ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„œ๋ณด๋ชจํ„ฐ๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋˜๋ฉฐ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒ€์ถœํ•˜๊ฒŒ ๋˜๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ˜•์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2. ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3์™€ ํŒŒ์ด์นด๋ฉ”๋ผ ๋ชจ๋“ˆ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3์—์„œ ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์— ํ•„์š”ํ•œ ์‚ฌ์ง„์„ ์ฐ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“ˆ์€ ์—†์œผ๋ฉฐ, ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3 ๋ณด๋“œ ์œ„์˜ ์ฝ”๋“œ์— ๊ฒฐํ•ฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ถˆ๋Ÿ‰ํ’ˆ ๊ฒ€์ถœ์˜ ์ตœ์ข… ๋ชฉ์ ์ด ์› ํ˜•ํƒœ์˜ ์ธ์‹ ์—ฌ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ์‚ฌ์ง„์—์„œ ์›์˜ ํ˜•ํƒœ๋ฅผ ์ธ์‹ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํŒŒ์ด์ฌ3 ํ™˜๊ฒฝ์—์„œ โ€˜OpenCVโ€™ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. OpenCV ๋ชจ๋“ˆ์€ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3์˜ ์นด๋ฉ”๋ผ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์ง„์„ ์ฐ๊ฑฐ๋‚˜, ์ €์žฅ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ๋ณด์—ฌ์ฃผ๊ธฐ, ์› ๊ทธ๋ฆฌ๊ธฐ, ํ…Œ๋‘๋ฆฌ ๊ทธ๋ฆฌ๊ธฐ, ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋„๊ฐ€ ๋†’์€ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ ํŒ€์ด ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณผ์ œ์— ํ•„์š”ํ•œ ๋ถ€๋ถ„์€, โ€˜์‚ฌ์ง„์—์„œ ์› ์ธ์‹โ€™, โ€˜์‚ฌ์ง„์—์„œ ์› ๊ทธ๋ฆฌ๊ธฐโ€™์ž…๋‹ˆ๋‹ค. โ€˜์‚ฌ์ง„์—์„œ ์› ์ธ์‹โ€™์€ ๋ฉ”์†Œ๋“œ โ€˜HoughCirclesโ€™๋ฅผ, โ€˜์‚ฌ์ง„์—์„œ ์› ๊ทธ๋ฆฌ๊ธฐโ€™๋Š” ๋ฉ”์†Œ๋“œ โ€˜circleโ€™์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•ด ์ฐ์€ ์ œํ’ˆ ์‚ฌ์ง„์—์„œ ๋ถˆ๋Ÿ‰ํ’ˆ์ธ์ง€, ์ •์ƒ์ œํ’ˆ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์— ์žˆ์–ด์„œ ์ตœ์ ์˜ ๋ฐฉ์•ˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

1) ๊ฒ€์ถœ๋œ ์›๊ณผ ์‹ค์ œ ์ œํ’ˆ ํ…Œ๋‘๋ฆฌ์˜ ๋„“์ด ์ฐจ์ด ๋น„๊ต๋ฅผ ํ†ตํ•œ ์˜ค์ฐจ์œจ ๊ณ„์‚ฐ

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%์˜ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.


์‹ค์ œ ์› ๊ฒ€์ถœ ์‚ฌ์ง„

์˜ค์ฐจ์œจ ๊ณ„์‚ฐ ์˜์—ญ

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ Houghcircle, contourArea ๋‘ ๋ฉ”์†Œ๋“œ ๊ฐ๊ฐ ์นด๋ฉ”๋ผ์˜ ํ”๋“ค๋ฆผ, ์‚ฌ์ง„์˜ ๋‚ฎ์€ ํ™”์งˆ, ๋“ฑ์—์„œ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ์˜ค์ฐจ๊ฐ€ ๋ถˆ๋Ÿ‰ํ’ˆ์ธ ์ œํ’ˆ์„ ์ •์ƒ์ œํ’ˆ์ด๋ผ๊ณ  ์˜คํŒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‹ค์†Œ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

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์žฅ์˜ ์‚ฌ์ง„์„ ์ฐ๋Š” ๋™์•ˆ, ์ œํ’ˆ์ด ์ด๋™ํ•˜์—ฌ ์นด๋ฉ”๋ผ ๋ฐ”๋กœ ๋ฐ‘์ด ์•„๋‹Œ ์•ฝ๊ฐ„ ๋น„์Šค๋“ฌํ•œ ์œ„์น˜์—์„œ ์ฐํžŒ ์‚ฌ์ง„ ๋˜ํ•œ ์˜ค์ฐจ์œจ ๊ณ„์‚ฐ์— ํฌํ•จ๋˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋•Œ, ์ •์ƒ์ ์ธ ์ œํ’ˆ์ž„์—๋„ ํƒ€์›ํ˜•์œผ๋กœ ์‚ฌ์ง„์ด ์ฐํž ์ˆ˜ ์žˆ์–ด, ์› ๊ฒ€์ถœ์— ์‹ ๋น™์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ด ๋ฐฉ๋ฒ• ๋˜ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

3) Hough circle ๋งค์†Œ๋“œ ๋‚ด ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋“ค์„ ํ†ตํ•œ ์› ์ธ์‹

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 ๋‚ด๋ถ€ ๊ฒฝ๋กœ์— ์ €์žฅ๋˜๊ณ , ๊ณง๋ฐ”๋กœ ์„œ๋ฒ„์— ์—…๋กœ๋“œ๋˜์–ด, ์ฑ…์ž„์ž ๋“ฑ์ด ์ž์œ ๋กญ๊ฒŒ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์„ ๊ฒ€์ถœํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋ฌดํ•œํžˆ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋งค ๋ฃจํ”„๋งˆ๋‹ค ์ œํ’ˆ์ด ์นด๋ฉ”๋ผ ์•ž์— ๋„๋‹ฌํ•˜์˜€๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•„๋‘์ด๋…ธ ๋ณด๋“œ์˜ ๋””์ง€ํ„ธ ์ ์™ธ์„  ์„ผ์„œ๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ ๋ณด๋“œ์™€ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3๋Š” ์œ ์„ ์ƒ์˜ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ์•ž์— ์ œํ’ˆ์ด ๋„๋‹ฌํ•˜์˜€๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ์› ์ธ์‹ ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ๋ฃจํ”„๋งŒ ๊ณ„์† ๋•๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ œํ’ˆ์ด ์นด๋ฉ”๋ผ ์•ž์— ๋„๋‹ฌํ•˜์˜€๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ฐ›์œผ๋ฉด ์› ์ธ์‹ ์ฝ”๋“œ๋ฅผ ๋‹จ 1ํšŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๊ณ  ๋‹ค์‹œ ๋ฃจํ”„๋ฅผ ๋•๋‹ˆ๋‹ค.
์› ์ธ์‹ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฃจํ”„๋Š” ์ฑ…์ž„ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋•Œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ ์›ํ•˜๋Š” ๋•Œ์— ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ on/off ์Šค์œ„์น˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋’ค์—์„œ ์„ค๋ช…ํ•  ์Œ์„ฑ์ธ์‹์ž…๋‹ˆ๋‹ค.

3. ์Œ์„ฑ์ธ์‹

์Œ์„ฑ์ธ์‹์€ ์› ์ธ์‹ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3๊ฐ€ ์•„๋‹Œ ๋˜ ๋‹ค๋ฅธ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ on์— ํ•ด๋‹นํ•˜๋Š” ๋ช…๋ น์„ ๋ฐ›์œผ๋ฉด ๋ฉˆ์ถฐ์žˆ๋Š” ๋ฃจํ”„๋ฅผ ์ž‘๋™์‹œํ‚ค๊ฒŒ ํ•˜๊ณ , off์— ํ•ด๋‹นํ•˜๋Š” ๋ช…๋ น์„ ๋ฐ›์œผ๋ฉด, ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ๋ฃจํ”„๋ฅผ ๋ฌด์กฐ๊ฑด ์ •์ง€์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋‘ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3 ์‚ฌ์ด์˜ ํ†ต์‹ ์€ mqtt๋ฅผ ํ†ตํ•ด์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3 ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์ œํ’ˆ ๋กœ๊ทธ๋Š” ๊ณง๋ฐ”๋กœ ์„œ๋ณด๋ชจํ„ฐ๋ฅผ ๋Œ๋ฆฌ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ณด๋ชจํ„ฐ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3๋กœ mqttํ†ต์‹ ์„ ํ†ตํ•ด ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


ReSpeaker 4-Mic Array for Raspberry Pi

ReSpeaker 4-Mic Array for Raspberry Pi๋Š” 4๊ฐœ์˜ ๋งˆ์ดํฌ๊ฐ€ ์ ์šฉ๋œ ๋ณด๋“œ๋กœ์„œ, ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด3์— ๊ฐ€์žฅ ์ตœ์ ํ™”๋œ ์Šคํ”ผ์ปค์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๋†’์€ ๊ฐ๋„์˜ ์Œ์„ฑ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ, jarvisfactory ํŒ€์˜ ์Œ์„ฑ์ธ์‹์— ํ•„์š”ํ•œ ์žฅ๋น„์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์นด๋ฉ”๋ผ์™€ ๋‹ฌ๋ฆฌ ์ดˆ๊ธฐ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋‚ด๋ ค๋ฐ›์•„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์Œ์„ฑ์ธ์‹์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ตฌ๊ธ€ ์–ด์‹œ์Šคํ„ดํŠธ(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์— ์ „๋‹ฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ฒ˜์Œ ์‹œ์ž‘ ๋ช…๋ น์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์™€ ์› ์ธ์‹ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋˜๊ณ , ๋„์ค‘์— ์ค‘์ง€ํ•ด์•ผ ํ•  ์ƒํ™ฉ์—์„œ ์ค‘์ง€ ๋ช…๋ น์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์™€ ์› ์ธ์‹ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™์„ ์ค‘์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4. ์„œ๋ฒ„

1) ์„œ๋ฒ„ ๊ตฌ์ถ•

์„œ๋ฒ„์—์„œ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ชฉํ‘œ๋Š” ์Šคํ”ผ์ปค์™€ ์นด๋ฉ”๋ผ, ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ„์˜ ํ†ต์‹ ์„ ์ด์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ด ํ†ต์‹ ์—์„œ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ๊ฐํ™”ํ•˜๋Š” ์—ญํ• ์ด ๋”ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด ์—ญํ• ์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ์Šคํ…œ์ด ์ž˜ ์ž‘๋™๋˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณต์ • ๊ณผ์ •์—์„œ ์ถ•์ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ โ€˜MySQLโ€™์ด๋ผ๋Š” ๋„๊ตฌ์™€ php๋ผ๋Š” โ€˜Hypertext preprocessorโ€™๋ผ๋Š” ์–ธ์–ด๋ฅผ ํ†ตํ•ด์„œ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ข€ ๋” ์ข‹์€ โ€˜phpMyAdminโ€™์ด๋ผ๋Š” ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ •์ ์œผ๋กœ ๋ฌถ์—ฌ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋™์ ์œผ๋กœ ๊ณ„์† ์ถ•์  ๋˜๋Š” ๋ณ€ํ˜•๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋จผ์ €, ์•„๋ž˜ ์‚ฌ์ง„๋“ค๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋‹จ์ˆœํ•œ ํ•œ ์ค„ ํ˜•์‹์— ๊ธด ์ค„ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ๋กœ ์ •๋ฆฌํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” โ€˜MySQLโ€™์—์„œ query๋ฌธ์„ ํ†ตํ•ด์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ์ด ๋งŒ๋“ค์–ด์ง„ ํ‘œ๋Š” โ€˜phpMyAdminโ€™์— ์‹œ๊ฐํ™”๋˜์–ด ๋‚˜ํƒ€๋‚˜๊ณ , ์ด ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด์„œ ์„œ๋ฒ„๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


phpMyAdimin

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•œ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ

๋‹ค์Œ์œผ๋กœ ์‚ฌ์ง„ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ง„์„ http ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•œ URL์— ๋จผ์ € ์˜ฌ๋ฆฐ ํ›„, ์„œ๋ฒ„์—์„œ๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋กœ ์ฐ์„ ๋ฌผ๊ฑด์„ ์ง€์ •ํ•˜๋Š” ํ…์ŠคํŠธ๋ฅผ ํ•˜์ดํผํ…์ŠคํŠธ๋งํฌํ˜•์‹์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ง€์ •๋œ ํ…์ŠคํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, ์ง€์ •๋œ URL ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ์ €์žฅ๋œ ์‚ฌ์ง„์ด ๋ณด์ด๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


์‚ฌ์ง„ ์ฒ˜๋ฆฌ Node-RED flow

์‚ฌ์ง„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ UI

2) I/O ํฌํŠธ ์ œ์–ด

์ „์ฒด์ ์ธ ๊ณต์ • ์ง„ํ–‰ ๊ณผ์ •์— ์žˆ์–ด์„œ ์„œ๋ฒ„์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ด€๋ฆฌ์ž ์ž…์žฅ์—์„œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ์ œ์–ด ๊ถŒํ•˜๋Š” ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ํ†ต์‹  ๋ฐ ์ •๋ณด ์ „๋‹ฌ์„ ๋ฉ”์ธ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์‹ ํ˜ธ๋Š” ๋ฌด์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Node-RED๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„_ํ†ต์‹  ๋ถ€๋ถ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Node-RED(์„œ๋ฒ„)์—์„œ ์•„๋‘์ด๋…ธ I/O ํฌํŠธ๋ฅผ ์ œ์–ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์€ ์•„๋‘์ด๋…ธ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค. 1๊ณผ 0์˜ ์‹ ํ˜ธ ๋ฐ ๋ฒ„ํŠผ์œผ๋กœ LED๋ฅผ ์ œ์–ดํ•˜๊ณ , ์‹œ๊ฐ„ ๋ฃจํ”„๋กœ ์„œ๋ณด๋ชจํ„ฐ๋ฅผ ๋™์ž‘์‹œํ‚ค๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.


Node-RED๋ฅผ ํ™œ์šฉํ•œ I/O ํฌํŠธ ์ œ์–ด

3) MQTT ์ œ์–ด

  • ์„œ๋ฒ„์—์„œ 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 sec

mqtt ๊ตฌ๋…

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("localhos

4) ์‹œ๋ฆฌ์–ผ ํ†ต์‹ 

Modbus Node-RED ๋…ธ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋‘์ด๋…ธ-์„œ๋ฒ„-๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๊ฐ„์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์—์„œ ์ธ์‹ํ•œ ๋ช…๋ น์ด ์•„๋‘์ด๋…ธ์˜ ์‹œ๋ฆฌ์–ผ ํฌํŠธ๋กœ ์ „์†ก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


Node-RED๋ฅผ ํ†ตํ•œ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ 

Demo Video

ํด๋ฆญํ•˜์—ฌ ๋น„๋””์˜ค ์žฌ์ƒ

1. alpha ๋ฒ„์ „ ์‹œ์Šคํ…œ ์™„์„ฑ

1. beta ๋ฒ„์ „ ์‹œ์Šคํ…œ ์™„์„ฑ

1. ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ์ œํ’ˆ ์‚ฌ์ง„ ํ™•์ธ

1. ์ตœ์ข… ๋ฐœํ‘œํšŒ ์‹œ์—ฐ

Research Prospects

์ค‘์†Œ๊ธฐ์—…๋“ค์€ ์Šค๋งˆํŠธํŒฉํ† ๋ฆฌ ๊ตฌ์ถ•์„ ์œ„ํ•ด ์ •๋ถ€์˜ ์Šค๋งˆํŠธํŒฉํ† ๋ฆฌ ๊ด€๋ จ ์ง€์›๊ธˆ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋Œ€๊ธฐ์—… ์ค‘์‹ฌ์˜ ์ตœ์ƒ๊ธ‰ ์„œ๋น„์Šค๋ณด๋‹ค๋Š” ์ค‘์†Œ๊ธฐ์—… ๋งž์ถคํ˜• ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ์ง„ํ–‰ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ €๋ ดํ•œ ์„ผ์„œ ๋ฐ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๋ฐ ์•„๋‘์ด๋…ธ๋ฅผ ํ†ตํ•ด ์ถฉ๋ถ„ํžˆ ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ ์ปจ์…‰์˜ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์—ฐ๊ตฌ์—์„œ ์ด์šฉํ•œ ๋น„์ „๊ณผ ๋ณด์ด์Šค ์ธ์‹์„ ํ†ตํ•ด์„œ ์‚ฌ๋žŒ๊ณผ ๊ธฐ๊ณ„, ๊ธฐ๊ณ„์™€ ๊ธฐ๊ณ„ ํ†ต์‹ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ˜์‘ํ•˜๋Š” ์ง€๋Šฅํ˜• ๊ณต์žฅ ์‹œ์Šคํ…œ์˜ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด์•˜๊ณ , ์ค‘์†Œ๊ธฐ์—… ๋งž์ถคํ˜• ์†”๋ฃจ์…˜์„ ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๋ก ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์ƒ ๊ณต์žฅ์— ๋‹ค๋ฅธ ๊ณต์ •์— ๋Œ€ํ•œ ํ™•์žฅ์ด๋‚˜ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ œ์กฐ๊ณต์žฅ์— ๋Œ€ํ•œ ๊ตฌ์ถ•์„ ์œ„ํ•ด ๋ชจ๋“ˆํ˜•์‹์˜ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์ด ํ•„์š”ํ•˜๊ณ , ์—ฌ๋Ÿฌ IoT ๋””๋ฐ”์ด์Šค๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” IoT ํ”Œ๋žซํผ์„ ํ†ตํ•ด์„œ ๋”์šฑ ๊ณ ๋„ํ™” ๋œ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ๋ถˆ๋Ÿ‰์— ๋Œ€ํ•œ ์˜ˆ์ง€๋ณด์ „๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€์—ฐ๊ตฌ๋กœ์จ ์ง„ํ–‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Review

  • ๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ์ง„ํ–‰ํ•œ ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ €๋ ดํ•œ ์„ผ์„œ ๋ฐ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด, ์•„๋‘์ด๋…ธ๋ฅผ ํ†ตํ•ด ์ถฉ๋ถ„ํžˆ ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ ์ปจ์…‰์˜ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์—ฐ๊ตฌ์—์„œ ์ด์šฉํ•œ ๋น„์ „๊ณผ ๋ณด์ด์Šค ์ธ์‹์„ ํ†ตํ•ด์„œ ์‚ฌ๋žŒ๊ณผ ๊ธฐ๊ณ„, ๊ธฐ๊ณ„์™€ ๊ธฐ๊ณ„ ํ†ต์‹ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๊ณ , ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ˜์‘ํ•˜๋Š” ์ง€๋Šฅํ˜• ๊ณต์žฅ ์‹œ์Šคํ…œ์˜ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถ•ํ•ด๋ด„์œผ๋กœ์จ, ์ค‘์†Œ๊ธฐ์—… ๋งž์ถคํ˜• ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๋ก ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ ๊ณต์žฅ์— ๋‹ค๋ฅธ ๊ณต์ •์— ๋Œ€ํ•œ ํ™•์žฅ์ด๋‚˜ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ œ์กฐ๊ณต์žฅ์— ๋Œ€ํ•œ ๊ตฌ์ถ•์„ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“ˆํ˜•์‹์˜ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์ด ํ•„์š”ํ•˜๊ณ , ์—ฌ๋Ÿฌ IoT ๋””๋ฐ”์ด์Šค๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” IoT ํ”Œ๋žซํผ์„ ํ†ตํ•ด์„œ ๋”์šฑ ๊ณ ๋„ํ™”๋œ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ๋ถˆ๋Ÿ‰์— ๋Œ€ํ•ด ์œ ์ง€๋ณด์ „๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€์—ฐ๊ตฌ๋กœ์จ ์ง„ํ–‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors