Это была неделя, когда 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 снова выполняет процесс установки.
При установке выберите «Выборочную» установку.
Он спросит, какие функции вы хотели бы установить. Убедитесь, что у вас есть Windows и веб-разработка> Инструменты разработки универсальных приложений для Windows> Инструменты и Windows SDK 10.0.10240, как показано на скриншоте ниже:
Установка Windows IoT Core Project
Вы можете найти необходимые файлы Windows IoT Core Project на странице MSDN Core IoT Core Project Templates . Просто нажмите «Скачать», и вы получите их:
Включение режима разработчика в Windows 10
Если вы попытаетесь сделать многое в Visual Studio на данный момент, вы увидите это сообщение об ошибке:
Это еще одна область, где меня немного застали врасплох. Первоначальная документация, которую я попробовал, привела меня к настройкам «Обновление и безопасность» в Windows 10. Однако в моей версии Windows 10 есть ошибка, когда каждый раз, когда вы нажимаете ссылку «Для разработчиков», чтобы включить ее, окно «Настройки» вылетает и закрывается. Так что этот метод был не лучшим вариантом.
Вместо этого мне пришлось сделать это с помощью групповой политики:
- Сначала откройте окно командной строки с привилегиями администратора. Для этого в Windows 10 мне было проще всего ввести «Командная строка» в поле Cortana на панели задач, щелкнуть правой кнопкой мыши по нему и выбрать «Запуск от имени администратора»:
- Введите
Gpedit.msc
- Затем перейдите к Политике локального компьютера> Конфигурация компьютера> Административные шаблоны> Компоненты Windows> Развертывание пакета приложения .
- Откройте политику «Разрешить установку всех доверенных приложений» и установите переключатель «Включено»:
- Сделайте то же самое для политики «Разрешает разработку приложений Магазина Windows и установку их из интегрированной среды разработки (IDE)»
- Перезагрузите компьютер, чтобы включить эти политики.
Если у вас возникли трудности с этим методом, проверьте страницу « Включить ваше устройство для разработки» в документации Microsoft, чтобы узнать о других возможных способах ее включения.
Установка Windows IoT Core на ваш Pi
Первое, что вам нужно сделать, это загрузить ISO для Windows IoT Core . Если вы начали загружать его ранее в этой статье, надеюсь, он уже закончен, и вы готовы к работе!
Оттуда:
- Дважды щелкните по нему, чтобы Windows 10 смонтировала его как виртуальный диск (это действительно приятная особенность Windows 10)
- Перейдите на новый накопитель и установите «Windows_10_IoT_Core_RPi2.msi».
- После этого вы можете извлечь виртуальный диск из системы.
- Далее мы хотим установить Windows 10 IoT Core на карту microSD вашего Raspberry Pi. Поместите это в устройство для чтения SD-карт (или в какой-то другой адаптер, если на вашем компьютере нет такого устройства).
- Введите «WindowsIoT» на панели задач и выберите «WindowsIoTImageHelper»:
- Откроется прекрасное ярко-синее окно, в котором вы сможете выбрать свою SD-карту и файл ffu. Нужный файл ffu был извлечен программой Windows_10_IoT_Core_RPi2.msi . Вы можете найти нужный файл в C: \ Program Files (x86) \ Microsoft IoT \ FFU \ RaspberryPi2 \ flash.ffu . Убедитесь, что на этой флешке НИЧЕГО не нужно, а затем нажмите «Flash»:
- Когда это будет сделано, аккуратно извлеките диск с помощью параметра «Безопасное извлечение устройства» в Windows, а затем безопасно извлеките его.
- Вставьте его в Raspberry Pi и подключите монитор HDMI, клавиатуру USB и мышь.
- При подготовке к включению Pi убедитесь, что у вас нет подключенных периферийных устройств . Мой Pi не загружался сначала, он загружался только после того, как я снял камеру Raspberry Pi и модуль USB Wi-Fi.
- Когда вы все их подключите, подключите блок питания к вашему Raspberry Pi, и он должен начать загружаться.
Странный перекос или растяжение экрана?
Если у вас есть проблемы, из-за которых изображение на вашем экране выглядит странно деформированным и растянутым, вам нужно будет немного подкорректировать настройки вашего Windows 10 IoT Core. Для меня дисплей работал нормально на одном из моих экранов, но потом другой стал действительно искаженным и странным. Исправить это:
- Отключите питание от Pi и подключите SD-карту обратно к ПК.
- На SD-карте будет файл с именем config.txt . Открой это.
- В этом файле есть строка, которая начинается с
hdmi_group =
. Если написаноhdmi_group = 2
, попробуйте переключить его наhdmi_group = 1
и наоборот. Один из них должен работать на вашем экране. - После того, как вы изменили 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-адрес следующим образом:
Убедитесь, что выбран SSH, а затем нажмите «Открыть». Нажмите «Да», чтобы увидеть все предупреждения системы безопасности о ключе хоста сервера.
Если это сработает, у вас будет окно терминала, готовое и ожидающее имя пользователя и пароль. Имя пользователя вашего Pi будет «Администратор», а пароль — «p @ ssw0rd». Если это сработает, вы окажетесь на диске C:
C:\>
Обновить пароль администратора по умолчанию
Очевидно, вы не хотите, чтобы пароль администратора оставался как «p @ ssw0rd» из соображений безопасности. Поэтому, войдя в систему, запустите следующую команду, заменив [superstrongpassword] своим суперсильным паролем:
net user Administrator [superstrongpassword]
Переименуйте ваше устройство Pi
Имя по умолчанию немного скучно. Не стесняйтесь переименовать Пи во что-то более веселое:
setcomputername [yourpreferreddevicename]
Перезагрузка вашего устройства
Это имя не будет использоваться, пока вы не перезапустите свой Pi. Чтобы сделать это через SSH, введите следующую команду:
shutdown /r /t 0
Подключение наших сервоприводов к пи
Я подключил свои сервоприводы напрямую к своему Пи для моей быстрой демонстрации, используя перемычку между мужчиной и женщиной, вот так:
Другие подключили сервоприводы к Raspberry Pi через контактный разъем GPIO на макетной плате ( см. Пример Adafruit ), а некоторые сначала подключают его к макетной плате. Выберите свои личные предпочтения. Это будет работать в любом случае, если контакты соответствуют их определениям в приложении.
Если вы хотите проверить, какие выводы соответствуют какому выводу, у Microsoft есть прекрасная страница, которая определяет Raspberry Pi 2 Pin Mappings . Цифры, на которые вы ссылаетесь в своем коде на этой странице, такие же, как «GPIO 27».
Наш демонстрационный код
Наш демонстрационный код IoT доступен на GitHub . Загрузите его, если вы уже знакомы с процессом и просто хотите увидеть его запуск.
Получение нашего демо танца на нашем пи
Наш Raspberry Pi к этому моменту готов к работе. Если вы снова введете «Windows IoT» в поле поиска на панели задач Cortana, вы увидите один из вариантов, отличный от WindowsIoTImageHelper, — WindowsIoTCoreWatcher.
Если вы откроете это, вы сможете увидеть, может ли ваш Pi быть найден вашим ПК:
После всех предыдущих шагов ваш Pi должен появиться. Если бы его не было здесь, вы бы не смогли подключиться к нему по SSH. Я указываю на этот экран только потому, что он может быть полезен, если ваш Pi отключился или потерял сетевое подключение по какой-то причине во время разработки. Это хороший инструмент, чтобы знать о!
Запуск проекта Windows 10 IoT Visual Studio
Откройте Visual Studio и выберите «Файл»> «Создать»> «Новый проект» . Оттуда откройте шаблоны и выберите Шаблоны> Visual C #> Windows> Windows IoT Core . Выберите «Фоновое приложение (IoT)», введите имя вашего приложения (я выбрал «ServoDancin») и нажмите «ОК».
После того, как это загрузится, вы захотите убедиться, что у вас есть ссылки, добавленные для функциональности 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 выше.
В раскрывающемся списке рядом с ним выберите «Удаленный компьютер».
Это должно позволить вам выбрать удаленный компьютер через всплывающее окно «Удаленные подключения». Выберите свой Pi из списка или, если он не появляется, попробуйте ввести его IP-адрес:
Нажмите «Выбрать», чтобы выбрать его. Затем нажмите эту кнопку воспроизведения еще раз, когда на ней написано «Удаленный компьютер», и приложение должно быть помещено на ваш Pi!
Если через некоторое время у вас возникнут проблемы с его загрузкой в Pi, попробуйте перезапустить Pi.
Наше приложение в действии
Когда ваше приложение запускается, оно должно выглядеть так!
Вывод
Это должно охватить весь процесс начала работы с Raspberry Pi и Windows 10 IoT Core, включая мои личные уроки от различных ошибок и путаницы! Я надеюсь, что это поможет ускорить процесс для других и приведет к довольно интересным демонстрациям IoT на платформе Windows.
Если вы делаете захватывающую демонстрацию IoT на базе Windows на основе этого кода, оставляете примечание в комментариях или пишите мне в Твиттере (я @thatpatrickguy ), я бы с удовольствием это увидел!