Хотелось бы поделиться опытом создания простых графических интерфейсов пользователя (GUI) для настройки различных устройств на микроконтроллерах. В статье речь пройдет про одну из моих давних конструкций — универсальный цифровой интерфейс трансивера. А именно про то, как простым способом добавить возможность настройки устройства через полноценное оконное приложение, а не через команды терминала.
Чаще всего устройства на микроконтроллерах (МК) общаются с пользователем с помощью USB подключения. Для этого используется специальный периферийный модуль МК UART и USB-UART переходник.
Для чего это соединение бывает необходимо? Например, в дешифраторе диапазонов можно установить какие выходы управления будут использовать на конкретном диапазоне. И после настройки сохранить их в энергонезависимой (EEPROM или FLASH) памяти МК. Конечно, всё то же самое можно сделать с помощью внешних органов управления. Например, назначить дополнительные функции на кнопки переключения или вообще каждый раз менять исходный код и записывать новую прошивку в память устройства. Но это не очень удобно. Гораздо приятнее общаться с устройством с помощью удобных команд, а еще лучше с помощью нажатия кнопок в оконном интерфейсе.
Далее речь пройдет про конкретное устройство, которое обладает довольно обширной функциональностью.
1. Оно имеет 16 выходов для управления внешними устройствами (например, коммутаторами антенн).
2. Оно умеет общаться с трансивером по интерфейсу RS232 и отдавать данные на ПК по USB (например, для аппаратного журнала).
3. Оно позволяет автоматически включать один из выходов в зависимости от выбранного диапазона в трансивере.
4. Оно имеет независимую настройку выходов по диапазонам для режимов RX и TX (можно выбрать разные антенны для приема и передачи).
5. Можно вручную переключать выходы (режим ручного антенного переключателя) с помощью кнопок UP и DOWN. При нажатии кнопки SAVE текущий выход будет связан с выбранным диапазоном.
И еще довольно много дополнительных функций, о которых можно прочитать в первоначальной статье.
Я использую этот интерфейс на удаленной позиции, поэтому для меня было важно иметь возможность не нажимая кнопок провести настройку выходов или сохранить новую конфигурацию антенн. Собственно, поэтому родилась идея сделать небольшое приложение, которое сможет переключать выходы и сохранять текущую конфигурацию в память МК.
На помощь в очередной раз пришел бесплатный ИИ Deepseek. Если кто-то еще не знаком с возможностями искусственного интеллекта, то самое время этим заняться. Он прекрасно справляется с задачей написания простого графического интерфейса пользователя на Python. От меня потребовалось только довольно четко описать задачу и вставить фрагменты кода из обработчика команд, которые принимает устройство и описать формат того, как устройство отвечает на эти запросы.
Фрагмент кода демонстрирует обработчик 5 команд в прошивке устройства.
void CommandHandler() { if (flag_comm_get) { SendSettingsResponse(); flag_comm_get = 0; } if (flag_comm_up) { flag_comm_up = 0; if (LL_GPIO_IsInputPinSet(PTT_IN_GPIO_Port, PTT_IN_Pin)) { HandleBandChange(1, RX_MODE); } else { HandleBandChange(1, TX_MODE); } } if (flag_comm_down) { flag_comm_down = 0; if (LL_GPIO_IsInputPinSet(PTT_IN_GPIO_Port, PTT_IN_Pin)) { HandleBandChange(-1, RX_MODE); } else { HandleBandChange(-1, TX_MODE); } } if (flag_comm_save) { flag_comm_save = 0; if (LL_GPIO_IsInputPinSet(PTT_IN_GPIO_Port, PTT_IN_Pin)) { HandleSaveOperation(RX_MODE); } else { HandleSaveOperation(TX_MODE); } } if (flag_comm_band) { flag_comm_band = 0; USART1_Send_String("CURRENT BAND: "); USART1_Send_IntToString(flag_band); USART1_Send_String("\n"); } }
В итоге ИИ создал рабочий вариант удобного интерфейса, который написан на Python и может работать как в Linux, так и в Windows. Архив с исходником и exe-файлом для Windows можно скачать по ссылке.
Приложение позволяет выбирать антенну для каждого диапазона, как на прием так и на передачу, а также сохранять все настройки в энергонезависимую память МК. Побочным эффектом этого стала возможность переключения антенн удаленно, то есть была реализована функциональность USB переключателя антенн.
Таким образом, даже не зная достаточно хорошо Python, можно создавать простые оконные приложения для общения с устройствами на МК буквально за считанные минуты. Кроме того, ИИ умеет довольно неплохо улучшать web-интерфейсы устройств созданных, например, на базе WI-FI модулей ESP8266.
Вот к примеру web интерфейс WI-FI измерителя мощности и КСВ до улучшения
и после:
Также обработке подвергся web-интерфейс управления антенной K9AY. До:
И после:
Также ИИ может помочь с написанием кода для web-страничек конфигурации чего-то посложнее. Например, ИИ помог сделать удобную страницу настроек для моего проекта удаленного управления и передачи звука CAESAR. Получился полноценный web-интерфейс с возможностью настройки звука, записи конфигурационных файлов и перезапуска запущенных сервисов.
Все эти возможности, предоставляемые DeepSeek или Qwen бесплатно (пока бесплатно?), сильно ускоряют и облегчают разработку и улучшение внешнего вида различных пользовательских интерфейсов. Главное в этом деле — четко формулировать то, что вы желаете получить на выходе, и иметь хотя бы базовые знания в языке программирования Python.