Программа взаимодействия Arduino <-> Windows

Преамбула

Идея в реализации трех основных функций:
1. Сигналами с Arduino управлять системной громкостью Windows
2. Сигналами с Arduino эмулировать нажатия комбинаций клавиш Windows
3. Включать экран/усилитель только при загрузке Windows и отключать сразу по выходу из него.

Решения для первого пункта есть, например «HotKey.exe», другие же найти не удалось. А учитывая то, что при сбое в подключении Arduino «HotKey.exe» весело сообщает о пропадании COM-порта и требует перезапуска, решено было написать что-то свое.

Для системы программирования Processing существует библиотека FIRMATA. Она позволяет организовать двунаправленный интерфейс. Однако, после нескольких часов копания так и не понял, как передать с Arduino абстрактную команду. Иными словами уткнулся в то, что при таком подходе Arduino теряет возможность обрабатывать что-то в себе. Не хотелось бы. Более того, сам Processing для меня непонятен. По умолчанию программа вообще получается в виде флеша .. бррр.

Таким образом, решено было писать на C#. Библиотека по типу FIRMATA нашлась — Sharpduino…. но ничего непонятно. Ну и ладно. Начал изобретать велосипед. Т.е. свой протокол обмена данными Arduino Приложение.

Как ни странно, но кое что получилось:
  • По команде с Arduino меняется громкость (первая основная цель)
  • По команде с Arduino могут эмулироваться нажатия клавиш и екоторые их комбинации (вторая основная цель)
  • По команде из Приложения меняется состояние цифровых и аналоговых выводов Arduino. А это значит, что при использовании Реле будет решена третья основная цель.
Как это можно использовать уже сейчас:

Хотя идея и предполагает взаимодействие Arduino <-> Приложение, а значит специальную «прошивку» Arduino, на деле функции управления Windows должны работать лишь при «правильном» синтаксисе команды.

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

Как (у меня) работает программа:

В Arduino можно загрузить любой скетч, главное, чтобы скорость соединения была 115200.

снимаем галочку «по умолчанию» и жмем  кнопку «поиск портов» (особенно, если Arduino подключили после запуска программы)

выбираем порт с нужной нам платой Arduino. Если порт не предполагается менять — ставим галку «по умолчанию», чтобы программа впредь сразу к нему пыталась подключаться.

По идее связь должна быть установлена.

Остальные кнопки без соответствующей прошивки Arduino пока не нужны. Кроме, пожалуй кнопки «Свернуть». Кстати, приложение сразу появляется в трее с иконкой Мяч. Иконка пока работает приложение не скрывается — почему? Да чтобы трей не «плясал» от изменения количества иконок и было проще целиться в него пальцем.

При отключении Arduino программа будет пытаться установить связь с выбранным COM-портом. Как только связь восстановится программа самостоятельно переходит в дежурный режим.

Реализованные команды из Arduino в программу:

Serial.println(«»); // без пустой команды иногда были ошибки
Serial.print(«B/V/0/E»);  // отключение громкости

Serial.println(«»); // без пустой команды иногда были ошибки
Serial.print(«B/V/1/E»);  // уменьшение громкости

Serial.println(«»); // без пустой команды иногда были ошибки
Serial.print(«B/V/2/E»);  // увеличение громкости

Как видно, синтаксис команд прост

B — начало команды

E — окончание команды

Все внутри — параметры. Разделитель параметров «/».

Остальные базовые команды реализую в ближайшее время. Кроме того, возможно задействовать системные события (переход/восстановление в/из ждущего/спящего режимов — возможно при восстановлении появления сообщения. В коде уже убрал. Перекомпилированная версия 0.3.1)

RTT — ver 0.3.1

Критика, рекомендации приветствуются!
Также готов попробовать реализовать функции по Вашим заявкам

Приложение 1. Доступные малыми усилиями коды клавиш Windows

Приложение 2. Коды, предоставляемые средой разработки