Введение в векторные дисплеи

Данная статья является переводом этой статьи.
Надеюсь мой перевод окажется не слишком топорным, а материал интересным.


Сегодня векторные дисплеи — это скорее старые диковинки, нежели средство отображения информации, тем не менее их применение в аркадных автоматах и радарных системах придает им определенный шарм.
В отличии от обыкновенных растровых дисплеев, где луч каждый раз проходит слева-направо и сверху-вниз для отрисовки каждой строки, в векторных дисплеях луч двигается по линиях, определяющих изображение.

Большинство двух-канальных осциллографов имеют режим XY, в которых сигнал, используемый для развертки изображения по времени, заменяется входным сигналом, тем самым позволяя управлять положением луча в двух плоскостях. Использование ШИМ-а с фильтром низких частот может быть эффективно для управления яркостью светодиода, но для того, что бы рисовать сложные фигуры необходим более быстрый способ. Наиболее простым способом является использование ЦАП (цифро-аналогового преобразователя) по схеме R-2R.

image

Если вам интересно узнать больше о создании векторного дисплея или о том как рисовать на экране осциллографа- добро пожаловать под кат.

Параллельный ЦАП по схеме R-2R


image
Восьмибитный ЦАП прост в изотовлении, для него требуется всего 16 резисторов на канал. Желательно использовать резисторы с однопроцентным допуском, но 5%-ные тоже сгодятся. Вам нужны 7 резисторов сопротивлением R и 9 сопротивлением 2*R.
В данном случае используются резисторы на 0.5 и 1 кОм.
Принципиальная схема преобразователя:

image

Так как мы управляем двумя каналами осциллографа, то нам нужно два ЦАП-а.

Если вы не хотите паять столько деталей, то можно использовать резисторные сборки в SIP корпусах либо использовать что-то вроде MC1408/1508 (умножающий ЦАП) в 16 пиновом DIP корпусе.

В данном проекте используется плата, основанная на микроконтроллере ATMEGA32U4, вы можете использовать практически любой другой другой микроконтроллер, главное что бы в нем было свободно два 8 пиновых порта, что бы можно было изменять состояние пинов одновременно.

Я использую порты PORTD и PORTB.

Настройка осциллографа


image
После спайки схемы подключите ее к осциллографу и переведите его в режим X-Y.
В недорогих Rigol-ах для этого необходимо войти в меню Horizontal Menu — Time Base и выбрать режим X-Y.
К сожалению недорогие цифровые осциллографы с LCD экранами уступают аналоговым в контексте рисования, хотя некоторые и имеют режим «Цифрового фосфора», симулирующий инертность экрана.

Горизонтальные и вертикальные линии


image

Подключив ЦАП-ы непосредственно к портам микроконтроллера аналоговое напряжение может меняется путем записи значений в порт. Например, для генерации сигнала напряжением 2 Вольта значение должно быть 256 * 2.0V / 5.0V == 102.

DDRB = 0xFF; 
PORTB = 102; //Значение, необходимое для генерации напряжения, равном 2 Вольта


В принципе нас не итересует конкретное значение напряжение, важно то что выходное напряжение линейно изменяется от 0 Вольт при 0x00 до 5 Вольт при 0xFF.

Осциллограф следует настроить на диапазон 0-5 Вольт и выровнять по каждой из осей.
Первое что следует попробовать это нарисовать горизонтальные и вертикальные линии, это можно сделать с помощью циклов, оставляя одну переменную неизменной. Например, при рисовании горизонтальной линии значение Y неизменно и наоборот.

void
line_vert(
        uint8_t x0,
        uint8_t y0,
        uint8_t w
)
{
        PORTB = x0;
        PORTD = y0;

        for (uint8_t i = 0 ; i < w ; i++)
                PORTD++;
}

void
line_horiz(
        uint8_t x0,
        uint8_t y0,
        uint8_t h
)
{
        PORTB = x0;
        PORTD = y0;

        for (uint8_t i = 0 ; i < h ; i++)
                PORTB++;
}


Код для рисования квадрата, наподобие того что на предыдущем рисунке.

 line_vert(64, 64, 128);
 line_vert(196, 64, 128);
 line_horiz(64, 64, 128);
 line_horiz(64, 196, 128);


Наклонные линии


image

Это изображение показывает распространенный артефакт векторных дисплеев: яркие точки в начале и конце линии. Этот эффект возникает потому, что интенсивность свечения точки зависит о времени, проведенного лучом в этой точке, а так как программе необходимо некоторое время для загрузки новой линии, то луч немного дольше задерживается на одном месте. Для решения этой проблемы можно использовать 16-битную арифметику или добавлять NOP-ы, что бы переключение всегда проходило за одно и тоже время.

Тут нужно сказать о выгорании экрана.

Если значения не меняются длительное время, то фосфор в этом месте может выгорать и становится другого цвета. Экраны также могут повреждается, если постоянно выводить одно и тоже изображение. Во время прошивки микроконтроллера порты обычно переключаются в Z-режим, что означает что на вход осциллографа подаются нули, что выражается в появлении яркого пятна в углу экрана.

Во время перепрошивки лучше всего снижать яркость.

Рисование наклонных линий намного сложнее чем рисование вертикальных или горизонтальных линий.
Идеальным вариантом является использование аналоговых схем для плавного изменения сигнала, как, например, это сделано в SC200.

В прочем, вместо этого мы можем использовать алгоритм Брезенхема, для разбиения линии на точки. Применение данного алгоритма вызывает появление ступенек на изображении, но это компенсируется простотой реализации.

void
line(
        uint8_t x0,
        uint8_t y0,
        uint8_t x1,
        uint8_t y1
)
{
        int dx, dy, sx, sy;

        if (x0 < x1)
        {
                dx = x1 - x0;
                sx = 1;
        } else {
                dx = x0 - x1;
                sx = -1;
        }

        if (y0 < y1)
        {
                dy = y1 - y0;
                sy = 1;
        } else {
                dy = y0 - y1;
                sy = -1;
        }

        int err = dx - dy;

        while (1)
        {
                PORTB = x0;
                PORTD = y0;

                if (x0 == x1 && y0 == y1)
                        break;

                int e2 = 2 * err;
                if (e2 > -dy)
                {
                        err = err - dy;
                        x0 += sx;
                }
                if (e2 < dx)
                {
                        err = err + dx;
                        y0 += sy;
                }
        }
}


Шрифты


image

После того как мы научились рисовать линии ничто не мешает так же рисовать символы.
В качестве шрифта удобно использовать библиотеку Hershey Fonts.
В ней каждый символ состоит из менее чем 32 точек. Все координаты точек расположены относительно нижнего левого угла символа и соединены до тех пор, пока не встретится значение (-1, 1), которое означает, что нужно перепрыгнуть к следующей точке. Контур заканчивается в точке с значением(0, 0).
Пример для числа 1.

typedef struct {
  int8_t x, y;
} path_t;

static const PROGMEM path_t digits[][32] = {
        [1] = {
                { 6,17},
                { 8,18},
                {11,21},
                {11, 0},
        },
};



Иногда на изображении вы можете увидеть линии между двумя точками, которые не соединяются, это объясняется тем, что напряжение на ЦАП-е изменяется не мгновенно. Этот эффект можно исправить если использовать канал яркости осциллографа, к сожалению мой осциллограф не имеет такой функции.

Растровые изображения


image
С помощью осциллографа также можно отображать растровые изображения.
Изображения получаются путем преобразования картинки в формат X Bitmap посредством ImageMagick. X Bitmap это текстовый формат для представления изображений, может использоваться напрямую в исходниках.
convert -resize 256x256 input.jpg image/image.xbm

В результате появляется монохроматическое изображение, занимающее 8 килобайт памяти программы.

Видео


Oscilloscope vector clock
Если видеоролик не отображается, его можно найти по ссылке www.flickr.com/photos/osr/7925036218/in/set-72157631344809602

Планы на будущее


image
В будущем я планирую восстановить замечательный ЭЛТ осцилограф и портировать Spacewar с PDP-1.
Поделиться публикацией
Комментарии 27
    +6
    Это прекрасно. Прямо даже захотелось стереть пыль со своего осциллографа и сделать какое-нибудь полезное устройство на нём. А так же наконец повторить VGA-монитор из осциллографа и написать статью сюда

    типа такого


    К сожалению картинки из оригинального моего поста все побились :((( dlinyj.livejournal.com/144457.html

      +1
      Так же есть очень интересное видео, которое можно опробовать самому, при наличии осциллографа с X и Y-входами — которое демонстрирует векторную графику. Это демосценерское поделие, и по моему реализованно даже на ZX-Spectrum

      www.youtube.com/watch?feature=player_embedded&v=s1eNjUgaB-g

      Его можно реализовать самому, если скачать файлик kapsi.fi/~jpa/stuff/other/youscope-wave.flac залив его в плеер, и подключив левый и правый канал соответственно к x и y входу. И насладится им
        +1
        Ухты, спасибо!
        Интересно, можно ли каким-либо образом прикрутить еще Z-канал? Например, с помощью фильтра?
          0
          В смысле?
            +1
            На сколько я понял в этом проекте не используется канал яркости, было бы круто оставив старый интерфейс(аудио выход) добавить поддержку изменения яркости.
              0
              Для поддержки изменения яркости требуется усилитель и разница потенциалов от -30 до +30 В (в зависимости от модели осциллографа). Только для данной демки это не требуется.

              А вообще, использовать векторные дисплеи с помощью звуковой карты — ИМХО, это крутая идея!
            0
            Странно, что ты это не видел. Известнейшая демка, по моему на всех РЭ форумах уже засветилась.

            Вот еще одна, выглядит попроще, но вроде как тут на динамики идет то же самое, что и на осцилл. И вот это уже круть нереальная. youtu.be/J1ylMJwfLmM
              0
              Круто, даже не знаю что сказать :)
              Кстати, может кому будет интересно, генерация сигнала авр-кой.
              axio.ms/projects/scope3d/

                0
                Нет, если бы на динамики и на экран выводилось бы одно и тоже, то кубы превращались бы в шум, а музыка в кулю-мулю.
                  0
                  Не, на самом деле можно извратиться. Графику рисовать на надзвуковых частотах, используя послесвечение осцила, а звук выводить в один канал, уводя луч за экран.
              +1
              Даже на бюджетном цифровике кое-что разглядеть можно :)



                0
                Круто, да. Я впервые на цифровике и увидел
                  0
                  Я до этого не видел, лень как-то было (ну в реале, на видео разумеется смотрел). А сейчас и осцилл под рукой, и ссылка на файл, и кусок провода с джеком на столе валяется…
                  0
                  Блин, а я так и не смог ее проиграть. Ни на аналоговом ни на цифровом. Видимо звуковой тракт у меня совсем не ахти. Пробовал и через плеер, и через ноут и через звуковуху компа.
                    0
                    Легко проиграл. Кстати сделал это впервые, закачав по ссылке в комменте Длинного. Пришлось покрутить развёртку конечно, и выбрать момент, когда хоть что-то вменяемое видно.
                      0
                      Я что то вменяеме видел, но оно было настолько зашумленное, что капец…
                +4
                Ещё в тему поста, поделие SVO — Злошник



                Тоже на AVR (ATmega8), плюс отечественная трубка. Описание, да ещё и на русском со схемой и прошивкой тут: sensi.org/~svo/zloshnik/

                З.Ы. Это не реклама и никакой заинтересованности, кроме передачи знаний более широкому кругу лиц у меня нет.
                  +1
                  Вот только я хотел запостить фотку осциллографа с виндой…
                  +1
                  Напомню что была полностью векторная игровая консоль — VECTREX: ru.wikipedia.org/wiki/Vectrex
                  В наши дни, по идее, можно сделать для неё аппаратный эмулятор на каком-нибудь ПЛИСе.
                    0
                    У деда часы 24 часовые, как на первом скрине. Непривычно так время смотреть на них.
                    Работа замечательная, продолжайте дальше.
                      0
                      Кстати, мечтал раньше о векторном рабочем столе на компе, чтобы на любом устройстве отрисовывалось всё без пикселей. И делать экраны раздвижные. Взял монитор, растянул и на стену повесил :D
                      +2
                      Истинно векторный способ генерации изображения, применявшийся в аналоговых ЭЛТ-осциллографах, в современных моделях уже практически не применяется. Осциллографы с ЖК-экраном вообще не имеют луча, а имеют матрицу пикселей. Они просто эмулируют управление лучом с помощью встроенного ПО или вычислительной электроники, а информация отображается в традиционном растровом виде. Например, Rigol DS1052E, что на одной из фоток, имеет ЖК-экран.

                      То же относится к цифровым осциллографам, даже если они имеют ЭЛТ-экран. Некоторые такие осциллографы можно переключить в аналоговый режим (напр. некоторые модели Hameg), и тогда станет возможно управлять лучом от входных сигналов. Впрочем, мало кто эксплуатирует и эти осциллографы в таком режиме. Поначалу я часто переключал, но потом, когда привык к «цифре», стал это делать все реже и реже.
                        +4
                        > применение в аркадных автоматах и радарных системах

                        Забыли об еще одном типе устройств, где используется векторное отображение картинки: это лазерные проекторы.
                          0
                          Логотип Хабра на осциллографе смотрелся бы впечатляюще ;)
                            +1
                            Сделаете его в векторе? ;)
                            0
                            Были ещё советские осциллографы-мультиметры С1-107 и С1-112. Один такой С1-112 у меня до сих пор лежит.
                            image
                              0
                              Отчего-то вспомнился Vectrex: en.wikipedia.org/wiki/Vectrex

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое