Статьи

Запуск Windows 10 IoT Core на Raspberry Pi 2

Это была неделя, когда Windows 10 была официально выпущена во всем мире, и был один аспект Windows 10, которым я был особенно заинтригован — мир Интернета вещей (IoT). Windows 10 имеет уменьшенную версию под названием «Windows 10 IoT Core», ориентированную на IoT. Это ни в коем случае не полная версия Windows 10, она ориентирована на питание встроенных систем. У меня было сильное желание протестировать эту ОС и посмотреть, на что это будет похоже, поэтому я достал свой Raspberry Pi и установил его!

Если вы разработчик, который хочет участвовать в IoT, и вы привыкли к экосистеме разработки Microsoft (C ++ или C #, Visual Studio, Win32 Console, Azure … и т. Д.), То Windows 10 IoT Core — это именно то, что вам нужно. за. Если вы разработчик, который, как и я, использует Unix-системы, JavaScript, Node и Arduino-стиль в стиле «Wiring», это будет своего рода кривой обучения.

Приближение всего этого опыта от сторонних разработок сделало это проблемой, но также и довольно интересным опытом. Было приятно попробовать альтернативный метод разработки для IoT. При прохождении всего процесса было много документации о том, как установить Windows 10 на Raspberry Pi и начать работу, но различные ссылки и ошибки иногда приводили меня в заблуждение. Короче говоря — это было грязно и запутанно для нового парня. Определенно заняло намного больше времени, чем я ожидал. В надежде, что моя собственная борьба не будет напрасной, я описал ниже, как я установил Windows 10 IoT Core на Raspberry Pi и различные проблемы, с которыми я столкнулся. Возможно, такой же разработчик, как и я, будет в той же лодке, который наткнется на эту статью и получит час или два, которые в противном случае были бы потрачены в замешательстве!

В конце концов, мы заставим нашу Raspberry Pi танцевать безумно! Ну … так буйно, как два сервомотора с прикрепленными к нему очистителями для труб могут танцевать.

Что вам нужно

Чтобы получить базовую настройку Windows 10 IoT Core вместе с нашей демонстрацией работающего сервомотора, вам потребуется следующее:

  • В частности, Raspberry Pi 2 — моим был Raspberry Pi 2 Model B. После этой статьи мне сказали, что этот процесс не будет работать для оригинального Raspberry Pi.
  • Источник питания micro USB 5 В — У большинства пользователей Raspberry Pi должен быть один из них. Microsoft заявляет, что ей требуется ток не менее 1,0 А, или более 2,0 А, если вы к нему много подключаете. Лично я просто использовал тот, который пришел с моим Пи, и все было хорошо.
  • Карта памяти micro SD объемом 8 ГБ или более — в ней будут храниться операционная система Windows 10 IoT Core и ваши файлы. Чтобы убедиться, что карта достаточно быстра для запуска ОС, убедитесь, что у вас установлена ​​карта класса 10 или выше. Microsoft предлагает Samsung 32 ГБ EVO или SanDisk 16 ГБ Ultra Micro SDHC (у меня был второй, достаточно удобно, тот, который я использовал на своем Pi ранее, и он работал отлично).
  • ПК с Windows 10 — для выполнения любой из этих разработок вам понадобится Windows 10 на вашем компьютере. Я был частью программы Insider Preview, и поэтому у меня уже была версия, которую я мог использовать.
  • Сообщество Microsoft Visual Studio версии 14.0.23107.0 D14Rel — я скоро опишу, как это сделать.
  • Windows IoT Core Project — я также расскажу, как их скачать.
  • Windows IoT Core ISO — размер чуть больше 500 МБ, поэтому, если у вас медленное соединение, как у меня, вы можете загрузить его как можно скорее. Загрузите ISO для Windows IoT Core здесь .
  • Замазка или другой SSH-клиент — только если вы хотите SSH к Pi. Вместо этого вы можете использовать PowerShell.
  • Кабель HDMI и монитор для его подключения — он понадобится вам, чтобы настроить процесс установки и в конце увидеть ваше приложение IoT в действии.
  • Клавиатура USB и мышь USB — это будут ваши контроллеры для Raspberry Pi, когда мы не будем использовать SSH.
  • Сетевой кабель — К сожалению, похоже, что только официальный адаптер Wi-Fi Raspberry Pi пока что способен работать с Windows 10 IoT Core (я не могу этого гарантировать, поскольку у меня его нет!), Поэтому для подключения к сети вам необходимо подключить его через порт Ethernet.
  • Устройство для чтения карт микро SD — Вам нужно будет прочитать эту карту микро SD на вашем ПК. Я использовал адаптер Micro SD, чтобы подключить его к своему ПК.
  • Два сервопривода — я использовал микро сервоприводы, похожие на эти сервоприводы в SparkFun . Большинство сервоприводов будут работать здесь, главное отличие будет в том, как далеко они смогут вращаться.
  • Шесть соединительных проводов от мужчины к женщине — это то, что нам нужно для подключения сервоприводов к порту GPIO Raspberry Pi. Если вы не уверены, как они выглядят, вот некоторые на сайте SparkFun для ссылки .
  • Два очистителя для труб — это необязательно, если вы хотите дать сервоприводам оружие, добавьте несколько очистителей для труб !

Установка Visual Studio

Одна вещь, которая бросила меня во время установки всего, — то, что версия, связанная с некоторыми в документации Microsoft, не совместима с Основными шаблонами проектов Windows IoT из-за обновленной подписи Microsoft. Правильная версия, которую вы хотите удостовериться, установлена ​​Microsoft Community Studio версии 14.0.23107.0 D14Rel. Перейдите на веб-сайт Visual Studio и загрузите версию «Community 2015». Это должна быть совместимая версия, а не любая, связанная непосредственно с документацией.

Если вы установили Microsoft Visual Studio и получаете сообщение об ошибке «Невозможно создать #SignatureDescription для поставляемого алгоритма подписи», значит у вас есть несовместимая версия Visual Studio, такая как та, которую я изначально скачал. Все, что я могу вам сказать, это … вы не одиноки! Возьмите кофе и / или немного побывайте во внешнем мире, так как эта новая Visual Studio снова выполняет процесс установки.

При установке выберите «Выборочную» установку.

Установка Visual Studio с пользовательскими настройками

Он спросит, какие функции вы хотели бы установить. Убедитесь, что у вас есть Windows и веб-разработка> Инструменты разработки универсальных приложений для Windows> Инструменты и Windows SDK 10.0.10240, как показано на скриншоте ниже:

Выбор правильных настроек для Visual Studio и IoT

Установка Windows IoT Core Project

Вы можете найти необходимые файлы Windows IoT Core Project на странице MSDN Core IoT Core Project Templates . Просто нажмите «Скачать», и вы получите их:

Загрузка шаблонов IoT для Visual Studio

Включение режима разработчика в Windows 10

Если вы попытаетесь сделать многое в Visual Studio на данный момент, вы увидите это сообщение об ошибке:

Требуется режим разработчика

Это еще одна область, где меня немного застали врасплох. Первоначальная документация, которую я попробовал, привела меня к настройкам «Обновление и безопасность» в Windows 10. Однако в моей версии Windows 10 есть ошибка, когда каждый раз, когда вы нажимаете ссылку «Для разработчиков», чтобы включить ее, окно «Настройки» вылетает и закрывается. Так что этот метод был не лучшим вариантом.

Вместо этого мне пришлось сделать это с помощью групповой политики:

  1. Сначала откройте окно командной строки с привилегиями администратора. Для этого в Windows 10 мне было проще всего ввести «Командная строка» в поле Cortana на панели задач, щелкнуть правой кнопкой мыши по нему и выбрать «Запуск от имени администратора»:
    Запуск командной строки от имени администратора
  2. Введите Gpedit.msc
  3. Затем перейдите к Политике локального компьютера> Конфигурация компьютера> Административные шаблоны> Компоненты Windows> Развертывание пакета приложения .
    Поиск параметров групповой политики
  4. Откройте политику «Разрешить установку всех доверенных приложений» и установите переключатель «Включено»:
    Включение групповых политик
  5. Сделайте то же самое для политики «Разрешает разработку приложений Магазина Windows и установку их из интегрированной среды разработки (IDE)»
  6. Перезагрузите компьютер, чтобы включить эти политики.

Если у вас возникли трудности с этим методом, проверьте страницу « Включить ваше устройство для разработки» в документации Microsoft, чтобы узнать о других возможных способах ее включения.

Установка Windows IoT Core на ваш Pi

Первое, что вам нужно сделать, это загрузить ISO для Windows IoT Core . Если вы начали загружать его ранее в этой статье, надеюсь, он уже закончен, и вы готовы к работе!

Оттуда:

  1. Дважды щелкните по нему, чтобы Windows 10 смонтировала его как виртуальный диск (это действительно приятная особенность Windows 10)
  2. Перейдите на новый накопитель и установите «Windows_10_IoT_Core_RPi2.msi».
  3. После этого вы можете извлечь виртуальный диск из системы.
  4. Далее мы хотим установить Windows 10 IoT Core на карту microSD вашего Raspberry Pi. Поместите это в устройство для чтения SD-карт (или в какой-то другой адаптер, если на вашем компьютере нет такого устройства).
  5. Введите «WindowsIoT» на панели задач и выберите «WindowsIoTImageHelper»:
    Открытие IoTImageHelper
  6. Откроется прекрасное ярко-синее окно, в котором вы сможете выбрать свою SD-карту и файл ffu. Нужный файл ffu был извлечен программой Windows_10_IoT_Core_RPi2.msi . Вы можете найти нужный файл в C: \ Program Files (x86) \ Microsoft IoT \ FFU \ RaspberryPi2 \ flash.ffu . Убедитесь, что на этой флешке НИЧЕГО не нужно, а затем нажмите «Flash»:
    Помещение IoT Core на SD-карту
  7. Когда это будет сделано, аккуратно извлеките диск с помощью параметра «Безопасное извлечение устройства» в Windows, а затем безопасно извлеките его.
  8. Вставьте его в Raspberry Pi и подключите монитор HDMI, клавиатуру USB и мышь.
  9. При подготовке к включению Pi убедитесь, что у вас нет подключенных периферийных устройств . Мой Pi не загружался сначала, он загружался только после того, как я снял камеру Raspberry Pi и модуль USB Wi-Fi.
  10. Когда вы все их подключите, подключите блок питания к вашему Raspberry Pi, и он должен начать загружаться.

Странный перекос или растяжение экрана?

Если у вас есть проблемы, из-за которых изображение на вашем экране выглядит странно деформированным и растянутым, вам нужно будет немного подкорректировать настройки вашего Windows 10 IoT Core. Для меня дисплей работал нормально на одном из моих экранов, но потом другой стал действительно искаженным и странным. Исправить это:

  1. Отключите питание от Pi и подключите SD-карту обратно к ПК.
  2. На SD-карте будет файл с именем config.txt . Открой это.
  3. В этом файле есть строка, которая начинается с hdmi_group = . Если написано hdmi_group = 2 , попробуйте переключить его на hdmi_group = 1 и наоборот. Один из них должен работать на вашем экране.
  4. После того, как вы изменили 1 на 2 или 2 на 1, безопасно удалите его с вашего ПК и подключите обратно к вашему Pi. Подключите Pi к источнику питания, и теперь вы сможете увидеть дисплей во всей красе!

Если это по-прежнему не работает, этот пост на форумах Raspberry Pi может предоставить вам немного больше информации.

Подключение к Raspberry Pi через SSH

Существует два способа удаленного подключения к вашему Pi с компьютера через ввод в стиле командной строки. Либо через PowerShell, либо через SSH. Большинство статей посвящено PowerShell, но я был более знаком с SSH и подумал, почему бы не пойти по дороге менее путешествованной? Это также показалось мне лучшим вариантом в долгосрочной перспективе, чтобы обеспечить постоянный доступ ко всем моим устройствам и серверам IoT, поскольку большинство из них также работают через SSH.

Если вы предпочитаете использовать PowerShell, обратитесь к документации Microsoft PowerShell .

Чтобы подключиться к Pi по SSH, взгляните на экран, на котором запущен Raspberry Pi, и получите его IP-адрес. Вам понадобится SSH-клиент, такой как Putty . Затем откройте Putty и введите этот IP-адрес следующим образом:

Подключение через Putty

Убедитесь, что выбран SSH, а затем нажмите «Открыть». Нажмите «Да», чтобы увидеть все предупреждения системы безопасности о ключе хоста сервера.

Если это сработает, у вас будет окно терминала, готовое и ожидающее имя пользователя и пароль. Имя пользователя вашего Pi будет «Администратор», а пароль — «p @ ssw0rd». Если это сработает, вы окажетесь на диске C:

 C:\> 

Обновить пароль администратора по умолчанию

Очевидно, вы не хотите, чтобы пароль администратора оставался как «p @ ssw0rd» из соображений безопасности. Поэтому, войдя в систему, запустите следующую команду, заменив [superstrongpassword] своим суперсильным паролем:

 net user Administrator [superstrongpassword] 

Переименуйте ваше устройство Pi

Имя по умолчанию немного скучно. Не стесняйтесь переименовать Пи во что-то более веселое:

 setcomputername [yourpreferreddevicename] 

Перезагрузка вашего устройства

Это имя не будет использоваться, пока вы не перезапустите свой Pi. Чтобы сделать это через SSH, введите следующую команду:

 shutdown /r /t 0 

Подключение наших сервоприводов к пи

Я подключил свои сервоприводы напрямую к своему Пи для моей быстрой демонстрации, используя перемычку между мужчиной и женщиной, вот так:

Raspberry Pi Эскиз с серво

Другие подключили сервоприводы к Raspberry Pi через контактный разъем GPIO на макетной плате ( см. Пример Adafruit ), а некоторые сначала подключают его к макетной плате. Выберите свои личные предпочтения. Это будет работать в любом случае, если контакты соответствуют их определениям в приложении.

Если вы хотите проверить, какие выводы соответствуют какому выводу, у Microsoft есть прекрасная страница, которая определяет Raspberry Pi 2 Pin Mappings . Цифры, на которые вы ссылаетесь в своем коде на этой странице, такие же, как «GPIO 27».

Наш демонстрационный код

Наш демонстрационный код IoT доступен на GitHub . Загрузите его, если вы уже знакомы с процессом и просто хотите увидеть его запуск.

Получение нашего демо танца на нашем пи

Наш Raspberry Pi к этому моменту готов к работе. Если вы снова введете «Windows IoT» в поле поиска на панели задач Cortana, вы увидите один из вариантов, отличный от WindowsIoTImageHelper, — WindowsIoTCoreWatcher.

Открытие IoTCoreWatcher

Если вы откроете это, вы сможете увидеть, может ли ваш Pi быть найден вашим ПК:

TARDIS найден в IoT Core Watcher

После всех предыдущих шагов ваш Pi должен появиться. Если бы его не было здесь, вы бы не смогли подключиться к нему по SSH. Я указываю на этот экран только потому, что он может быть полезен, если ваш Pi отключился или потерял сетевое подключение по какой-то причине во время разработки. Это хороший инструмент, чтобы знать о!

Запуск проекта Windows 10 IoT Visual Studio

Откройте Visual Studio и выберите «Файл»> «Создать»> «Новый проект» . Оттуда откройте шаблоны и выберите Шаблоны> Visual C #> Windows> Windows IoT Core . Выберите «Фоновое приложение (IoT)», введите имя вашего приложения (я выбрал «ServoDancin») и нажмите «ОК».

Создание нового IoT проекта

После того, как это загрузится, вы захотите убедиться, что у вас есть ссылки, добавленные для функциональности IoT Windows 10. Для этого щелкните правой кнопкой мыши раздел «Ссылки» под названием вашего проекта в окне «Solution Explorer». Выберите «Добавить ссылку».

Добавить ссылку на проект

В открывшемся окне перейдите в «Универсальные Windows»> «Расширения» и выберите «Расширения Windows IoT для UWP». Нажмите ОК. Теперь мы готовы добавить в наш код.

Выбор менеджера ссылок

Кодирование нашего проекта

Этот пример в C #. Вы можете написать код на C ++, если хотите, но вам нужно переписать приведенный ниже пример на C ++!

В нашем примере мы собираемся подключить два сервопривода к нашему Raspberry Pi и заставить их танцевать взад и вперед, чтобы отпраздновать нашу радость, что Windows 10 имеет версию IoT!

Откройте файл MainPage.xaml.cs (он будет находиться под MainPage.xaml). Обновите код для MainPage.xaml следующим образом:

 using System; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.Devices.Gpio; using System.Diagnostics; namespace ServoDancin { public sealed partial class MainPage : Page { private const int SERVO_PIN_A = 18; private const int SERVO_PIN_B = 23; private GpioPin servoPinA; private GpioPin servoPinB; private DispatcherTimer timer; private double BEAT_PACE = 1000; private double CounterClockwiseDanceMove = 1; private double ClockwiseDanceMove = 2; private double currentDirection; private double PulseFrequency = 20; Stopwatch stopwatch; public MainPage() { InitializeComponent(); this.InitDancing(); } private void InitDancing() { // Preparing our GPIO controller var gpio = GpioController.GetDefault(); if (gpio == null) { servoPinA = null; if (GpioStatus != null) { GpioStatus.Text = "No GPIO controller found"; } return; } // Servo set up servoPinA = gpio.OpenPin(SERVO_PIN_A); servoPinA.SetDriveMode(GpioPinDriveMode.Output); servoPinB = gpio.OpenPin(SERVO_PIN_B); servoPinB.SetDriveMode(GpioPinDriveMode.Output); stopwatch = Stopwatch.StartNew(); currentDirection = 0; // Initially we aren't dancing at all. timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(BEAT_PACE); timer.Tick += Beat; if (servoPinA != null && servoPinB != null) { timer.Start(); Windows.System.Threading.ThreadPool.RunAsync(this.MotorThread, Windows.System.Threading.WorkItemPriority.High); } if (GpioStatus != null) { GpioStatus.Text = "GPIO pin ready"; } } private void Beat(object sender, object e) { if (currentDirection != ClockwiseDanceMove) { currentDirection = ClockwiseDanceMove; GpioStatus.Text = "Yay!"; } else { currentDirection = CounterClockwiseDanceMove; GpioStatus.Text = "Windows 10!"; } } private void MotorThread(IAsyncAction action) { while (true) { if (currentDirection != 0) { servoPinA.Write(GpioPinValue.High); servoPinB.Write(GpioPinValue.High); } Wait(currentDirection); servoPinA.Write(GpioPinValue.Low); servoPinB.Write(GpioPinValue.Low); Wait(PulseFrequency - currentDirection); } } private void Wait(double milliseconds) { long initialTick = stopwatch.ElapsedTicks; long initialElapsed = stopwatch.ElapsedMilliseconds; double desiredTicks = milliseconds / 1000.0 * Stopwatch.Frequency; double finalTick = initialTick + desiredTicks; while (stopwatch.ElapsedTicks < finalTick) { } } } } 

Наш код объяснил

Начальные биты тянут в себя функциональные возможности, необходимые для нашего приложения. Я полагаю, что большинство из нижеприведенного — это основные части, которые будут запускать наше приложение IoT и читать файл xaml, который мы скоро сделаем.

 using System; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; 

Затем эта строка обеспечивает доступ к порту GPIO нашего Raspberry Pi:

 using Windows.Devices.Gpio; 

Наконец, эта строка дает нам доступ к функциональности секундомера:

 using System.Diagnostics; 

Вся наша логика кода находится внутри этого контейнера (убедитесь, что вы изменили «ServoDancin», если выбрали другое имя для своего приложения):

 namespace ServoDancin { public sealed partial class MainPage : Page { // Code will be here } } 

Затем внутри мы начинаем определять переменные, которые будем использовать в нашем приложении. Первые определяют контакты, к которым мы будем прикреплять наши сервоприводы к порту GPIO нашего Pi, и сами объекты контактов, к которым мы будем обращаться:

 private const int SERVO_PIN_A = 18; private const int SERVO_PIN_B = 23; private GpioPin servoPinA; private GpioPin servoPinB; 

Далее мы определяем наш таймер, который будет переключать направление наших сервоприводов и скорость, с которой он будет делать это в миллисекундах:

 private DispatcherTimer timer; private double BEAT_PACE = 1000; 

Затем мы устанавливаем две позиции для нашего сервопривода, на которые мы будем переключать его (1 — импульс длительностью в одну миллисекунду, который поворачивает сервопривод по часовой стрелке, а 2 — импульс в две миллисекунды, который поворачивает сервопривод против часовой стрелки). Мы используем currentDirection для хранения текущего движения, которое у нас есть.

 private double CounterClockwiseDanceMove = 1; private double ClockwiseDanceMove = 2; private double currentDirection; 

PulseFrequency — это то, как часто мы будем посылать импульсы на наш сервопривод в миллисекундах. Для перемещения сервопривода он ожидает импульсы каждые 20 миллисекунд. Наш stopwatch — это то, что мы будем использовать для измерения времени всех импульсов:

 private double PulseFrequency = 20; Stopwatch stopwatch; 

Весь наш код начинается с функции MainPage() . InitializeComponent() инициализирует наш MainPage.xaml. Это не то, что мы определяем в нашем коде, это вещь Windows IoT Core. Наш код в этом this.InitDancing() :

 public MainPage() { InitializeComponent(); this.InitDancing(); } 

Этот код инициализирует наш вывод GPIO и отображает ошибку, если он не может его инициализировать:

 private void InitDancing() { // Preparing our GPIO controller var gpio = GpioController.GetDefault(); if (gpio == null) { servoPinA = null; if (GpioStatus != null) { GpioStatus.Text = "No GPIO controller found"; } return; } 

Затем мы определяем наши два сервопривода:

 // Servo set up servoPinA = gpio.OpenPin(SERVO_PIN_A); servoPinA.SetDriveMode(GpioPinDriveMode.Output); servoPinB = gpio.OpenPin(SERVO_PIN_B); servoPinB.SetDriveMode(GpioPinDriveMode.Output); 

Затем мы запускаем наш секундомер, инициализируем направление, в котором наш сервопривод движется к нулю (что означает, что он никуда не движется), создаем новый таймер (это то время, когда наше направление изменяется, когда наши сервоприводы будут двигаться) с миллисекундной синхронизацией, которую мы определенный ранее, и скажите ему, чтобы он запускал функцию Beat() каждый раз, когда он тикает:

 stopwatch = Stopwatch.StartNew(); currentDirection = 0; // Initially we aren't dancing at all. timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(BEAT_PACE); timer.Tick += Beat; 

Если наши сервоприводы не равны нулю, мы запускаем таймер и также запускаем фоновый процесс, который проверяет наш серво с регулярными интервалами в 20 миллисекунд. Именно в этом фоновом процессе мы посылаем текущее направление, в котором мы хотели бы, чтобы оно путешествовало.

 if (servoPinA != null && servoPinB != null) { timer.Start(); Windows.System.Threading.ThreadPool.RunAsync(this.MotorThread, Windows.System.Threading.WorkItemPriority.High); } 

Если все идет хорошо с инициализацией вывода GPIO, то мы показываем сообщение, показывающее, что все готово!

 if (GpioStatus != null) { GpioStatus.Text = "GPIO pin ready"; } 

Наша функция Beat() — это то, что переключает направление нашего сервопривода. Он не говорит сервоприводу, что делать конкретно, он просто переключает переменную currentDirection чтобы изменить направление, в котором наш фоновый пульсирующий процесс скажет сервоприводу двигаться. Он также устанавливает наш текст в приложении, чтобы чередовать сообщения для небольшого добавления веселье.

 private void Beat(object sender, object e) { if (currentDirection != ClockwiseDanceMove) { currentDirection = ClockwiseDanceMove; GpioStatus.Text = "Yay!"; } else { currentDirection = CounterClockwiseDanceMove; GpioStatus.Text = "Windows 10!"; } } 

MotorThread() — это место, где наш фоновый процесс регулярно отправляет импульсы нашему сервоприводу, чтобы заставить его реагировать и танцевать. Если значение currentDirection равно 1 или 2, оно отправит сообщение высокого уровня на контакт. Затем он ждет одну или две миллисекунды (количество нашего currentDirection ) перед отправкой низкого импульса. Время между этими максимумами и минимумами определяет сервопривод в каком направлении двигаться. Затем мы ждем оставшееся время в пределах обычного 20-миллисекундного интервала импульсов для нашего сервопривода, прежде чем повторить это снова.

 private void MotorThread(IAsyncAction action) { while (true) { if (currentDirection != 0) { servoPinA.Write(GpioPinValue.High); servoPinB.Write(GpioPinValue.High); } Wait(currentDirection); servoPinA.Write(GpioPinValue.Low); servoPinB.Write(GpioPinValue.Low); Wait(PulseFrequency - currentDirection); } } 

Чтобы фактически выполнить эту функцию Wait() , мы должны определить ее, поэтому в качестве нашей последней функции для приложения мы настроили эту функцию здесь. Он использует stopwatch мы установили ранее, и удерживает наш поток до тех пор, пока не истечет количество миллисекунд.

 private void Wait(double milliseconds) { long initialTick = stopwatch.ElapsedTicks; long initialElapsed = stopwatch.ElapsedMilliseconds; double desiredTicks = milliseconds / 1000.0 * Stopwatch.Frequency; double finalTick = initialTick + desiredTicks; while (stopwatch.ElapsedTicks < finalTick) { } } 

Наш файл MainPage.xaml

Файл MainPage.xaml определяет, как наше приложение будет отображаться на экране HDMI. Если вы создаете приложение, которое вообще не требует отображения, вы можете настроить Pi на работу в режиме без головы , что звучит немного жутко, но просто означает, что на экране ничего не отображается и зависит от командной строки. стиль соединения вместо. Наше приложение будет заголовочным приложением, которое будет отображаться на экране. Если вы хотите узнать разницу между ними и узнать, как их настроить, обратитесь к документации Microsoft по режимам Headed и Headless .

Наш файл MainPage.xaml выглядит так:

 <Page x:Class="ServoDancin.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ServoDancin" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Blue"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock x:Name="GpioStatus" Text="Finding GPIO..." TextAlignment="Center" FontSize="40" /> </StackPanel> </Grid> </Page> с <Page x:Class="ServoDancin.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ServoDancin" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Blue"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock x:Name="GpioStatus" Text="Finding GPIO..." TextAlignment="Center" FontSize="40" /> </StackPanel> </Grid> </Page> 

Большая часть этого полностью настроена для нас Visual Studio, так что здесь вам, возможно, потребуется отрегулировать лишь несколько битов. Во-первых, вы должны убедиться, что эти две строки имеют имя вашего приложения (если вы решили изменить его):

 <Page x:Class="ServoDancin.MainPage" ... xmlns:local="using:ServoDancin" 

Все остальное сосредоточено на отображении текста в нашем приложении. Все, что будет у нашего приложения, — это один текстовый блок под названием «GpioStatus», который первоначально сообщает нам, инициализированы ли выводы GPIO, но затем отображает сообщения вовремя с нашими танцующими сервоприводами.

Мы не особо используем сложные макеты приложений. Мы настроили фон для нашего приложения синим (я подумал, что это Microsoft! Какой цвет лучше, чем синий?):

 <Grid Background="Blue"> 

Затем у нас есть одна панель, которую мы выравниваем по центру страницы:

 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 

Наконец, у нас есть наш текстовый блок, определяющий его имя, чтобы мы могли ссылаться на него позже, исходный контент, размер шрифта и выравнивание:

 <TextBlock x:Name="GpioStatus" Text="Finding GPIO..." TextAlignment="Center" FontSize="40" /> 

Получаем это приложение на наш пи

Чтобы поместить это приложение в нашу Raspberry Pi, нам нужно настроить Visual Studio для компиляции и отправки приложения на удаленную машину (ваш Pi). Raspberry Pi работает на процессоре ARM, поэтому в раскрывающемся списке рядом с «Отладка» вы захотите выбрать «ARM». Если вы не видите опцию для них, убедитесь, что вы создали правильный тип проекта на предыдущих этапах и добавили также ссылки на IoT в Windows 10 выше.

Выбор ARM для устройства IoT

В раскрывающемся списке рядом с ним выберите «Удаленный компьютер».

Добавить удаленный компьютер в Visual Studio

Это должно позволить вам выбрать удаленный компьютер через всплывающее окно «Удаленные подключения». Выберите свой Pi из списка или, если он не появляется, попробуйте ввести его IP-адрес:

Добавление TARDIS в качестве удаленной машины

Нажмите «Выбрать», чтобы выбрать его. Затем нажмите эту кнопку воспроизведения еще раз, когда на ней написано «Удаленный компьютер», и приложение должно быть помещено на ваш Pi!

Если через некоторое время у вас возникнут проблемы с его загрузкой в ​​Pi, попробуйте перезапустить Pi.

Наше приложение в действии

Когда ваше приложение запускается, оно должно выглядеть так!

Dancin Servos в действии

Вывод

Это должно охватить весь процесс начала работы с Raspberry Pi и Windows 10 IoT Core, включая мои личные уроки от различных ошибок и путаницы! Я надеюсь, что это поможет ускорить процесс для других и приведет к довольно интересным демонстрациям IoT на платформе Windows.

Если вы делаете захватывающую демонстрацию IoT на базе Windows на основе этого кода, оставляете примечание в комментариях или пишите мне в Твиттере (я @thatpatrickguy ), я бы с удовольствием это увидел!