Для торгового автомата, описанного в статье, потребовалось дополнить программу новыми функциями. Требовался интерфейс оператора - несколько диалоговых окон:

До этого дисплей 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 торговых автоматов с различными версиями наших программ. Принципиальных отличий в интерфейсе от описанной версии у них мало, работает без замечаний.

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


  1. Kopcheniy
    06.09.2022 16:37
    +1

    Понравилась ваша статья про обратную разработку автомата. Благодарю, что поделились.

    Для новой версии автомата закупили мониторы с тачскрином.

    Монитор подключается к Малине по hdmi? А сенсорная панель управляется по каналу i2c, ктр есть в hdmi?

    Сам пока пытаюсь подключить дисплей с параллельным RGB интерфейсом к GPIO и пока не очень получается - нет картинки. Даже импульсов clock, hsync и vsync нет (пощупал осциллографом), хотя в файле config.txt включил поддержку dpi24.


    1. raspberry_pi_soft Автор
      06.09.2022 16:52

      Спасибо, приятно, если информация пригодится. Мониторы были двух типов, 15" - для альбомной ориентации изображения, 24" для портретной, оба по HDMI подключались. Знаю точно, нам пересылал производитель по одному экземпляру, чтобы поменьше багов было. Отдельно из каждого монитора выходит USB кабель, от тачскрина.

      А можно ссылку на Ваш дисплей, может, смогу что-то подсказать?


      1. Kopcheniy
        06.09.2022 17:06

        Дисплей точно рабочий от навигатора. Точного даташита не нашёл, но распиновка у многих дисплеев со шлейфом 40 pin один в один. Распиновку также уточнил по сигналам на рабочем дисплее. Очень похож этот https://static.chipdip.ru/lib/010/DOC004010158.pdf Может что-то не так настроил в config.txt, т к даже нет импульсов синхронизации.


        1. raspberry_pi_soft Автор
          06.09.2022 17:28

          Насколько понял, надо отключить в Pi i2c, i2s, spi

          dtparam=i2c_arm=off
          dtparam=spi=off
          dtparam=i2s=off

          в config.txt

          Иначе конфликт, они на те же ножки выходят, что и DPI 24


          1. Kopcheniy
            06.09.2022 17:38

            Отключил. Мои добавления в конце. Смотрел пример 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


            1. raspberry_pi_soft Автор
              06.09.2022 17:43

              Pi может не поддерживать 480x272 или заданные DPI timings. Попробуйте из примера использования DPI другой режим и параметры, чтобы добиться для начала сигнала хоть какого-то, осциллографом увидеть.


              1. Kopcheniy
                06.09.2022 18:00

                Благодарю за дельный совет.


    1. raspberry_pi_soft Автор
      06.09.2022 17:13

      Один из мониторов