GPS-трекер с пространственным анализом на Azure IoT Hub
Компоненты и материалы
| Arduino UNO | × | 1 шт. |
| Raspberry Pi 2 Model B | × | 1 шт. |
| Adafruit Ultimate GPS Breakout | × | 1 шт. |
| Разъём 9V на «баरल-джек» | × | 1 шт. |
| Крона 9V | × | 1 шт. |
| Фоторезистор | × | 1 шт. |
| Светодиоды (3 прозрачных, 1 красный, 1 жёлтый, 1 зелёный) | × | 6 шт. |
| Таковая кнопка 12 мм (SparkFun) | × | 2 шт. |
| Тумблер (slide switch) | × | 3 шт. |
| Резистор 10 кОм | × | 4 шт. |
| Резистор 221 Ом | × | 3 шт. |
| Половинная беспаяльная макетная плата | × | 1 шт. |
| Полноразмерная беспаяльная макетная плата | × | 1 шт. |
| Перемычки | × | 1 комплект |
| MicroSD 16 ГБ с адаптером (SanDisk) | × | 2 шт. |
Программное обеспечение и онлайн-сервисы
- Microsoft Windows 10 IoT Core
- Microsoft Azure
- Arduino IDE
- Microsoft Visual Studio 2015
- Google Earth Professional
- Quantum GIS (QGIS)
- Microsoft Windows 10 Enterprise
О проекте
Введение
Современные мобильные технологии делают ГИС-карты доступными на любом устройстве. Этот проект можно использовать как учебное занятие для детей: основы открытого железа, мобильных вычислений, геопространственных технологий и облачных вычислений.
Проект состоит из трёх частей:
- Arduino GPS-трекер — запись GPS-координат, освещённости и типа объекта. Дети могут выезжать на улицу и отмечать местоположение заранее заданных объектов (знаки, деревья, лавочки). Это даёт понимание того, как данные попадают на ГИС-карты. В сопровождении взрослых можно замерять освещённость ночью для анализа безопасности.
- ГИС-визуализация и анализ — отображение точек на карте, интерполяция освещённости для выявления недостаточно освещённых зон.
- Windows 10 IoT Core и Azure IoT Hub — загрузка и распределение данных, масштабирование до тысяч устройств.
Arduino GPS-трекер
Видеообзор устройства и демонстрация работы. Исходный код и схема на макетной плате ниже.
Фоторезистор
Аналоговый датчик яркости (0–1023). Примеры: яркое солнце ~1000, тень днём ~900, под фонарём ночью ~170.
Слот MicroSD
Пример в Arduino IDE: File → Examples → SD → Datalogger.
Adafruit Ultimate GPS
Простой в использовании GPS. Библиотеки устанавливаются по инструкции Adafruit.
Индикация качества фиксации спутников (HDOP)
HDOP (Horizontal Dilution of Precision) — мера точности по горизонтали. Чем ниже, тем точнее.
- Красный — нет фиксации
- Жёлтый — фиксация, HDOP > 1.5
- Зелёный — фиксация, HDOP ≤ 1.5
Три тумблера для кодирования типа объекта (0–7)
Левый = 2² (4), центральный = 2¹ (2), правый = 2⁰ (1). Сумма даёт код 0–7.
OFF OFF OFF = 0 = Замер освещённости
OFF OFF ON = 1 = Лавочка
OFF ON OFF = 2 = Камень
OFF ON ON = 3 = Мусорка
ON OFF OFF = 4 = Дерево
ON OFF ON = 5 = Телефонная будка
ON ON OFF = 6 = Фонарный столб
ON ON ON = 7 = Водопроводная колонка
Кнопка
Каждое нажатие дописывает в datalog.csv на MicroSD строку CSV:
ШИРОТА,ДОЛГОТА,ЗНАЧЕНИЕ_СВЕТА,ТИП_ОБЪЕКТА
Пример:
40.77221,-73.97392,105,5
40.77139,-73.97394,60,1
40.77051,-73.97460,150,6
Почему нет LCD-дисплея?
- Код GPS + SD + LCD компилировался, но SD становился нестабильным. Удаление LCD стабилизировало работу. На Arduino MEGA ресурсов хватило бы на всё.
- Крона 9V быстро садится при питании LCD. Не критично — убрали.
ГИС-визуализация и анализ
Визуализация точек в Google Earth Pro
Извлеките MicroSD, вставьте в ПК с Google Earth Pro. Откройте CSV в текстовом редакторе, добавьте заголовок:
LATITUDE,LONGITUDE,LIGHT_VALUE,FEATURE_TYPE
File → Import → выберите CSV → настройте стили иконок для типов объектов. Обычный Google Earth не умеет импортировать CSV.
Пространственный анализ в QGIS
QGIS — бесплатный открытый ГИС. Установка и туториалы на qgis.org.
- Загрузите границы территории, тропы и прочие базовые слои.
- Загрузите CSV-точки, настройте символику по значению освещённости (синий — светло, красный — темно).
- Выполните интерполяцию точечных данных для оценки освещённости между замерными точками.
- Соберите дополнительные замеры и загрузите в QGIS.
- Повторите интерполяцию на расширенном наборе — карта станет детальнее.
Windows 10 IoT Core и Azure IoT Hub
Масштабирование
Arduino-трекер прост и дешев. Устройств может быть тысячи. Управление данными от них — задача для Azure IoT Hub на базе Windows 10 IoT Core.
Сначала пройдите базовые примеры
Рекомендуется пройти «Getting Started with Azure IoT Hub for .NET» — создание учётной записи, настройка хаба, отправка/приём сообщений. Скачайте Azure IoT Hub Device Explorer для администрирования устройств.
Windows 10 IoT Core на Raspberry Pi 2
На ПК с Windows 10 скачайте образ IoT Core для RPi2, прошейте MicroSD через Windows IoT Image Helper. Вставьте карту в RPi2, подключите Ethernet, дождитесь появления в Windows IoT Core Watcher.
Подключите кнопку к GPIO (схема в конце). Исходный код ниже.
UWP-приложение для отправки данных в IoT Hub
Visual Studio 2015 → New Project → Blank App (Universal Windows). Название: IoTHubClientSendEvent. NuGet: Microsoft.Azure.Devices.Client, Newtonsoft.Json. Добавить ссылку на Windows IoT Extensions for UWP (доступ к GPIO).
В MainPage.xaml.cs:
using Windows.Devices.Gpio;
using Newtonsoft.Json;
using Microsoft.Azure.Devices.Client;
using System.Text;
private const int buttonPin = 6;
private GpioPin buttonGPIO;
static DeviceClient deviceClient;
static string deviceId = "MakerChallengeDevice2";
static string uploadFile = "data.csv";
class evData {
public string id { get; set; }
public string data { get; set; }
}
// В конструкторе MainPage:
deviceClient = DeviceClient.CreateFromConnectionString("DEVICE_CONNECTION_STRING", TransportType.Http1);
initGPIO();
private void initGPIO() {
var gpio = GpioController.GetDefault();
buttonGPIO = gpio.OpenPin(buttonPin);
if (buttonGPIO.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
buttonGPIO.SetDriveMode(GpioPinDriveMode.InputPullUp);
else
buttonGPIO.SetDriveMode(GpioPinDriveMode.Input);
buttonGPIO.DebounceTimeout = TimeSpan.FromMilliseconds(50);
buttonGPIO.ValueChanged += buttonPin_ValueChanged;
}
private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) {
if (e.Edge == GpioPinEdge.FallingEdge) {
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 → Remote Machine. Выберите RPi2 в списке устройств.
Совет: в свойствах проекта → Package Manifest → Packaging → измените Package Name на понятное (например, IoTHubClientSendEvent), иначе в веб-интерфейсе IoT Core сложно найти приложение.
Build → Deploy Solution. В IoT Core Watcher → правый клик → Web Browser Here → логин Administrator → Apps → выберите приложение → Start.
UWP-приложение для приёма сообщений из IoT Hub
Visual Studio 2015 → New Project → C# Console App. Название: IoTEventHubReceiver. NuGet: WindowsAzure.ServiceBus, Newtonsoft.Json.
using System.IO;
using System.Threading;
using Newtonsoft.Json;
using Microsoft.ServiceBus.Messaging;
class evData {
public string id { get; set; }
public string data { get; set; }
}
static string connectionString = "IOT_HUB_CONNECTION_STRING";
static string iotHubD2cEndpoint = "messages/events";
static EventHubClient eventHubClient;
static void Main() {
eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
SynchMessages();
}
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(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 для сохраняемых файлов.
Запуск и тест
Запустите IoTEventHubReceiver на рабочей станции. Нажмите кнопку на RPi2 — отправится сообщение «Just checking in!». Консоль покажет:
Message received from MakerChallengeDevice2. Just checking in!
Максимальный размер сообщения — 256 КБ. Файл data.csv кладётся в папку приложения на RPi2 через сетевую шару (Windows IoT Core Watcher → Open Network Share → c$\Data\Users\DefaultAccount\AppxLayouts\). При нажатии кнопки в консоли появится содержимое CSV.
Резюме
Проект демонстрирует: создание простого GPS-трекера, анализ собранных данных, облачное управление информацией. Точки расширения:
- Другие типы датчиков на Arduino-трекере.
- Прямая загрузка в Azure через WiFi/Bluetooth/Cellular.
- Другие виды пространственного анализа.
- Веб-карта для отображения сырых или обработанных данных.
- EventProcessors в Azure Stream Analytics для реакции на данные в реальном времени.
Код
- Arduino GPS Datalogger: GitHub
- Azure IoT Hub Example (UWP): GitHub
- Azure IoT Device Explorer: GitHub
- Windows 10 IoT Core Samples: GitHub
Схемы
Производственный процесс
- Avnet Silica демонстрирует передовую ИИ, IoT и решения связности на Embedded World 2019
- Точный мониторинг температуры и влажности с SHT15 на Windows 10 IoT Core
- Логгер температуры и влажности на Arduino с DHT11 и Ethernet Shield
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Празднуем со светом и звуком: DIY-проект «С днём рождения» на Arduino
- Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
- Управление телевизором через Alexa и Arduino IoT Cloud — пошаговое руководство
- DIY Guitar Speed Pick & Stomp Pedal — моторизированный медиатор на Arduino
- Система управления бассейном на Azure IoT: умные датчики и удаленный мониторинг
- Освоение проектирования печатных плат для Интернета вещей: Полное руководство