Опыт работы с советским газоразрядным дисплеем ГИП-10000 (ИМГ-1-02)
Краткая справка
ГИП-10000 была разработана Рязанским НИИ «Плазма» в 1977. Дальнейшее её производство, вплоть до развала СССР, осуществлялось на Ровенском заводе «Газотрон».
Конструктивно ГИП-10000 представляет собой пакет из двух стёкл, между которыми находятся диэлектрическая маска и две взаимно перпендикулярные системы анодных и катодных электродов. Внутренний объём панели заполнен газовой смесью Пеннинга (98–99% Ne + 1–2% Ar) под давлением около 100 мм.рт.ст. По периметру пакет заклеен компаундом.
Напротив пересечений электродов в диэлектрической маске сделаны отверстия размером 0.6 мм с шагом 1 мм. В катодных электродах так же сделаны отверстия, которые образуют информационные ячейки (пиксели) панели. При подаче напряжения величиной 240В в этих ячейках возникает тлеющий разряд:
Режим индикации только динамический с построчным (покатодным) сканированием.
ИМГ-1–02
Ко мне эта матрица попала в составе полуфабриката под названием ИМГ-1–02.
Этот дисплей представляет из себя конструкцию в виде «бутерброда» из двух печатных плат. На нижней плате распаян катодный коммутатор, состоящий из дешифратора, сделанного на основе цифровой логики 133 серии, и высоковольтных ключей в виде транзисторных npn-сборок К1НТ661А. К этой же плате припаяна и приклеена непосредственно сама газоразрядная панель ГИП-10000:
На верхней плате распаяны анодные ключи на базе таких же транзисторных сборок, система защиты дисплея от остановки развертки, а также 4 полиэтиленовых шлейфа, служащие для питания и управления дисплеем:
Первая проблема, с которой я столкнулся — на этот дисплей нет нормальной документации. Есть справочный листок с техническими характеристиками и есть рекламка из журнала «Электронная промышленность» за октябрь 1980 года:
Ни распиновки шлейфов, ни принципа управления, ни электрических схем — в сети ничего нет. Конечно, можно было бы попробовать самому составить схему по рисунку дорожек на печатных платах, но бездеструктивно это вряд ли получилось бы сделать.
К счастью, в сети нашелся человек под ником cool.e1337, который поделился со мной распиновкой шлейфов. Огромное человеческое спасибо ему за это.
Распиновка шлейфов ИМГ-1–02
Axxx — входы коллекторов транзисторов анодных ключей
ENxx-xx — входы эмиттеров транзисторов анодных ключей сгруппированных в десятки
X1-X8 — входы дешифратора выбора строк
Разобравшись с распиновкой, первым делом я подключил питание +240В и +5В с целью проверки работоспособности самой газоразрядной панели. На дисплее зажглась первая строка:
Но почему строка зажглась, ведь на входы анодных ключей ничего не подано? А всё дело в том, что каждый анодный ключ у ИМГ-1–02 выполнен на одном NPN-транзисторе:
В момент, когда транзистор закрыт, ток течет через резистор R1 и в этом случае ячейка панели светится. А когда транзистор открыт, то ток течет по цепи R1-R2-кэVT1, и ячейка в этом случае не светится, так как напряжение на выходе ключа составляет около 90В, что значительно ниже напряжения возникновения и поддержания разряда. Энергия при этом рассеивается в тепло на резисторах и транзисторе.
С точки зрения энергоэффективности это не самое удачное схемотехническое решение. Для улучшения ситуации разработчики дисплея, видимо, предлагали использовать входы ENxx-xx и отключать неиспользуемые десятки анодных ключей. Но это неудобно, так как усложняет управление дисплеем. К слову, в изделии ИМГ-1–03 входы ENx просто притянуты земле (GND), разработчики там тоже не заморачивались.
Далее необходимо было убедиться в работоспособности катодного коммутатора. Дешифратор принимает на вход номер строки в двухразрядном двоично-десятичном виде (BCD), X1-X4 соответствуют единицам строк, X5-X8 десяткам. К его входам я подключил микроконтроллер atmega328p, который быстро перебирал строки от 1 до 100, чтобы полностью зажечь всё поле дисплея:
Из-за конструктивных особенностей катодных электродов, у ранних версий ГИП-10000 (с желтой маской) некоторые пиксели кривые:
Это вызвано тем, что газовый разряд возникает не ровно по центру этих ячеек, а немного в стороне:
В более поздних версиях ГИП-10000 (с серой маской) этот дефект устранён:
Подключение к МК
Почему я назвал этот дисплей полуфабрикатом? Потому что ни схемы развертки, ни знакогенератора, ни ОЗУ, ни фреймбуфера, ни высоковольтного преобразователя здесь нет — всё это нужно делать самому. Просто так сходу подключить его к какой-нибудь условной «ардуине» не получится.
Первым делом нужно было решить, как и чем управлять сотней анодных ключей. Ничего лучше, проще и дешевле, чем «паровозик» из 13 сдвиговых регистров 74HC595 я не придумал. Для управления дешифратором я поставил в «паровозик» ещё один регистр.
Вторая проблема — как физически соединить дисплей с микроконтроллером? У дисплея есть 4 гибких шлейфа по 32 контакта с шагом 1.25 мм и логично было бы попробовать их использовать, вместо того, чтобы паять лапшу из МГТФ.
Под руку попали два 50-контактных SCSI шлейфа. Как раз то что надо для 100 анодных ключей. Для соединения шлейфов с дисплеем я сделал две небольшие переходные платки:
Регистры 74HC595 распаял на макетных платах МГТФом:
Получилась такая схема:
Таким образом, управление всем дисплеем осуществляется по шине SPI всего лишь по трём проводам (не считая питание). Загружаем 13 байт с графическими данными строки, загружаем 1 байт с номером строки, щёлкаем «защёлкой» — строка отображается на дисплее, переходим к следующей. И так все 100 строк, минимум 60 раз в секунду.
Теперь можно подключить дисплей к МК и что-нибудь отобразить:
Как видно на фотографии, на дисплее светится крайний левый столбец (на самом деле это первая строка, так как дисплей стоит боком), но светится явно он не должен. Почему это происходит?
Если запустить очень медленную развертку, то можно увидеть откуда возникает данный дефект:
Дело в том, что в газоразрядных индикаторах тлеющий разряд возникает не мгновенно после приложения электрического потенциала на электроды, а спустя некоторое время, называемое временем запаздывания развития разряда.
Оно зависит от многих факторов: от состава газа, от площади электродов, от уровня начальной ионизации, от температуры, от уровня внешней освещённости, от величины тока/напряжения и т.п. Для его уменьшения используются различные методы и решения.
Чаще всего это, так называемые keep-alive элементы, т.е. элементы индикации которые горят постоянно, создавая вокруг себя облако ионизированного газа.
В некоторых газоразрядных панелях американского производства эти элементы размещаются возле катодов с которых начинается развёртка и светят на обратную сторону дисплея. А в «Электронике МС6205», например, постоянно подсвечиваются промежутки между строками.
В ИМГ-1–02 применяется метод в виде форсирующей цепочки (вольтдобавки), включенной в цепь первого катодного электрода:
В момент, когда дешифратор включает первую строку, происходит разрядка конденсатора C1, что приводит к кратковременному выбросу напряжения на катоде величиной -120 В (240–120), относительно «земли»:
Разность потенциалов между анодом и катодом в этом момент составляет 360В (240+120), что и вызывает подсвечивание всей строки.
Для отключения форсирующей цепочки достаточно отпаять один из выводов конденсатора C1, после чего дефект изображения исчезнет.
Bad Apple!
Разобравшись с выводом графики на дисплей можно попробовать запустить на нём Bad Apple!:
Для этого я написал простенькую программку на python, которая последовательно читает кадры из видеоролика, делает необходимые преобразования при помощи OpenCV (resize, threshold, crop), переводит кадр в битовый формат и шлет его построчно-побайтно по UART.
Со стороны МК (atmega328p) тоже очень простая программа, которая в бесконечном цикле постоянно обновляет картинку на дисплее, а в прерывании от UART помещает принятый байт в фреймбуфер. Интересно то, что я не использовал двойную буферизацию — приёмный буфер кадра и буфер отображения один и тот же (так как размер фреймбуфера 1300 байт, а объём SRAM у atmega328p всего 2048 байт). Так, конечно, делать не надо, но тем не менее всё очень хорошо работало.
Но монохромная графика это слишком просто и скучно. Можно попробовать вывести на дисплей что-нибудь более интересное, например Лену в 8 оттенках «серого»:
Тут используется нечто похожее на FRC (frame rate control), т.е. кадр формируется с градациями цветов из нескольких монохромных изображений. Для формирования восьмицветного кадра требуется 3 монохромных изображения.
Но, как показала практика, 8-ми оттенков для этой панели слишком много, так как разница между некоторыми градациями цветов практически не заметна даже в статических сценах.
Наиболее оптимальной является четырехцветная палитра, для которой требуется всего 2 монохромных изображения, которые можно сформировать по следующему алгоритму:
Читаем изображение и преобразуем его палитру в градации серого (256 уровней).
Преобразуем изображение в 4-цветное с палитрой [0,85,170,255]. Для сглаживания рекомендуется применить какой-нибудь алгоритм дизеринга. В принципе, если не использовать дизеринг, то этот шаг можно пропустить.
Снижаем глубину цветности до 2-бит. Для этого целочисленно делим значение цвета каждого пикселя на 64. Получаем изображение с палитрой [0,1,2,3]
Первое монохромное изображение формируется из остатков от деления значения каждого пикселя на 2.
Для второго изображения сначала целочисленно делим значение каждого пикселя на 2, а затем так же формируем из остатков от деления на 2.
Для удобства дальнейшей работы сразу при этом объединяем два изображения в один вертикальный кадр.
Код на python для последних четырёх пунктов:
def img_to_raw_frame(input_img, output_frame):
output_frame = numpy.zeros((input_img.shape[0] * 2, input_img.shape[1]), dtype=np.uint8)
input_img = input_img >> 6 # Reduce bitdepth to 2-bit
for y in range(input_img.shape[0]):
for x in range(input_img.shape[1]):
for i in range(2):
output_frame[y + input_img.shape[0] * i][x] = (input_img[y][x] >> i) % 2
return output_frame
Теперь при следующих вариантах комбинаций первого и второго изображения на дисплее можно получить 4 оттенка:
При выводе изображения на дисплей, каждая строка второго изображения должна быть включена ⅔ от общего времени горения строки, а каждая строка первого ⅓ времени. За счет персистенции зрения (инерционности) и достигается эффект многоцветности.
Чтобы было понятнее, вот небольшая гифка иллюстрирующая в упрощённом виде происходящее. Слева — то, что происходит на дисплее в очень замедленном виде, справа — то что в итоге видит глаз:
Возможно возникнет логичный вопрос — почему бы просто не выводить в нужном порядке каждое монохромное изображение целиком? Увы — из-за физических особенностей газоразрядных панелей изображение при этом начинает сильно мерцать. Для подавления мерцания можно многократно увеличить частоту развертки, но при этом возникает проблема с яркостью изображения и временем поджига строки (чем выше частота развертки, тем ниже уровень остаточной ионизации и тем хуже и дольше поджигается каждая последующая строка).
Новый драйвер
В ходе работы с этим проектом вылезло несколько подводных камней:
Родные шлейфы дисплея оказались очень плохого качества. Во-первых они изготовлены из полиэтилена, который плавится от малейшего прикосновения паяльником. Даже если пытаться охлаждать место пайки металлической пластинкой, то полиэтилен всё равно скукоживается. Во-вторых медные проводники шлейфа от старости окислились и стали очень хрупкими. Они постоянно ломались в местах пайки и изгиба. Потом искать среди сотни проводников какой конкретно отвалился было не самой приятной задачей. Нужно менять эти шлейфы на что-то другое. Конечно, самый простой вариант припаять напрямую провода типа МГТФ, но мне всё-таки хотелось бы некоторой модульности и возможности, при необходимости, разобрать всю эту конструкцию.
Повышающий преобразователь, который обеспечивал высоковольтное питание дисплея был построен на контроллере mc34063 по топологии step-up. Он прекрасно работал с выходным напряжением 200В, но этого мало для ГИП-10000 (для более-менее нормальной работы нужно как минимум 230В). А вот при повышении выходного напряжения выше 210В уже начинались проблемы с КПД, максимальной мощностью и нагревом компонентов. Нужно было менять его на что-то более эффективное.
Стекло панели ужасно бликует.
Вся эта конструкция в виде переходных плат, SCSI-шлейфов и макеток была очень громоздкой и неудобной. А с учётом того, что всё было ещё соединено при помощи проводков для беспаечных макетных плат, то постоянно возникала проблема, когда что-то где-то отвалилось или плохо контачит. Нужно сделать одну плату на которой должно быть всё распаяно.
Сперва я начал поиски замены шлейфов. Перелопатив большое количество каталогов, я остановил свой выбор на комплекте разъёмов KLS1-XL6–1.25–30-H (розетка на кабель) и KLS1-XL6–1.25–30-RM2 (разъём на плату). Это 30 пиновые разъёмы с шагом 1.25 мм, которые идеально встали на место родных шлейфов:
Для борьбы с бликами я применил самое простое решение — наклеил на стекло панели матовую пленку для планшетов:
Повышающий преобразователь
В ИМГ-1–02 используется не самая удачная конструкция анодных ключей. При самом неблагоприятном исходе (момент, когда высокое напряжение подано, а дисплей ничего не отображает, т.е. все транзисторы анодных ключей открыты) потребление тока по высоковольтной шине составляет почти 40 мА при напряжении 240 В. Почти 10 Вт уходят на обогрев помещения.
Изначально я планировал сделать преобразователь на каком-нибудь специализированном ШИМ-контроллере, типа MAX1771, но по ряду причин отказался от этого варианта.
В итоге я сделал обыкновенный обратноходовой повышающий преобразователь на ШИМ-контроллере UC2843. Это очень старый, широко распространенный и дешёвый контроллер. Применяется он буквально везде, начиная от зарядных устройств для смартфонов, заканчивая сварочными инверторами. Несмотря на свой возраст (первые упоминания о нём я находил в статьях за 1982 год), свою работу он выполняет отлично.
Схема преобразователя получилась следующая:
Ничего необычного, за исключением того, что вместо RCD-снаббера применяется рекуперирующая цепочка.
Почему и зачем
Главным недостатком любого обратноходового преобразователя является выброс напряжения на стоке силового ключа от индуктивности рассеивания, который может достигать нескольких сотен вольт. И если не предпринимать никаких мер, то рано или поздно этот выброс пробьёт силовой ключ.
Обычно для борьбы с этим выбросом применяют RCD-снаббер, или снаббер на TVS-диоде, или их связку. Но этот метод рассеивающий, т.е. всё что он делает — в нужный момент времени преобразует энергию от индуктивности рассеивания в тепло. Понятно, что на КПД преобразователя это влияет негативным образом, и логично было бы попробовать направить эту энергию обратно в источник питания, т.е. рекуперировать её. К счастью не пришлось изобретать велосипед, так как уже есть готовые методы и решения.
Скажу лишь, что основной недостаток такого метода — требуется дополнительная обмотка рекуперации, количество витков которой примерно равно количеству витков первичной обмотки. В повышающих преобразователях это не проблема, так как число витков первичной обмотки невелико. А вот в сетевых блоках питания, где первичная обмотка содержит пару сотен витков, такое решение становится уже слишком накладным, поэтому повсеместно не используется. Да и производителям в общем-то плевать на то, что 5-Ваттная зарядка будет иметь КПД 80%, а не 90.
Сделав пробную плату (собирать на макетке такие преобразователи противопоказано), я провел нагрузочные испытания, результаты которых свел в табличку:
U in, V | I in, A | U out, V | I out, A | P in, W | P out, W | КПД, % |
10 | 1,158 | 239,9 | 0,0431 | 11,58 | 10,339 | 89,289 |
12 | 0,966 | 239,7 | 0,0436 | 11,592 | 10,451 | 90,157 |
14,5 | 0,787 | 239,9 | 0,0427 | 11,412 | 10,244 | 89,765 |
16 | 0,722 | 239,8 | 0,0432 | 11,552 | 10,36 | 89,681 |
КПД 89–90%, что для обратноходового повышающего преобразователя очень неплохой результат. А если учесть, что стоимость его деталей чуть больше 100 руб., то результат просто замечательный.
Одновременно со всем этим я не спеша трассировал печатную плату для нового драйвера. Суть осталась та же — паровозик из регистров 74HC595, только теперь в корпусе TTSOP. Также на плате распаян вышеописанный повышающий преобразователь:
Далее платы были заказаны в Китае, изготовлены, отправлены, получены, распаяны. После чего мне предстояла очень муторная и монотонная работа — обжатие нескольких сотен (я делал несколько драйверов сразу) проводков калибром 26AWG клеммами KLS1-XL6–1.25-T. Это гораздо сложнее, чем обжим клемм под контакты с шагом 2.54 мм, так как одно неловкое движение, приложил чуть большее усилие — и либо клемму передавливает, либо перерезает провод.
Наконец, ИМГ-1–02 начал приобретать вид законченного изделия:
Подключение к ПК и запуск Doom
Запуск DOOM на этой панели это, конечно, громко сказано. На самом деле DOOM будет работать на ПК, а ИМГ-1–02 будет работать в качестве монитора, а если точнее — будет просто показывать захваченную область экрана. Но тем не менее, выглядит это очень необычно.
Для начала я сменил МК на STM32F103С8. Суть осталась примерно та же, что и в проекте c Bad Apple! — по таймеру обновляем картинку на дисплее, принимаем данные по UART и помещаем их в буфер. Только теперь их два — в один записываются принятые данные по UART, второй используется в качестве фреймбуфера. После прихода очередного кадра буферы меняются местами. Приёмом данных и записью их в буфер теперь занимается контроллер DMA.
Со стороны ПК программа тоже претерпела изменения. Во-первых, в качестве входного потока она теперь принимает область экрана (модуль MSS). Во вторых программа обзавелась полноценным GUI (модуль dearpygui), в котором можно настроить:
Com-порт и скорость соединения
Размер и положение области захвата
Тип алгоритма дизеринга: Флойд-Стейнберг, Аткинсон, Бёркес, Сиерра, Байер, либо вообще отключить его
Параметры изображения либо в ручном режиме (яркость, контрастность, гамма)
Либо в автоматическом. На выбор два алгоритма — либо автоматическое выравнивание гистограммы, либо адаптивное контрастно-ограниченное выравнивание (CLAHE)
Для того, чтобы это всё быстро шевелилось и выдавало стабильные 60 FPS, для всех функций, связанных с обработкой изображений (за исключением использующих OpenCV), я использую JIT-компилятор Numba.
Результат моих трудов можно увидеть в этом видео:
Думаю, у многих возникнет закономерный вопрос –, а какая задержка между тем, что отображается на мониторе и тем, что отображает ИМГ-1–02?
Технически, конечно, можно замерить время выполнения питоновского кода для обработки одного кадра и исходя из этого прикинуть величину лага. Но этот метод не совсем корректный, так как при таком способе имеет место быть «эффект наблюдателя».
Поэтому я воспользовался старым дедовским методом — включил секундомер с миллисекундами, так чтобы он отображался и на мониторе и на ИМГ-1–02, и сделал несколько фотографий. Результат, честно говоря, превзошёл все ожидания:
Да, изображение на ИМГ-1–02 отображается в среднем на 0.03–0.04 секунды раньше, чем на мониторе. Т.е. можно сказать, что лаг отрицательный (относительно монитора).
Заключение
В заключение хотелось бы сказать пару слов про «доставаемость» таких дисплеев. На сегодняшний день ИМГ-1 (ИМГ-1–02 и ИМГ-1–03) уже можно отнести к разряду сложнодоставаемых. Во-первых их и так было выпущено не очень много (тираж за всё время производства составил меньше 10000 штук). Во-вторых много таких дисплеев было уничтожено золотодобытчиками-афинажниками. Тут ещё сыграл злую шутку желтый цвет маски, который некоторые принимали за позолоту.
Но, как я писал в самом начале статьи, ГИП-10000 применялась в изделии под названием Электроника МС6205. Этот девайс найти гораздо проще (особенно жителям Украины). Он представляет из себя текстовый знакосинтезирующий дисплей и изначально в графическом режиме работать не может.
После публикации своих первых результатов с ИМГ-1–02 мне стали неоднократно поступать вопросы по поводу переделки МС6205 в графический вариант. Чтобы не курочить свои дисплеи я приобрел несколько останков от МС6205, с которых были сняты все золотосодержащие компоненты, но самое ценное для меня — панели ГИП-10000 были живы. Спустя некоторое время я родил вот такой вот драйвер:
В качестве анодных ключей здесь используются микросхемы от плазменных телевизоров SN755870N, а в качестве катодных связка из дешифратора основе 74HC238 и 74HC139 + ULN2803. Оно всё прекрасно работает, но, к сожалению, всплыло несколько подводных камней (устранимых), из-за которых я пока заморозил этот проект. Но рано или поздно я обязательно доведу его до победного конца и обязательно про это напишу.
На этом пока всё. С радостью отвечу в комментариях на все ваши вопросы, мысли, идеи, предложения.
Репозиторий проекта
https://github.com/iiiytn1k/IMG-1–02
Источники
http://www.155la3.ru/img1_02.htm
https://www.edn.com/power-tips-91-how-to-improve-flyback-efficiency-with-a-nondissipative-clamp/
Якимов О. П. Газоразрядные матричные индикаторные панели. — М.: Советское радио, 1980
Вуколов Н. И., Михайлов А. Н. Знакосинтезирующие индикаторы: Справочник — М.: Радио и связь, 1987.