[Raspberry Pi] ICbanQ 무상체험단 34기 Beginner Kit for Windows10 IoT 활용기
1. Windows Device Portal
Windows 10 IoT Core 에는 장치의 설정을 할 수 있는 웹서버가 있다. 접속하기 위해서는 라즈베리파이에 할당된 내부 IP Adress 를 알아야 한다. Windows IoT Core Watcher 를 통해서 알수도 있고 HDMI 모니터 연결을 통해서도 알 수 있다.
https://developer.microsoft.com/en-us/windows/iot/win10/tools/deviceportal
Windows IoT Core Watcher 는 같은 네트워크 상에 IoT 기기가 감지될 경우 정보를 표시해준다.
이 네트워크상에서는 라즈베리파이의 IPAddress 가 192.168.219.104 이다. 네트워크 환경은 사용자에 따라서 다를 수 있으므로 Watcher 에 나온 주소대로 입력한다. 라즈베리파이의 전원을 켤 때마다 주소가 달라질수도 있다. 라즈베리파이의 웹서버는 8080포트로 연결된다. 웹 브라우저의 주소창에 192.168.219.104:8080 을 입력한다. 다음 화면이 나온다.
사용자 이름, 비밀번호는 다음과 같이 입력한다.
사용자 이름: Administrator
비밀번호: p@ssw0rd (0 는 숫자 0이다.)
제대로 연결되면 다음과 같은 화면이 나온다.
App Manager 를 사용하면 Visual Studio 를 실행하지 않아도 앱이 독립적으로 실행될 수 있다. Installed apps 에서 PACKAGE FULL NAME 과 일치하는 앱을 찾아서 Set Default 한뒤 Restart 한다.
이후에는 라즈베리파이가 켜지면서 앱이 자동으로 실행된다.
그러나 이 경우 소스코드를 수정해서 다시 업로드 시키려고 하면 문제가 발생한다. 앱이 이미 실행중이기 때문이다.
Default 앱을 바꾸어주면 된다. IoTCoreDeaultApp 으로 바꾸고 Set Default 한다. 그다음 Processes 에서 해당 앱을 kill 해준다. 앱의 이름의 왼쪽에 'X' 표시를 클릭하면 된다. 그 다음 부터는 업로드가 되는것을 확인할 수 있다.
2. 새로운 앱 만들기
Visual Studio 에서 File -> New -> Project 를 선택한다. Windows -> Universal -> Blank App(Universal Windows) 를 선택한다.
Target Version 은 Build 10586 을 선택한다.
오른쪽의 Solution Explorer 에서 (Universal Windows) 라고 되어 있는 부분에 우클릭을 하고 Manage NuGet Packages 를 선택한다.
NuGet Package Manager 에서 Browse 를 클릭하고 windows remote 라고 입력하면 Windows-Remote-Arduino 가 나온다. Install 한다.
Review Changes 가 나오면 OK 를 클릭한다.
Solution Explorer 의 References 를 우클릭한다. Add Reference 를 선택한다.
Universal Windows -> Extensions -> Windows IoT Extensions for the UWP 10.0.10586.0 을 체크한다. OK 한다.
ConnectTheDots 를 프로젝트에 사용하려면 3개의 파일을 add 해야 한다.
AppSettings.cs
ConnectTheDotsHelper.cs
ConnectTheDotsSensor.cs
이 파일은 connectthedots-master\Devices\DirectlyConnectedDevices\WindowsIoTCorePi2\ConnectTheDotsIoT 에 있다.
왼쪽의 Solution Explorer 에서 (Universal Windows) 부분에 우클릭을 하고 Add -> Existing Item 을 선택하여 위의 경로에 있는 3개의 파일을 추가한다.
그리고 MainPage.xaml.cs 에 using ConnectTheDotsIoT; 를 추가해야 한다.
Solution Explorer 에서 Package.appxmanifest 를 우클릭한다. View Code 를 선택한다.
다음 코드를 찾는다.
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
이 부분을 다음과 같이 수정 후 저장한다.
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort"/>
</Device>
</DeviceCapability>
</Capabilities>
다음 코드를 추가하면 아두이노 관련 코드를 쓸 수 있다.
using Microsoft.Maker.RemoteWiring;
using Microsoft.Maker.Serial;
구체적인 코드는 사용기 2부를 참고한다.
만약 라즈베리파이를 껐다가 다시 켠다면 Visual Studio 에서 Deploy error 가 발생한다. 그 때는 Visual Studio 를 종료하고 다시 실행시킨다.
3. 하드웨어
팬 컨트롤을 위한 하드웨어 구성은 다음과 같다.
120mm DC Fan 을 온도변화에 따라서 릴레이로 제어하여 작동시킨다. 차량용 공기정화필터는 바닥의 먼지가 팬의 바람에 의해 날아가는 것을 막는 용도이다.
아두이노 쉴드에 LED, Button, Relay, LM35 모듈을 연결한다. 릴레이와 DC Fan 을 연결할때는 별도의 전원을 연결한다. 12V 전원을 연결하여 아두이노의 신호에 따라서 ON/OFF 가 되도록 하였다. Button 을 눌러서 Fan 이 작동할지 여부를 결정한다. LED 가 켜진 상태는 Fan 이 작동할 수 있는 상태이다.
4. 소프트웨어
ConnectTheDotsHelper 를 이용하면 Azure EventHub 에 쉽게 연결할 수 있다.
ConnectTheDotsHelper ctdHelper;
List<ConnectTheDotsSensor> tempsensor = new List<ConnectTheDotsSensor> {
new ConnectTheDotsSensor("2198a348-e2f9-4438-ab23-82a3930662ac", "Temperature", "F"),
};
인자로 GUID(Globally Unique Identifier) 를 넘겨주어야 하는데 DFRobot 사의 예제에 나온대로 똑같은 값을 넣어도 작동한다.
ctdHelper = new ConnectTheDotsHelper(serviceBusNamespace: "네임스페이스 값을 넣어준다.",
eventHubName: "ehdevices",
keyName: "D1",
key: "이 부분에 D1 에 해당하는 키값을 넣어준다.",
displayName: "Temperature",
organization: "ICbanQ",
location: "anywhere",
sensorList: tempsensor);
}
서비스버스의 네임스페이스와 D1 에 해당하는 디바이스의 키값을 복사하여 붙여넣기 한다. 자세한 방법은 사용기 2부를 참고한다.
ConnectTheDotsSensor tempsensor = ctdHelper.sensors.Find(item => item.guid == "2198a348-e2f9-4438-ab23-82a3930662ac");
tempsensor.value = Tem;
ctdHelper.SendSensorData(tempsensor);
ConnectTheDotsSensor 에서 형식에 맞는 데이터를 입력받은 후에 ConnectThedotsHelper 의 SendSensorData 메소드를 이용하여 EventHub 에 전송한다.
아두이노의 핀번호는 다음과 같이 지정한다.
private const int RELAY = 13;
private const int BUTTON = 8;
private const int LED = 10;
private const String LM35 = "A0";
푸시 버튼을 토글 버튼처럼 사용하기 위해서 BUTTON_State 변수를 사용하였다. 상태변화에 따라서 팬 동작여부와 LED 의 ON/OFF 를 결정한다.
if(arduino.digitalRead(BUTTON) == PinState.HIGH)
{
if(BUTTON_State == true)
{
arduino.digitalWrite(LED, PinState.HIGH);
FanON = true;
BUTTON_State = false;
}else
{
arduino.digitalWrite(LED, PinState.LOW);
FanON = false;
BUTTON_State = true;
}
}
arduino.digitalWrite(RELAY, PinState.LOW);
if ((Tem > 30) && (FanON))
{
arduino.digitalWrite(RELAY, PinState.HIGH);
}
}
소스코드를 첨부한다. 서비스네임스페이스와 디바이스 키값은 각자 설정한 대로 입력해야 한다.
완성된 작품이 동작하는 동영상은 다음과 같다.
제작 후기:
Windows 10 , Visual Studio 설치에 거의 절반 이상의 시간을 보내다 보니 정작 프로젝트 진행에 필요한 자료조사에는 소홀하게 되었다. 원래의 계획에서는 스마트폰을 이용하여 팬을 ON/OFF 할수 있는 기능을 추가하려고 하였으나 그 기능을 추가하기 위해서는 라즈베리파이에 웹서버 역할을 하는 앱이 실행되어야 한다는 것을 자료조사과정에서 알게 되었다. 시간 부족으로 그 기능을 구현하지 못한 것은 아쉽다. Windows 10 IoT 에 대한 자료가 많지 않다보니 단순한 기능을 구현하기 위해서 상당한 시행착오를 거쳐야 한다. 제한된 시간내에 결과물을 공개해야 하는 체험단의 특성상 미완성 상태로 공개할 수 밖에 없다는 점이 아쉽다. Azure, Windows 10 IoT 는 개발속도가 빨라서 몇달만 지나도 기존 자료가 쓸모가 없어지는 경우가 많았다. 구글 검색으로 자료조사를 할때는 1년 이내의 자료만 참고하고 그 이전 자료는 무시하는 것이 좋다. Azure 의 관리 포탈 사이트가 새롭게 생겨서 자꾸 이동하라고 유도하고 있는데, 사용기에 올린 캡쳐화면들은 아마 몇달 뒤에는 쓸모가 없어질 것이다. 센서로부터 수집된 데이터를 가공하고 어떻게 활용할 것인지 연구하는 것이 이번 체험단 활동의 남은 과제가 될 것이다. IoT 분야가 빠르게 변화하고 있어서 새로운 개발 보드 , 새로운 클라우드 서비스가 계속 나오고 있다. 저마다 고성능을 내세우면서 자기들것이 최고라고 자랑하지만 승부는 초기사용자를 얼마나 확보하느냐에 달린것 같다. 기술적인 세부사항을 얼마나 공개할 수 있는가, 사용자에 대한 지원은 어느정도인가에 따라서 초기사용자 확보에 차이가 날 것 같다.
마지막으로 필자의 실수로 체험단 진행과정에서 귀찮은 일이 발생했음에도 너그럽게 받아들여주신 아이씨뱅큐 무상체험단 관계자 분들에게 감사의 말씀을 드린다.
라즈베리파이 IoT 키트 구입처 : 아이씨뱅큐 http://www.icbanq.com/P006971505
아이씨뱅큐 100% 무상체험단 카페 : http://cafe.naver.com/icbanq
아이씨뱅큐 공식 블로그 : http://blog.naver.com/icbanq