Для торгового автомата, описанного в статье, потребовалось дополнить программу новыми функциями. Требовался интерфейс оператора - несколько диалоговых окон:
До этого дисплей 24" выполнял только функции отображения рекламного видео - сразу после включения, и индикации неисправности в виде иконок внизу экрана. Для новой версии автомата закупили мониторы с тачскрином.
Как видно из картинки выше, задача диалоговых экранов - индикация данных от датчиков, выбор видео по умолчанию в режиме "offline", отправка письма в сервисную службу и справочник ( учебные видео как загрузить новый контейнер с сиропом и т.п.).
Для Заказчика была важна зрелищность. Диалоговые экраны должны были быть красивыми и положительно влиять на продажи его автоматов, особенно при демонстрации возможностей на выставках. Вот такой маркетинг. Для этого был нанят дизайнер, дизайн экранов несколько раз переделывался, обсуждался всем коллективом Заказчика. Результат в виде картинок для каждого экрана прислали нам как исходное, например:
Моей задачей было прежде всего - "не испортить дизайн". Надежность, простота в отладке и минимум проблем при последующем сопровождении само собой разумелись.
После некоторых раздумий решил использовать Python с библиотекой Pygame. Скорости Raspberry Pi хватало, даже если постоянно пересылать картинку. Конечно, в оконном режиме и с постоянной пересылкой не всё так радужно, но в полноэкранном режиме и с однократной пересылкой фона никаких задержек не заметно. Основной плюс - короткий простой исходник и мой полный контроль над распределением ресурсов процессора.
Небольшое отступление. Приходилось разрабатывать программы пульта оператора с интерфейсом пользователя для больших корабельных радиоэлектронных комплексов. Сложные правила, большая и непростая программа, но объемы данных от разных источников были небольшими, и Питона хватало. Писали две большие программы пульта оператора для гидроакустических станций, там объемы данных за единицу времени большие и без C/C++ уже никак. На Raspberry Pi не самый производительный процессор, но отличный видеочип и превосходная поддержка его в Pygame. На Raspberry Pi старались избегать тяжеловесных GUI библиотек, обычно ограничивались Pygame, SDL2, Tkinter. Если Заказчик не настаивал на конкретной библиотеке. Но вернемся к нашей задаче.
Одновременно программа должна была выполнять чтение UART с данными о состоянии автомата, опрос модуля АЦП ADS1115 ( подключенного к термопаре ), опрос 3G/4G модема по SNMP протоколу ( уровень сигнала сети и IP ), отправку телеметрии на сервер. Графический интерфейс пользователя не должен была мешать этим задачам. Добавьте к этому периодическое желание Заказчика что-то улучшить в интерфейсе, добавить или убрать кнопку, и т.п.
Для воспроизведения основного видео мы использовали программу hello_video.bin, достоинство - очень быстрый старт повтора, основное ограничение - поддержка только видеофайлов *.h264. Поверх этого видео иконки аварии отображались с помощью программы pngview, пример вызова:
./pngview -b 0x0000 -x 115 -y 360 alert_icon1.png &
Эту же программу использования для показа черного квадрата на весь экран до запуска основной программы. Было такое пожелание Заказчика, меньше показывать тексты и загрузку ОС после включения автомата.
Для показа обучающих видео выбрали omxplayer, пример вызова для отображения видео в окне:
omxplayer "How to clean the filter.mp4" --orientation 90 --no-keys --layer 4 --win 1045,190,1530,880 &
Заказчику требовалось два варианта исполнения GUI, для вертикального ориентированного монитора и горизонтального. Программу писали у себя на своем Raspberry Pi, процесс отладки:
Для отладки взаимодействия с новым "железом" использовали кой-какие простые имитаторы, например потенциометр как имитатор разной температуры от термопары + модуль АЦП ADS1115, три Arduino Uno для эмуляции плат цветной подсветки в тороговом автомате:
Окончательно отлаживали удаленно на торговом автомате Заказчика, для этого уже пришлось на настольном ПК Заказчика устанавливать VNC viewer, одного SSH уже не хватало. Это касается графических окон. Для отладки было удобнее запускать программу в оконном режиме, чтобы одновременно видеть сообщения в терминале.
Видео на нашем мониторе, как выглядит результат:
Заказ был завершен успешно, со слов Заказчика, его ожидания в части маркетинга оправдались и покупать автоматов стали больше, особенно на тематических выставках. Плюс упростилось использование автомата, у покупателей стало меньше вопросов при эксплуатации.
Далее писали версии для другого состава оборудования автомата, добавляли поддержку других 4G модемов, поддержку других протоколов и многое другое. В настоящий момент у Заказчика в сети более 10000 торговых автоматов с различными версиями наших программ. Принципиальных отличий в интерфейсе от описанной версии у них мало, работает без замечаний.
Kopcheniy
Понравилась ваша статья про обратную разработку автомата. Благодарю, что поделились.
Монитор подключается к Малине по hdmi? А сенсорная панель управляется по каналу i2c, ктр есть в hdmi?
Сам пока пытаюсь подключить дисплей с параллельным RGB интерфейсом к GPIO и пока не очень получается - нет картинки. Даже импульсов clock, hsync и vsync нет (пощупал осциллографом), хотя в файле config.txt включил поддержку dpi24.
raspberry_pi_soft Автор
Спасибо, приятно, если информация пригодится. Мониторы были двух типов, 15" - для альбомной ориентации изображения, 24" для портретной, оба по HDMI подключались. Знаю точно, нам пересылал производитель по одному экземпляру, чтобы поменьше багов было. Отдельно из каждого монитора выходит USB кабель, от тачскрина.
А можно ссылку на Ваш дисплей, может, смогу что-то подсказать?
Kopcheniy
Дисплей точно рабочий от навигатора. Точного даташита не нашёл, но распиновка у многих дисплеев со шлейфом 40 pin один в один. Распиновку также уточнил по сигналам на рабочем дисплее. Очень похож этот https://static.chipdip.ru/lib/010/DOC004010158.pdf Может что-то не так настроил в config.txt, т к даже нет импульсов синхронизации.
raspberry_pi_soft Автор
Насколько понял, надо отключить в Pi i2c, i2s, spi
в config.txt
Иначе конфликт, они на те же ножки выходят, что и DPI 24
Kopcheniy
Отключил. Мои добавления в конце. Смотрел пример 1, пример 2, пример 3 документацию. Подумал, может вы пробовали подключать дисплеи таким образом.
мой config.txt
For more options and information see
http://rpf.io/configtxt
Some settings may impact device functionality. See link above for details
uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1
uncomment the following to adjust overscan. Use positive numbers if console
goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
uncomment to force a console size. By default it will be display's size minus
overscan.
#framebuffer_width=1280
#framebuffer_height=720
uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1
uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
uncomment to force a HDMI mode rather than DVI. This can make audio work in
DMT (computer monitor) modes
#hdmi_drive=2
uncomment to increase signal to HDMI, if you have interference, blanking, or
no display
#config_hdmi_boost=4
uncomment for composite PAL
#sdtv_mode=2
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800
Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18
Additional overlays and parameters are documented /boot/overlays/README
Enable audio (loads snd_bcm2835)
dtparam=audio=on
Automatically load overlays for detected cameras
camera_auto_detect=1
Automatically load overlays for detected DSI displays
display_auto_detect=1
Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2
Disable compensation for displays with overscan
disable_overscan=1
[cm4]
Enable host mode on the 2711 built-in XHCI USB controller.
This line should be removed if the legacy DWC2 controller is required
(e.g. for USB device mode) or if USB support is not required.
otg_mode=1
[all]
[pi4]
Run as fast as firmware / board allows
arm_boost=1
#Это добавил
Enable DRM VC4 V3D driver on top of the dispmanx display stack
#dtoverlay=vc4-fkms-v3d
#max_framebuffers=2
[all]
#Это добавил для первого подключения по UART
#enable_uart=1
#core_freq=250
#Выключаем все интерфейсы, ктр используют выводы GPIO
dtparam=i2c_arm=off
dtparam=spi=off
dtparam=i2s=off
#Включаем поддержку DPI дисплея
dtoverlay=dpi24
enable_dpi_lcd=1
display_default_lcd=1
#Включаем настраиваемый пользователем режим
dpi_group=2
dpi_mode=87
dpi_output_format=0x6f005
#Пока не знаю какой фронт у экрана активный: передний или задний. Если нужно - инвертировать.
dpi_timings=480 1 8 4 43 272 1 8 4 12 0 0 0 60 0 9000000 3
#overscan_left=0
#overscan_right=0
#overscan_top=0
#overscan_bottom=0
framebuffer_width=480
framebuffer_height=272
raspberry_pi_soft Автор
Pi может не поддерживать 480x272 или заданные DPI timings. Попробуйте из примера использования DPI другой режим и параметры, чтобы добиться для начала сигнала хоть какого-то, осциллографом увидеть.
Kopcheniy
Благодарю за дельный совет.
raspberry_pi_soft Автор
Один из мониторов