Концепция донглов в Embedded устройствах
В этой статье мы рассмотрим не совсем типичный процесс взаимодействия с устройствами. Сразу замечу, что предлагаемая концепция применима преимущественно к мобильным устройствам, не привязанным к стационарному питанию. В качестве примера реализации мы будем использовать самую распространенную плату 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, про электрические схемы, а также контроллеры и их программирование.