Концепция донглов в Embedded устройствах

42c4e5644b9d793e45ba0ac42937119a.png

В этой статье мы рассмотрим не совсем типичный процесс взаимодействия с устройствами. Сразу замечу, что предлагаемая концепция применима преимущественно к мобильным устройствам, не привязанным к стационарному питанию. В качестве примера реализации мы будем использовать самую распространенную плату Arduino, но при необходимости подобные решения можно без труда реализовать и для микрокомпьютеров типа Raspberry и других макетных плат.

Типичное современное устройство будь то, мобильный телефон или пульт от телевизора — это самодостаточное устройство. То есть, они не требуют каких-либо дополнительных аппаратных компонентов для работы. Но, что, если наше устройство, заточено под выполнение конкретных задач и не является универсальным? В качестве примера можно рассмотреть считыватель RFID-карт

Для работы такого устройства в самодостаточном режиме нам необходимо использовать дисплей или светодиоды для визуального отображения результатов выполнения операции, выключатели и кнопки для того, чтобы пользователь мог взаимодействовать с устройством и собственно, аккумулятор в качестве источника питания.

Все это усложняет конструкцию, так как необходимо использовать большее число деталей, увеличивается размер и масса устройства, появляются дополнительные точки отказа. Ну и если говорить о сколько-нибудь серийной сборке то увеличивается и себестоимость производства устройства.

Но в некоторых случаях мы можем отказаться от использования периферийных компонентов. У любого из нас всегда есть с собой смартфон, который можно использовать в качестве интерфейса взаимодействия с нашим устройством.

Что такое донгл

Слово dongle англоязычная википедия трактует как устройство, которое будучи подключенным к порту другого устройства предоставляет ему дополнительную функциональность. Собственно, это то, что нам нужно, мы подключаем наше устройство к USB порту смартфона и получаем питание и возможность взаимодействия с интерфейсом.

С обеспечением питанием все достаточно просто — нам потребуется лишь переходник для подключения устройства к порту телефона. Так, если мы говорим об использовании платы Arduino Nano, то нужен переходник порт_телефона — mini USB. Здесь может возникнуть вопрос по требованиям к силе тока, так как порт смартфона вряд ли выдаст большой ток, но в случае с платой Arduino и устройства для чтения RFID, которое я использую в качестве примера, тока вполне достаточно для нормальной работы.

В качестве клиента для взаимодействия с интерфейсом в простейшем случае можно использовать  соответствующие приложения, например USB Serial Console.

Пишем виртуальный интерфейс

Конечно, можно написать «толстого клиента», то есть полноценное Android приложение, которое будет взаимодействовать с устройством через USB порт и визуально отображать рабочий интерфейс. Но эта задача уже больше относится к разработке под Android и требует соответствующих навыков. Да и оправдано это будет только если интерфейс взаимодействия с устройством будет достаточно сложным, например содержать большое количество настроек, спрятанных в отдельных меню.

Поэтому проще написать интерфейс для работы через серийный порт, чем мы сейчас и займемся. Общий принцип будет довольно простой: Основное меню с несколькими опциями, каждая из которых выбирается посредством указания соответствующей цифры.  

eb1ad63f7ba0c6b6715f13dc1144f07c.png

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

0fe202d1adb2cac7a36137ce2f724a0b.png

Приступим к реализации. В рамках данной статьи я не буду рассматривать процесс установки 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.

15414d7fa6a08f3fca84b83d39dde2f2.png

Заключение

В этой небольшой статье мы рассмотрели альтернативный подход к разработке интерфейса взаимодействия между пользователем и самим устройством. Конечно, такой подход не всегда удобен и имеет свои недостатки, так как мы не можем использовать устройство без смартфона. Но в определенных случаях он может быть полезен.

В завершение хочу порекомендовать вам несколько бесплатных вебинаров про то кто такой Embedded developer, про электрические схемы, а также контроллеры и их программирование.

© Habrahabr.ru