
В этой статье мы рассмотрим не совсем типичный процесс взаимодействия с устройствами. Сразу замечу, что предлагаемая концепция применима преимущественно к мобильным устройствам, не привязанным к стационарному питанию. В качестве примера реализации мы будем использовать самую распространенную плату Arduino, но при необходимости подобные решения можно без труда реализовать и для микрокомпьютеров типа Raspberry и других макетных плат.
Типичное современное устройство будь то, мобильный телефон или пульт от телевизора – это самодостаточное устройство. То есть, они не требуют каких-либо дополнительных аппаратных компонентов для работы. Но, что, если наше устройство, заточено под выполнение конкретных задач и не является универсальным? В качестве примера можно рассмотреть считыватель RFID-карт
Для работы такого устройства в самодостаточном режиме нам необходимо использовать дисплей или светодиоды для визуального отображения результатов выполнения операции, выключатели и кнопки для того, чтобы пользователь мог взаимодействовать с устройством и собственно, аккумулятор в качестве источника питания.
Все это усложняет конструкцию, так как необходимо использовать большее число деталей, увеличивается размер и масса устройства, появляются дополнительные точки отказа. Ну и если говорить о сколько-нибудь серийной сборке то увеличивается и себестоимость производства устройства.
Но в некоторых случаях мы можем отказаться от использования периферийных компонентов. У любого из нас всегда есть с собой смартфон, который можно использовать в качестве интерфейса взаимодействия с нашим устройством.
Что такое донгл
Слово dongle англоязычная википедия трактует как устройство, которое будучи подключенным к порту другого устройства предоставляет ему дополнительную функциональность. Собственно, это то, что нам нужно, мы подключаем наше устройство к USB порту смартфона и получаем питание и возможность взаимодействия с интерфейсом.
С обеспечением питанием все достаточно просто – нам потребуется лишь переходник для подключения устройства к порту телефона. Так, если мы говорим об использовании платы Arduino Nano, то нужен переходник порт_телефона – mini USB. Здесь может возникнуть вопрос по требованиям к силе тока, так как порт смартфона вряд ли выдаст большой ток, но в случае с платой Arduino и устройства для чтения RFID, которое я использую в качестве примера, тока вполне достаточно для нормальной работы.
В качестве клиента для взаимодействия с интерфейсом в простейшем случае можно использовать соответствующие приложения, например USB Serial Console.
Пишем виртуальный интерфейс
Конечно, можно написать “толстого клиента”, то есть полноценное Android приложение, которое будет взаимодействовать с устройством через USB порт и визуально отображать рабочий интерфейс. Но эта задача уже больше относится к разработке под Android и требует соответствующих навыков. Да и оправдано это будет только если интерфейс взаимодействия с устройством будет достаточно сложным, например содержать большое количество настроек, спрятанных в отдельных меню.
Поэтому проще написать интерфейс для работы через серийный порт, чем мы сейчас и займемся. Общий принцип будет довольно простой: Основное меню с несколькими опциями, каждая из которых выбирается посредством указания соответствующей цифры.

Также, при необходимости могут выводиться подменю по следующему алгоритму.

Приступим к реализации. В рамках данной статьи я не буду рассматривать процесс установки Arduino IDE и рассказывать, что такое макетные платы. Публикаций на эту тему в Интернете достаточно. Вместо этого мы перейдем сразу к рассмотрению кода.
В начале инициализируем серийный интерфейс и отрисуем основное меню.
void setup() { Serial.begin(9600); Serial.setTimeout(50); Main_menu(); }
В основном цикле loop мы будем ожидать ввода значений.
void loop() { if (Serial.available()) { String str = Serial.readString(); Serial.println(str); Commands(str); }
Процедура Commands с пмощью конструкций case отлавливает нужные значения и вызывает процедуру для вывода соответствующего подменю.
switch (s[0]) { case '1': Serial.println("Command 1"); Command_1(); break; …
Таким образом, мы можем проваливаться в нужные меню и затем возвращаться в основное. В приведенном ниже примере я несколько упростил себе жизнь, использовав сквозную нумерацию, но при желании можно написать отдельные обработчики для разных меню.
Вот полный код нашего скетча:
void Main_menu() { Serial.println(""); Serial.println("Arduino Nano interface"); Serial.println(" Menu:"); Serial.println("1. Command 1"); Serial.println("2. Command 2"); Serial.println("3. Command 3"); Serial.println("4. Exit"); Serial.println(""); } void Command_1() { Serial.println(""); Serial.println("Command 1 interface"); Serial.println(" Menu:"); Serial.println("5. SubCommand 1"); Serial.println("6. SubCommand 2"); Serial.println("7. Exit"); Serial.println(""); } void Commands(String s) { Serial.println(""); switch (s[0]) { case '1': Serial.println("Command 1"); Command_1(); break; case '2': Serial.println("Command 2"); Main_menu(); break; case '3': Serial.println("Command 3"); Main_menu(); break; case '4': Serial.println("Exit"); Main_menu(); break; case '5': Serial.println("Subcommand 5"); Command_1(); break; case '6': Serial.println("Subcommand 6"); Command_1(); break; case '7': Serial.println("Exit"); Main_menu(); break; default: Main_menu(); break; } Serial.println(""); } void setup() { Serial.begin(9600); Serial.setTimeout(50); Main_menu(); } void loop() { if (Serial.available()) { String str = Serial.readString(); Serial.println(str); Commands(str); } }
В процессе отладки можно использовать непосредственно среду Arduino IDE, открыв Tools -> Serial Monitor.

Заключение
В этой небольшой статье мы рассмотрели альтернативный подход к разработке интерфейса взаимодействия между пользователем и самим устройством. Конечно, такой подход не всегда удобен и имеет свои недостатки, так как мы не можем использовать устройство без смартфона. Но в определенных случаях он может быть полезен.
В завершение хочу порекомендовать вам несколько бесплатных вебинаров про то кто такой Embedded developer, про электрические схемы, а также контроллеры и их программирование.
ссылка на оригинал статьи https://habr.com/ru/articles/777526/
Добавить комментарий