[Raspberry Pi] ICbanQ 무상체험단 34기 Beginner Kit for Windows10 IoT 사용기 2부
본체험제품은 No1. 전자부품 전문 쇼핑몰 아이씨뱅큐의 지원을 받아 작성한 것입니다.
1. Universal Windows Platform
마이크로소프트는 Windows10 을 발표하면서 UWP(Universal Windows Platform)이라는 개념을 소개했다. 데스크탑과, 모바일, IoT 용 앱을 모두 한번에 개발 가능하다는 것이다. 그러나 시작 버튼 없는 Windows 8 을 체험해본 사람들에게는 허황된 이야기로 들릴 수 밖에 없는 데다가 익숙한 것을 자꾸 바꾸라고 강요하는 짜증나는 일이다. 그런 거부감을 줄이기 위해서 1년간 무료 업데이트를 해주는 파격적인 지원을 해준다. 갑자기 마이크로소프트의 인심이 후해진건가 싶지만 알고보면 과거 버전에 대한 지원을 하는 대신 새로운 버전으로 갈아타게 만드는 것이 더 쉽기 때문이다. Windows 7 에서는 Windows 10 IoT 개발이 불가능한 것도 그러한 이유이다. 과거에는 호환성을 유지하기 위해서 신기술을 과거 버전에도 도입하는 경우가 있었지만 이제는 호환성 포기하고 다 갈아 엎어버리는 전략을 쓰고 있다. 모바일 공략을 위해서 일단 저지르고 보는 것 같다. 익숙하지 않는 UI 를 몇일 체험해 보고 나니 그다지 나쁘지 않다는 느낌을 받았다. 모바일 , IoT 에서도 그대로 느낄 수 있다고 생각하니 윈도폰에도 관심이 가고 라즈베리파이에 터치 스크린을 연결해서 Windows 10 IoT 앱을 실행시켜보고 싶기도 하다. 사람들이 '적응'하도록 만드는 것이 목적이었다면 마이크로소프트의 전략은 성공한 것이고 스크린이 달린 모든 기계에 Windows 를 사용하게 만들겠다는 마이크로소프트의 야망이 실현될 것이다.
2. Windows Remote Arduino
IoT 개발을 위해서 ESP8266 같은 저가형 모듈을 사용할수도 있지만 데이터를 수집하고 사용자와 대화 하면서 주변 장치의 허브 역할을 하기 위해서는 라즈베리파이 정도의 성능이 필요하다. 마이크로소프트에서 여기에 주목한 것 같다. 라즈베리파이에 Windows 10 IoT Core 를 내장하고 터치스크린을 달아서 주변 장치로부터 센서 데이터를 수집하고 사용자와 대화하면서 데이터를 가공하여 적절한 처리를 하는 것 그 중심에 Windows 를 넣고 싶은 것이다. 그럼 Windows 를 사용하여 개발하는 것과 아두이노의 스케치를 사용하여 개발하는 것에는 어떤 차이가 있는가. 스케치를 사용하여 아두이노에 프로그래밍하면 독립적으로 실행된다. 하지만 Firmata 가 내장된 아두이노는 외부에서 제어한다. DFRobot 사의 키트에서는 라즈베리파이에서 실행되는 유니버설 앱에서 아두이노를 제어한다. 이것을 구현하기 위해서 마이크로소프트에서는 라이브러리를 제공한다. 다음 웹사이트에 소스코드가 있다.
https://github.com/ms-iot/remote-wiring
개발 개념도는 다음과 같다. PC 에는 Windows 10 이 설치되어 있고 Raspberry Pi 에는 Windows 10 IoT Core , Arduino 에는 Firmata 가 설치되어 있다. PC 와 Raspberry Pi 사이에는 Ethernet 으로 연결되어 Raspberry Pi 에 유니버설 앱을 업로드한다. Raspberry Pi 와 Arduino 사이에는 USB Serial 로 연결되어 신호를 주고 받는다.
Windows Remote Arduino 는 3계층으로 되어 있다.
- Remote Wiring (interface)
- Firmata (protocol)
- Serial (transport)
Remote Wiring 이 요청을 하면 Firmata 가 번역을 해서 Serial 로 보낸다. 번역이라고 해서 어떤 기능이 추가된 것은 아니고 단순히 타입을 바꾸어주는 정도인듯 하다.
핵심적인 method 는 RemoteDevice, UsbSerial 이다. RemoteDevice 를 통해서 Arduino 와 통신할 수 있고, 통신방법은 UsbSerial , BluetoothSerial 을 선택할 수 있다.
DFRobot 사의 예제 https://github.com/DFRobot/WindowsIoT/wiki/Get-Started 를 통해서 어떤 방식으로 앱이 동작하는지 알아본다.
using Microsoft.Maker.Serial;
using Microsoft.Maker.RemoteWiring;
Serial, RemoteWiring 관련 메소드를 사용하기 위해 필요하다.
private PinState ledState; //Pin state of the LED
private const int LED_PIN = 13; //Pin number of the on board LED
private DispatcherTimer blinkTimer; //Timer for the LED to blink every one second
RemoteDevice arduino; //Handle the arduino
UsbSerial usb; //Handle the USB connction
PinState 는 HIGH, LOW 의 값을 갖는다. RemoteDevice 는 Arduino 를 직접 제어하기 위한 개체이다. PinMode, digitalWrite, analogRead 등의 익숙한 명령어를 사용할 수 있게 해준다. UsbSerial 은 케이블로 시리얼 연결하기 위한 방법을 제공한다. RemoteDevice 를 USB 로 연결할 것인지 Bluetooth 로 연결할 것인지 정할 수 있다.
arduino = new RemoteDevice(usb);
arduino.DeviceReady += onDeviceReady;
UsbSerial 개체를 만들기 위해서 Arduino ExpansionShield 의 VID, PID 를 입력한다. DFRobot 사에서 정한대로 VID_2341, PID_8036 을 쓰면 된다. RemoteDevice 개체를 만들 때 UsbSerial 을 통해 통신하겠다는 뜻이다. 아두이노가 준비가 되었을 때 실행할 콜백함수를 연결해준다. 57600bps 로 연결하고 데이터 8비트 패리티는 없고 스타트스탑비트는 1비트로 연결한다.
연결이 되면 onDeviceReady 함수가 호출된다. 이 예제에서는 onDeviceReady -> setup -> blink 순서로 호출된다. setup 은 스케치의 setup 과 같고, loop 에 해당하는 함수는 blink 이다.
var action = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() =>
{
setup();
}));
RunAsync 는 결과를 비동기로 받는다는 뜻이다. setup() 에서는 아두이노가 실행해야 되는 명령이 있다. 즉, 아두이노가 작업을 실행하고 있는 동안 라즈베리파이는 다른 일을 할 수 있다.
blinkTimer = new DispatcherTimer();
blinkTimer.Interval = TimeSpan.FromMilliseconds(100);
blinkTimer.Tick += blink;
blinkTimer.Start();
스케치에서는 loop() 문을 통해서 자동으로 반복할 명령을 나열하면 되지만 C#에는 그런 것이 없으므로 timer 를 사용하여 흉내를 내준다. 100밀리초마다 blink 함수를 실행한다는 뜻이다.
3. Microsoft Azure
Azure 는 Microsoft 사에서 개발한 cloud service 이다. 센서데이터를 수집하고 분석하는 용도로 microsoft 사에서 오픈소스로 개발한 connectthedots 를 통해서 이용할 수 있다. 기본적인 개념은 아두이노로부터 데이터를 수집하여 라즈베리파이로 인터넷과 연결하고 데이터를 Azure 에 전송하는 것이다. 자세한 개념은 다음링크를 참조한다.
https://github.com/Azure/connectthedots/blob/master/GettingStarted.md
Azure 를 이용하려면 계정이 있어야 하는데 시험용으로 무료로 사용할 수 있다.
https://azure.microsoft.com/ko-kr/pricing/details/app-service/
마이크로소프트 계정이 필요하므로 일단 가입한다. 스토어에서 앱을 다운로드받으려면 어짜피 있어야 하므로 구글 계정 만들듯이 계정을 만든다. 신용카드 결제정보를 입력하기 위해서는 activex 문제 때문에 internet explorer 를 사용해야 한다.
회사전화에는 자신의 핸드폰 번호를 입력하면 된다. 핸드폰 번호는 010-1234-5678 이라면 1012345678 로 입력한다. 잠시뒤에는 홍콩에서 문자가 날아온다. 확인코드를 입력하고 '코드 확인'을 클릭한다.
무료이용이지만 나중에 유료로 전환하기 위해서는 지불 정보가 필요하다. 한달 체험을 위해서 공인인증서까지 필요하다.
크레딧을 미리주고 다 사용하면 유료로 전환할 수 있는 모양이다.
이제 Azure 를 셋팅해야 한다. 다음에서 Download ZIP 을 클릭한다. connectthedots-master.zip 압축을 해제한다.
https://github.com/Azure/connectthedots
connectthedots-master\connectthedots-master\Azure\AzurePrep\AzurePrep.sln 을 연다.
Visual Studio 2015 에서는 경고 메세지가 몇개뜨지만 OK 를 클릭한다.
Build -> Build Solution 을 클릭한다. (connectthedots 에서는 Release 로 Build 하라고 되어 있다.)
다음 경로에 있는 AzurePrep.exe 를 실행한다.
connectthedots-master\connectthedots-master\Azure\AzurePrep\AzurePrep\bin\Release\AzurePrep.exe
다음 화면에서 Microsoft 계정을 입력한다.
개인자격으로 계정을 만들었다면 개인계정으로 로그인하면 된다.
커맨드 프롬프트 창에서 1번을 선택한다.
Waiting for authentication result...
Retrieving a list of subscriptions...
List of available subscriptions:
1: 무료 체험
Please select subscription number:
1
Are you sure you want to use 무료 체험 subscription?(y)
y
Requesting access to subscription...
권한부여 화면에서 '동의함'을 클릭한다.
적당한 Service Bus Namespace 를 지어준다.
Enter a name for Service Bus Namespace (only letters and digits, less than 17 chars long).
(Note that fully qualified path may also be subject to further length restrictions.)
Service 지역을 선택한다. 한국과 가까운 지역은 일본이니까 Japan West 정도면 적당할 것 같다.
Retrieving a list of Locations...
Available locations:
1: Central US
2: East US (creating new Resource Group is not supported)
3: East US 2
4: North Central US
5: South Central US
6: West US
7: North Europe
8: West Europe
9: East Asia
10: Southeast Asia
11: Brazil South
12: Japan East
13: Japan West
14: Canada Central
15: Canada East
Please select Location from list:
이후로 나오는 모든 요구에 모두 'y' 로 답하면 된다.
바탕화면에 확장자가 log 인 파일이 하나 생성된다.
connectthedots-master\connectthedots-master\Azure\AzurePrep\CreateWebConfig\bin\Release\CreateWebConfig.exe 를 실행한다.
다시 로그인한다.
이전에 생성했던 namespace 와 service location 을 선택한다.
Waiting for authentication result...
Retrieving a list of subscriptions...
List of available subscriptions:
1: 무료 체험
Please select subscription number:
1
Are you sure you want to use 무료 체험 subscription?(y)
y
Requesting access to subscription...
Retrieving a list of created namespaces...
Created namespaces:
1: HomeAuto-ns (Japan West)
2: dfexample-ns (Japan West)
0: Exit without processing
Please select namespace you want to use:
2
Are you sure you want to select dfexample-ns namespace?(y)
y
Retrieving namespace metadata...
Started processing...
Opening and updating D:\connectthedots-master\Azure\AzurePrep\CreateWebConfig\bin\Release\web.PublishTemplate.config
Writing updates to C:\Users\slowcall\Desktop\web.config
Web config saved to C:\Users\slowcall\Desktop\web.config
Please hit enter to close.
namespace 가 두 개 생겼는데 1번은 만들고 나서 알 수 없는 이유로 storage 가 만들어지지 않아서 다시 namespace 를 만들었다. 서비스가 복잡해서 여러번 시도해야 한다. 선택한 namespace 는 나중에 센서연결에 필요하므로 기억해 둔다. 모든 작업이 끝나면 바탕화면에 web.config 파일이 생성된다. 이 파일을 다음 경로에 복사한다.
connectthedots-master\Azure\WebSite\ConnectTheDotsWebSite
이정보는 나중에 센서데이터를 확인하기 위한 웹사이트를 만드는데 필요하다.
AzurePrep 에서 자동으로 D1, D2, D3, D4, WebSite, StremingAnalytics 의 device 를 만든다. 각각 key 를 가지고 있다. 이 key 를 복사해서 예제에 넣으면 이제부터는 센서로부터 받은 데이터를 클라우드에 전송하게 된다.
이제는 웹브라우저로 센서데이터를 확인할 수 있는 웹사이트를 만들 차례다.
connectthedots-master\Azure\WebSite\ConnectTheDotsWebSite.sln 을 Visual Studio 에 로드한다.
메뉴에서 Build -> Build Solution 를 클릭해서 빌드를 해준뒤에 publish 를 해준다.
Microsoft Azure Web Apps 를 선택한다.
New 를 클릭한다. Existing Web Apps 는 이미 한번 만들어진 것이다. 처음 만들때는 표시되지 않는다.
Web App name , App Service plan 의 이름만 적당한 것으로 정하고 나머지는 화면에 표시된 대로 한다.
App Service plan: Create new App Service plan
Resource group: Default-ServiceBus-JapanWest
Region: Japan West
Database server: No database
https://manage.windowsazure.com 에서 웹앱을 선택한다. 방금 정했던 App name 을 선택한다. 구성을 선택한다.
WEBSOCKET 설정후 저장한다.
일단 웹사이트 설정은 모두 끝나고 이제부터는 앱을 만들어야 한다. DFRobot 사의 waterplant 예제를 통해서 어떤 원리로 IoT 구현할 것인지 체험해 본다.
4. DFRobot 예제 waterplant
다음 웹사이트에 나온대로 따라해본다.
https://github.com/DFRobot/WindowsIoT/wiki/Water-plant-system-by-IoT
https://github.com/DFRobot/Waterplantsystem/ 에서 Download ZIP 을 클릭한다. Waterplantsystem-master.zip 을 다운로드 받은후 압축해제한다.
Visaul Studio 에서 Waterplantsystem.sln 을 Open 한다.
오른쪽의 Solution Explorer 에 문제가 발생한 것을 알 수 있다. 필요한 라이브러리가 없기 때문이다. Microsoft.Maker.Firmata , Microsoft.Maker.Serial , Microsoft.Maker.Remotewiring 을 Remove 한다. 우클릭하면 나온다.
Waterplantsystem (Universal Windows) 를 우클릭한다. Manage NuGet Packages 를 선택한다. Browse 에서 windows remote 를 검색하면 다음과 같은 화면이 나온다. install 한다.
다음은 센서와 클라우드를 연결해야 한다. MainPage.xaml -> MainPage.xaml.cs 를 클릭하여 소스를 수정한다.
ctdHelper1 에 serviceBusNamespace 가 있고 "****" 표시가 되어 있다. 이것은 각자 설정한 클라우드 서비스버스의 네임스페이스를 넣으라는 뜻이다. 애저 클라우드 설정할때 dfexample-ns 로 했으므로 그걸 넣는다. (애저 클라우드 서비스 설정시에 아무거나 마음에 드는 걸로 하면 된다.)
그 다음 키를 입력해야 한다.
https://manage.windowsazure.com 에서 서비스버스를 선택하고 설정했던 네임스페이스를 선택한다. '이벤트허브 -> ehdevices -> 구성' 을 선택한다.
'기본 키' 라고 되어 있는 부분 오른쪽에 있는 작은 버튼을 누르면 키가 복사된다. 해당 키를 소스코드의 key 에 넣는다. 예제에서는 센서가 3개이므로 D1, D2, D3 모두 넣어본다. 한개만 넣어도 상관없다.
Remote Machine 설정을 해주고 (minwinpc 를 찾는다.) Remote Machine 버튼을 누른다. 애저 클라우드 설정시에 Web App name 으로 웹사이트 만들어저 있다. 예를 들어 homeautoweb 으로 정했다면 homeautoweb.azurewebsite.net 으로 접속하면 다음 화면이 나온다.
하드웨어 셋팅은 다음과 같이 한다.
디지털 포트
8번 : 부저
9번 : 디지털 푸시 버튼
10번 : 릴레이
11번 : Green LED
12번 : Blue LED
13번 : Red LED
아날로그 포트
A0 : 로테이션 센서
A1 : LM35 온도 센서
A2 : 토양 습도 센서
A3 : 주변광 센서
모든 모듈을 세팅하고 실제로 작동시켜 보면 다음과 같은 결과가 나온다.
워터펌프 대신 DC Fan 을 연결하였다. 화분 대신 컵에 물을 담아서 센서의 작동을 확인하였다. 릴레이에는 별도의 12V 전원을 연결하였다. 릴레이 모듈에는 NO , NC 가 있는데 각각 Normally Open, Normally Closed 라는 뜻이다. http://www.dfrobot.com/index.php?route=product/product&product_id=64#.V0ExAJGLQ2w
센서가 작동할 때만 릴레이로 회로를 연결하고 싶다면 NO 와 Com 단자에 선을 연결해야 한다. 아두이노가 공급할 수 있는 전원에는 한계가 있으므로 별도의 전원을 공급한다.
장치가 독립적으로 실행되도록 하려면 앱을 Startup 으로 설정해야 한다. 웹 인터페이스로 연결해야 하는데 자세한 것은 활용기에서 설명한다.
작동하는 동영상은 다음과 같다.
Windows 10 IoT 를 이용한 Home Automation 예제는 다음을 참고하면 좋다.
https://microsoft.hackster.io/en-US
주의사항: 2A 의 전류가 흐를 수 있는 충분히 믿을만한 micro 5핀 케이블로 전원을 연결해야 부팅이 된다. 혹시라도 부팅이 되지 않는다면 너무 싼 전원 케이블을 사용하고 있지 않은지 확인해 본다.
라즈베리파이 IoT 키트 구입처 : 아이씨뱅큐 http://www.icbanq.com/P006971505
아이씨뱅큐 100% 무상체험단 카페 : http://cafe.naver.com/icbanq
아이씨뱅큐 공식 블로그 : http://blog.naver.com/icbanq