[59호]제 17회 대한민국 교육박람회
제 17회 대한민국 교육박람회EDUCATION KOREA 2020
교육 최신 정보, 트렌드 분석을 통해 한국 교육의 새로운 패러다임을 제시하는 ‘제17회 대한민국 교육박람회가 지난 1월 서울 코엑스에서 개최하였다. 17회를 맞이하는 대한민국 교육박람회는 대한민국 최대의 교육전문 종합 박람회다.
이번 박람회는 ‘교육이 미래다(The Future is Education)’를 주제로 교육과 기술의 융합을 통한 에듀테크(EdTech) 및 교육콘텐츠, 최신 교육환경 및 시설과 조기/초등, 어학, 평생 및 직업교육 등 교육 전반에 대한 분야별 우수 기업과 제품을 만날 수 있었다. 특히 어린 학생들의 관심과 흥미를 높여줄 수 있는 레고 또는 로봇형식의 교구들을 특히 많이 볼 수 있었다.
가장 먼저 만나보았던 에스에프에듀의 부스에서는 고릴라셀인 90여 종에 이르는 레고블록 형태의 입출력장치인 제품들을 선보였다. 고릴라셀은 아두이노에 입출력장치를 쉽게 연결할 수 있게 도와주는 고릴라 쉴드와 레고블록 형태의 입출력장치인 센서셀, 모터셀, 디스플레이셀, 통신셀등으로 구성돼 있으며 블록명령으로 코딩이 가능한 교구이다. 이 중 고릴라 쉴드는 PCB 형태로 제작되어 아두이노 및 마이크로 비트에 케이블로 쉽게 연결하여 다양한 메이킹을 가능하게 해주며, 아두이노를 변형 없이 사용할 수 있는 역할을 해준다. 또한, 다양한 고릴라셀은 레고와 호환되기 때문에 교과 시간이나 잉여시간에 아이들은 코딩 공부를 하는데 거부감 없이 놀이와 함께 즐길 수 있는 특징이 있다.
코딩 원스톱 솔루션을 제공하는 Asome IT에서는 어썸봇과 어썸카를 선보였다. 어썸봇은 걷고 춤추는 로봇형 코딩 교구로 스마트 OS로 다양한 동작을 만들 수 있다. 어썸카는 자율주행 자동차형 교구로 라인 트레이싱 센서로 선을 따라 이동이 가능하며, 4개의 바퀴를 코딩으로 마음껏 조종할 수 있다. 두 제품 모두 WiFi를 통해 신호를 전달하고, 받을 수 있으며 거리를 재거나 장애물을 피할 수 있게 설계되었다. 소비자는 20가지 액티비티가 가능한 교구로 놀이를 통해 코딩에 대한 흥미를 느낄 수 있고, 직접 코딩으로 조종하며 재미있게 지식을 습득할 수 있는 특징을 갖는다. 특히, AsomeIT의 코딩 교육은 자체 개발한 코딩 플랫폼인 AsomeCode에서 교재와 60여 개의 동영상 강의가 제공되며 블록코딩 실습을 통해 누구나 쉽게 배우고, 가르칠 수 있다.
국내외 유수 혁신 교육기관과 협력하여 AI 시대의 미래 인재 교육 프로그램을 개발 보급하는 유메이커스에서는 아이들이 상상하고, 만들고 해결할 수 있는 메이커 교구와 교육 프로그램을 소개하였다. 메이커 교구로는 메이커 입문용 보드게임 메어커스 플레이, 손으로 만드는 메이커 소재와 공구, 3D모델링과 브릭으로 만나는 3D Bricks 제품, 스마트 전자 블록을 활용한 교구 등 다양한 방식이 적용된 메이커 KIT를 확인할 수 있었다.
그 중 두 가지 제품이 가장 많은 주목을 받았는데 첫 번째로는 상상하던 디자인을 레고브릭과 3D모델링 소프트웨어를 활용하여 표현하는 3D Bricks 제품이었다. 3D Brick은 큐브(픽셀)와 레고를 디자인하는 프로그램인 USECUBES를 사용하여 자신이 디자인한 모형을 레고로 만들 수 있다. 이후, 코딩으로 움직임 설계 및 3D 프린터와 블록을 통해 실제 입체물로 제작이 가능하며 다른 레고 형태의 교구와 달리 여러 가지 전자 부품들이 외부로 노출되지 않아 시각적으로 완성도가 높은 특징이 있다.
두 번째로는 스마트 인터렉티브 블록 크리모 제품으로 블록 조립을 통해 자기 생각을 표현하는 창의 과학 코딩 교구이다. 스위치블록, 모터블록 등 다양한 전자 부품을 블록화하여 쉽게 결합이 가능하고, 일반 블록과 호환이 되어 다양한 형태의 작품 구현이 가능하다.
또한, PC나 태블릿 등에서 코딩한 내용을 아두이노 또는 라즈베리파이를 통해 블록을 제어할 수 있어 초등학생부터 대학생까지 교육 및 활용이 가능하다. 이 제품을 통해 스마트 가로등 만들기, 신호등 만들기, 자동차 만들기 등 다양한 블록 결합을 통해 공간지각 능력과 창의력을 향상할 수 있다.
주목받는 에듀테크 기업 럭스로보는 전 세계 약 51개국에 수출되어 1,000여 개가 넘는 교육기관에서 코딩교육에 사용하는 스마트 블록 모디(MODI)를 전시하였다.
레고와 생김새가 유사한 모디 (MODI)는 누구나 쉽게 자신만의 로봇을 만들 수 있는 스마트 모듈이다. 피지컬 컴퓨터의 각 기능을 13종의 모듈에 담아 만들었으며, 각 모듈은 MCU로 안에는 OS가 들어있기에 모듈끼리 연결만 해도 바로 작동이 가능하다. 크게 입력, 출력, 설정에 따라 모듈을 나눌 수 있으며 입력에는 적외선, 마이크, 환경 모듈 등 7종, 출력에는 LED, 스피커, 디스플레이, 모터 등 5종, 이외 배터리, 네트워크 2종의 설정 모듈로 구성되어 있다. 구성품 중 최소 1개의 입력 모듈과 1개의 출력 모듈이 연결되면 별도의 코드 업로드 없이도 사용이 가능한데 예를 들면 배터리모듈, 버튼모듈, LED모듈을 연결하면 불이 켜지는 걸 확인할 수 있다.
코딩을 진행하기 위해서는 럭스로보에서 지원하는 MODI 전용 코딩프로그램인 MODI Studio를 통해 가능하며 이 프로그램은 코딩에 필요한 5개의 주요 문법 요소를 기반으로 제작되어 쉽게 이용할 수 있고, 다양한 응용이 가능하다. 또한, 각 모듈은 자석으로 쉽게 사방으로 연결이 가능하고, 레고나, 엔트리, 스크래치, 아두이노와도 호환되어 원리부터 심화 학습까지 넓은 범위에서 활용이 가능한 특징이 있다.
코딩 교육 전문 기업으로 비상하고 있는 마르시스 부스에서는 마르시스 대표 제품인 오조봇, 스트로비, 샘랩, 대시앤닷 제품들을 보며 직접 체험도 할 수 있었다. 사진 속 안내요원이 직접 시현하는 제품은 3월 말 정식 출시를 앞둔 레버블록(Cleverblocks)과 대시 제품이다.
레버블록은 마르시스에서 자체 개발한 유아 코딩 교구로, 손으로 블록을 조립해 로봇을 움직이는 탠저블 코딩 교구이다. 컴퓨터나 스마트폰과 같은 디바이스가 필요 없이 블록을 조작하여 코딩로봇 오조봇이나 대시제품을 움직일 수 있게 만들어준다. 레버블록 접착면은 자석으로 되어있기에 유아들이 손쉽게 연결할 수 있으며, 놀이를 통해 코딩과 알고리즘의 기초 개념을 이해할 수 있게 도와주는 특징이 있다.
레버블록과 호환되는 대시제품은 미국 원더워크샵에서 개발 및 출시한 교육용 코딩 로봇이다. 5가지 전용 어플리케이션을 통해 단계별, 연령별 학습과 엔트리와 연동하여 작동이 가능하다.
또한, 대시는 속도와 방향 조절이 가능하고, 제품 내에 저장된 다양한 소리를 내거나, 아이의 목소리를 녹음하여 재생할 수도 있다. 얼굴의 12개의 LED와 가슴 LED로는 다양한 색상을 표현할 수 있기에 쉽게 지루해하는 아이들을 위한 코딩교육에 다양하게 활용될 수 있다.
대형 보드를 이용하여 만든 스마트팜으로 눈길을 끈 블루이노에서는 아두이노 10배 크기의 코딩교구 우노빅보드를 전시하였다. 우노빅보드는 기존 작은 사이즈로 시인성이 낮은 브레드보드와 브레드보드에 연결하는 점퍼선이나 전자 부품의 날카로운 접촉 부분으로 인해 사용자가 다치는 문제점을 보완한 대형 코딩 교구이다. 일반 브레드보드 10배에 해당하는 대형 보드로 이에 사용할 수 있는 LED 등 각종 전자 부품들도 보드에 맞게 대형 사이즈로 제공되며, 물리적인 크기만 변했을뿐 동작이나 사용 프로그램은 동일하게 사용이 가능하다.
또한, 우노빅보드 내에 부품과 회로 연결용 점퍼선에 탈부착이 쉬운 마그네틱 인터페이스를 적용하여 초등학교 저학년도 안전하게 사용이 가능하고, 납땜하지 않고도 회로를 연결할 수 있다. 이런 대형 제품을 사용하면 브레드보드 활용 시 핀이 잘 꽂히지 않아 어려움을 겪었던 부분을 해결해 주기 때문에 실습 시간이 줄어들고, 그만큼 학생들의 집중력도 높여줄 수 있는 장점이 있다. 현재 이 제품은 방과 후 수업, 동아리 수업 등 코딩교육을 시작하는 학생들을 대상으로 하는 교육 여러 분야에서 사용되고 있다.
4차 산업혁명 시대, 주목받는 또 다른 기술이 드론 분야이다. 드론은 군사용으로 만들어졌던 무인 항공기로, 기술이 발전하며 군사 장비뿐만 아니라 촬영용, 농약 살포용, 물류 배송용 등 새로운 산업 생태계를 만들어 가며 사용범위가 점차 확대되고 있다. 이에 따라 드론 교육에 대한 관심도 점차 높아져가고 있고, 교육박람회에 곳곳에서도 드론 교구들을 만나 볼 수 있었다. 그중 DIY 드론 만들기 및 드론 원리 교육 전문 기업 제니랩에서는 JD KIT를 전시하며 고객들에게 사용 방법을 직접 시연해 주었다.
JD KIT는 주니랩만의 기술로 만든 DIY 조립 방법으로 볼트나, 풀, 나사 없이 기둥에 똑딱이 버튼을 끼워 손쉽고 안전하게 조립이 가능하다. 또한, 드론 설계, 디자인 작업을 통해 나만의 드론을 만들 수 있고, 3D 프린터를 활용하여 다양한 형태의 드론 샤시 제작도 가능하다.
현장에서는 스마트폰 전용 앱을 통해 드론을 제어하였는데, 이외에도 JDRC무선 조정기를 통해서도 제어가 가능하고, 엔트리, 스크래치 코딩과 호환되며 언어별 예제 소스도 제공된다고 한다.
또한, 사이언스 창작소로 풍력 자동차, 기어 자동차, 모터 비행 등 다양한 조립과 실험을 통해 드론 원리를 배울 수 있어 아날로그와 디지털 제어를 함께 경험하며 창의 융합 교육이 가능하다. 만들어진 드론은 7~10분 비행할 수 있고, 10~20m 비행거리에 240mA Li-Po 배터리를 사용하는 특징을 갖는다.
이번 교육 박람회에서는 덴마크, 핀란드와 같이 주빈국 부스들도 확인할 수 있었다. 국제학업성취도 평가에서 항상 상위권을 차지하는 핀란드 부스에서는 교육을 놀이의 연장선으로 만드는 핀란드 교육의 방향성과 학업 환경 조성에 큰 노력을 하고 있음을 엿볼 수 있었다.
한국에서도 미세먼지, 공기 오염과 관련된 관심이 높아지고 있는데 핀란드 또한 실내 공기 질 개선이 큰 화두에 올랐다고 한다. 이에 핀란드에서는 나아바 단체를 통해 학교 실내공기 개선을 위한 노력을 하고 있으며, 나아바는 실제 식물을 벽으로 제작하여 공기를 정화하는 그린월을 제공하고 있다.
그린월은 인공지능 & 원격시스템으로 관리되는 식물과 인공지능을 결합한 스마트 벽으로 1대당 4,000개의 공기 정화식물로 구성되어 미세먼지를 25% 제거하고, 휘발성 유기화합물은 57% 제거가 가능하다. 오염된 실내공기는 무기성장배지로 흡수되고, 식물 뿌리 미생물들이 유해한 물질을 완전 분해 & 공기 정화를 해주는 역할을 하며, 자연화된 공기가 나아바 기기 상단부의 팬을 통해 실내공간으로 공급되며 공기 정화가 이루어진다고 한다. 또한, 설치 이후에도 전문적인 방문 유지관리 서비스가 제공되기 때문에 식물이 시들거나, 문제가 발생할 때도 빠른 조치가 가능하다.
국내에서도 교육 환경을 변화시키는 제품들을 많이 찾아볼 수 있었는데 아이스크림 미디어에서 선보인 클래스키 제품은 학생들의 수업 참여도를 높이고, 퀴즈나 투표를 진행할 때 효율적인 솔루션을 제공한다. 클래스키는 코딩 교구인 언플러그드 뚜루뚜루 제품으로 유명한 아이스크림 미디어와 kid Tech 스타트업 태그 하이브의 기술력이 합쳐져 탄생한 스마트 수업 도구이다.
기존 학교 수업 시 퀴즈나 설문조사 때 일일이 학생들의 숫자를 세야 하는 불편함을 개선하고, 교실 환경에서 꼭 필요한 기능들을 편리하게 사용할 수 있도록 선생님과 함께 기획, 개발한 수업 도구로 Wifi 환경이 아니어도, 휴대폰이 없이도 사용할 수 있다.
사용 방법은 클래스키 프로그램을 설치 및 USB 동글을 꽂고 아이들에게 리모컨을 나눠준 후, 다양한 학급 활동에 활용하면 된다. 특히 퀴즈나 설문, 임원선거, 상호평가 등 학급 활동 시 아이들이 직접 리모컨 버튼을 누르며 참여할 수 있어 소극적인 학생도 수업 참여를 끌어낼 수 있는 장점이 있다. 클래스키에서 진행한 모든 내용은 통계자료로 데이터화되어 나타나기 때문에 학업성취도 및 학생 관리에 사용할 수 있고, 자료는 엑셀 파일로 다운로드 할 수 있다.
아바비젼에서는 공부하고 즐기는 새로운 형태의 스마트 에듀케이션 테이블 Think Touch 제품을 선보였다. 씽크 터치 (Think Touch)는 다수의 사용자가 함께 콘텐츠를 활용할 수 있는 멀티테이블로 어린이를 위한 교육용 콘텐츠와 건전한 게임을 App 스토어에서 다운로드해서 놀이와 교육을 한 번에 진행할 수 있는 스마트 테이블이다. 어린이 사용자를 위한 32인치 넓은 디스플레이와 멀티 터치 센서 칩 기술을 기반으로 정확하고 빠른 반응속도, 부드럽고 끊김 없는 터치 감도를 갖추고 있다.
또한, 높은 내구성과 곡면 모서리로 디자인되었으며 충격에 강한 강화유리를 사용하였기에 아이들이 이를 통해 학습과 놀이를 진행하거나 야외에서도 안전하게 사용할 수 있다.
지원되는 애플리케이션들은 주로 알고리즘을 이해하거나, 비트와 이진수, 압축, 데이터 구조와 정렬 등 컴퓨터 과학의 원리를 배울 수 있는 교육용 보드게임 또는 게임을 통한 코딩교육 프로그램이 대다수였고, 이외에도 그림을 그리거나, 피아노를 치거나 모둠학습이 가능한 프로그램들이 제공된다.
A, B, D홀에서 엄청난 규모로 진행된 2020 대한민국 교육박람회는 3일간 16개국 261개사, 1,252 부스, 41,263명이 참관하며 성황리에 막을 내렸다. 코딩 교육이 초, 중, 고등학교에서 정식 과목으로 도입됨에 따라 그 중요성이 더욱 커진 만큼 어린 나이 때부터 코딩의 원리를 이해할 수 있게 놀이와 교육을 접목한 제품들이 많았고, 교사, 교직원, 강사만큼 학부모와 자녀가 함께 제품을 체험하는 모습을 손쉽게 발견할 수 있었다.
이번 박람회는 대부분 제품을 직접 체험할 수 있도록 전시되어 있기 때문에 코딩이 생소한 학부모나 학생들이 방문하여 교육 정보를 쉽게 습득하고, 제품을 통해 학습 방향을 선정하는데 많은 도움이 되었을 거라 생각된다. 또한, 각종 콘퍼런스, 세미나, 워크숍이 진행되었고, 로보마스터 대회, 체험관 등이 운영되어 볼거리와 정보가 가득했던 박람회였기에 2021년 더 다채로워진 대한민국 교육 박람회를 기대해보며 이번 관람기를 마친다.
[59호]SLAM, Navigation을 활용한 방사능 측정 자율 로봇에 대한 연구
2019 ICT 융합 프로젝트 공모전 참가상
SLAM, Navigation을 활용한
방사능 측정 자율 로봇에 대한 연구
글 | 동서대학교 고성현, 김대성, 김윤정, 황혜랑
1. 심사평
칩센 방사능 측정을 로봇을 이용하여 진행한다는 최종 용도의 차이는 있지만, 주요한 내용은 최근에 많은 부분에 적용되고 있는 in-door navigation 관련 사항이 아닌가 합니다. 유사한 형태로 우리가 가장 쉽게 볼수 있는 것이 로봇 청소기가 아닐까 하고, navigation mapping 기술들도 구현의 방안이나, 방식은 다르더라도 최종 목표는 동일한 것으로 보입니다. 보고서와 결과물에 있어 navigation 기능에 대한 타 솔루션에 비해 개선되거나 장점이 좀 더 부각되었다면 좋을 것으로 보이고, 결과적으로도 가장 핵심 내용은 이 내용이 되어야 하지 않을까 합니다. 최종 결과물에 대하여 볼수 있는 자료가 부족하다는 것도 아쉬움으로 남습니다.
뉴티씨 동일본대지진 당시에 핵발전소에 문제가 생겨도 실제로 바로 투입할 수 있는 일본의 로봇이 없었다는 사실에 일본 국민들이 적잖게 당황했고, 로봇기술에 대한 자존심에도 많이 손상을 입었습니다. 이후 해외의 로봇들이 들어와서, 현장에 투입되었고, 이 이후로 이번 작품과 같은 시도들이 많이 이루어졌었고, 레스큐로봇콘테스트도 강화되었습니다. 앞으로 이러한 부분들에 대한 지원이 우리나라에서도 많이 이루어져서 그러한 연구가 활발히 진행되기를 바래봅니다.
위드로봇 SLAM 및 ROS에 대한 정리는 훌륭합니다. 그런데 직접 수행한 부분에 대한 설명은 상대적으로 너무 적어 전체 완성도를 파악하기가 어렵습니다.
펌테크 기존의 로봇기술에 내비게이션 Algorithm이 적용된 아이디어와 실용성이 우수한 작품이라고 판단되어지며 여러 형태의 지형지물에 적용이 가능해야 하는 특수 로봇인 점을 감안한다면 관절이 있는 형태로 구현되는 것이 더욱 효율적이지 않았을까 하는 점과 원격 컨트롤 등의 추가적인 기능이 부가되었다면 더욱더 완성도가 높지 않았을까 생각해 보았습니다. 단 제출된 보고서상에서는 전체 로봇의 외관 구성은 일부 확인하였으나 Algorithm 이 적용된 동작 영상을 확인할 수 없었으며 제출된 문서를 감안하여 볼 때 최종 완성은 되지 않은 것으로 판단됩니다.
2. 작품설명 및 배경
후쿠시마 원자력 발전소 사고, 국내 원자력 발전소 안전에 대한 우려 제기, 아파트 등 건축물의 세슘 방사능 방출에 대한 사회적 이슈가 제기되고 있다. 방사능에 대한 정밀한 측정이 요구되며 측정 방식(사람에게 무해한 측정방식)에 대한 기술적 접근이 필요한 상황이다. 이 같은 배경을 토대로 본 연구회는 SLAM, Navigation 기술을 활용한 방사능 측정 자율로봇에 대하여 연구하였다.
2.1. 방사능 측정에 대한 아이디어 구성
사람이 직접 이온화 방사능을 측정하기엔 인체에 방사능의 악영향을 미칠 수도 있고, 히로시마 원전폭격 때와 같이 방사능에 피폭당한 도심에는 사람의 발길이 닫기 힘들기에 로봇에 G.M 계수기를 설치해 사람이 직접 가서 측정하지 않아도 되는 장점이 있다.
G.M 계수기는 이온화 방사능을 측정하는 가장 대표적인 휴대용 방사선 측정기이고, 전원, 고전압 발생 장치, G.M Tube, 그리고 프로세서와 디스플레이로 구성된다.
G.M Counter은 사용함에 따라 G.M Tube 내부의 가스가 소멸하고, 방사선의 수만 알 수 있고 에너지에 관한 정보는 알 수 없다는 단점이 있지만, 사람이 직접 측정하였을 때 인체에 악영향을 미치면서까지 측정 하는 방법 보다 G.M 계수기를 설치하여 로봇이 측정하는 방법이 더 효율적이고 정밀도가 높다.
2.2. GM계수기의 구조
G.M계수기에는 G.M Tube 부품이 사용되는데, G.M Tube는 양극과 음극, 충전가스, 그리고 방전 소거 가스로 구성된다. 여기와 전리에 의한 2차 전자사태를 방지하기 위해 불활성 가스를 사용한다. G.M관에 사용되는 혼합가스에서 펄스를 출력시키기 위해서는 최소한의 E/P 비가 필요하고, E의 값을 작게 하기 위해 충전가스의 기압을 1이하로 유지해야 한다.
일반적인 G.M 계수관의 기압은 Ar 90torr, ethanol 10torr 이다. 방전 소거를 통해 G.M 계측관 내부의 지속적인 펄스를 제거하고, 후속 방사선 입자의 계측을 가능하게 한다.
G.M계수기와 설계된 방사능 측정 회로도를 제작하고 SLAM, Navigation을 접목한 로봇에 방사능 측정 장치를 부착시킨다. 이렇게 개발된 장비를 바탕으로 사람이 접근할 수 없는 방사능 피폭지역에 로봇을 통한 방사능 수치를 정밀 측정할 수 있도록 설계하였다.
3. 주요 동작 및 특징
3.1. 로봇에 적용할 ROS 운영체제
ROS를 사용 가능한 운영체제를 가졌으며, ROS는 로봇 시스템의 운영체제이며 ROS를 사용 가능한 운영체제(OS)로는 Ubuntu, OS X, 등이 있지만, 본 연구팀에서는 Ubuntu에 접목시켜 사용하였다. 다음으로 로봇 운영체제에서 사용된 ROS 특징을 살펴보자.
첫째, 통신 인프라가 가능하다. 노드 간 데이터 통신을 제공하며, 통상적 미들웨어로 지칭되는 메시지 전달 인터페이스 지원, 메시지 파싱 기능, 메시지의 기록 및 재생 가능, 메시지 사용으로 인한 다양한 프로그래밍 언어 사용 가능하고 분산 매개 변수 시스템이다.
둘째, 로봇에 대한 표준 메시지가 정의되고, 로봇, 센서 등의 상대적 좌표를 트리화 시키는 TF 제공뿐만 아니라 로봇의 물리적 특성을 설명하는 XML 문서 기술, 로봇의 상태를 한눈에 파악할 수 있는 진단 시스템을 제공 받을 수 있으며, 센서 드라이버, 센싱/인식 레벨의 라이브러리를 제공하고, 지도 작성에 필요한 SLAM, 작성된 지도 내에서 목적지를 찾아가는Navigation 라이브러리를 구현할 수 있다.
셋째, 로봇 개발에 필요한 다양한 개발 도구를 제공하며, 로봇 개발의 효율성을 향상시킬 수 있다. 소프트웨어 프레임워크를 사용하고 있으며, 로봇 소프트웨어 프레임워크 특징은 노드간에 메시지 교환 방법으로 복잡한 프로그램을 잘게 나눠 공동 개발이 가능하며, 명령어 도구, 시각화 도구 Rviz, GUI 도구 모음 rpt, 3차원 시뮬레이터 Gazebo 지원이 가능하다.
여기서 사용하는 ROS의 목적은 로보틱스 소프트웨어 개발을 전 세계 레벨에서 공동 작업 가능하도록 생태계를 구축하는 것이며, 곧 메타운영체제이다. (메타운영체제는 어플리케이션과 분산 컴퓨팅 자원간의 가상화 레이어로 분산 컴퓨팅 자원을 활용하여, 스케줄링 및 로드, 감시, 에러 처리 등을 실행하는 시스템)
로봇 소프트웨어 프레임워크를 기반으로 다양한 목적의 응용 프로그램을 개발, 관리, 제공하고 있으며 유저들이 개발한 패키지 또한 유통하는 생태계를 갖추고 있다.
3.2. 로봇에 적용할 SLAM 기술
본 연구는 지도 작성에 필요한 슬램(SLAM)기술을 적용하였고, 여기서 SLAM(Simultaneous Localization and Mapping)은 ‘슬램’ (동시적 위치 추정 및 지도 작성)이라고 읽는다. 즉, 로봇이 미지의 환경을 탐색하면서 로봇에 장착된 센서만으로 로봇 스스로 자신의 위치를 추정하는 동시에 미지 환경의 지도를 작성하는 것을 의미한다. 이는 내비게이션의 자율 주행을 위한 핵심 기술로서 위치 추정에 사용되는 엔코더(Encoder)와 관성 센서(IMU, Inertial Measurement Unit)를 병행하여 구현한다. 엔코더는 구동부인 바퀴의 회전량을 측정하여 추측 항법(dead reckoning)을 통해 로봇의 위치를 근삿값으로 계산한다. 이 부분에서 오차가 꽤 발생하는데, 관성 센서에서 측정한 관성 정보가 위치 정보의 오차를 보상해준다. 목적에 따라서는 엔코더 없이 관성 센서만으로 위치를 추정하기도 한다. 이러한 위치 추정은 지도를 작성할 때 사용되는 거리 센서나 카메라를 통해 얻은 주변 환경의 정보를 기반으로 다시 한 번 위치를 바로잡는다. 이 위치 추정 방법론으로는 칼만 필터(Kalman Filter), 마르코프 위치 추정(Markov Localization), 파티클 필터(Particle Filter)를 이용한 몬테카를로 위치추정(Monte Carlo Localization) 등이 있다.
장애물 지형 등의 지도 작성에는 거리 센서를 사용한다. 거리 센서 이외에 카메라를 이용하기도 하는데 스테레오 카메라를 이용한 거리 측정으로 거리 센서처럼 이용하거나 일반 카메라를 이용한 비주얼 SLAM도 있다. 그리고 환경에 표시물(Marker)을 붙여서 인식하는 방식도 제안되고 있다. 예를 들어, 천장에 표시물을 장착하여 카메라로 표시물을 구별하는 방법이다. 최근에는 카메라를 사용하여 거리 센서의 결과물에 준하는 거리 값을 추출하는 Depth camera(Kinect, Xtion 등)가 보급되어서 이들을 이용하는 방법도 많이 연구되고 있다.
3.3. Navigation 맵핑 기술
내비게이션은 주어진 환경에서 로봇이 현재 위치부터 지정한 목적지까지 이동하는 것이다. 이를 위해서는 주어진 환경의 가구, 물체, 벽 등의 기하학적인 정보(Geometry, geo-: 토지, metry: 측정)가 담긴 지도가 필요하다. 앞서 설명한 SLAM 기술을 이용하여 로봇이 자신의 위치 정보와 센서로부터 얻은 거리 정보에서 지도를 얻을 수 있었다. 내비게이션은 이 지도와 로봇의 엔코더, 관성 센서, 거리 센서 등을 이용하여 현재 위치부터 지도상에 지정된 목적지까지 이동하게 된다.
➊ 센싱(Sensing)지도상에서 로봇은 엔코더와 관성 센서(IMU 센서) 등으로 자신의 오도메트리(Odometry) 정보를 갱신하면서 거리 센서가 장착된 위치부터 장애물(벽, 물체, 가구 등)과의 거리를 계측한다.
➋ 위치 추정(Localization / Pose Estimation)엔코더로부터 바퀴 회전량, 관성 센서로부터 관성 정보, 거리 센서로부터 장애물과의 거리 정보 등을 기반으로 기존에 작성해 둔 지도상에 로봇이 현재 어디에 있는지 위치를 추정(Localization / Pose Estimation)하게 된다.
➌ 모션 계획(Motion Planning)이동 경로 계획(Path Planning)이라고도 불린다. 현재 위치에서부터 지도상에 지정받은 목표 지점까지 이동 궤적(Trajectory)을 생성한다. 지도 전체상의 전역 이동 경로 계획(Global Path Planning)과 로봇 중심으로 일부 지역을 대상으로 한 국부 이동 경로 계획(Local Path Planning)으로 나누어 로봇의 이동 경로를 만든다.
➍ 이동/장애물 회피(Move / Collision Avoidance)모션 계획에서 작성된 이동 궤적을 따라서 로봇에 속도 명령을 내리면 로봇은 그 이동 궤적을 따라 목적지까지 이동한다.
4. 전체시스템 구성
본 연구팀은 OpenCR, Raspberry Pi 3, HLS-LFCD2와 기타 부품들을 이용하여 삼층 구조의 로봇을 완성하였다. 사용자가 원하는 부품을 넣고 뺄 수 있도록 여유 공간을 많이 두었고 MicroSD카드에 Raspberry Pi 3 패키지 등을 설치하고 ROS 개발환경 구축을 하였다. 개발환경을 구축해야 ROS 운영체제를 사용할 수 있고 사용자가 원하는 프로그램을 코딩할 수 있기 때문이다. 다음으로는 동작 테스트를 하여 제대로 환경이 구축되었는지 확인 하였고 하나의 컴퓨터로 코딩을 하기 위하여 OpenCR과 라즈베리 파일을 ip주소로 연결시켰다.
다음으로는 센서 관련 패키지를 적용하고. 패키지 설정 후 마스터를 실행 하고 로봇 및 센서를 구동하고 RViz, 로봇의 원격조종, 지도 작성을 실행하여 지도 작성이 정확히 구현되었는지 확인을 하였다. 지도 작성이 완료되면 완성된 지도는 3가지 색상(① 흰색 ② 흑색 ③ 회색)으로 나타났다. 3가지 색상들로는 로봇의 상태를 알 수 있는데 ‘① 흰색 = 로봇이 이동 가능한 자유영역 ② 흑색 = 로봇이 이동 불가능한 점유 영역 ③ 회색 = 확인되지 않는 미지영역‘ 이렇게 구분된다.
지도가 완성되어지면 SLAM 관련 노드들의 처리과정은 다음과 같이 나타낼 수 있다. ① Sensor-node ② Robot_teleop ③ Robot_core ④ Gmapping ⑤ Map_server 이러한 과정을 그림으로 나타내면 아래와 같이 프로그램이 나오게 된다.
내비게이션을 사용하기 위해 위치추정 필터를 사용해야한다. 위치추청 필터는 대표적인 ① 칼만 필터(Kalman Filter), ② 파티클 필터(Particle Filter)를 사용한다.
칼만 필터(Kalman Filter)는 잡음이 포함되어 있는 선형 시스템에서 대상체의 상태를 추적하는 재귀 필터이다. 이 필터는 베이스 확률을 기반으로 하는데 예측(Prediction)과 보정(update)을 계속하게 된다. 여기서 예측(Prediction)이란, 모델의 상정하고 이 모델을 이용하여 이전 상태로부터 현재 시점의 상태를 예측하는 의미를 가지고, 보정(update)이란 앞 단계의 예측 값과 외부 계측기로 얻은 실제 측정 값 간의 오차를 이용하여 더욱 정확한 상태의 상태 값을 추정하는 걸 보정이라고 한다. 그림을 살펴보면 쉽게 알 수 있다.
로봇에 사용한 파티클 필터(Particle Filter)는 시행착오(try-and-error)법을 기반으로 한 시뮬레이션을 통하여 예측하는 기술로 대상 시스템에 확률 분포로 임의로 생성된 추정 값을 파티클(입자)형태로 나타낸다. 수행하는 순서로는 ① 초기화(Initialization) ② 예측(Prediction) ③ 보정(Update) ④ 위치 추정(Pose estimation) ⑤ 재추출(Resampling)을 실행한다.
내비게이션을 실행하기 위해 마스터를 실행하고 로봇 및 센서를 구동 하고 RViz, 로봇 원격 조종, 내비게이션을 실행하였다.
로봇에서 사용하는 내비게이션이란 Dynamic Window Approach(DWA)라고 하는데 로봇의 속도 탐색 영역(velocity searxh space)에서 로봇과 충돌 가능한 장애물을 회피하면서 목표점까지 빠르게 다다를 수 있는 속도를 선택하는 방법이다. 그림을 보면 쉽게 이해할 수 있다.
위 그림에서처럼 로봇은 위치로 생각하는 것이 아니라 속도로 생각하여 병진속도로는 몇 m/s, 회전수는 몇 번이라 수치를 매기고 가장 알맞은 속도를 찾아내 목표점으로 도달할 수 있도록 하였다. 이러한 DWA 기술은 ROS에서 사용되는 대부분의 로봇들이 적용한다.
시스템을 SLAM기술을 적용한 로봇을 완성한 후 방사능 측정을 하기 위하여 G.M 계수기(G.M Tube)를 장착하였다. 방사능 측정에 대한 정밀도를 높이기 위하여 사전에 방사능 측정 실험을 진행하였고, 이를 통해 방사능 성분이 대기 중에 분포되어 있음을 파악하는 실험을 하였다.
5. 개발환경
로봇 기술의 발전은 미래에 인간의 삶을 더 풍요롭고 삶의 질을 높이는 결과를 기대할 수 있다. 집에서 사용하는 로봇 청소기, 음료를 만들어주는 로봇 등 많은 종류의 로봇들을 살펴보면 로봇이 활용되는 분야는 넓어지고 있고, 우리의 삶 속에 차지하는 비중은 커져 가고 있다는 것을 알 수 있다. 하지만 로봇의 개발로 인한 장점만 있는 것은 아니다. 로봇의 개발을 할수록 사람의 일자리, 직업의 다양성이 사라지고 있다는 단점도 생겨났다. 이렇듯 로봇에 대한 사회적, 기술적, 환경적 장단점 파악을 통해 인류에 이바지할 수 있는 로봇에 대한 연구가 필요하다.
인간이 직접 일을 수행하기에는 위험성이 있는 재난현장에는 로봇을 투입하여 필요한 데이터 값을 측정할 수 있다. 예를 들어 2011년 일본 후쿠시마에는 지진으로 인하여 원자로가 폭발한 사고가 발생하였다. 몇 년이라는 시간이 흐른 지금도 후쿠시마 원전 주변은 방사능 수치가 높아서 사람이 가까이 가기에는 피폭의 위험이 있다. 하지만 이 로봇을 활용한다면 현재 원전 주변의 지도와 방사능 농도를 사람이 가지 않고도 정확한 데이터 값을 측정할 수 있다. 이렇게 인류가 발전하면서 생기는 새로운 문제들을 로봇들을 통해 효율적으로 대응을 할 수 있다. 이 로봇의 가장 큰 장점은 작은 크기의 모듈형 구조 로봇이라는 점이다. 손쉽게 조립, 유지 보수가 가능하며 상황에 따라서 다양한 센서와 모터 등을 착용할 수 있기 때문에 높은 확장성을 가지고 있다. 또한 오픈소스 소프트웨어를 제공하는 ROS를 기반으로 하고있다. 오픈소스를 가져다 사용할 수도 있기 때문에 개발 과정에 어려움은 다른 로봇보다 적을 것이라고 생각한다.
인간이 하기 어렵고, 위험이 도사리는 일을 로봇으로 대신하여 인간의 삶의 질을 높이는 결과를 기대할 수 있을 것이다.
5.1 ROS 구현환경
ROS개발 환경을 구축한다. 설치는 아래와 같이 그림을 참고하여 입력을 하여 구현한다. 기본적인 ROS 설치와 몇 가지 ROS 설정을 포함한 Unix 명령을 사용한다.
수동 설치 방법은 먼저 ROS를 설치를 한 후, 다음으로 사용할 운영체제를 선택한다. 위 연구팀은 우분투를 사용하였고, 우분투에 들어가서 순서대로 작업을 한다. 다음으로 ROS 개발환경을 구축하는 방법을 통하여 안정적인 로봇의 개발환경을 완성한다.
다음으로 ROS 환경 설정에 대하여 적용하도록 한다.
그림과 같이 Unix 명령을 통한 ROS 환경 설치를 완료하고 ROS 테스트를 통하여 ROS 횐경에 대하여 검증한다. 참고로 ROS 정상동작 검증순서는 아래와 같이 진행하였다.
① 확인을 하기 위해서 터미널 창에 roscore를 입력한다.
② 다른 터미널 창을 열어서 rosrun turtlesim turtlesim_node를 입력한다.
③ 입력 후 파란색 거북이가 뜬 창을 확인할 수 있다.
④ 새로운 터미널 창에 rosrun turtlseim turtle_teleop_key를 입력을 하고 키보드 화살표를 이용하여 거북이를 움직일 수 있다. (그림 11 참고)
그림 11은 ROS에서 사용하는 통합개발환경 (IDE)이다. 본 연구팀이 사용한 방법은 Qtcreator + QtCreator Plugin for ROS이다. 설치 방법은 sudo apt-get install qtcreator을 입력하면 된다. Qtcreator + Qt Creator Plugin for ROS는 CmakeLists.txt을 그대로 사용하며 rqt플러그인 및 GUI(graphical user interface)개발하기 쉽다는 장점을 가지고 있다.
6. 단계별 제작 과정
6.1. 프로그램 설치
6.1.1. ROS 설치
아래의 설치 Code를 통하여 ROS를 설치한다.
· $wget http://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/
· master/install_ros_kinetic.sh&&chomod 755./install_ros_kinetic.sh&&bash./
· install_ros_kinetic.sh
6.1.2. ROS 환경설정
· $ifconfig 소스코드를 사용하여 자신의 컴퓨터 ip 주소를 찾고
· $gedit~/.bashrc 소스코드 입력 시 나오는 메모장에 아래와 같이 작성한다
· $export ROS_HOSTNAME= 자신의 인터넷 ip
· $export ROS_MASTER_URI=http://자신의 ip:11311
6.1.3. ROS 동작테스트
터미널 창을 2개 열어 ROS의 노드들이 메시지를 잘 주고받는지 확인한다.
6.2 ROS 도구 설치 (설치 소스코드는 6장 기타 소스코드 참고)
6.2.1. RViz (ROS Visualisation Tool) slam 기술을 사용하기 위해 아래와 같은 순서로 설치한다. 또한 Rvis는 다음과 같은 성능을 지니고 있다.
· 센서의 데이터 시각화
· 레이저 거리센서(LDS)센서의 거리 데이터
· IMU센서의 관성 데이터
· 로봇 외형의 표시와 계획된 동작을 표현
· 지도 표시, 내비게이션, 목적지 지정 등의 역할을 함
6.2.2. RQT설치 및 실행 – GUI형태로 ROS를 이용하기 위함이다.
6.2.3. 기본 설치 패키지(Gazebo를 이용하기 위한 준비)
Gazebo
· 물리 엔진을 탑재한 3차원 시뮬레이터로서 로봇을 가상으로 구동하는 역할을 한다.
· ROS와 호완성이 좋아 기본 시뮬레이터로 사용
· DARPA Challenge에서 선정한 공식 시뮬레이터
6.3 Gmapping + Robot 필요한 준비
설치의 목적은 Gmapping을 사용하기 위함이며 Gmapping의 특징은 Rao – Blackwellized 파티클 필터, 파티클 수 감소, 그리드 맵을 구동시킬 수 있다. 설치의 순서는 아래와 같다.
1) 소프트웨어 준비
2) 패키지 설치
3) 마스터 실행(remote PC)
4) 로봇 및 센서 구동(SBC)
5) RViz, 로봇 원격 조종, 지도 작성(remote PC)
6.4 내비게이션: Navigation + Robot에 개발 동작 순서
내비게이션이란 로봇의 속도 탐색 영역(velocity search space)에서 로봇과 충돌 가능한 장애물을 회피하면서 목표점까지 빠르게 다다를 수 있는 속도를 선택하는 방법이다. 개발 동작순서는 아래와 같다.
1) 마스터 실행(remote PC)
2) 로봇 및 센서 구동(SBC)
3) RViz, 로봇 원격 조종, 지도 작성(remote PC)
6.5 로봇 제작
6.6 로봇에 G.M 계수기 탑재
· 로봇에 G.M 계수기(방사능 계측기)를 달아 방사능 측정.
· 디스플레이로 방사능 측정
· SLAM, Navigation을 이용하여 장애물을 스스로 피하며 사람들이 다니지 못하는 방사능에 오염된 곳을 G.M 계수기로 측정하여 방사능 검출
여기서 G.M계수기란 이온화 방사능을 측정하는 가장 대표적인 휴대용 방사선 측정기이다. G.M 계수기는 ‘G.M계수기의 특성‘ 설명과 같이 G.M Tube 부품이 사용되는데, G.M Tube는 양극과 음극, 충전가스, 그리고 방전 소거 가스로 구성된다. 여기와 전리에 의한 2차 전자사태를 방지하기 위해 불활성 가스를 사용한다. GM관에 사용되는 혼합가스에서 펄스를 출력시키기 위해서는 최소한의 E/P 비가 필요하고, E의 값을 작게 하기 위해 충전가스의 기압을 1이하로 유지해야 한다.
일반적인 GM 계수관의 기압은 Ar 90torr, ethanol 10torr 이다. 방전소거를 통해 G.M 계측관 내부의 지속적인 펄스를 제거하고, 후속 방사선 입자의 계측을 가능하게 한다.
G.M계수기와 설계된 방사능 측정 회로도를 제작하고 SLAM, Navigation을 접목한 로봇에 방사능 측정 장치를 부착시킨다. 이러한 개발된 장비를 바탕으로 사람이 접근할 수 없는 방사능 피폭지역에 로봇을 통한 방사능 수치를 정밀 측정할 수 있도록 설계하였다.
7. 소스코드
7.7.1. ROS 설치
1. $wget http://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/
master/install_ros_kinetic.sh&&chomod 755./install_ros_kinetic.sh&&bash./
install_ros_kineticsh
2. 기본 설치 패키지(Gazebo를 이용하기 위한 준비)
$sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy
ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc
Ros-kinetic-rgbd-launch
ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino
ros-kinetic-rosserial-python ros-kinetic-rosserial-server
ros-kinetic-rosserial-client
ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server
ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rat-image-view
ros-kinetic-gmapping ros-kinetic-navigation ros-kinetic-interactive-markers
$ cd /catkin_ws/src/
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.simulationsgit
cd /catkin_ws && catkin_make
7.7.2. ROS 환경설정
$gedit~/.bashrc
# Set ROS Indigo
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
# Set ROS Network
export ROS_HOSTNAME= 자신의 인터넷 ip
export ROS_MASTER_URI=http://자신의 ip:11311
# Set ROS alias command
alias cw=’cd ~/catkin_ws’
alias cs=’cd ~/catkin_ws/src’
alias cm=’cd ~/catkin_ws && catkin_make’
자신의 컴퓨터 ip를 확인하는 명령어 $ifconfig
7.7.3. ROS 동작 테스트
$roscore
$rosrun turtlesim turtlesim_node
$rosrun turtlesim turtle_teleop_key
$rosrun rqt_graph rqt_graph
7.7.4. ROS 도구 설치
1. RVis (ROS Visualisation Tool)
· $sudo apt-get install ros-kinetic-rviz
$rosrun rviz rviz
2. RQT설치 및 실행
· $sudo apt-get install ros-kinetic-rqt ros-kinetic-rqt-common-plugins
$rqt
8. 결론
후쿠시마 원자력 발전소 사고, 국내 원자력 발전소 안전에 대한 우려 제기, 아파트 등 건축물의 세슘 방사능 방출에 대한 사회적 이슈가 제기됨에 따라 방사능에 대한 정밀한 측정이 요구되며 측정 방식(사람에게 무해한 측정방식)에 대한 기술적 접근이 필요한 상황이다. 이러한 배경을 토대로 SLAM, Navigation 기술을 활용한 방사능 측정 자율로봇에 대한 연구를 진행하였고 그에 맞는 작품을 제작하였다.
[59호]SMART WAREHOUSEA
2019 ICT 융합 프로젝트 공모전 참가상
SMART WAREHOUSEA
글 | 한성대학교 박종연, 최영수
1. 심사평
칩센 ICT가 적용되어야 할 가장 큰 분야 중 하나가 industrial 분야입니다. 그 안에는 Smart Factory를 비롯한 물류관리도 매우 중요한 분야입니다. 작품명인 SMART WAREHOUSE가 되기 위해서는 물류의 불출이 아닌 관리에 무게를 두고 고민을 했으면 어땠을까 하는 아쉬움이 남습니다. 이는 특정 물품의 불출만이 아니라 warehouse 내의 물품 위치, 수량 등을 기본적으로 관리하고, 이를 불출까지 정확하게 할 수 있는 시스템이 되어야 합니다.
뉴티씨 스마트 공장 등에서 쓰일 수 있는 컨베이어 벨트와 원하는 물품을 창고에서 자동으로 배출할 수 있는 구조를 생각하고, 이를 구현한 것에 박수를 보냅니다. 생각만 하는 사람들도 많은데 이를 직접 구현하여 다른 사람들에게 도움을 주려고 한 점 등은 앞으로 살아가면서 삶에 큰 도움이 될 것이며, 많은 사람들에게 도움을 주실 것으로 생각합니다. 기본적으로 좋은 아이디어이지만, 좀 더 구체적인 안이 제시되었다면 좋았을 것 같습니다.
위드로봇 창의성이나 실용성 부분은 기존 제품과 차별점이 없지만 문제를 해결해 나가는 단계가 구체적으로 설명되어 있어 공모전 취지에 어울린다 생각되어 완성도 부분에 높은 점수를 부여하였습니다.
펌테크 전체적인 작품의 하우징 구성에 관련된 아이디어, 작품 완성도, 보고서 완성도 수준이 우수하였다고 생각합니다. 단 컨베이어 벨트는 모터 구동방식을 속도 조절이 가능하도록 감속기어 적용 모터를 사용하거나 PWM 제어로 구현하는 것이 좋지 않았을까? 텍스트 콘솔 방식 대신 GUI 기반의 명령제어 방식이었다면 더욱더 완성도가 높지 않았을까? 하는 생각을 해보았습니다. 학부과정의 학생이 구현하기에 적정한 난이도를 가진 작품이라고 생각합니다.
2. 작품 개요
4차 산업혁명을 통한 변화를 통해 나타난 기술 중 설계·개발, 제조 및 유통·물류 등 생산과정에 디지털 자동화 솔루션이 결합된 정보통신기술(ICT)을 적용하여 생산성, 품질, 고객만족도를 향상시키는 지능형 생산 공장을 뜻하는 스마트팩토리에서 아이디어를 얻어와 생산 공장이 아닌 물류창고 혹은 매장에서 고객의 주문을 받으면 사람이 아닌 기계가 자동적으로 주문에 맞추어 배송 준비 또는 물품을 꺼내어 준다면 편리하겠다는 생각이 들었다.
이 아이디어를 생각한 구체적인 계기는 대학 수업에 필요한 제품을 구매하기 위해 구로에 위치한 디바이스마트 매장에 방문하였던 일이 생각이 났다. 그 당시 임베디드 컴퓨터와 기초적인 지식이 없는 본인들은 매장에 제품들이 잘 정리되어 있음에도 불구하고 비슷한 생김새와 너무 많은 부품의 종류로 인해 프로젝트에 알맞은 제품을 찾는데 많은 시간을 소비하였다. 이때 본인들은 많은 제품을 사람이 기억하여 찾는 것은 힘들기도 하고 비효율적이라는 생각을 가지게 되었다. 이러한 불편함을 겪어보며 소비자가 온라인 혹은 오프라인에서 컴퓨터 혹은 웹을 통해 주문서를 작성하면 기계가 알아서 찾아 꺼내주면 편리하고 효율적이겠다는 생각을 하게 되었고 택배 포장 직전까지 자동으로 해준다면 물류창고에서의 업무 효율이 극대화될 것 같다는 생각이 들었다.
3. 작품 설명
3.1. 주요 동작 유형
3.1.1. 주문 상품 배출
일정한 각도를 회전하는 스태핑 모터를 사용하여 톱니를 일정 길이 만큼만 밀도록 설계하고, 웹에서 사용자가 주문한 제품의 개수만큼 밀어준다.
3.1.2. 배출되는 상품 외부 이탈 방지
배출된 상품이 컨베이어 벨트 밖으로 이탈하지 않도록 턱을 설치한다.
3.1.3. 배출 완료된 제품 상자에 담기
배출된 상품이 컨베이어 벨트 동작으로 인하여 상자에 담기도록 한다. 이탈 방지 벽을 설치하여 배출되는 제품이 외부로 이탈하는 것을 방지한다.
3.2. 전체 시스템 구성
3.3. 개발 환경(개발 언어, Tool, 사용 시스템 등)
· HTML, CSS(웹, 웹디자인)
· NODE.JS(서버 프레임워크, JavaScript 기반)
· NODE EXPRESS(웹프레임워크)
· PUG(VIEW 템플릿)
· MySQL(데이터베이스)
· PYTHON(서버컴퓨터와 Arduino 통신)
· Arduino(C언어, 마이크로컨트롤러)
· Raspberry Pi(서버 및 Arduino 통신을 위한 초소형 컴퓨터)
· GITHUB (버전관리 시스템)
· SKETCH UP(3D모델링)
4. 단계별 제작 과정
1주차 : 디바이스마트와 관련하여 불편했던 경험을 생각하며 이를 개선하고자 노력해보았다. 물품과 관련하여 자동화를 시키고 싶어서 떠오른 서비스로 스마트팩토리란 개념을 떠올렸고 이를 우리가 어떻게 소규모로 접목시킬지 생각하였다. 생산이 자동적으로 이루어지는 스마트 팩토리를 다르게 생각해서 물류의 자동화를 강점으로 살린 SMART WAREHOUSE의 개념을 생각하였다.
물류의 자동화인 SMART WAREHOUSE를 주제로 정하고 주제 선정에 있어서 중요한 실현가능성, 독창성에 대하여 잘 들어맞는지에 대하여 고민해보았다. 우선 SMART WAREHOUSE가 얼마나 실현 가능한지 생각해보았다. 처음에 생각했던 이미지대로 만들어지게 된다면 웹과 아두이노의 연결로 인해 실제로도 무리없이 사용될 수 있다고 생각하였다. 다음은 독창성에 대하여 생각해보았다. 주변의 소규모 매장 혹은 전자부품 매장을 십여 군데를 찾아다녀보았을 때 웹에서 명령을 내렸을 때 자동적으로 물류를 해주는 것이 아닌 사람이 주문서를 들고 물품을 찾아 포장을 하는 것이 전부 다였다. 따라서 이를 도입한다면 사람이 직접 돌아다닐 필요가 없고 마지막 검사과정만 확인하면 경쟁력 있고 독창성이 있지 않을까 생각하였다.
2주차 : 아이디어에 관하여 외형적인 부분과 어떤 시스템을 이용할지에 대하여 논의가 모두 이루어졌기 때문에 SMART WAREHOUSE의 기본이 되는 컨베이어벨트의 프로토타입을 제작하기로 하였다. 그에 따른 재료구입을 완료하였고 컨베이어벨트 프로토타입을 완성하였다. 하지만 컨베이어벨트의 원통을 담당하는 원통 모양의 풀이 레일을 담당하는 종이와 잘 접합되지 않고 따로 따로 돌아가는 문제가 자주 발생하였다.
토의를 통해 문제를 해결하기 위한 2개의 가정을 해보았다. 첫 번째로는 기존에 참고한 자료와는 재료의 차이가 나서 레일이 돌아가지 않는다는 점과 임의적으로 크기를 늘려서 레일과 원통형의 원통 모양의 풀이 같이 돌아가지 않는다는 점이 있다고 생각하였다. 그에 따라서 정교한 모델링과 마모되지 않는 재질의 물품이 필요하다고 여겨졌다.
상단: 참고한 컨베이어 벨트(youtube) : 마찰력이 약간 높은 재질
하단: 컨베이어벨트 프로토타입 : 마찰력이 높은 재질
1. 참조한 자료를 통해 미니컨베이어벨트 프로토타입 제작완료
2. 주변에서 구할 수 있는 재료와 이미 있는 재료로 제작
미흡점 및 수정 계획
· 프로토타입의 원통형의 풀통 부분을 3D모델링을 통해 마찰력을 필요한 만큼만 높이고 정확한 두께로 안정감을 추구하기로 하였다,
· 마찰력이 높은 종이 대신에 마찰력이 낮은 재질의 A4로 대체
· 6각형 모양의 pvc지지대를 원통형의 나무막대로 대체할 예정
3주차 : 프로토타입에서 헛돌던 원통 교체를 위한 3D 모델링 및 프린팅한 후 출력된 원통과 컨베이어 벨트를 조립 후 동작 실험을 한다.
좌: SketchUp 프로그램을 통한 원통 3D 모델링
우: 모델링한 원통 3D 프린팅 출력
좌: 3D 프린팅한 원통과 모터와 결합하기 위한 나무막대 결합
우: 그림9-3의 물체와 컨베이어벨트간의 조립 + 모터와 나무막대와 의 결합을 위한 작은 원통형의 3D 프린팅해서 조립
미흡점 및 수정 계획
· 가벼운 재질로 바꾼 후 이전보다 잘 작동하나 마찰력이 부족하여 가끔 헛도는 현상 발생
· 3D프린터에 자주 이용되는 스타팅벨트 구입 및 조립 예정
앞서 제작한 제품의 마찰력이 너무 부족하여 가끔씩 헛도는 부분을 수정한 후, 토의를 통해 벨트의 톱니 모양이 있는 스타팅벨트를 이용하여 마찰력을 다시 높인 컨베이어 벨트를 제작한다.
좌: 원통 부분 스타팅벨트 장착
우: 레일부분에 스타팅벨트 장착
미흡점 및 수정 계획
· 좌측 원통부분과 1주차에 레일을 담당하는 종이 부분에 스타팅벨트 장착한다.
· 높은 마찰력과 뻣뻣한 종이의 재질로 인하여 스타팅벨트끼리 접합이 잘 되지 않는 것을 확인한다.
· 마찰력과 종이의 재질 문제라 판단하고 부드럽고 마찰력이 낮은 A4에 스타팅벨트를 장착한다.
· 회전은 잘 되나 모터의 힘을 잡아주지 못하고 계속해서 돌아가서 종이가 마모될 가능성이 보인다,
· 원통에 장착된 스타팅벨트만 유지하고 레일의 역할인 종이에 장착된 스타팅벨트는 제거하고 돌려보아도 제대로 돌아가지 않아 종이에 마찰력을 주는 어떤 장치가 필요하다고 생각하게 된다.
4주차 : 스타팅벨트의 톱니가 마찰력이 너무 높아 모터가 힘을 받쳐주지 못한다고 판단한 후, 전기테이프를 마찰력이 높고 뻣뻣한 종이와 부드러운 A4용지에 가로로 붙여 실험한다.
상단: 원통 부분 스타팅벨트 유지
하단 좌: 마찰력 높은 종이 + 전기테이프
하단 우: A4 + 전기테이프
· 실험결과 뻣뻣한 재질의 종이는 가끔씩 뜨는 것을 확인 A4용지는 유지성의 문제가 있지만 프로토타입에서 실험을 목적으로 하는 것에는 알맞다고 생각
· A4종이에 전기테이프를 붙여 놓은 벨트를 쓰는 것으로 결정
좌: 기존 수납함
우: 커스터마이징한 수납함
· 컨베이어벨트를 제작 완료한 후 부품함을 커스터마이징하여 제작했다.
부품함 내부 구조
상단: 정확한 치수를 잰 후 3D 모델링을 그린 모습
하단: 3D 프린팅 + 레크기어 장착한 모습
1번: 공구함 작동되기 전 사진
2번: 공구함 작동되고 있는 사진
3번: 공구함 완성된 내부 구조
4번: 사이드 샷
· 3D모델링 및 프린팅을 통한 부품함 내부 동작부 완성
· 간단한 아두이노 코딩을 통한 동작 테스트
· 아두이노 코딩 후 실험을 통하여 동작에 필요한 값(모터의 회전수) 조절
5주차 : 먼저 제작된 1개의 커스터마이징한 부품함 테스트후 2개를 추가 제작한다. 아두이노 우노보드를 통해 제작 중 연결 가능한 핀의 수가 부족한 것을 파악하였다. 다수의 연결 가능한 핀을 보유한 아두이노 메가보드로 교체한다. 전력소모와 전력이 일정하게 흐르지 않는 점을 발견하였으며, 전력관리를 위한 4채널 5v릴레이션 모듈을 사용하고자 한다.
좌: 아두이노 메가보드 사용, 릴레이션 모듈을 사용하여 전력을 일정하게 유지
우: 난잡한 선 정리와 모터드라이브 모듈 정리를 위한 3D프린팅 후 조립
제작한 부품을 전체적으로 조립한다.
전체적인 프로타입 모형 구조
6주차 : Raspberry pi를 와 node.js를 통한 서버 제작, Web제작
1번: Web Home 화면
2번: 수량확인 화면
3번: 주문 화면
4번: 주문성공 화면
5번: 주문실패 화면
5. 확장성 및 활용
중,대형 창고에 적층식으로 필요한 만큼 적층하여 적용할 수 있고 확장에 용이하다.
· 기본형에 상단부와 좌우로 적층 및 정렬하여 확장할 수 있다.
· 상단으로 적층할 때에는 제품 손상을 줄이기 위해 바로 떨어지지 않도록 미끄럼틀 모양의 받침을 추가로 설치한다.
· 창고에 커스텀화하여 쉽게 증설 및 감축을 할 수 있다고 생각하며, 창고에 비해 물건이 적은편인 매장에는 무인 오더기를 통하여 상품을 사용자가 쉽게 꺼낼 수 있도록 도와주는 식으로도 활용이 가능하다고 생각한다.
6. 기타(회로도, 소스코드, 참고문헌 등)
전역변수 부분
#include <Stepper.h>
const int stepsPerRevolution = 2048; // 모터별 스탭 수 설정
Stepper stepperA(stepsPerRevolution,52,48,50,46); //모터A 핀 설정
Stepper stepperB(stepsPerRevolution,44,40,42,38); //모터B 핀 설정
Stepper stepperC(stepsPerRevolution,36,32,34,30); //모터C 핀 설정
int RelaypinD = 4; // IN1 4채널 릴레이 모듈 핀 설정
int RelaypinC = 5; // IN2 4채널 릴레이 모듈 핀 설정
int RelaypinB = 6; // IN3 4채널 릴레이 모듈 핀 설정
int RelaypinA = 7; // IN4 4채널 릴레이 모듈 핀 설정
char loopn1=’z’; //웹에서 받아온 수량 개수 변수 z는 디폴트 값
char loopn2=’z’; //웹에서 받아온 수량 개수 변수 z는 디폴트 값
char loopn3=’z’; //웹에서 받아온 수량 개수 변수 z는 디폴트 값
int a1; //형변환을 위한 변수
int a2; //형변환을 위한 변수
int a3; //형변환을 위한 변수
Loop 부분
while(Serial.available()>0)
{
loopn1=Serial.read(); //라즈베리파이에서 시리얼로 입력
delay(2);
loopn2=Serial.read(); //라즈베리파이에서 시리얼로 입력
delay(2);
loopn3=Serial.read(); //라즈베리파이에서 시리얼로 입력
delay(2);
a1=(int)loopn1-48; //시리얼에서 받아온 값 CHAR에서 int로 형변환
a2=(int)loopn2-48; //시리얼에서 받아온 값 CHAR에서 int로 형변환
a3=(int)loopn3-48; //시리얼에서 받아온 값 CHAR에서 int로 형변환
}
digitalWrite (RelaypinA, HIGH);
digitalWrite (RelaypinD, HIGH);
if(loopn1 != ‘z’) //A에 주문이 들어오면 동작
{
Serial.println(a1);
Serial.println(a2);
Serial.println(a3);
digitalWrite (RelaypinA, LOW); // 릴레이 ON
pushingA(a1);
digitalWrite (RelaypinA, HIGH); // 릴레이 OFF
delay (500);
digitalWrite (RelaypinA, LOW); // 릴레이 ON
delay (500);
pullingA(a1);
digitalWrite (RelaypinA, HIGH); // 릴레이 OFF
loopn1=’z’; // 주문 플래그 초기화
}
if(loopn2 != ‘z’) //B에 주문이 들어오면 동작
{
digitalWrite (RelaypinB, LOW); // 릴레이 ON
pushingB(a2);
digitalWrite (RelaypinB, HIGH); // 릴레이 OFF
delay (500);
digitalWrite (RelaypinB, LOW); // 릴레이 ON
delay (500);
pullingB(a2);
digitalWrite (RelaypinB, HIGH); // 릴레이 OFF
loopn2=’z’; // 주문 플래그 초기화
}
if(loopn3 != ‘z’) //C에 주문이 들어오면 동작
{
digitalWrite (RelaypinC, LOW); // 릴레이 ON
pushingC(a3);
digitalWrite (RelaypinC, HIGH); // 릴레이 OFF
delay (500);
digitalWrite (RelaypinC, LOW); // 릴레이 ON
delay (500);
pullingC(a3);
digitalWrite (RelaypinC, HIGH); // 릴레이 OFF
loopn3=’z’; // 주문 플래그 초기화
conveyor(); // 컨베이어 작동
}
}
함수부분
//부품 밀기 함수
void pushingA(int a){
delay(500);
for(int i=0;i<a;i++)
{
Serial.println(“Pulling out the product….”);
stepperA.step(2048);
delay(100);
stepperA.step(1024);
delay(100);
}
delay(500);
}
//부품함 당겨오기 함수
void pullingA(int a){
delay(500);
for(int i=0;i<a;i++)
{
Serial.println(“Putting the case in place…….. “);
stepperA.step(-2048);
delay(100);
stepperA.step(-1024);
delay(100);
}
delay(500);
}
// 컨베이어 작동 함수
void conveyor()
{
Serial.println(“Conveyor belt operation………… “);
delay (1000);
digitalWrite (RelaypinD, LOW); // 릴레이 ON
delay (5000);
digitalWrite (RelaypinD, HIGH); // 릴레이 OFF
delay (1000);
Serial.println(“Complete………… “);
}
7. 회로도
8. 참고자료 및 문헌
· https://www.youtube.com/watch?v=WTtT92Gr1CY
· Do it! Node.js 프로그래밍
· 원리와 실제 리눅스 프로그래밍
· 사물인터넷을 품은 라즈베리파이
9. 작동영상
· https://www.youtube.com/watch?v=Ysacw7002vE SMART WAREHOUSE
· https://www.youtube.com/watch?v=NdeOCZxM45s SMART WAREHOUSE conbeyor belt
· https://youtu.be/wV2b3ynvDYo SMART WAREHOUSE toolbox
[59호]실시간 미세먼지 농도 데이터를 이용한 휴대용 마스크 착용 경보기
2019 ICT 융합 프로젝트 공모전 참가상
실시간 미세먼지 농도 데이터를 이용한
휴대용 마스크 착용 경보기
글 | 한국산업기술대학교 정승식, 숭실대학교 정지은, 박우상
1. 심사평
칩센 주기적으로 스마트폰과 데이터 통신을 하여야 하고, 미세먼지 정보 센터의 기준치와 비교하여 어떠한 결과를 도출해내는 방식이라면 굳이 별도의 장치를 보유하여야 하는 이유가 무엇인지 잘 모르겠습니다. 내 위치의 실시간 미세 먼지를 알수는 없으나, 이미 스마트폰을 통해 지역별 미세먼지 농도를 확인할수 있는데, 굳이 별도의 장치를 이용하여 마스크 착용 여부를 판단하는 것은 실효성이 많아 보이지는 않아 보입니다.
뉴티씨 미세먼지는 정말 우리나라에 재앙수준으로 늘어나 있습니다. 세계 100개의 미세먼지 문제도시 중에 40개 정도가 대한민국에 있다고 하니 얼마나 심각한지 알 수 있습니다. 중국은 베이징 1개 정도만 들어있다고 하죠. 미세먼지를 현실에서 바로바로 측정하여 결과를 알 수 있다면 참 좋을 것 같습니다. 많은 사람들이 만약 그것이 있다면, 하나정도는 구매하지 않을까 싶네요. 소형화하여 상품화 한다면 참 좋은 상품이 될 것 같습니다.
위드로봇 다양한 상황에 대한 결과 분석이 아쉽습니다.
펌테크 수집된 미세먼지 데이터를 서버로 전송 후 화면에 표시하는 기술 구현 방식은 우수했다고 생각합니다. 학부과정의 학생이 구현하기에 적정한 난이도를 가진 작품이라고 생각합니다.
2. 개요와 목표
요즘 우리나라에서 파란 하늘을 보는 것이 매우 드물다. 그것의 제일 큰 원인은 바로 미세먼지이며 역대 최악의 고농도 미세먼지로 인해 우리나라 대기 질 순위는 180개국 중에 173위로 매우 저조한 등수이고 그로 인해 호흡기 질환 등 건강 악화에 대한 우려가 커지고 있다. 미국 환경보호청(EPA)에 의하면 고농도 미세먼지 지역에 거주하는 사람은 유방암에 걸릴 확률이 높고, 호흡기로 침투한 먼지 때문에 심장마비, 동맥경화 등 심혈관 질환 발병 위험률도 높아진다고 한다. 그러므로 외부활동 시 미세먼지 흡입을 줄이기 위해 마스크 착용이 필수적으로 여겨지는 상황이다.
하지만 한국갤럽의 미세먼지 관련 인식 설문조사 결과에 따르면, 미세먼지 나쁨 예보일 때 ‘마스크를 착용하지 않는 편’ 응답은 45%로 집계됐다. 절반에 가까운 사람이 아직 건강상태의 심각성을 인식하지 못한 채 마스크 착용을 꺼리는 상황이다. 우리는 이러한 상황에서 미세먼지에 대한 경각심을 주고자 ‘미세먼지 어디까지 마셔봤니?’라는 작품을 만들었다.
작품을 만들면서 우리는 미세먼지 마스크 착용 권장뿐만 아니라 이미 미세먼지 마스크를 착용하는 사람들에게도 도움이 되는 정보를 더 주는 것을 목표로 하였다. 인터넷상에서 지역의 농도를 평균 내어 보여주는 것과 실제로 내가 있는 공간의 농도는 다를 수 있다. 예를 들어 인터넷에서 알려주는 값이 ‘보통’ 수준이라 마스크 착용을 하지 않고 있는데 실제로 내가 있는 곳 주변에 공장, 공사 등의 이유로 농도가 ‘나쁨’ 수준일 수 있다. 그렇게 되면 고농도 미세먼지를 그대로 들이마시는 정보 전달의 오류가 생긴다. 따라서 이를 방지하기 위해 휴대가 가능한 경보기가 있다면 더 좋을 것으로 생각했다. 더불어 이 작품을 통해 미세먼지 해결방안을 개발하는 사람들에게 실제 현장의 미세먼지 농도 데이터를 알고 유용하게 사용하여 실질적이고 더 좋은 대책을 마련하는 데 도움이 될 것이라고 생각한다.
3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 작품 디자인
가방이나 허리춤에 매달 수 있는 열쇠고리 형태의 휴대용 경보기 형태이다.
3.1.2 미세먼지 측정 및 경보
전원을 공급하면 실시간으로 현재 나의 주변의 미세먼지 농도를 측정한다. 그리고 측정한 농도를 미세먼지 정보 센터에서 제공하는 기준치와 비교하여 ‘나쁨’수준(36~75μg/m³)이 측정되면 상단 LED의 초록 불빛으로, ‘매우 나쁨’수준(76~ μg/m³)이 측정되면 상단 LED의 빨간 불빛으로 주변 미세먼지 농도 상태를 색으로 알려준다. 뿐만 아니라 상단의 스위치를 누르면 센서에서 측정한 실시간 미세먼지 종류별(PM-2.5, PM-10) 농도를 LCD에서 5초간 확인 할 수 있게 하였다.
3.1.3. 실시간 미세먼지 농도 웹서버로 기록 및 수치 확인
경보기는 웹서버로 실시간으로 측정된 주변 미세먼지 농도 값을 보낸 다. 웹서버에서는 받은 수치를 저장하고 그래프화 하여 시간대별 미세먼지 농도 변화를 나타낸다, 이는 데이터를 필요로 하는 사람에게 유용하게 쓰일 수 있다. 그리고 마스크 착용 여부를 확인하여 데이터 축적에 반영함으로써, 사용자가 얼마만큼의 미세먼지를 마셨는지, 또한 흡연했을 시 미세먼지 흡입량과 비교하여 미세먼지의 위험성을 실감할 수 있도록 한다.
3.2. 전체 시스템 특징
3.2.1. 구성 hardware
Wemos D1 mini, PMS 7003 미세먼지 센서, LED, Tact switch, 16×2 LCD with I2C comm module
3.2.2. 구성 software
Apache 8.0, mySQL, Microsoft Azure, ino
미세먼지 흡입량은 다음에 의한 공식으로 인해 산출되었다.
일반 남성의 분당 흡입량 : 6L -> 초당 흡입량: 0.1L, 15초당 1회씩 로깅하므로 1회 로깅당 흡입량 : 1.5L, 최신 데이터로부터 24시간 전까지의 기록을 모두 더한 값 Xug/L * 1.5 = 하루 동안의 흡입량
이 때 기록을 더할 때, 마스크를 쓰고 있었다면(mask 버튼이 눌러진 상태라면) kf94기준 94%의 미세먼지를 걸러주므로 0.06을 곱한 상태로 더한다.
3.2.3. 전체적인 구성도
3.3. 개발환경(개발언어, Tool, 사용 시스템)
3.3.1. 아두이노 기술 구현
Tool: visual micro(Arduino extension for visual studio)
언어: cpp
미세먼지 센서 감지, led 발광 로직, wifi 데이터 전송, lcd 발광 로직
3.3.2. 웹서버 제작 및 DB구축
Tool: Microsoft Azure, mySQL, Apache Tomcat
언어: HTML, javascript, SQL, JSTL, java, jsp
4. 단계별 제작과정
4.1. 웹서버 제작
· Azure 가상머신 구축
· Apache 8.0 설치
· mySQL 설치
· DB 제작
Microsoft Azure를 이용해 가상머신을 구축하고, Apache를 설치하고 mySQL을 이용해 DB를 구축하였다. 홈페이지는 bootstrap을 이용하여 작성하고, jsp를 이용하여 서버와 연동시켰으며 그래프는 Google Chart를 이용하여 구현하였다.
4.2. 아두이노 센서 동작 및 전체적인 알고리즘 작성
미세먼지 센서 제작(센서, LED, 스위치 연결 및 pin mapping)
· 미세먼지 센서를 동작시키는 코드를 작성
· 미세먼지의 값을 측정하여 웹서버로 전송하는 코드를 작성
· 미세먼지의 값을 기준치에 맞춰 LED가 발광하는 코드를 작성
· 스위치의 작동여부를 인터럽트로 받아와 LCD를 작동시키는 코드를 작성
5. 소스코드
5.1 아두이노
#include <Wire.h>//i2c 통신을 위한 헤더
#include <LiquidCrystal_I2C.h>//lcd를 사용하기 위한 헤더
#include <ESP8266HTTPClient.h>//http로 전송하기 위한 헤더
#include <ESP8266WiFi.h>//wifi 연결을 위한 헤더
volatile bool intFlag = 0;
int pm25 = 0, pm10 = 0, pm1 = 0; //센서로부터 byte 형태로 전송되는 데이터를 int 형태로 받아 사용
char* ssid = “********”;
char* password = “*********”; //wifi 접속하기 위해 쓰는 ssid와 password
String host = “http://52.141.33.28/import?”; //웹서버로 주소의 형태를 통해 데이터를 전송하기 위한 주소
//——————-PINS———————//
int green = D0, red = D6;
int SerialRX = D5;
int tactSwitch = D7; //esp8266의 pin
//———————————————-//
LiquidCrystal_I2C lcd(0×27, 16, 2); //i2c 객체를 활성화
void setup()
{
WiFi.mode(WIFI_STA); //client mode 사용
WiFi.disconnect();
Serial.begin(9600); //hardware serial 사용
attachI nterrupt(tactSwitch, riseFlag, RISING); // tact switch 를 위한 pin interrupt 설정
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
digitalWrite(green, LOW);
digitalWrite(red, LOW); //기본적으로 led를 low로 설정
if (connectWiFi()) //wifi 연결 과정, 연결이 되지 않을 시 종료
{
return;
}
lcd.begin();
lcd.clear();
lcd.noBacklight(); // lcd를 끄고, 화면의 글씨를 지워 초기화함
}
void loop()
{
PMdetect(); // 미세먼지 값을 측정
blink(); // 미세먼지 값에 따라 led 색상 조정
showLCD(); // 스위치를 누를 경우 lcd 화면을 보여줌
log(); // wifi를 통해 웹서버로 데이터 전송
}
void blink() // 환경부 기준에 따라 ‘좋음’ 일 경우 led 끄고, ‘보통’일 경우 초록색, ‘나쁨’일 경우 빨간색 led를 발광
{
struct led {
bool red;
bool green;
};
led sel[4] = { {0,0},{0,1},{1,0},{1,0} };
int state25 = 0, state10 = 0;
if (pm25 > 35) state25++;
if (pm25 > 75)state25++;
if (pm10 > 30)state10++;
if (pm10 > 80)state10++;
int result = state25 | state10;
digitalWrite(red, sel[result].red);
digitalWrite(green, sel[result].green);
}
void PMdetect() //pms7003 미세먼지 센서로부터 값을 얻어냄
{
int chksum = 0; //체크섬 변수
unsigned char pms[32] = { 0, }; //미세먼지 데이터 저장용 배열
if (Serial.available() >= 32) { // pms7003은 총 32byte의 데이터를 전송, 이것보다 적은 데이터를 받았을 경우 함수를 실행하지 않음
for (int j = 0; j < 32; j++) {
pms[j] = Serial.read();
if (j < 30)
chksum += pms[j];
}
if (pms[30] != (unsigned char)(chksum >> 8)
|| pms[31] != (unsigned char)(chksum)) {//체크섬을 통해 제대로 된 데이터를 전송받았는지 체크, 체크섬 값이 다를 경우 에러로 판정
Serial.flush();
return;
}
if (pms[0] != 0×42 || pms[1] != 0x4d) //전송된 데이터의 첫 번째와 두 번째의 값은 고정, 이 값이 변경되었을 경우 에러로 판정
{
Serial.flush();
return;
}
pm1 = (pms[10] << 8) | pms[11];
pm25 = (pms[12] << 8) | pms[13];
pm10 = (pms[14] << 8) | pms[15]; //bit shift를 통해 2개의 byte 데이터를 하나의 int 데이터로 합침
}
}
int connectWiFi()//wifi에 접속하기 위한 함수
{
int count = 0;
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
if (count++ == 10) {
return 1;
}
}
return 0;
}
void riseFlag() { intFlag = 1; } //인터럽트 서비스 루틴, 인터럽트 플래그를 활성화
void lowFlag() { intFlag = 0; } //다시 인터럽트 플래그를 내림
void log()
{
static unsigned long logtime = 0; //millis() 함수를 이용해 원하는 시간에만 데이터 전송, 현재는 15초
if (millis() – logtime > 5000)
{
logtime = millis(); //데이터를 전송할 경우 타이머를 최신화함
HTTPClient httpClient;
Serial.println(“pm25=” + String(pm25));
httpClient.begin(host + “pm1=” + String(pm1) + “&pm25=” + String(pm25) + “&pm10=” + String(pm10)); //주소를 입력하는 형식을 이용해 데이터를 전송
}
}
void showLCD() //lcd를 밝혀주는 함수
{
#define ON true
#define OFF false
static unsigned long lcdtime = 0;//lcd 발광 시간을 비교하기 위한 함수
static bool lcdstate = OFF;
if (intFlag == 1) //인터럽트 플래그가 활성화 되어있을 시
{
lcd.clear();
lcd.backlight();
lcdtime = millis(); //lcd 발광 시간을 계산, 이 시간부터 5초간 지속
lcd.print(“PM2.5:” + String(pm25) + “ug/m3”); //lcd에 PM25의 값을 print
lcd.setCursor(0, 1); //커서를 한칸 내림
lcd.print(“PM10:” + String(pm10) + “ug/m3”); //lcd에 PM10의 값을 print
lcd.backlight(); //lcd의 백라이트 활성화
lcdstate = ON; //lcd의 상태를 ‘켜짐’으로 바꿈
lowFlag(); //인터럽트 플래그는 내려줌
}
else if (lcdstate && (millis() – lcdtime > 5000)) //lcd가 ‘켜짐’ 상태고 현재 시간이 lcdtime으로부터 5초 이상 지났을 시
{
lcd.clear(); //lcd 글자 지움
lcd.noBacklight(); //lcd 백라이트 비활성화
lcdstate = OFF; //lcd의 상태를 ‘꺼짐’으로 바꿈
}
}
5.2. 홈페이지 코드
<%@ page language=”java” contentType=”text/html; charset=UTF-8”
pageEncoding=”UTF-8”%>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8”>
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css” integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”>
<link rel=”shortcut icon” href=”/resources/title.png”>
<title>Hello, Particular Matter!</title>
</head>
<body>
<div class=”container”>
<div class=”row mt-3”>
<div class=”col-12 text-center”>
<h2>Hello, Particular Matter!</h2>
</div>
</div>
<div class=”row mt-3”>
<div class=”col-12”>
<div class=”card text-center” style=”min-width: 270px;”>
<div class=”card-body” id=”card-pmnotice”>
<h5 class=”card-title” id=”card-pmnotice-title”>${currentTime}</h5>
<div class=”mb-3” id=”card-pmnotice-pm”>
<p class=”card-text” id=”card-pmnotice-pm-pm1”>PM1.0 = ${pm1}ug/㎥</p>
<p class=”card-text” id=”card-pmnotice-pm-pm25”>PM2.5 = ${pm25}ug/㎥</p>
<p class=”card-text” id=”card-pmnotice-pm-pm10”>PM10 = ${pm10}ug/㎥</p>
</div>
<p>${message}</p>
<button class=”btn btn-primary” id=”btn-update”>Update information</button>
<button class=”btn btn-success” id=”btn-graph”>I want to see a graph!</button>
</div>
</div>
</div>
</div>
<div class=”row mt-4”>
<div class=”col-12”>
<c:choose>
<c:when test=”${flgMask == 0}”>
<button type=”button” class=”btn btn-primary btn-lg btn-block btn-controlmask” id=”1”>Wear a Mask!</button>
</c:when>
<c:when test=”${flgMask == 1}”>
<button type=”button” class=”btn btn-danger btn-lg btn-block btn-controlmask” id=”0”>Remove a Mask!</button>
</c:when>
</c:choose>
</div>
</div>
</div>
<script src=”https://code.jquery.com/jquery-3.3.1.slim.min.js” integrity=”sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo” crossorigin=”anonymous”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js” integrity=”sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1” crossorigin=”anonymous”></script>
<script src=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js” integrity=”sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM” crossorigin=”anonymous”></script>
<script type=”text/javascript”>
var protocol = location.protocol;
var port = location.port;
var host = location.hostname;
$(document).on(‘click’, ‘.btn-controlmask’, function() {
$(this).prop(‘disabled’, true);
location.href = protocol + “//” + host + “:” + port + “/mask?flgMask=” + $(this).attr(‘id’);
});
$(document).on(‘click’, ‘#btn-update’, function() {
$(this).prop(‘disabled’, true);
location.href = protocol + “//” + host + “:” + port + “/”;
});
$(document).on(‘click’, ‘#btn-graph’, function() {
$(this).prop(‘disabled’, true);
location.href = protocol + “//” + host + “:” + port + “/graph”;
});
</script>
</body>
</html>
그래프 페이지 코드
<%@ page language=”java” contentType=”text/html; charset=UTF-8”
pageEncoding=”UTF-8”%>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8”>
<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css” integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”>
</head>
<body>
<div id=”curve_chart” style=”width: 100vw; height: 600px;”></div>
<div class=”container”>
<div class=”row mt-2 mb-5”>
<div class=”col-12 text-center”>
<div class=”alert alert-danger”>
${message}
</div>
<button class=”btn btn-success” id=”btn-home”>Go back to home!</button>
</div>
</div>
</div>
<script src=”https://code.jquery.com/jquery-3.3.1.slim.min.js” integrity=”sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo” crossorigin=”anonymous”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js” integrity=”sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1” crossorigin=”anonymous”></script>
<script src=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js” integrity=”sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM” crossorigin=”anonymous”></script>
<script type=”text/javascript” src=”https://www.gstatic.com/charts/loader.js”></script>
<script type=”text/javascript”>
var protocol = location.protocol;
var port = location.port;
var host = location.hostname;
$(document).on(‘click’, ‘#btn-home’, function() {
$(this).prop(‘disabled’, true);
location.href = protocol + “//” + host + “:” + port + “/”;
});
google.charts.load(‘current’, {packages: [‘corechart’]});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
// Define the chart to be drawn.
var data = new google.visualization.DataTable();
data.addColumn(‘date’, ‘time’);
data.addColumn(‘number’, ‘pm1.0’);
data.addColumn(‘number’, ‘pm2.5’);
data.addColumn(‘number’, ‘pm10’);
data.addRows(${graphData});
var options = {
title: ‘Particulate Matter Density’,
curveType: ‘function’,
legend: { position: ‘bottom’ }
};
// Instantiate and draw the chart.
var chart = new google.visualization.LineChart(document.getElementById(‘curve_chart’));
chart.draw(data,options);
}
</script>
</body>
</html>
5.3. bean 코드
package bean;
import java.math.BigDecimal;
public class HomeBean {
private BigDecimal dc_pm1;
private BigDecimal dc_pm25;
private BigDecimal dc_pm10;
private String st_update;
private String flg_mask;
public BigDecimal getDc_pm1() {
return dc_pm1;
}
public void setDc_pm1(BigDecimal dc_pm1) {
this.dc_pm1 = dc_pm1;
}
public BigDecimal getDc_pm25() {
return dc_pm25;
}
public void setDc_pm25(BigDecimal dc_pm25) {
this.dc_pm25 = dc_pm25;
}
public BigDecimal getDc_pm10() {
return dc_pm10;
}
public void setDc_pm10(BigDecimal dc_pm10) {
this.dc_pm10 = dc_pm10;
}
public String getSt_update() {
return st_update;
}
public void setSt_update(String st_update) {
this.st_update = st_update;
}
public String getFlg_mask() {
return flg_mask;
}
public void setFlg_mask(String flg_mask) {
this.flg_mask = flg_mask;
}
}
5.4. Controller 코드
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import service.GraphService;
@WebServlet(“/graph”)
public class GraphController extends HttpServlet {
private static final long serialVersionUID = 1L;
GraphService gs = new GraphService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get info
if (!gs.getDataforGraph(req)) {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// forward
req.getServletContext().getRequestDispatcher(“/WEB-INF/template/graph.jsp”).forward(req, resp);
}
}
5.5. DAO(Data Access Object) 코드
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.GraphBean;
public class GraphDao extends SQLExecuter {
public List<GraphBean> getDataforGraphDao() {
String sql =
“SELECT “ +
“ dc_pm1, dc_pm25, dc_pm10, dt_update, flg_mask “ +
“FROM “ +
“ h_particular_matter “ +
“WHERE dt_update > NOW() – INTERVAL 1 DAY “ +
“ORDER BY “ +
“ dt_update “;
List<GraphBean> lgb = executeSelect(sql);
if (lgb == null) {
System.out.println(“GraphDao.getDataforGraphDao: 1. Fail to get data”);
return null;
}
return lgb;
}
@Override
public List<GraphBean> executeSelect(String sql) {
try {
Class.forName(connector);
Connection conn =
DriverManager.getConnection(connectionStr);
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery(sql);
List<GraphBean> lgb = new ArrayList<GraphBean>();
while ( rset.next() ) {
GraphBean gb = new GraphBean();
gb.setDc_pm1(rset.getBigDecimal(“dc_pm1”));
gb.setDc_pm25(rset.getBigDecimal(“dc_pm25”));
gb.setDc_pm10(rset.getBigDecimal(“dc_pm10”));
gb.setDt_update(rset.getTimestamp(“dt_update”));
gb.setFlg_mask(rset.getString(“flg_mask”));
lgb.add(gb);
}
rset.close();
stmt.close();
conn.close();
return lgb;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
[59호]스마트홈 플랫폼
2019 ICT 융합 프로젝트 공모전 참가상
스마트홈 플랫폼
글 | 건양대학교 강현욱, 김준혁
1. 심사평
칩센 개발 작품에 적용된 기술이나 제품은 현재 이미 상용화 단계를 넘어 판매되고 있는 제품들도 많이 있습니다만, 시제품의 형태라 하더라도 작품 개발의 범위에 있어 2인 개발을 진행했다는 것에 조금 놀랐습니다. 전원플러그, 블라인드, 조명 제어등은 생활에 있어서 늘상 접하게 되어 익숙함에 의하여 소홀할 수 있지만, 그래서 더 편리하고 안전하되 효율적으로 사용할 수 있는 방안이 늘 고민되어야 합니다. 전원 플러그 control에 대하여 기본적인 사전 학습이 많이 되었을 것으로 보이고, 모터 컨트롤과 조명 제어 등에도 여러가지 시행착오를 겪었으리라 예상됩니다만, 최소한의 결과를 잘 도출해 낸 것 같습니다.
무선 기술과 networking을 연결하는 것이 가장 기본적인 IoT의 기능인데, 이 부분까지 접목이 되어 있습니다, 보고서에서 언급된 일부 미흡한 부분등에 대하여 추가적인 고민이 이루어진다면 제품화를 고려할만한 좋은 작품이 나올수 있을듯 합니다.
뉴티씨 여러가지 IoT장치를 실제로 만들어서 적용하고자 한점에서 매우 좋은 시도로 보입니다. 또한, 여러가지 CPU들을 사용하고, 기술들도 여러가지를 사용하여 테스트해보고자 한 점이 돋보입니다. 하지만, 한가지에 좀더 집중했다면, 뭔가 작품성이 높은 작품을 만들 수 있었을 것이라는 아쉬움이 남습니다. 기술적으로 많은 학습을 했을 것이라고 생각되며, 앞으로 좋은 작품으로 다음에 다시 보기를 바랍니다.
위드로봇 시중에 나와있는 유사 제품과 다른 차별성을 보여 주면 더 좋은 제품이 될 것 같습니다.
펌테크 스마트홈 구현에 사용 가능한 다양한 응용분야를 미니어처 형태로 짜임새 있게 잘 구성하였다고 생각합니다. 다만 스마트홈 제어를 스마트폰을 통하여 제어하는 방식으로 구현하었다면 더욱더 완성도 높은 작품이 되지 않았을까 생각해봅니다. 학부과정의 학생이 구현하기에 적정한 난이도를 가진 작품이라고 생각합니다.
2. 작품 개요
우리 팀이 설계한 스마트홈 플랫폼은 스마트 멀티탭, 스마트 블라인드, 스마트 무드등, 온습도계, 라즈베리파이 서버로 구성되어 있으며, 무선통신기술을 이용하여 웹 또는 앱으로 원격 제어가 가능하고, 각 기기의 상태를 확인할 수 있다.
3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 스마트 멀티탭
위 그림은 블라인드 내부 외부 하드웨어 사진이다. 3구 멀티탭을 분해하여서 릴레이 모듈과 전류센서를 연결하여 각각 원격 제어가 가능하도록 제작하였다. 와이파이 모듈을 사용하여 WiFi망을 통해 원격 통신을 가능하게 하였다. 220V 정격전압은 5V AC-DC 컨버트를 통해 변환시켜 아두이노에 5V를 안정적으로 넣을 수 있었다.
각각의 멀티탭을 ON/OFF 해주기 위해 3개의 이미지 버튼을 만들어서 작동을 할 수 있게 만들었다. HTML의 테이블 태그를 이용해서 디자인을 하였고 이미 켜있는 상태는 붉은색, 꺼있는 상태는 회색으로 버튼이 눌렸음을 사용자에게 알려주었다. 현재시간을 볼 수 있는 코드는 구현하였으나, 이후 현재 시간을 이용해 예약 후 꺼질 수 있도록 해야 한다.
HTML에서 버튼을 누르면 이미 설정해 놓은 버튼 ID가 IP주소를 따라 ESP8266에 명령을 주고 ESP8266에서는 IPD에 버튼 명령을 받으면 read()명령어를 통해 아두이노에 동작 시행 명령을 준다.
getVPP 함수를 통해 인위적으로 만든 전류값을 실효값과 mA단위로 변경해주었다. 그 값을 이용해서 대기모드 상태외 구현코드를 만들었다.
정상적으로 HTML에서 명령어가 전달되었고 휴대폰을 충전했다가 빼고 난 뒤 수 초 후 릴레이가 OFF되는 모습도 볼 수 있었다. 실시간 전력을 측정하여 과전류 방지 및 대기전력 낭비를 줄이는 초기 모델이다.
3.1.2. 스마트 블라인드
그림 3.6은 블라인드를 제어하는 컨트롤러의 케이스 사진이다. 솔리드웍스를 사용하여 원하는 규격의 케이스를 3D 프린터로 출력하려고 했지만, 프린터에 문제가 발생하여 차선책으로 아크릴을 이용하여 케이스를 제작하였다.
아크릴 판들을 고정하기 위해 순간접착제를 이용하니 무언가 하얀 흔적이 생겨서 보기에 좋지 않았다. 그래서 가죽 질감의 시트지를 붙여 깔끔한 느낌이 들도록 했고강력한 네오디뮴 자석을 이용하여 커버를 확실하게 여닫을 수 있게 하였다.
그림 3.9는 부품들을 납땜한 회로를 케이스 안에 넣은 모습이다. 블라인드를 동작시키기 위한 모터, 그 모터를 제어하기 위한 모터드라이버(DMC-50), 무선 통신을 위한 Wi-Fi 모듈(esp-01), 웹 서버로부터 수신한 명령을 처리하는 아두이노(NANO), 모터 작동을 위해 인가되는 DC24V 전압을 아두이노를 위한 DC5V 전압으로 변압시키는 레귤레이터 부분으로 구성되어있다.
모터를 제어하기 위해 10, 11, 12번의 디지털핀을 설정하였다. 이 핀들은 웹 코딩을 통해 각각 정지, 올림, 내림으로 설정되어있다. 그리고 sendData함수를 통해 Wi-Fi와 연결하고, IP주소, 다중연결설정, 서버 연결을 실행하고, 시리얼 모니터에 출력한다.
Wi-Fi 모듈(esp-01)을 사용하여 아두이노와 Apache 서버를 연결하고 Wi-Fi를 통해 받은 명령을 판별하여 모터를 동작시킨다.
사용자가 버튼을 통해 블라인드를 동작시키는 부분이다. 또한 이미지 파일에 하이퍼링크 기능을 넣어서 이전 페이지로 돌아갈 수 있다. 각 컴포넌트는 div태그를 이용하여 깔끔하고 명확하게 구분하였다. UP, STOP, DOWN 버튼에는 onClick 함수를 적용하여 버튼을 누르면, 해당 명령을 Wi-Fi를 통해 블라인드 컨트롤러로 전송한다.
그림 3.12에 있는 기타 기능들은 실제로 기능하지 않는다. 적혀있는 값도 임의로 넣은 것이다. 실제로 기능하지 않음에도 추가한 이유는 우리가 생각하는 시나리오를 위해서이다. 지금은 디자인 부분만 구현했지만 앞으로 기능을 추가할 것이다.
제어 버튼을 누르면 Wi-Fi를 통해 블라인드 컨트롤러로 전송하는 자바스크립트이다. 서버에 연결되어 있는 여러 가지 장치들을 구분하기 위해 블라인드 컨트롤러의 IP주소를 이용한다. 해당 IP주소를 가진 장치로 명령을 보낸다.
버튼을 누르면 눌렀다는 상태를 색깔로 표시하기 위한 이벤트를 발생시키는 자바스크립트이다. 어떤 버튼을 누르면 회색으로 변하여 누른 상태, 동작 중인 상태를 나타내며, 만약 다른 버튼이 눌러져 있으면, 그 버튼은 원래 색깔인 흰색으로 돌아간다.
그림 2.13는 스마트 블라인드를 설치한 모습이다. 블라인드를 동작시키려면 상당한 힘이 필요하고, 안정적으로 동작시키기 위해서는 컨트롤러가 벽에 잘 고정되어 있어야 한다. 가장 확실한 고정 방법은 못으로 벽에 고정시키는 것이지만 임시 설치이기에 양면테이프를 이용하였다. 접착력이 뛰어나 잘 고정되기는 하였으나, 블라인드를 동작시킬 때 발생하는 진동으로 인해 조금씩 부착이 약해지는 것을 볼 수 있었다.
3.1.3. 스마트 무드등
사용자 화면을 다음과 같이 사용자의 감정, 분위기에 맞추어 선택할 수 있도록 설정 했으며 정열-빨강, 진정-초록, 청량-파랑, 낙천-노랑, 환상-무지개, 공허-하양 그리고 밝기는 3단계로 분류 했다. 아두이노 코딩을 통해 일정 숫자 값을 받을 때 원하는 색상을 나타낼 수 있도록 만들었다. 기본적인 빨강, 초록, 파랑부터 무지개까지 나오도록 만들었다.
무드등의 회로는 상용전원 220V를 어댑터를 통해 9V로 변압시키고, 아두이노에 인가하여, 아두이노에서 네오픽셀로 전압을 주고, 아두이노의 3.3V 출력 핀에서 Wi-Fi 모듈(esp-01)로 전력을 공급하는 방식이다.
케이스는 초기에 원이나 구 형태로 구상했지만 많은 자료 조사와 여러 도안들을 통해 그림 3.15과 같은 형태로 색상을 표현했을 때, 분위기 있는 무등등이 될 것이라고 생각하여 디자인을 결정하였다.
3.1.4. 스마트 온습도계
이번 프로젝트를 진행하면서 하드웨어와 소프트웨어를 직접 만들며 제품을 실제로 제작했다.
하드웨어 측면으로는 아두이노 UNO와 ESP8266(esp-01), DHT22를 사용하였다. 소프트웨어 측면으로는 아두이노 IDE를 이용해 코딩을 했으며, ESP8266을 조작하기 위한 SoftwareSerial 헤더 파일과 DHT22를 사용하기 위해서 DHT 헤더 파일을 import하였다.
Serial 모니터 확인 부분과, DHT22 시작, ESP8266로 와이파이를 통한 IP 주소 획득 부분에 들어간 코드로 AT명령어를 사용했다. 아두이노 loop 함수 부분은 다른 제품과 달리 아두이노 자체가 서버가 되어 웹 페이지를 생성하고 IP주소를 메인 웹 서버에서 하이퍼링크로 접근하게 했다.
다른 제품과 달리 JAVA Script를 사용하지 않고 아두이노 자체를 서버로 만들었기 때문에 <a>태그로 하이퍼링크를 사용해 아두이노 서버의 IP를 추가하고 통일성을 위해 프레임을 나누어 볼 수 있게 하였다.
3.1.5. 라즈베리파이 서버
서버 구축을 위해 내장 WI-FI 기능이 있는 라즈베리파이3 B+ 모델을 사용하였으며, 라즈베리파이에는 아파치2를 설치하였다. 포트포워딩을 해준다면 외부에서도 접속할 수 있다. 아파치 서버에 우리가 만든 HTML 관련 파일을 넣으면, 웹에서 항상 서버가 가동하기 때문에 언제든지 접속할 수 있었다. 차후 MySql을 이용해 DB값을 활용할 예정이다.
3.2. 전체 시스템 구성
3.3. 개발 환경
· HardWare : Arduino, Apache, Linux
· SoftWare : HTML, CSS, BootStrap, JavaScript
· Tools : atom, Arduino IDE, frizing, RaspberryPi, Telnet, Putty, Filezila
4. 단계별 제작 과정
원활한 제작을 위해 IoT 장치 시제품을 분석하여 필요한 센서에 대해 학습하였다. 아두이노를 기반으로 제어하기 때문에 아두이노에서 사용가능한 센서를 이용하였다. 각 센서의 datasheet를 통해 사양을 확인하고 규격에 맞게 회로를 구성하였다. 처음에는 브레드보드판과 점퍼선을 이용해서 테스트를 시행하였고 테스트가 완료되면 PCB기판에 납땜을 통해서 모듈화를 시켰다. 납땜 시 전선을 사용하였고 경우에 따라서 wrapping도 하였다. Smart Multitap, Smart Blind, Smart Mood Light, Smart Hygrometer 총 4 가지의 IoT 장치를 제작하였다. 모형으로 된 집을 제어하는 것이 아닌 실제 집에서 사용하는 것을 목표로 했기 때문에 각 제품은 상용 전원(220V)을 사용할 수 있게 제작하였다.
서버는 라즈베리파이와 아파치를 이용하였다. 외부접속을 용이하기 위해 라즈베리파이 아파치2 서버를 가동시켜 언제든 웹에 접속할 수 있도록 하였다. 아두이노에는 Wi-Fi 모듈(esp-01)을 부착하여 Wi-Fi를 통해 라즈베리파이와 연결할 수 있도록 하였다. 각 제품에 고정 IP 주소를 할당하여 전원을 껐다가 켜더라도 IP 주소를 다시 할당하는 불편함이 없도록 하였다. 웹은 bootstrap을 이용해 CSS로 디자인하였고, 전원 ON/OFF 동작 및 LED 제어 버튼은 JSP를 이용해서 구현하였다.
4.1.1. 스마트 멀티탭
멀티탭 블록도 다이어그램
실제 멀티탭 분해 및 릴레이 모듈 연구
전류센서 부착 및 esp8266 모듈 연결
전체 회로도 구상 및 제작
케이스 제작 및 모듈화
웹 페이지 설계 및 통신
웹 디자인 및 실시간 전류 모니터링 구현
4.1.2. 스마트 블라인드
설계도 구상 및 사용할 부품, 부품의 치수를 확정
프로그램한 대로 모터가 잘 구동하는지 시험하기 위한 Testtype 제작
블라인드 줄에 맞는 기어를 3D프린터로 제작, 모터와 아두이노의 동작 전압을 조정하기 위한 레귤레이터 설계
Wi-Fi 연결 및 회로 납땜. 케이스 제작
웹 페이지 설계, 서버 연결, 원격 제어
4.1.3. 스마트 무드등
System Blockdiagram, Flowchart 작성
frizing을 활용한 회로도 및 케이스 설계 도면 작성
하드웨어 모듈화
4.1.4. 통합(라즈베리파이 서버, 웹 페이지)
웹 서버
5. 참고문헌
[1] 금별맘 “삶의 질을 높여주는 LG스마트홈 IoT 기기”
[2] I-DB “전기요금 주범! 가전제품 대기전력 소모량”
[3] 다음블로그 “전기 1w당 요금은 얼마나 될까?”
[4] apkpure “스마트 멀티탭 원격제어 APK”
[5] 에듀이노 오픈랩 “5V동작 20A 전류 센서 모듈”
[6] “DMC-50”, 모터뱅크, 모터관련 쇼핑몰
[7] just4you, “전원설계 기본원칙”, 전자회로, 네이버블로그
[8] Wkim, “LM7805동작설명”, 전자부품, 네이버블로그
[9] 원동현, “Play! SolidWorks 2014 Master”, 초판, 청담북스
[10] 원동현, “솔리드웍스 기본과정”, SolidWorks Korea, 유튜브 강의
[11] 사용법어찌, “HTML 태그사용법”, 구글
[12] 솜피IoT블라인드, “블라인드 웹디자인”, LGU+ 홈피
[13] ev art, “esp8266 LED 제어”, 다음 블로그
[14] 제타의 IOT 세상나들이, “ESP-01, ITEADLIB Wee 라이브러리를 사용하여 온,습도를 전달해주는 웹서버” 네이버 블로그
[15] ESP8266 AT Command Set, PDF
[16] Hard Copy Arduino, “온습도 센서 (DHT22, DHT21)”, 블로그
[17] MakeWith, “아두이노를 이용한 미니 웹 서버 만들기 : 예제 분석”, 블로그
[18]kokoafab,”조도센서(모듈)로 어두워지면 켜지는 LED 만들기”
[19]Makeshare,“네오픽셀 RGB LED WS2812에 대해 알아보기/아두이노 조명”