NERD WORLD

WIZnet 4월 아카데미 - 라즈베리파이와 위즈네트 모듈을 이용한 스마트홈 본문

일상

WIZnet 4월 아카데미 - 라즈베리파이와 위즈네트 모듈을 이용한 스마트홈

학부생7년차 2016. 4. 20. 20:55

위즈네트 4월 아카데미에 또 다녀왔다. 아마 4월중에 남은 3번의 교육도 다 다녀올까 싶다. 매번 갈때마다 하나씩은 새로운걸 배우고 돌아오는 느낌. 이번 주제는 "라즈베리파이와 위즈네트 모듈을 이용한 스마트홈"이었다. 특히나 이번 강의는 강의자료의 내용이 더 훌륭했다고 느꼈다. 이번이 3번째 수강한 강의인데, 3번의 강의들 중에서 수업과 강의자료의 내용과 순서가 가장 일치했기 때문이다. 그러므로 이전 14일 강의 포스트에 비해서 더욱 간략하게 정리해보고자 한다. 강의자료는 위즈네트 아카데미 사이트에 공개되어있으므로 아래에 링크를 남긴다.

[ 실습 목표 ]

간단하게 정리하자면 "웹 브라우저(노트북 or 스마트폰)의 버튼을 토글(toggle)해서 센서 쉴드(shield)의 백색 LED를 제어하고, 센서 쉴드의 온도/습도 센서값을 웹 브라우저로 확인한다"이다. 온도/습도 센서와 관련된 부분을 빼고, "스마트폰으로 백색 LED를 제어한다"라는 부분만 놓고보면 14일 강의에서 BLYNK 앱으로 W5500-EVB의 백색 LED를 제어하는것과 다를바가 없어보인다.

다만 구현방식이 다른 것이다. 간단히 아래와 같은 그림으로 정리해볼 수 있겠다. 윗부분이 14일 강의의 구현을 요약한 것이고, 아랫부분이 19일 강의의 구현을 요약한 것이다. 세세한 부분은 생략하였고(예: 19일 강의파트에서 WIZwiki-W7500 보드를 거쳐 센서 실드로 연결된다), 사용된 프로토콜과 하드웨어 코드 라이브러리등도 생략했다.

14일 강의 주제의 핵심은 "스마트폰을 이용한 제어의 간단한 구현(by BLYNK)"였고, 19일 강의 주제의 핵심은 "스마트홈 구현"이다. 그런 맥락에서 19일 강의의 구현이 가지는 이점은 (전적으로 내 개인적인 생각) 구현된 시스템의 독립성이다. 간단히 얘기해서 14일의 구현은 필현적으로 BLYNK 서버를 거쳐가야 하는데 이는 지구상 어딘가에 있는 서버이므로 데이터가 먼 거리를 이동해야한다. 하지만 19일의 구현에서는 웹 브라우저로 모니터링하는 디바이스, 서버 역할을 하는 라즈베리파이, 그리고 센서 실드가 모두 같은 서브넷(subnet)에 존재하도록 구현되었다. 그러므로 서브넷의 인터넷 연결을 관장하는 게이트웨이와 외부 네트워크 사이의 연결이 단절된다고 하더라도 시스템 운영에는 문제가 없다. 집밖에서 제어하고 싶다면 얘기가 달라지겠지만... 그럼에도 확실한 점은 서버를 내가 소유한다는 점이다. 서버가 올라간 라즈베리파이는 내가 가지고 있을 수 있다.

정리하자면 14일 강의와 19일 강의는 같은 실습 목표를 가졌지만, 그 구현이 판이하게 다르므로 19일 강의는 14일 강의와 다른 면에서 유익하게 다가왔다.

[ 구성요소 정리 : HW / SW 모두! ]

1) 라즈베리파이 : 

작은 (싱글-보드) 컴퓨터라고 이해했다. 컴퓨터라서 OS도 올라간다. RASPBIAN이라는 독자적인 OS를 가지고 있고, 라즈베리파이 공식 홈페이지에서 다운로드 받을 수 있다. 실습에서는 RASPBIAN JESSIE LITE를 다운로드 받아서 Win32diskmanager를 사용해서 SD 카드에 OS 이미지를 만들었다. 라즈베리파이에 OS를 올리고 부팅하는 방식이 SD 카드 삽입을 통해서이기 때문이다. 

라즈베리파이를 처음 접했고, 빠삭하게 알기 위해서는 많은 공부가 필요할 것이다. 그러므로 우선 라즈베리파이를 이루는 구성요소들 중에서 외부와의 연결 포트 위주로 짚고 넘어가보자. (참고 링크)

      • Ethernet : LAN 케이블을 연결할 수 있다. 실습에서도 라즈베리파이의 네트워크 연결을 위해서 라즈베리파이와 ipTIME H508 허브 공유기를 연결하였다. OS가 올라가 있으니 네트워크 I/O 작업은 OS가 맡아주지 않을까 예상된다.
      • Memory Card Slot : Micro SDIO. OS 부팅에 쓰인다.
      • Power : Micro USB socket 5V, 2A. 스마트폰 충전기랑 똑같이 생겼다. 똑같나?
      • Video Output : HDMI 혹은 Composite RCA로 연결되어있다고 한다. HDMI 연결이 가능한 모니터가 있다면 이를 이용해볼 수 있지 않을까?
      • Audio Output : 3.5mm jack, HDMI 라고 되어있다. 보통 스마트폰이나 노트북에 이어폰 연결할때의 포트랑 동일하게 생겼군.
      • USB : 2 x 2로 뭔가 4개 꽂을 수 있게 생긴 포트가 있길래 거기가 SD 카드인줄 알았더니 아니었다. 알고보니 USB를 꽂을 수 있는 포트였군.
      • GPIO Connector : 뾰족하게 생긴 핀이 40개있는데 GPIO였다. M형이다.
      • Camera Connector : 15-pin MIPI Camera Serial Interface(CSI-2)가 있다고 하는데 잘 모르겠다.
      • JTAG : not populated(?), 덧붙여져있지 않다(?)
      • Display Connector : DSI 15 way flat flex cable connector 라고 한다. Video Output 이랑 또 다른건가?

이 중에서 실습때 사용한 포트는 붉은색으로 표시하였다. Power는 Micro USB-to-USB 케이블을 이용해서 노트북에 연결하여 전력을 공급하였고, SD 카드는 앞서 언급한 OS 이미지를 담은 SD 카드를 사용하였다. Ethernet에 대해서도 위에서 언급했으니 생략.

2) Putty :

노트북 PC에서 라즈베리파이에 원격으로 접속하기 위해 사용했다. RASPBIAN OS의 네트워크 인터페이스 설정에서 정해진 값의 정적 IP를 사용하도록 해놓았다. 그러므로 그 값을 사용해서 Putty로 SSH로 접속했다. 포트는 22번을 사용했다. Micro USB-to-USB 케이블로 접속된거라고 생각했는데 오산이었다. 노트북 PC와 라즈베리파이가 같은 서브넷에 존재했기때문에 가능한 것이었다. 

3) MQTT : 

"경량의 Publish/Subscribe 메시징 프로토콜"이라고 강의자료에 나와있다. 경량이니 IoT에 적합할것이다. 기본적으로 PublisherSubscriberBroker를 매개로 물려있는 구조를 지닌다. 아래 사진으로 이해해보자. (사진출처 및 참고링크)

여러 종류의 Broker가 있는데, 그 중 실습에서는 Mosquitto Broker를 사용했다. 간단히 요약해서 엔드-노드 디바이스를 제어하고자 한다면 제어하는쪽이 Publisher가 되고, 디바이스가 Subscriber가 된다. 반대로 디바이스의 센서로부터 데이터를 받아오고 싶다면 디바이스가 Publisher가 되고, 받아보는쪽이 Subscriber가 되는 것이다. 이러한 양방향 메시징 작업을 보통의 웹서버에서로 직접 구현할 수도 있을 것이다. 하지만 메시징 작업만이 목적이라면 MQTT 프로토콜을 사용하는 것이 훨씬 더 경량하므로 더 효율적인 것이다. 여담이지만, 위의 참고 링크에서 MQTT 프로토콜로 채팅 프로그램을 만드는 것도 설명되어있다.

4) OpenHAB :

Open Home Automation Bus의 약자이다. 사실 앞서 얘기한 MQTT 만으로 스마트-홈의 모든것이 가능해보였다. 엔드-노드의 디바이스를 제어할 수도 있고, 센서로부터 데이터를 받아올 수도 있기 때문이다. 그래서 OpenHAB의 존재의의에 대해서 의문이 생겼다.

답은 통합(Integration)이다. 서로 다른 회사에서 개발한 엔드-노드 디바이스들은 서로 다른 프로토콜을 사용할 수 있다. 즉, MQTT말고 다른 프로토콜이 내장된 디바이스가 스마트-홈 시스템에 포함될 수도 있다. IoT에서도 많은 프로토콜이 혼재되어있나보다. 그렇다면 여러 디바이스들을 모니터링하기 위해서는 디바이스마다 다른 어플리케이션을 써야하고 이는 비효율적이다. OpenHAB이 추구하는바는 OpenHAB Event Bus가 중간에서 게이트웨이 역할을 하고 하나의 어플리케이션으로 다양한 디바이스들을 모니터링하는 것이다. Event Bus에서 각각의 프로토콜로 바인딩(binding)하는 개념이다. 아래의 그림으로 이해해보자 (그림 출처).

5) WIZwiki-W7500 + Sensor Shield : 

WIZwiki-W7500 보드는 W7500 칩에 기반한 WIZwiki 플랫폼 보드이다. W7500 칩은 ARM Cortex-M0, 128KB Flash와 W5500(Hardwired TCP/IP chip)을 합친 one-chip solution이다. Arduino Shields들과도 compatible 하므로 IoT 쪽에서 빠르게 프로토타입을 만들기에 적절하다.

그러므로 YWROBOT에서 만든 Arduino I/O Sensor Shield를 사용할 수 있었다. I/O pin을 꽂아서 간단하게 위에 적층시킬 수 있다. 실습에서는 센서 실드에 달린 백색 LED와 온도/습도 센서를 사용했다.

라즈베리파이는 PC이므로 MQTT 소프트웨어를 다운로드받아서 실행했지만, WIZwiki-W7500 보드는 펌웨어가 올라가므로 보드가 MQTT Publisher/Subscriber 역할을 수행할 수 있도록 라이브러리를 활용한 펌웨어 프로그래밍이 필요하다. ARM mbed 프로젝트 코드가 제공되었다.

[ 실습 시스템 ]

구성요소들을 정리하였으니, 최종적으로 구현된 실습 시스템을 한번 정리해보자. 

OpenHAB 프로그램MQTT Broker라즈베리파이 머신 위에서 돌아간다. OpenHAB 프로그램의 설정을 바꾸고 싶을때는 configuration file을 수정한다. MQTT Broker를 OpenHAB에 바인딩시키기 위해서 configuration file에 MQTT Broker를 정의하는 코드를 추가해준다. 이때 라즈베리파이 자신의 ip주소가 입력된다. 다음은 OpenHAB 프로그램의 sitemapitem 객체를 정의한다. sitemap은 웹 브라우저를 통해 사용자에게 보여지는 UI 요소를 생성하는 객체이다. 그리고 item은 sitemap 객체에 변화가 생겼을때(예: 버튼 객체가 토글됨) 실제 어떤 작업이 이뤄지는지(예: 센서 실드의 백색 LED의 RED LED를 Off함)를 기술한 객체이다. 그러므로 MQTT Publisher와 Subscriber가 item을 기술하는 과정에 포함된다. 라즈베리파이가 센서 실드의 모듈을 제어할때는 Publisher로, 센서 실드의 센서의 값을 읽어올때는 Subscriber 역할이라고 보면 된다. 즉, 라즈베리파이는 OpenHAB의 주체이며, MQTT Broker이면서 동시에 LED 토픽에 대한 Publisher온도/습도 센서 토픽에 대한Subscriber의 역할을 수행한다.

WIZwiki-W7500 보드에는 MQTT 관련 코드가 펌웨어로 컴파일되어 업로드된다. 위즈네트 측에서 ARM mbed 커뮤니티에 공개해준 코드를 그대로 사용할 수 있다.

main.cpp 파일에서 hostname만 라즈베리파이의 IP 주소로 바꿔주면된다. MQTT Broker가 라즈베리파이에 올라가있기 때문이다. WIZwiki-W7500은 동적 IP를 공유기로부터 할당 받도록 코드가 작성되었으므로, IP 주소 값을 지정해줄 필요는 없다. WIZwiki-W7500 보드는 센서 실드를 제어할 명령을 받아올때는 MQTT Publisher로, 센서 실드의 값을 읽어서 라즈베리파이로 전송할때는 MQTT Subscriber의 역할을 맡는다. 디버깅을 위해 시리얼 모니터로 출력하는 코드가 삽입되어있어, 노트북 PC에서 hercules 같은 프로그램으로 확인할 수 있다. 보드의 Reset 버튼을 누르면 DHCP 서버에 요청해서 IP 주소를 할당 받아오고, MQTT 접속을 완료하는 과정을 볼 수 있다.

노트북 PC의 웹 브라우저는 라즈베리파이가 제공하는 웹 페이지를 유저에게 보여주는 역할을 맡는다. 이를 보고 유저는 백색 LED를 제어할 수 있고, 현재 온도/습도 값을 확인할 수 있다. 제어 명령과 센서 값은 라즈베이파이와 주고받는다.

라즈베리파이와 WIZwiki-W7500 보드와 노트북 PC는 모두 같은 서브넷에 속해있다는 점을 다시 한번 상기시키자. 전체 시스템의 구성을 아래와 같이 간단히 정리해보았다.


Comments