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

Комментарии (3)


  1. MaxPro33
    04.12.2023 13:34

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


  1. smart_alex
    04.12.2023 13:34
    +1

    Ничего не понял — то ли статья так написана, то ли я отупел окончательно — что куда подключать (где схема?) и причем тут Ардуино?


  1. serafims
    04.12.2023 13:34
    +4

    А еще можно текст разукрашивать в консоли. И размер шрифта менять (в зависимости от эмулятора терминала). И еще можно рисовать красивые рамки, кнопки, заголовки и таблицы, используя ASCII-графику. То есть так можно вполне себе TextUI построить!
    Стоп, где-то же это было...