Концепция донглов в 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, про электрические схемы, а также контроллеры и их программирование.


ссылка на оригинал статьи https://habr.com/ru/articles/777526/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *