Как инженеру мне всегда импонировала русская прагматичная манера именования новых продуктов. Если какой-нибудь западный маркетолог может назвать небольшое игровое устройство на базе ЭЛТ «The Vectormatic Score-Master 3000» (Векторматический рекордсмен 3000), то русские склонны использовать более содержательные названия. И поскольку рассматривается третья попытка создания векторной системы отрисовки, то и назвали бы они ее «Векторная рисовальная машина №3». Счет инженеры — маркетологи (15: 0).
Еще много лет назад меня увлекла идея использования небольшой осциллографической электронно-лучевой трубки для отображения аналоговых часов. Это начинание, конечно, сулило эстетическое удовольствие, но в то же время казалось нелепым. Идея заменить цепочку механических связей на микроконтроллер, управляющий двумя высоковольтными дифференциальными усилителями, и независимый высоковольтный источник питания только, чтобы, грубо говоря, показывать время – казалась немного глупой.
Если при этом учесть всю работу по реализации каждого этапа процесса, в результате которого должно получиться достойного вида устройство, и прибавить детальную проработку дизайна, то весь проект уже намекал на свою монументальность.
Ни одна из множества предполагаемых задач не представляла особых трудностей сама по себе, но если брать в целом, то именно этап интеграции всего воедино в таких проектах и раскрывает сложности взаимосвязей отдельных компонентов.
В данной статье рассматривается сборка простой космической игры на базе ЭЛТ. В этом проекте описывается архитектура, приводятся конструкторские заметки, комментируется использованное оборудование, электроника, реализация питания высокого напряжения, а также процесс лазерной резки корпуса.
Общие сведения
Корпус собран из двух основных частей, изготовленных из плиты МДФ при помощи лазерной резки. В верхней части размещается ЭЛТ-дисплей, БП высокого напряжения, каналы отклонения и соответствующие калибраторы. В нижней части размещен джойстик, кнопки, микроконтроллер и БП низкого напряжения. Сзади расположен разъем питания и гнездо USB mini B. Верхний сегмент корпуса одевается на нижний, и вся эта конструкция фиксируется плоской панелью управления, на которой находится джойстик и кнопки.
ЭЛТ
Используемая ЭЛТ – это D7-16G, которая имеет чуть больше 76мм в диаметре, 160мм в длину и работает от аккумулятора. Три таких ЭЛТ я купил много лет назад как раз для подобных проектов.
ЭЛТ D7-16G
В ней используется 11-контактный коннектор типа 30-232, найти который весьма проблематично. После недолгих раздумий у меня возникла идея собрать собственный, вырезав заготовку лазером из листа акрила и подобрав подходящие контактные штырьки от цоколя ламповой панели.
Сборный коннектор 30-232
Для этого я разработал в Autocketch две составные заготовки таким образом, чтобы контакты электронно-лучевой трубки располагались вдоль контура “D” левой детали. Затем каждая эта деталь была вырезана из 3мм акрилового листа и склеена. Контакты я извлек из новой ламповой панели B9A, вставил в склеенную заготовку и слегка загнул для фиксации, после чего припаял к их выводам провода, заизолировав соединения термоусадкой.
Высоковольтный блок питания
Этот блок основан на импульсном стабилизаторе SG3525, запускающем двухтактный каскад N-FET, сопровождаемый небольшим ферритовым трансформатором со вторичными катушками высокого и низкого напряжения. Высоковольтная сторона проходит через положительный полуволновой выпрямитель, генерируя около 240В постоянного тока, после чего понижается параллельным стабилизатором до 210В. Выпрямленное напряжение подается на усилители отклонения и потребляет около 7мА. Напряжение вторичной обмотки ВН также удваивается, генерируя примерно -600В, 1мА, для смещения луча электронной пушки. Балансировка любого постоянного тока вторичной обмотки, способного насыщать сердечник или вызывать его магнитное смещение, реализуется положительными и отрицательными выпрямителями.
Структура трансформатора начинается с первичной обмотки в середине, после которой идет заземленное начало вторичной обмотки ВН, заканчивающейся выводом под анодным напряжением. В завершении идет обмотка низкого напряжения, которая используется для накала спирали электронно-лучевой трубки. Такой порядок выбран, чтобы избежать пробоя между обмотками высокого и низкого напряжения. Проговорив все это, я задумался о данной топологии и, пожалуй, найду время для ее доработки.
Блок ВН и устройство отклонения
Я так давно не использовал ферритовый броневой сердечник, что совершенно забыл о его электропроводности. Это привело к возникновению пробоя между верхней частью вторичной обмотки и заземленным ферритом, в результате чего из строя вышло несколько пар транзисторных драйверов первичной стороны STN3NF06L. В ходе выяснения причины я заменил их на пару более устойчивых TO252 (100A/8mΩ), способных выдержать даже подачу 12В, 1А и запустить трансформатор с короткозамкнутыми витками.
Я был несколько растерян, обнаружив, что стабилизатор SG3525 бывает не только в широком, но и в узком корпусе SOIC. В итоге посадочное место на печатной плате оказалось неподходящим, и пришлось заказывать узкую деталь из Великобритании.
Усилитель отклонения
Проектирование этой подсистемы оказалось непростой задачей, в связи с чем много времени ушло на работу с симулятором SPICE, который помог понять все нюансы.
Вот краткая спецификация:
- несимметричный вход 0..5В
- дифференциальный выход с размахом >80В на каждое плечо
- при 210В ток потребления менее 2мА
- возможность питания от 12В
- отсутствие отрицательных шин
- полоса пропускания >500кГц со сдвигом фазы менее 5° по отношению к расчетной
В течение нескольких дней я изучил несколько топологий, начиная с каскодной двухтактной схемы с источником втекающего тока. Изначально был опробован и оптимизирован только стационарный режим. После достижений базовых значений постоянного тока, я занялся параметрами переменного. Конденсатор, соединяющий эмиттеры двухтактной схемы (что не удивительно) существенно влияет на усиление переменного тока, частоту, фазовые характеристики и, судя по всему, выраженно взаимодействует с эмиттерными резисторами, а также связанными с ними стоками.
Здесь в качестве улучшения можно применить термостабилизацию путем термоскрепления выходных устройств (если учесть, что сейчас это SOT-233, то задача не из легких). В качестве альтернативы, конечно же, можно перейти на их монтирующиеся в отверстия аналоги, что существенно упростит задачу.
Было бы неплохо использовать схему, в которой фазовый сдвиг и усиление оказались бы менее зависимыми. Но текущий простой вариант, итак, преодолел многие сложные технические преграды, поэтому дополнительное требование стало бы уже чересчур обременительным.
Плата контроллера и ЦАП
Учитывая, что основная задача микроконтроллера в повторяющемся вычислении строки векторных пар каждые несколько десятков миллисекунд, то мне показалось резонным использовать для этого недорогой и простой вариант.
Очевидными кандидатами были ATmega328P и ST micro STM32F103C8T6. В итоге был выбран первый исключительно за более широкие возможности и (некогда) популярность. В процессе сборки платы на удивление выяснилось, что мной по случайности был куплен контроллер версии “B”, но об этом чуть позже.
В целом его плата проста и включает в себя USB-преобразователь FT232RL, двухканальный 8-битный ЦАП, интерфейс для джойстика и кнопок, дополнительный интерфейс I2C и стабилизатор 5В. Можно было использовать Arduino Nano с материнской платой, но текущее решение отличалось простотой и удобством подключения.
Плата контроллера и ЦАП
Системные требования подразумевают работу с одной шиной, что ограничивает выбор ЦАП. Изначально я взял TLC7528, который, вроде как, имеет токовый выход, но при более подробном изучении оказалось, что он может быть настроен на работу в режиме выхода напряжения. В сочетании с операционными усилителями TSH82 это оказалось плохим вариантом, так как искажение даже на минимальных уровнях сигнала составляло несколько процентов. Решил я эту проблему, заменой ЦАПа на AD7302, в котором реализовано два выхода напряжения и время установления 2мкс.
Искажение в несколько процентов может все испортить
Оглядываясь назад, можно предположить, что искажение при использовании TLC7528 могло быть связано с ограниченным входным синфазным диапазоном связанных с ним TSH82. Это легко проверить, удалив эти операционные усилители, и нарисовав круг Лиссажу на осциллографе непосредственно с помощью щупов.
В итоге ряд конструктивных ошибок подтолкнули меня к пересборке этой, казалось бы, простой платы: выбор ЦАП, изначальное использование FT232RL и отсутствие привязки соответствующего вывода TST к земле. Так же я совершил ошибку в схеме подключения USB-разъёма на плате (перепутал сигнальные провода), которую временно исправил с помощью самодельного кабеля.
Новый микроконтроллер, набор инструментов и загрузчик
Как я уже говорил, на удивление обнаружилось, что заказанные мной ранее ATmega328P непостижимым образом оказались менее популярной разновидностью “B”. Они полностью бинарно-совместимы со своими младшими собратьями за исключением лишь сигнатуры чипа. При этом в более новом варианте есть ряд полезных дополнительных функций, включая поддержку второго USART.
Arduino предоставляет новейший набор инструментов, который, как ни странно, не был доступен на сайте Atmel. Эти инструменты пришлось извлечь и собрать в портативный пакет, в связи с чем они больше не опирались на фреймворк Arduino. После я обновил соответствующий makefile проекта, чтобы он ссылался на новый контроллер и инструменты.
С учетом совместимости чипов, стандартный загрузчик Arduino был запрограммирован на более новом при помощи относительно небольшой AVR Studio 4 IDE, которую я выбрал за простоту интерфейса. XML-файл описания нового контроллера нужно было создать на основе старой версии. В итоге основными отличиями стали его номер и соответствующая сигнатура.
Для прошивки проекта использовалась утилита make и, соответственно, файл makefile. При таком подходе набор инструментов занял всего около 30Мб, а не сотни, как в случае с использованием «современных» интегрированных IDE.
Реальные программисты не используют IDE
Прошивка
Система спроектирована рисовать около 10К векторных пар в секунду. При скорости обновления в 50Гц это означает возможность отрисовки 200 векторов. После каждых 200 векторов (20мс) передний план получает сигнал для обновления их списка, чтобы игра могла выполняться в достаточно плавном режиме.
Несколько процессов системы требуют возможности вращения векторов. При этом, несмотря на очевидную резонность использования десятичного значения в диапазоне 0..359 градусов, такое решение потребует задействовать U16 и окажется излишне громоздким. После недолгих размышлений я решил, что будет уместным обработать максимально возможный объем данных с помощью S8 (от +127 до –128). Это также подойдет для представления координат X/Y (с учетом применения 8-битного ЦАП) для выражения угла (примерно ±180 градусов).
Обновление экрана осуществляется посредством прерывания таймера и является единственным способом управления ЦАПами. Векторы считываются из буфера ping или pong и повторяются до момента переключения буфера задачей переднего плана. Каждый буфер начинается со счетчика U8 и продолжается до следующей доступной точки записи, сопровождаемой точкой чтения. После этого он содержит список значений X и Y, сохраненных в формате U8.
Направление космического корабля изменяется движением джойстика влево/вправо. Сам корабль отображается в виде четырех точек а-ля с шеврона из сериала Стар Трек, вращающихся вокруг своего центра. Для каждого вектора требуется поиск sin и cos, 4 операции умножения и две сложения. Всего получается 37 вычислений за одно вращение, что в целом составляет примерно 200 инструкций. Космический корабль всегда будет отрисовываться первым, и первой векторной парой всегда будет его носовая часть, поэтому в выходном буфере эта векторная пара будет стартовой точкой для пуска ракет.
Запуск ракет осуществляется нажатием соответствующей кнопки. Они вылетают из носовой части корабля и продолжают движение по его текущему курсу. Уничтожение ракеты, которых одновременно может быть запущено не более 16, происходит при столкновении с астероидом или при достижении ей видимого радиуса космоса. Данная модель полета основана на рисовании линий между носом корабля и границей видимого радиуса, где дельта X и дельта Y вычисляются при запуске. Дельта X/Y – это фиксированная точка 8.8, так же, как и скорость.
Корабль в центре, астероид внизу
Объекты астероидов появляются в случайном месте радиуса и летят по нему прямо под углом между 80 и 140 градусами. При их появлении генерируется случайная стартовая и конечная позиции, которые затем преобразуются в декартовы координаты, и вопрос о прямой линии решается во многом аналогично ситуации с ракетами.
При столкновении ракеты с астероидом, обе сущности уничтожаются, и текущий счетчик очков увеличивается. Численные объекты дисплея берутся из «7-сегментной» таблицы поиска.
Весь «тяжелый» процесс игры выполняется при помощи функции «вращения», которая используется для добавления входного объекта (астероид, космический корабль, 7-сегментное значение и т.д.) в выходной буфер. Помимо этого, она позволяет входному объекту вращаться, а также применять смещение по осям X и Y. При этом ничто не мешает добавить во входной буфер взвод инопланетных кораблей в составе 2х2, после чего взять их как группу и развернуть перед отрисовкой.
Механическая часть
Придание этому космическому устройству эстетичности потребовало уже гораздо больше усилий, хотя сам процесс оказался намного занятнее, чем я ожидал. Изначально наклон корпуса ЭЛТ получился заметно ниже, чем планировалось, и в итоге несколько часов ушло на поиск способа вырезать сдвижной фиксирующий сегмент таким образом, чтобы верхние и нижние части можно было соединить подходящим образом.
Первичный дизайн
Какую же оказывается большую разницу могут внести буквально несколько градусов. Я был поражен тем, насколько в итоге изменился эстетический вид, и насколько криво смотрелся первый вариант с наиболее развернутым углом.
Комплект: модуль ЭЛТ, нижний сегмент корпуса и крышка передней панели
ЭЛТ зафиксирована при помощи круглых кронштейнов из МДФ, приклеенных к верхней части отсека. Изнутри эти кронштейны обшиты эластичным поролоном на клейкой основе.
Пустой ЭЛТ-фронт с фиксатором корпуса и разметкой под печатную плату
По фотографиям сложно заметить, что панель управления с джойстиком и кнопками надежно фиксирует ЭЛТ-модуль, препятствуя его обратному выдвижению.
Пакеты, использованные для проектирования корпуса
Для начального проектирования верхнего и нижнего сегментов корпуса использовался редактор Inkscape с расширением “The Laser Cut Box”. В качестве связки этих сегментов выступили только зубчатые вырезы. Итоговую заготовку из Inkscape я просто скопировал и вставил в Autosketch, в котором произвел все необходимые доработки.
Для нарезки заготовок из МДФ я использовал лазерный резак 70Вт. Рабочий цикл оказался достаточно быстрым, что позволило параллельно успеть опробовать альтернативные конструкторские идеи.
Заключение
Как я и рассчитывал, на этом проекте мне удалось многому научиться, поскольку все, кроме разве что встроенного микроконтроллера, оказалось за гранью моего обывательского опыта.
Очевидно, что на базе этого устройства отрисовки векторов можно разработать много разных игр и приложений. Пока что я однозначно хочу добавить на плату модуль синхронизации (через I2C), реализовав свой давний замысел по отображению аналоговых часов. Остальные возможные доработки будут вноситься постепенно.
Неприличный, конечно, получился промах со схемой USB mini B и первой безуспешной попыткой использовать ЦАП с токовым выходом в режиме выхода напряжения. Но в остальном я даже не знаю, что бы еще исправил в случае повторной сборки такого агрегата.
В текущем проекте были достигнуты все намеченные цели, включая расширение кругозора, в процессе чего, как это часто бывает, не обошлось без сюрпризов.
Связаться с автором Mark Atherton можно по почте markaren1@xtra.co.nz