NERD WORLD

WIZnet 4월 아카데미 - IoT 디바이스 컨트롤을 위한 쉬운 스마트폰 APP 활용 (1) 본문

일상

WIZnet 4월 아카데미 - IoT 디바이스 컨트롤을 위한 쉬운 스마트폰 APP 활용 (1)

학부생7년차 2016. 4. 18. 22:55

위즈네트(WIZnet)라는 회사에서, IoT를 주제로 매월 무료 오프라인 강의를 제공하고 있다. 그 소식을 온오프믹스(Onoffmix)에서 메일로 보내준 뉴스레터로 전해들었다. 기존의 무료 강의들은 특정 주제의 입문 수준이고, 1회성인 경우가 많았다. 이에 비해서 위즈네트에서 제공하는 강의는 매주 화/목 2번씩, 한달이 4주이니 총 8회의 강의들을 제공한다는 점에서 차이가 있었다. 또한 입문 수준 뿐 아니라, 초급, 중급, 중/상급의 자체적인 구분에 따른 다양한 수준의 강의를 제공한다는 점도 차이점이었다.

그렇다면 위즈네트는 무슨 회사이기에 이런 알찬 강의들을 무료로 제공하는 것일까? 위즈네트는 Ethernet / WLAN 관련 솔루션의 칩을 제작하는 벤더(vendor)라고 이해할 수 있겠다. 칩을 제작하는 벤더들은 자사가 개발한 칩을 어필하기 위한 수단으로 해당 칩을 내포한 EVB(EValuation Board) 제작하여 제공 및 판매한다. 칩 자체는 Ethernet / WLAN 관련 솔루션의 역할만 수행하므로, 편리하게 원하는 프로토타입을 개발할 수 있도록 MCU 칩, 다양한 입출력 인터페이스를 덧붙여서 EVB로 만들어 제공하는 것이다. 잠재적 구매자들은 EVB를 가지고 원하는 상위 레이어의 솔루션을 제작해보고, 성능을 테스트해본다. 마음에 든다면 위즈네트의 칩을 사용해서 직접 원하는 솔루션을 설계하여 양산하기 시작한다. 그러한 맥락에서, 오픈 아카데미를 운영하며 위즈네트의 칩, 칩을 내포한 EVB, 아두이노에 결합할 수 있는 쉴드 등의 사용법을 소개하는 강의를 제공하는 것 아닐까? 다양한 사람들이 강의를 수강하여 위즈네트라는 회사의 존재와 회사가 판매하는 솔루션을 접하고, 다른 사람들에게 알리고, 결국 해당 솔루션이 필요한 사람들까지 알게되어 위즈네트의 솔루션을 구매하게 되는 정보의 전파.

이 포스트에서는 14일에 참석했던 강의("IoT 디바이스 컨트롤을 위한 쉬운 스마트폰 활용")의 내용을 간단히 정리해보려고 한다. 14일 강의가 두번째였다. 5일에 처음으로 참석했었고("IoT 시대 네트워크 어디까지 해봤니?") 그 사이의 7일 강의와 12일 강의는 불참했다. 매월 이뤄지는 8회의 강의가 꼭 순서대로 들어야만 이해할 수 있는 구성은 아니어서 다행이었다. 6일에 다녀온 가족여행이 당일치기가 될지 몰랐으므로 7일 강의는 신청하지 않았었고, 12일에는 컴퓨터공학부에서, Alpha-Go의 원리가 담긴 네이처(Nature) 논문을 해설해주는 특강이 있었어서 거기에 참석했었다. 언젠가 5일 강의에 대해서도 정리할 기회가 있을 것.

포스트를 작성하는 목적은, 14일 강의 내용에서 등장한 임베디드 시스템과 데이터 통신망의 여러 개념들을 세세히 짚어가면서 내 이해를 다지기 위함이다. 첫번째 포스트에서는 우선 14일 강의에서 사용한 보드와, 보드를 활용해서 구성한 시스템에 대해서 정리할 것이다(두번재 포스트는 각각의 개념들을 내가 불편함을 느끼지 않을 수준까지 세세히 이해해보려는 시도를 담게될 듯 하다).

사용한 보드 = W5500-EVB

14일 강의에서 사용한 보드는 W5500-EVB이다. 이름에서 알 수 있듯이, W5500이라는 칩의 기능을 사용해볼 수 있도록 위즈네트가 제공하는 EValuation Board이다. 그러므로 W5500 칩을 내포하고 있고, MCU 칩과 다양한 인터페이스를 비롯한 여러 구성 요소들로 이뤄져 있다. 아래의 사진은 위즈네트 위키에서 W5500-EVB의 구성요소들을 간략히 설명해놓은 사진을 옮겨온 것이다.

W5500 칩의 존재를 확인할 수 있다. 구성 요소들을 간단히 살펴보자.

1) RJ45 포트는 LAN 케이블로 외부와 연결되어있다. 실습에서는 강의실에 배치된 LAN 허브에 연결됬었다. 이를 통해 인터넷과 연결된 것이다. 인터넷에 연결되어있으므로 외부에서 데이터가 들어오고, 또한 외부로 데이터를 내보낸다. 최하위 레이어인 Physical Layer의 데이터를 주고받지 않을까? 아마 10011100111... 같은 바이너리 데이터일 것이다.

2) RJ45 포트는 W5500 칩과 연결되어있다. 그렇다면 대체 이 W5500 칩은 뭘하는 아이일까? 공식몰의 소개에 따르면 "Hardwired TCP/IP가 내장된 이더넷 컨트롤러 칩"이라고 소개되어 있다. 이렇게 생각해보자. 노트북에 LAN 케이블을 연결해서 인터넷에 접속해서 웹서핑도 하고 즐거운 시간을 보낸다. 이때 노트북에 연결된 LAN 케이블로 들어오고 나가는 데이터도 Physical Layer바이너리 데이터이다. 그 Physical Layer의 바이너리 데이터이므로 최상위 Application layer에서 최하위 Physical Layer로 내려오면서 거치는 다양한 레이어들의 헤더들이 주렁주렁 달려있다. 이 바이너리 데이터는 노트북에 내장된 NIC(Network Interface Card)에서 한꺼풀씩 벗겨지고(정확히 어디까지 벗겨질지는 지금 확실히 모르겠다. 아마 Network layer 까지 벗겨주려나....), 소켓으로 들어가고, 소켓은 컴퓨터의 CPU에서 돌아가고 있는 프로세스에게 최종적으로 데이터를 전해주고, 프로세스는 밑에서 올려받은 데이터를 처리하는 일련의 작업일 것이다. 컴퓨터에서 이 과정의 일부는 H/W으로, 나머지는 S/W으로 이뤄진다. 정확히 얘기해서 NIC이 하는 작업은 H/W적으로 이뤄지고, 그 윗단의 작업은 General-Purpose machine인 노트북의 CPU에서 일반적으로 정의된 인스트럭션들의 조합으로 S/W적으로 이뤄진다. 하지만 W5500은 Physical layer의 데이터를 받아서 어플리케이션 프로세스에게 건네주기 위해 최종 단계로 변환하는 작업을 모두 수행하는데, 이는 모두 H/W적으로 구현되어있다. 보통 정해진 작업을, S/W적으로 구현하는것과 H/W적으로 구현하는 것을 비교해보면 후자가 더 효율적이다. "그" 작업만 수행할 수 있도록 최소한의 자원으로 구현할 수 있는 덕분이다. 아래의 사진은 5일 강의자료에서 따온 그림이다. 지금까지의 논의를 담고 있다. 

W5500은 TCP/IP 작업까지 H/W적으로 구현했다는 점에서 의의를 지니는 것이다. 그래서 Hardwired라는 표현이 쓰였다. 

3) W5500 칩은 오른편에 ARM Cortex-M0라고 적힌 MCU 칩과 SPI(Serial Peripheral Interface)로 연결되어있다. W5500에서 뽑아낸 어플리케이션을 위한 최종 데이터가 예를 들어서 보드에 연결된 어떤 엑츄에이터(actuator)를 제어하는 것이라고 한다면, 이를 MCU 칩에 우선 전송하고 MCU 칩이 엑츄에이터에 제어 신호를 인가한다. 반대로 보드에 연결된 센서 데이터를 외부에 있는 웹 클라이언트에게 실시간으로 보여주고 싶을 수도 있다. 이 경우에는 MCU 칩이 W5500 칩에게 센서 데이터를 전송하고, W5500 칩이 여러 레이어의 헤더를 덧붙여서 Physical layer의 바이너리 데이터로 만든뒤 RJ45 포트를 통해서 내보내는 것이다. 이 두 칩간 연결이 SPI로 되어있다고 했다. 간단히 얘기해서 MCU 칩이 W5500 칩을 비롯한 여러 주변 기기(peripheral)들과 시리얼 통신을 하기 위한 인터페이스를 의미한다. 자세한 인터페이스 구성은 얘기하지 않겠다(사실 잘 모ㅋ름ㅋ).

4) ARM Cortex-M0라고 적힌 MCU 칩에 대해서 조금만 더 얘기해보자. 사실 ARM이 만든 Cortex-M0는 눈에 보이는 하드웨어 칩이 아니라, MCU 코어의 설계도를 지칭한다. 즉 ARM이 직접 MCU 칩을 생산하는 것이 아니라, MCU 칩의 중심인 MCU 코어를 설계하고, 벤더들이 그 Cortex-M0 설계를 내포한 MCU 칩을 생산해서 판매할때마다 로열티를 받는 것이다. 그러므로 정확히는 저 칩은 ARMCortex-M0 MCU 코어를 내포한, NXP사의 LPC11E36 MCU라고 얘기해야 정확하다.

아마 이런 느낌 아닐까....?

5) 나머지 구성 요소들이 많지만, 얘기하지 않고 넘어가도록 하겠다. 우측 테두리에 RGB LED가 달려있다는 것만 짚어두고 넘어가자. 14일 강의에서 진행한 실습에 저 LED를 사용했기 때문에.

구성한 시스템 = BLYNK 앱으로 W5500-EVB의 RGB LED를 제어

"보드에 LAN 케이블을 연결하면, 인터넷으로 보드를 제어할 수 있다". 위에서 정리한 W5500-EVB을 한 문장으로 정리해본 것이다. 강의 후반부는 이를 간단히 확인해보는 실습이 진행되었다. 제어할 것은 W5500-EVB의 MCU 칩에 연결된 peripheral 중 하나인 RGB LED이다. 그렇다면 이 RGB LED를 어떻게 인터넷으로 제어할 것인가?

BLYNK 라는 스마트폰 어플리케이션으로 제어하는 실습이었다. 컴퓨터에 응용 프로그램을 하나 개발해서 보드로 HTTP 메시지를 날리게 할 수도 있을 것이고, 개발된 응용 프로그램인 브라우저를 이용하는 것도 가능할 것이다. 방법은 무궁무진하다. 스마트폰 앱을 직접 개발할 수도 있을 것이다. 그러나 처음부터 "바퀴를 재발명"할 필요는 없는 것. 강의에서는 이미 전세계의 (취미) IoT 개발자들에게 그 편리함과 성능을 인정받은 BLYNK 라는 앱을 사용해서 수강자들이 시스템의 핵심을 이해할 수 있도록 해주었다. BLYNK의 UI/UX도 아주 깔끔하고, 정말 아름다운 아이디어라 생각되어 만든 사람들이 어떤 사람들인지 좀 찾아보고 싶었는데, 구글링하니 패션 관련된 스타트업 BLYNK 얘기만 나와서 결국 포기하였다.

BLYNK 앱에서 새로운 프로젝트를 만들면, 앱이 토큰(token)을 발행해준다. 이 토큰을 통해 BLYNK 앱과, W5500-EVB 보드에 올려진 실행 코드가 서로를 식별한다. W5500-EVB 보드에 인가한 IP 주소와 MAC 주소만 알고 있다면 이론적으로 W5500-EVB에 제어명령을 날릴 수 있다. 토큰을 통해 W5500-EVB 보드가 무분별한 제어명령을 무시하고, 미리 약속된 토큰값을 포함하고 있는 제어명령만 받아들인다.

토큰값이 복잡하니, 아래 E-mail 버튼을 눌러서 E-mail로 받아볼수도 있다. HARDWARE MODEL을 Arduino UNO로 지정해준 것은, W5500-EVB의 I/O 인터페이스가 Arduino UNO 보드의 그것과 일치하기 때문이다. 일부러 W5500-EVB를 설계할 때 대중적으로 널리 사용되는 Arduino UNO 보드의 I/O 인터페이스와 동일하게 설계한 것이다. 그 덕에 BLYNK 앱을 쓸 수 있었던것이기도 하고.

프로젝트를 생성한 뒤에는 Button을 3개 생성해서 각각 백색 LED의 R, G, B 광원의 On/Off를 지정하는 D8, D9, D10 핀과 연결한다. PUSH가 아니라 SWITCH로 변경하는것도 잊지말자. 생성을 마친 후에 프로젝트 페이지에서 우상단 ▷ 버튼을 클릭하면, W5500-EVB 보드와의 연결이 활성화된다!! 하지만 아직 우리는 W5500-EVB에 실행코드를 업로드하지 않았으니, 연결되지 못할 것이다.

지금까지의 데이터-플로우를 아래와 같이 간략히 정리해보았다.

이제 남은 것은 W5500-EVB 보드에 펌웨어(Firmware)를 업로드 하는 것이다. 업로드 할 펌웨어의 코드를 작성하고, 바이너리 코드로 컴파일하고, 보드에 업로드하고, 업로드한 펌웨어의 정상 동작 여부를 간단히 시리얼 모니터로 확인한 뒤, 실제로 BLYNK 앱으로 백색 LED를 제어해볼 것이다.

1) 우선 펌웨어의 코드를 작성할 개발환경을 구축한다. NXP가 만든 MCU 칩을 사용하므로, NXP가 제공하는 IDE(통합개발환경, Integrated Developement Environment)를 사용할 것이다. LPCXpresso 라는 IDE이다. 무료 버전이 제공하는 기능으로도 우리가 사용하기에 충분하다. 

2) 라이브러리를 포함한 신규 프로젝트를 생성한다. BLYNK 앱으로 백색 LED를 제어하는 신규 프로젝트를 생성한다. 프로젝트를 생성하는 과정에서, LPC11E36 칩과 W5500-EVB 보드에 대한 칩 라이브러리보드 라이브러리를 프로젝트에 import 시킬것이다. 칩 라이브러리와 보드 라이브러리는 웹 상에 공개되어있다. BLYNK 앱과 연관된 메인코드 부분은 공개되어있지 않고, 실습 당일에 파일을 주셔서 값 몇개만 바꾸고 사용하였다.

    • MAC address : 6 bytes 중에 앞 3 bytes 는 제조사인 위즈네트의 고유번호이니 변경하면 안된다. 뒷 3 bytes 를 적절히 임의적인 숫자로 변경해준다. 

    • Subnet mask : 자신의 노트북이 W5500-EVB와 같은 서브넷에 소속되어있다면, 노트북에서 cmd에서 ipconfig 명령어로 확인할 수 있다. 값을 동일하게 적어준다.

    • IP address : 마찬가지로, W5500-EVB가 LAN 케이블로 연결된 네트워크의 게이트웨이 주소와 서브넷 마스크 값을 지키면서 뒷부분을 임의로 지정한다. 위의 경우 게이트웨이 주소가 192.168.1.1이고, 서브넷 마스크가  앞 3bytes 이므로 192.168.1.xxx의 임의의 xxx로 값을 정한 것이다. 같은 서브넷에 물린 디바이스들 중에서 겹치지만 않으면 된다.

위의 BLYNK 앱 생성과정에서 획득한 토큰값을 넣어준다.

3) 머신코드로 변환하고, FlashMagic이라는 프로그램으로 W5500-EVB에 업로드한다. 우선 LPCXpresso에서 프로젝트를 컴파일해서 머신코드를 생성해낸다. 컴파일하기 전에, LPCXpresso의 빌드 세팅에서 보드 설정이 적절히 되어있는지 확인하자. 컴파일 후에 프로젝트 폴더 하위의 Debug 폴더 안에 있는 .hex 파일을 획득한다. FlashMagic이라는 프로그램으로 업로드하기 위해서는 .hex 파일이 필요하다.

4) hercules 프로그램으로 시리얼 모니터링하여 올바른 머신코드가 업로드되었는지 확인한다. hercules는 시리얼 케이블로 연결된 보드를 모니터링 할 수 있게 해주는 프로그램이다(아마 시리얼 케이블로 특정 텍스트를 baud rate에 맞춰 내뿜도록 하는 코드가 프로젝트에 포함되어있을 것이다...). 올바른 프로젝트 코드를 작성해서, 올바르게 컴파일되어, 올바르게 업로드되었다면 BLYNK 앱과 W5500-EVB 보드가 연결되었을 것이고 BLYNK 앱에서 명령을 내리지 않더라도, 주기적으로 메시지를 주고받는다. 시리얼 모니터로 그 메시지를 확인할 수 있다(당일 실습이 끝나고 보드를 반납하여 가지고 있지 않다는게 아쉽군 ㅜㅜ).

5) BLYNK 앱에서 백색 LED를 켜고 꺼본다. BLYNK 앱 프로젝트에 생성한 D8 ~ D10 버튼을 켜고 꺼보면서 LED 불빛의 색깔을 확인해본다. 잘 제어됨을 확인할 수 있을 것이다.

1) - 5) 까지의 단계들에 대해서는 위즈네트 아카데미 사이트의 아래 링크에 더 자세하게 기술되어있다. 정보의 중복을 피하기 위하여... 이 글에는 최대한 간단하게 적고, 링크를 남기는 것이 더 좋은 방향일것이라 생각된다.



일단은 여기까지 적어본다. W5500-EVB 보드를 가지고 있었다면, 더 잘 써볼 수 있었을 것 같은데 보드가 없다는 점이 아쉽다. 여윳돈이 생긴다면 차근차근 하나씩 필수적인 보드들과 쉴드들을 구매해나가보자. 다음 글에서는 이 글에서와 또한 이 글에 언급되지는 않았지만 임베디드 시스템에서 중요한 단어들과 그 의미들에 대해서 곱씹어볼까 한다.


Comments