현재 모바일 기술은 매우 발전해 거의 모든 기기에서 GIS 정보 지도를 쉽게 사용할 수 있습니다. 이 프로젝트는 어린이들에게 오픈 소스 하드웨어, 모바일 컴퓨팅, 지리공간 기술, 클라우드 컴퓨팅 기초를 가르치는 교실 활동으로 활용할 수 있습니다.
이 프로젝트는 3가지 파트로 구성됩니다:
1) Arduino GPS 데이터로거
어린이들도 도움을 받아 GPS 위치 정보, 조도 측정, 위치 대상 유형을 기록하는 장치를 만들 수 있습니다. 실외에서 표지판, 나무, 공원 벤치 등 정해진 대상의 위치를 표시하며 주변 세계와 GIS 지도에 표시되는 데이터에 대한 이해도를 높일 수 있습니다. 야간 공공장소의 낮은 조도는 안전 문제이므로, 성인 동반 하에 야간 조도 측정을 수집해 분석할 수 있습니다.
2) GIS 시각화 및 분석
현장에서 수집한 위치를 지도에 시각화합니다. 공간 포인트 보간 분석으로 영역별 조도 수준을 추정하고 지도에 표시합니다.
3) Windows 10 IoT Core와 Azure IoT Hub 활용
GIS 시각화 및 분석 후, Windows 10 IoT Core와 Azure IoT Hub로 데이터를 업로드하고 배포합니다. 이를 통해 수천 개의 데이터 수집기와 현장 장치를 쉽게 확장 관리할 수 있습니다.
Arduino GPS 데이터로거
다음 영상은 Arduino Uno GPS 데이터로거 장치 개요와 빠른 시연을 보여줍니다. 소스 코드와 브레드보드 다이어그램은 아래에서 확인할 수 있습니다.
주요 부품 정보:
포토레지스터
밝기를 측정하는 아날로그 센서로 사용이 매우 쉽습니다. 아날로그 판독값은 0~1023이나 대부분 200 미만이며, 매우 밝은 빛에서만 높습니다. 장치 제작 시 조도 테스트로 예상값을 파악하세요. 예: 밝은 햇빛 약 1000, 주간 야외 그늘 약 900, 야간 가로등 바로 아래 약 170.
마이크로 SD 슬롯
Arduino IDE의 파일 > 예제 > SD > Datalogger에서 좋은 예제를 찾을 수 있습니다.
Adafruit Ultimate GPS
사용하기 쉬운 GPS입니다. 여기서 예제를 따라 Arduino IDE에 GPS 라이브러리를 설치하세요.
위성 고정 상태 LED
수평 정밀도 저하(HDOP)는 GPS에서 오는 X,Y 위치 정확도 측정값입니다. HDOP 값이 낮을수록 위치 정확도가 높습니다. GPS가 고정되면 위도/경도와 함께 HDOP 값을 반환합니다.
빨강 - 위성 고정 안 됨
노랑 - 위성 고정, HDOP > 1.5
초록 - 위성 고정, HDOP ≤ 1.5
이진 기능 유형 슬라이드 스위치
3개 슬라이드 스위치로 10진수 0~7을 이진 표현합니다. 왼쪽 스위치는 2²(4), 가운데는 2¹(2), 오른쪽은 2⁰(1)을 나타냅니다. 스위치 상태에 따른 값의 합으로 0~7 기준 10진수 값을 얻어 수집 대상 유형을 나타냅니다.
예시:
OFF OFF OFF = 0 0 0 = 0 = 조도 센서 판독
OFF OFF ON = 0 0 1 = 1 = 공원 벤치
OFF ON OFF = 0 1 0 = 2 = 바위
OFF ON ON = 0 1 1 = 3 = 쓰레기통
ON OFF OFF = 1 0 0 = 4 = 나무
ON OFF ON = 1 0 1 = 5 = 공중전화
ON ON OFF = 1 1 0 = 6 = 가로등
ON ON ON = 1 1 1 = 7 = 음수대
버튼
버튼을 누를 때마다 CSV 형식의 데이터 한 줄이 마이크로SD 카드의 datalog.csv에 추가됩니다.
GPS, 마이크로SD, 1602 LCD 코드가 컴파일되고 Arduino Uno에 배포되지만 마이크로SD 슬롯이 불안정했습니다. LCD를 제거하니 안정화되어 사용자 알림용으로 LED를 추가했습니다. MEGA 등 리소스가 더 많은 Arduino라면 GPS, 마이크로SD, 1602 LCD 동시 사용이 가능할 것입니다.
9V 배터리가 편리하지만 1602 LCD 구동 시 배터리 수명이 짧습니다. 필수 구성 요소가 아니므로 제외했습니다.
GIS 시각화 및 분석
GPS 포인트 시각화
CSV 형식의 GIS 데이터는 지도에서 보기 전까진 유용하지 않습니다. Arduino GPS 데이터로거에서 마이크로SD 카드를 꺼내 Google Earth Professional이 설치된 Windows 10 컴퓨터에 꽂으세요. 텍스트 파일을 복사해 텍스트 에디터로 열고 맨 위에 다음 열 제목을 추가한 후 .CSV로 저장하세요.
위도,경도,조도값,기능유형
Google Earth Professional에서 파일 > 가져오기로 .CSV 파일을 가져옵니다. 옵션을 거쳐 기능 유형별 다른 아이콘 스타일을 만들고 포인트 위치를 표시합니다. Google Earth Professional 버전이어야 합니다. 일반 버전은 .CSV 가져오기 기능이 없습니다.
Quantum GIS (QGIS)로 공간 분석
QGIS는 인기 있는 무료 오픈소스 GIS로, 설치 프로그램과 튜토리얼은 여기에서 확인하세요. QGIS로 GPS 위치의 조도 센서 속성에 공간 분석을 수행해 공원 등 공공장소의 야간 조도 충분/부족 영역을 파악할 수 있습니다.
1단계 - 평가 대상 지역의 경계, 산책로 등 관련 정보를 로드합니다.
2단계 - GPS 데이터로거의 .CSV 파일에서 포인트를 QGIS 맵에 로드합니다. 포인트 심볼로지와 라벨을 적용해 조도 값을 시각적으로 확인합니다.
포인트에 조도 센서 값이 표시되어 밝은 곳(파랑)과 어두운 곳(빨강)을 볼 수 있습니다. 하지만 알려진 위치 사이의 더 넓은 영역 분석에는 포인트 데이터만으로는 부족합니다.
3단계 - 포인트 데이터에 보간을 수행해 알려진 위치 주변과 사이의 값을 추정합니다. 보간은 특정 위치의 데이터가 있을 때 알려진 위치 사이의 값을 추정하는 데 사용됩니다.
보간으로 공원 내 조도 값을 더 잘 파악할 수 있습니다. 알려진 위치에 더 많은 조도 판독값을 제공하면 분석이 개선됩니다.
4단계 - 더 많은 조도 판독값을 수집해 QGIS에 로드합니다.
5단계 - 더 큰 데이터셋으로 보간을 재실행합니다.
두 번째 보간이 첫 번째와 유사한 패턴을 보이지만 추가 포인트 덕분에 더 자세합니다.
Windows 10 IoT Core와 Azure IoT Hub 사용
확장성
Arduino GPS 데이터로거는 센서 정보를 마이크로SD 카드에 기록하는 저렴하고 간단한 장치입니다. 이 장치들을 지리적으로 넓게 배포해 정보를 수집할 수 있습니다. 이들 장치에서 들어오는 정보를 관리하는 시스템을 직접 설계하려면 어려울 수 있습니다.
Windows 10 IoT Core와 Azure IoT Hub를 메시징 시스템 기반으로 사용하면 장치 수를 수천 대로 쉽게 확장할 수 있습니다.
먼저 이 예제들을 시도해보세요
진행하기 전에 Azure IoT Hub for .NET 시작하기 튜토리얼을 따라하는 것을 강력히 권장합니다. Azure 체험 계정 생성, Azure IoT Hub 설정, 메시지 송수신을 위한 핵심 샘플 개발 단계를 안내합니다.
Azure IoT Hub Device Explorer도 다운로드해 Windows 10 IoT Core 장치 관리에 활용하세요. 소스/설치파일은 여기서 다운로드하세요.
Raspberry Pi 2에서 Windows 10 IoT Core
Windows 10 개발 머신에서 Raspberry Pi 2용 Windows 10 IoT Core를 다운로드하고 Windows IoT Image Helper로 마이크로SD 카드에 플래싱하세요.
마이크로SD 카드를 Raspberry Pi 2에 장착하고 이더넷 연결 후 부팅 시 Windows IoT Core Watcher에 나타나는지 확인하세요.
아래 그림과 같이 브레드보드에 버튼을 연결하세요. 하단의 회로도 참조. 소스 코드 링크도 하단에 있습니다.
데이터 업로드용 유니버설 Windows 애플리케이션
Windows 10 컴퓨터에서 Visual Studio 2015를 시작하고 파일 > 새로 만들기 > 프로젝트. 유니버설 Windows 애플리케이션용 빈 앱 템플릿 선택. 프로젝트 이름을 IoTHubClientSendEvent로 지정. NuGet으로 Microsoft.Azure.Devices.Client와 Newtonsoft.Json 추가. Windows IoT Extensions for the UWP 참조 추가로 Raspberry Pi 2의 GPIO 접근 권한 획득.
준비되면 MainPage.xaml.cs 상단에 다음 using 문 추가:
using Windows.Devices.Gpio;
using Newtonsoft.Json;
using Microsoft.Azure.Devices.Client;
using System.Text;
MainPage 클래스에 다음 변수와 상수 추가. deviceId 값은 Azure IoT Hub Device Explorer에서 구성한 장치 이름이어야 합니다.
Azure IoT Hub로 메시지 전송하는 sendMessageToIOTHub() 함수 추가:
private static async void sendMessageToIOTHub() {
string myString;
var msg = new evData();
if (File.Exists(uploadFile)) {
myString = System.IO.File.ReadAllText(uploadFile);
} else {
myString = "Just checking in!!";
}
msg.id = deviceId;
msg.data = myString;
var messageString = JsonConvert.SerializeObject(msg);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
await deviceClient.SendEventAsync(message);
}
기본 Debug x86으로 컴파일해 작동 확인. 다음, Release ARM으로 타겟 변경하고 원격 머신 선택.
네트워크에 Windows 10 IoT Core 장치가 있으면 Visual Studio 2015가 감지해 배포 타겟으로 설정 가능.
빠른 팁:
Windows IoT Core에 배포하기 전 프로젝트 우클릭 > 속성. 응용 프로그램 패널에서 패키지 매니페스트 버튼 클릭. 패키징 탭에서 패키지 이름을 지정(예: IoTHubClientSendEvent). 안 하면 Windows 10 IoT Core 웹 인터페이스에서 앱 식별이 어렵습니다.
빌드 > 솔루션 배포 선택. 배포 완료 후 Windows IoT Core Watcher에서 장치 찾기. 우클릭 > 웹브라우저 여기. 로컬 관리자 계정으로 로그인 후 왼쪽 Apps 링크 클릭. 설치된 앱 드롭다운에서 방금 배포한 앱 선택 후 시작.
이제 IoT Hub 모니터링 애플리케이션을 개발해봅시다.
Azure IoT Hub에서 메시지 수신용 유니버설 Windows 애플리케이션
Visual Studio 2015에서 새 C# Windows 콘솔 애플리케이션 생성. 프로젝트 이름 IoTEventHubReceiver. NuGet으로 WindowsAzure.ServiceBus와 Newtonsoft.Json 추가.
Program.cs 상단에 using 문 추가:
using System.IO;
using System.Threading;
using Newtonsoft.Json;
using Microsoft.ServiceBus.Messaging;
IoTEventHubReceiver 클래스에 JSON 역직렬화용 클래스 추가:
class evData {
public string id { get; set; }
public string data { get; set; }
}
Azure IoT Hub에서 메시지 수신용 변수 추가. IOT_HUB_CONNECTION_STRING 값은 Azure IoT Hub Device Manager에서 가져오세요.
마지막으로 연속 루프 설정용 SynchMessages() 함수와 메시지 수신 및 디스크 저장용 ReceiveMessages 추가:
private static async void SynchMessages() {
while (true) {
var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
foreach (string partition in d2cPartitions) {
ReceiveMessagesFromDeviceAsync(partition);
}
}
}
private async static Task ReceiveMessagesFromDeviceAsync(string partition) {
var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
while (true) {
EventData eventData = await eventHubReceiver.ReceiveAsync();
if (eventData == null) continue;
string data = Encoding.UTF8.GetString(eventData.GetBytes());
evData d = JsonConvert.DeserializeObject<evData>(data);
StreamWriter writer = new StreamWriter("c:\\gps\\download\\" + d.id + "." + DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day + "." + DateTime.Now.Hour + "." + DateTime.Now.Minute + "." + DateTime.Now.Second + ".csv");
writer.Write(d.data);
writer.Close();
Console.WriteLine(string.Format("Message received from {0}.\n{1}", d.id, d.data));
}
}
개발 워크스테이션에 수신 메시지 저장용 "c:\gps\download" 폴더 생성.
Azure IoT Hub 메시지 송수신 애플리케이션 실행
IoTEventHubReceiver 프로그램을 개발 워크스테이션에서 시작하고 콘솔 화면 대기. 다음, Windows 10 IoT Core가 실행 중인 Raspberry Pi 2의 GPIO에 연결된 버튼과 IoTHubClientSendEvent 프로그램을 누르세요. 버튼을 누르면 "Just checking in!" 텍스트가 Azure IoT 이벤트 허브로 전송됩니다. 개발 머신 콘솔에 다음 메시지 표시:
Message received from MakerChallengeDevice2. Just checking in!
텍스트 파일 내용을 메시지로 전송하는 것도 가능합니다(256KB 미만 - 현재 Azure IoT Hub 최대 메시지 크기). sendMessageToIOTHub() 함수에서 파일 읽기 및 직렬화, ReceiveMessagesFromDeviceAsync() 함수에서 역직렬화 및 파일 저장 방식을 확인하세요.
현재 Windows 10 IoT Core는 코드로 절대 경로 파일 접근을 허용하지 않지만, 실행 파일과 같은 디렉토리의 파일은 참조 가능합니다. 모범 사례는 아니지만 작동합니다. 앱 폴더에 텍스트 파일 배치: Windows 10 IoT Core Watcher에서 장치 우클릭 > 네트워크 공유 열기. 로컬 관리자 계정으로 인증 후 탐색:
c$\Data\Users\DefaultAccount\AppxLayouts
배포된 애플리케이션 이름의 폴더를 찾아 텍스트 파일을 넣으세요. 이 예제에서는 파일명이 data.csv여야 하고 256KB 미만이어야 합니다. 위도, 경도, 조도 판독값, 기능 유형을 나열한 CSV 파일이 좋은 예시입니다. Raspberry Pi 2 GPIO에 연결된 버튼을 누르면 콘솔에 다음 표시:
Message received from MakerChallengeDevice2. LAT,LNG,LT,TYP
45.45926,-110.57361,45,6
45.78546,-110.02487,156,3
파일 업로드 확장 - Azure IoT Hub for .NET 시작하기 예제를 따라하면 다음 단계 섹션에서 Azure Blob Storage에 파일 업로드 예제를 찾을 수 있습니다.
요약
이 프로젝트는 간단한 Arduino GPS 데이터로거로 정보를 기록하고, 수집된 데이터를 분석하며, 클라우드로 수집 정보를 관리하는 방법을 보여줍니다. 다음과 같은 확장 포인트가 있습니다:
Arduino GPS 데이터로거에서 다양한 센서 유형 정보 기록
WiFi, Bluetooth, Cellular로 Arduino 장치에서 Azure로 직접 업로드
환경에 대한 더 나은 의사결정을 위한 다양한 유형의 공간 분석 수행
원시 또는 분석된 정보를 표시하는 매핑 웹 애플리케이션 개발
Azure Stream Analytics의 EventProcessors로 IoT Hub 수신 데이터에 실시간 대응