Вот как начать создавать приложение для Windows 10 на Arduino, даже если вы никогда раньше не программировали приложения для Windows
Microsoft делает все возможное для Windows 10, наконец-то воплощая мечту о кроссплатформенных приложениях. В сочетании с официальной поддержкой Arduino вы получаете в свое распоряжение новый мощный инструмент: возможность легко создавать универсальные приложения для Windows, имеющие аппаратную связь с реальным миром
Вот как начать работу, даже если вы никогда раньше не программировали приложения для Windows
Прежде чем читать дальше, посмотрите демонстрацию того, что мы собираемся сделать
https://www.youtube.com/watch?v=_uKlY72LKvc
Следует отметить, что я не использовал Visual Studio и даже не касался C# примерно 10 лет назад. Я подхожу к этому с точки зрения свежей установки Visual Studio и забыл все, что знал
Если вы уже достаточно опытны в программировании приложений для Windows или даже ищете простой способ начать программировать в Windows без этих штучек с Arduino, попробуйте руководство Райана по созданию простого приложения на Visual Basic. Абсолютные новички в программировании, возможно, захотят сначала ознакомиться с моей статьей ‘Программирование 101’ (и частью 2)
Вы должны быть знакомы с некоторыми проектами Arduino для начинающих (и, возможно, даже читали наше руководство по Arduino), но это, вероятно, будет первый раз, когда вы попробуете создать реальное программное обеспечение для взаимодействия с компьютером
Загрузки
Во-первых: вам нужно присоединиться к программе Windows Insider Program, чтобы получить последнюю предварительную версию Visual Studio 2015 и последнюю сборку Windows 10 Preview. Сделайте это сейчас – это бесплатно.Windows 10 – это предварительная версия для разработчиков, и ее не следует устанавливать в качестве основной операционной системы. Она чертовски глючная
Visual Studio – это собственная среда разработки Microsoft, которую мы будем использовать для создания приложения C# Windows
Почему C#? Имея сильное сходство с Java, этот язык программирования относительно прост для начинающих, чтобы получить работающее приложение, но при этом достаточно мощный, чтобы вы могли создавать потрясающие приложения (даже игры): C# – это язык сценариев для Unity – ознакомьтесь с нашей бесплатной электронной книгой ‘Руководство для начинающих по программированию игр в Unity’)
Если вы еще этого не сделали, скачайте Arduino IDE с официального сайта Arduino.cc и установите стандартную firmata на плату. Вы найдете его в разделе Examples -> Firmata -> Standard Firmata. Это просто превратит ее в ‘тупое’ последовательное устройство, которое будет делать все, что скажет ему наше приложение – на самой плате не будет никакой прикладной логики, только интерфейс между нашим приложением и любыми датчиками или устройствами вывода, подключенными к Arduino
Что касается подключения, вы можете либо подключить светодиод непосредственно к контакту 13 и GND, как показано ниже, либо использовать встроенный светодиод. Вам также понадобится переменный резистор (я использовал линейный потенциометр 10k), подключаемый к A0 (с соответствующими ножками на GND и +5v тоже, очевидно)
Наконец, загрузите пакет Remote Wiring с GitHub No Longer Available. Это слой, который нам нужно добавить, чтобы наше приложение для Windows могло общаться с Arduino
Создайте приложение
Откройте Visual Studio. Если вы запускаете его впервые, вам будет предложено войти в систему. Проигнорируйте это, если хотите. Выберите Visual C# в качестве варианта разработки и продолжайте; в любом случае, потребуется несколько минут, чтобы подготовить Visual Studio к первому использованию
Создайте новый проект, используя шаблон Visual C# -> Blank App (Windows Universal). Я назвал свой проект ‘Arduino Test’, но это не имеет значения
На этом этапе я столкнулся с ошибкой о необходимости переключить Windows 10 в режим разработчика, если я хочу запустить приложение. Сделайте это, хотя если вы обнаружите, что ваша сборка Windows 10 падает при такой настройке, это известная ошибка, и вам нужно использовать редактор групповой политики, чтобы включить режим разработчика
Затем щелкните правой кнопкой мыши в любом месте Solution Explorer (это такая штука справа) и выберите Add -> Existing Project
Перейдите к месту, где вы скачали файлы Remote Wiring с Github – если они были распакованы, это должна быть папка remote-wiring-develop. Внутри нее вы найдете Microsoft.Maker.win10 ; и внутри нее вы найдете еще 3 папки. По очереди добавьте каждую из них, перейдя внутрь этих трех папок и найдя файл проекта
Если вы получите ошибку ‘XAML 8. 2 file not found’, то у вас неправильная версия Visual Studio или не установлены инструменты разработчика. Вернитесь к началу этой статьи и убедитесь, что вы скачали и установили оба связанных файла Visual Studio
Эти 3 проекта, которые вы только что добавили, являются просто различными слоями интерфейса Arduino. В проводнике решений, если вы щелкните правой кнопкой мыши и выберите Dependencies -> Build Dependencies , вы увидите, какие слои от каких зависят ( Serial ни от чего не зависит; Firmata зависит от Serial; RemoteWiring зависит от обоих). Единственное изменение, которое вам нужно сделать здесь, это выбрать ваш проект из выпадающего списка и отметить каждый флажок, чтобы указать, что ваш проект зависит от всех этих других проектов
Последний шаг: в проводнике решений снова щелкните правой кнопкой мыши на элементе References под вашим проектом и выберите Add Reference. Слева перейдите к Windows Universal , затем поставьте галочку напротив Microsoft Visual C++ AppLocal Runtime Package. Не закрывайте диалог
Далее перейдите в раздел Проекты (также в том же диалоговом окне, из списка слева) и установите флажок напротив каждого из трех проектов Microsoft.Maker
Это было труднее, чем следовало бы, но это нужно сделать только один раз; теперь мы можем немного повеселиться с программированием – обещаю, это не так страшно
Программирование
Если вам трудно следить за ходом работы, полный код доступен на Pastebin. Тем не менее, я настоятельно рекомендую прочитать примечания ниже, чтобы я мог объяснить, что на самом деле делает код
Во-первых, нам нужно добавить немного кода, который говорит, что нам нужен USB-порт для связи с Arduino. Найдите файл Package.appxmanifest в проводнике решений и дважды щелкните, чтобы отредактировать его. Нам нужно вставить сюда код – технически, мы будем ‘вставлять дочерний узел’, поскольку это XML-файл, но просто замените весь раздел <Capabilities> кодом, приведенным ниже, чтобы он выглядел следующим образом:
Точный код будет отличаться, если вы используете Bluetooth, или если вы используете Win8. 1, а не 10, но следующий код предназначен для Windows 10, USB-соединение
<Capabilities>
<Capability Name='internetClient'/>
<DeviceCapability Name='serialcommunication'>
<Device Id='any'>
<Function Type='name:serialPort'>
</Device>
</DeviceCapability>
</Capabilities>
Перейдите в меню Build -> Rebuild Solution , и убедитесь, что вы не получаете никаких ошибок
В проводнике решений разверните узел MainPage.xaml. Двойной щелчок на нем загрузит дизайнер форм, к которому мы вернемся позже, а пока откройте MainPage.xaml.cs , который содержит основную логику нашего приложения
Добавьте две строки в первый раздел, чтобы указать, что мы будем ‘использовать’ биты Arduino
usingMicrosoft.Maker.serial;
usingMicrosoft.Maker.RemoteWiring;
Я также добавил строку о том, что мы будем использовать System.Diagnostics; , которая позволяет нам использовать функцию Debug.WriteLine() для вывода отладочных сообщений в IDE
Прежде всего, давайте определим несколько переменных, которые мы будем использовать в дальнейшем. Добавьте эти строки непосредственно перед объявлением функции public MainPage()
UsbSerial connection;
RemoteDevice arduino;
UInt16 lastvalue;
Далее перейдем к функции MainPage() – она называется конструктором, и это функция, которая вызывается сразу после создания нашего приложения, поэтому мы используем ее, чтобы все настроить
Сначала добавьте строку для установления последовательного USB-соединения с определенным USB-устройством (Arduino)
connection =newUsbSerial('VID_2341''PID_0043');
Обратите внимание, что USB IDs стандартного Arduino Uno уже закодированы в блоке, но вы можете проверить это в Диспетчере устройств -> Порты (COM и LPT) -> Arduino Uno -> Details tab -> Hardware IDs
Затем добавьте следующие строки сразу после этого
arduino =newRemoteDevice(connection);
connection.ConnectionEstablished += OnConnectionEstablished;
connection.begin(57600, SerialConfig.SERIAL_8N1);
Здесь происходит несколько вещей. Во-первых, мы создаем объект RemoteDevice – помните, это слой, который дает нам кучу команд Arduino – и присваиваем ему имя переменной ‘arduino’. Следующая строка прикрепляется к событию ConnectionEstablished, чтобы сказать ‘как только USB-соединение будет успешно установлено, запустите функцию OnConnectionEstablish()’.
Последняя просто сообщает, что соединение уже установлено, со скоростью передачи 57600 бод, используя битовый шаблон 8N1
Вам также понадобится создать функцию OnConnectionEstablished(), поэтому выйдите за пределы функции MainPage() и просто сделайте пустую функцию следующим образом
privatevoidOnConnectionEstablished
// LOGIC HERE
Вернитесь к дизайнеру форм, о котором я говорил ранее (если вы забыли, как это сделать: дважды щелкните на MainPage.xaml в проводнике решений). Создайте две кнопки. Для этого откройте вкладку Toolbox, которую вы найдете вертикально прикрепленной в левой части экрана. Перетащите две кнопки на страницу, затем обозначьте одну On, а другую Off
Выберите первую кнопку, затем в окне свойств в правом нижнем углу назовите ее ‘OnButton’. Щелкните на маленьком значке молнии – это список событий и действий, который используется для указания того, что происходит при взаимодействии с элементами формы. Введите ‘OnButtonClick’ в поле Click
Когда вы нажмете Enter, автоматически будет создан код для этого события кнопки и загружен стандартный вид кода. Переключитесь пока обратно в конструктор форм и сделайте то же самое для кнопки Off, но на этот раз назовите ее ‘OffButton’ и ‘OffButtonClick’. Пока вы там, перейдите и назовите форму главного окна за ним ‘Page’ – мы будем использовать ее позже. Теперь у вас должно получиться что-то похожее на скриншот ниже:
Снова на мгновение вернитесь в дизайнер и снова для каждой кнопки установите свойство isEnabled на False. Вы можете сделать это, введя свойство непосредственно в представлении кода XAML, или найти этот флажок в окне свойств (нажмите на гаечный ключ, если вы все еще находитесь в представлении действий) – он находится в расширенной категории свойств Common
Это не обязательно, но это хорошая практика, чтобы отключить кнопки, пока мы не убедимся, что Arduino подключена и соединена
Чтобы снова включить их, добавьте следующее в функцию OnConnectionEstablished(). Не стоит слишком беспокоиться о точном значении кода, это просто способ обработки обновления формы в современных приложениях Windows для обеспечения хорошей производительности. После подключения к Arduino мы установим свойство IsEnabled кнопок в true
privatevoidOnConnectionEstablished
{
// enable the on off buttons
varaction = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,newWindows.UI.Core.DispatchedHandler(() => {
OnButton.IsEnabled =true
OffButton.IsEnabled =true
}));
arduino.pinMode(14, PinMode.ANALOG);
arduino.AnalogPinUpdatedEvent += MyAnalogPinUpdateCallback;
Debug.WriteLine(arduino.analogRead(14));
}
Вы также увидите более знакомый оператор pinMode(), чтобы сказать, что у нас есть аналоговый вход на пине 14 (есть 13 цифровых пинов, поэтому A0 начинает отсчет с 14). Затем у нас есть еще одно объявление события – когда значение аналогового вывода обновляется, вызывается функция MyAnalogPinUpdateCallback
Наконец, нам нужно отредактировать события нажатия кнопок и решить, что происходит при изменении аналогового входа. Давайте начнем с кнопок. Мы можем взаимодействовать с Arduino, используя имена функций, аналогичные именам обычного кода Arduino, следующим образом:
arduino.digitalWrite(13, PinState.HIGH);
Вставьте это для события onButton, а это – для offButton:
arduino.digitalWrite(13, PinState.LOW);
Просто. Аналоговый вход от Arduino немного сложнее, но вот что я придумал
publicvoidMyAnalogPinUpdateCallbackbytepin, UInt16value
{
ifvalue-lastvalue >|| lastvalue-value>){
Debug.WriteLine('Pin A'+ pin +' is now 'value);
varaction = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,newWindows.UI.Core.DispatchedHandler(() => {
bytenum = Convert.ToByte(value);
Page.Background =newSolidColorBrush(Windows.UI.Color.FromArgb(255, num, num, Convert.ToByte(255-num)));
}));
}
lastvalue =value
}
Обратите внимание, что я сохраняю предыдущее значение, полученное от пина, в переменной lastValue; это позволяет нам проверить, насколько сильно изменилось значение, и реагировать, только если разница значительна (своего рода сглаживание сигнала). Если оно изменяется в любую сторону более чем на 5 (0-1024 – полный диапазон значений), то мы реагируем изменением значения цвета фона RGB элемента Page
Поскольку у нас есть только одно число для работы, а я торопился, я немного помудрил с 3 числами, необходимыми для создания R, G и B. Возможно, вы сможете придумать что-то более красивое
Готово
Вот и все – запустите код, и вы должны увидеть что-то похожее на скриншот выше. Кнопки будут включать и выключать светодиод, а переменный резистор будет менять фон. Если у вас возникли проблемы, не забудьте, что полный код находится здесь
Теперь, когда вы можете писать свои собственные приложения для Windows 10, взаимодействующие с Arduino, что вы сделаете? Может быть, контроллер домашней автоматизации? Дайте мне знать в комментариях
Комментировать