Функционирует при финансовой поддержке Федерального агентства по печати и массовым коммуникациям (Роспечать)

Механическое что-то-такое-видение

Как собрать механический телевизор из бумаги и лампочки

Можно смело утверждать, что все телевизоры, мониторы, планшеты, смартфоны обязаны своим появлением технологическому отверстию. Попросту говоря — дырке. Именно отверстие лежит в основе камеры-обскуры, изобретенной, как считается, в VI веке до нашей эры. Оно же легло в основу всего современного телевидения — с помощью отверстий считывалось и показывалось изображение в механическом телевидении. Вместе с инженерами AvitoTech мы решили воспроизвести один из этапов зарождения телевидения и «на коленке» собрать механический телевизор с диском Нипкова.


Телик. Начало

Скорее всего, кроме возможности взмыть в воздух человечество всегда мечтало и о том, чтобы наладить быстрое общение на расстоянии: не ждать, пока голуби или «курьерская» служба тамплиеров доставят письма, и уж тем более отказаться от необходимости лично доставлять что-то пешком. Можно сказать, что первые шаги к исполнению этой мечты были сделаны в VI веке до нашей эры. Именно к тому времени относятся первые упоминания камеры-обскуры.

Это простое устройство представляло собой небольшую темную внутри коробку, в одной из стенок которой было проделано небольшое отверстие, проще говоря — дырка. Отраженный от объектов внешнего мира свет, проходя через дырку диаметром до полумиллиметра, падал на расположенную напротив стену коробки. В результате на ней появлялось изображение внешнего мира — правда, перевернутое. Для VI века изобретение было удивительным.

Долгое время устройство использовалось только для развлечения. Однако в VIII веке камеры-обскура, которые позволяли детальнее разглядывать звездное небо, начали применять для астрономических наблюдений. В XVI веке художники впервые применили устройство для рисования пейзажей со сложной перспективой — камеру доработали, оснастив зеркалом и стеклянным подстольем. Там располагалась бумага, на которую проецировалось изображение. Художникам оставалось только аккуратно перенести на холст.

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

Пинхол-фотография

Наконец, в 1884 году немецкий техник Пауль Нипков изобрел первое механическое устройство, позволявшее раскладывать изображение на линии, — диск Нипкова. Это был легкий металлический диск, по краю которого на равном угловом расстоянии друг от друга находятся небольшие отверстия равной величины. Они расположены по спирали в один оборот таким образом, что последнее отверстие в спирали (дальше прочих от края диска) находится в точности под первым.

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

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


Построчная развертка

Благодаря диску Нипкова появилась техническая возможность улавливать изображение (причем движущееся!) и передавать его на расстояние: сначала по проводам, а потом и по радио. Идея для современного человека выглядит простой: за непрозрачным диском со спирально расположенными отверстиями необходимо расположить фоточувствительный элемент, например фоторезистор (резистор, сопротивление которого уменьшается в зависимости от степени его освещенности) или фотодиод (устройство, генерирующее напряжение, величина которого зависит от освещенности).

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

Таким образом формируется непрерывный изменяющийся сигнал, с которым можно работать. Например, через усилитель, который повышает передаваемое по проводу напряжение, подключить обычную лампочку, а напротив расположить второй диск Нипкова, вращающийся с той же скоростью, с которой вращался «читавший» изображение первый диск. В этом случае на одном из секторов второго диска возникало движущееся изображение: мигающая лампа для каждого отрезка траектории движения точек диска давала свою освещенность, которая складывалась в картинку.

Позднее провод заменили радиосигналом, в который научились помимо аудио- добавлять и видеосигнал. Так появилось механическое телевидение, имевшее только один (зато неоспоримый) плюс: конструкция передатчиков и приемников изображения была очень простой.

А вот минусов было много. Основным, пожалуй, можно считать очень низкую четкость изображения по вертикали (хотя по горизонтали благодаря плавному движению отверстий четкость была очень высокой) — сказывалось небольшое количество отверстий, которые можно было разместить в спирали (обычно их было от 30 до 50 на диске диаметром от 30 до 50 сантиметров). В целом же плотная спираль позволяла разложить изображение на 200 строк, однако при этом страдала ширина изображения. В телевидении большинства стран был принят стандарт изображения в 30 строк (иначе говоря, линий), а в Канаде, например, действовал свой уникальный стандарт — 180 строк.


Механические телевизоры как устройства отображения движущихся изображений вошли в обиход в 1920-х годах — после того, как устройство, в основе которого лежал диск Нипкова, разработал шотландский инженер Джон Лоуги Бэрд, — но просуществовали недолго. В конце 1930-х годов механические телевизоры почти полностью были вытеснены телевизорами на электронно-лучевых трубках русского инженера Владимира Зворыкина и американского изобретателя Фило Фарнсуорта.

Сегодня механическое телевидение транслируется только на нескольких любительских радиоканалах США. Однако изобретение Нипкова используется и по сей день. Это неотъемлемая часть некоторых моделей конфокальных микроскопов и камер для рапидной съемки. Но самое главное заключается в другом: принцип построчной развертки изображения послужил одной из основ для создания электронно-лучевых и жидкокристаллических дисплеев, а позднее и диодных матриц на органических диодах. В них изображение тоже формируется построчно, а каждая строка представлена пикселями.


Игла, паяльник и немного магии

Вместе с инженерами «Авито» мы решили собрать механический телевизор — правда, с небольшим налетом современности.

Если в первых механических телевизорах настройка изображения производилась вручную с помощью переменного резистора (он изменял напряжение, подаваемое на электромотор, который вращал диск, изменяя и частоту его вращения; позднее настройку автоматизировали с помощью синхронизирующих импульсов, передаваемых в радиосигнале), то в нашей версии управление частотой вращения было решено доверить Arduino. При этом данные о скорости вращения диска Нипкова мы будем получать с помощью датчика скорости вращения с оптопарой (фотодиод и светодиод) и реперного диска на валу электромотора.

Сам диск Нипкова мы сделали, воспользовавшись утилитой, написанной американским программистом Гэри Миллардом, — Nipkow Disc DXF Generator. Она позволяет, указав диаметр диска, рассчитать расположение отверстий спирали и вывести их в виде изображения для последующей печати. Утилита позволяет генерировать схему диска Нипкова для 30- и 32-строчной развертки.

На странице автора также можно найти еще одну полезную утилиту, которая пригодится нам в этом проекте, — Video2NBTV. Она позволяет конвертировать видео в звуковой сигнал, которым можно будет впоследствии зажигать светодиод для формирования изображения. Кроме того, нам потребуются два транзистора КТ819Г (или любых других биполярных NPN-транзистора со схожими характеристиками), резистор на 1 килоом, резистор 500 ом, блок питания на 12 вольт, электродвигатель с питанием от 12 вольт (идеально подойдет, например, двигатель от корпусного компьютерного кулера), паяльник, флюс, немного припоя и несколько часов на программирование микроконтроллера.

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

В этой схеме используется каскад из двух транзисторов (выполняют роль ключей), который позволяет управлять светодиодом. Когда на входе появляется аудиосигнал, то есть отличный от нуля уровень напряжения, первый транзистор открывается сам и открывает второй. После этого ток начинает свободно протекать через светодиод, и тот загорается. Как только аудиосигнал пропадает, оба транзистора закрываются, и светодиод гаснет. Еще до подключения к источнику звука работу этой схемы можно легко проверить: достаточно подключить ее к источнику питания и коснуться аудиоразъема пальцем — светодиод загорится.

Помимо транзисторного каскада для управления светодиодом, необходимо собрать и логическую часть телевизора, которая будет управлять вращением диска Нипкова. Для этого датчик оборотов подключаем к питанию (можно подключаться прямо к Arduino), а его сигнальную линию — к цифровому пину 2 на микроконтроллере.

Кроме того, потребуется подключить модуль управления электромоторчиком на базе драйвера L298N. Этому модулю необходимо питание 12 вольт, которое тоже можно взять с Arduino (смотри схему подключения), а также три управляющих сигнала: два на линиях A и B (они задают направление вращения электромоторчика) к пинам 3 и 4 на Arduino и линия Spd к пину 5. У некоторых производителей линии A, B и Spd могут обозначаться как IN1, IN2 и ENA соответственно. Модули обычно выполняются с возможностью управления двумя электромоторами, тогда названия линий для второго моторчика будут IN3, IN4 и ENB соответственно.

Если в модуле подать логическую единицу, то есть напряжение около 5 вольт, на линию A, на линию B — логический нуль, а на линию Spd — напряжение выше нуля, то моторчик будет вращаться против часовой стрелки. Если линии A и B инвертировать — вращение будет происходит по часовой стрелке. Чем выше напряжение на линии Spd, тем быстрее будет вращаться электромотор. Все просто.

Теперь, когда все собрано по схемам (автор не заморачивался и использовал навесной монтаж, когда все элементы припаиваются к ножкам друг друга, а не к электрической плате), нужно продумать алгоритм и написать скетч для Arduino. Логика проста: датчиком оборотов мы подсчитываем количество оборотов диска Нипкова в минуту (наш вентилятор от компьютера выдает 1800 оборотов в минуту при напряжении 12 вольт) и исходя из полученного значения увеличиваем или уменьшаем скорость вращения электромотора.

Выглядит готовый скетч следующим образом:

.

Сначала определяем константы подключенных пинов Arduino, а также числовые переменные, в которые будем записывать расчеты оборотов и вычисления. В функции setup() для константы, для которой назначен пин управления скоростью электромотора, назначаем функцию выхода, то есть на этот пин будет подаваться напряжение. Затем на пины 3 и 4 подаем высокий и низкий логический уровни, чтобы указать модулю управления электромотором, что этот самый электромотор должен вращаться против часовой стрелки. Наконец, для пина, к которому подключен датчик оборотов, указываем режим работы через прерывания. Это позволит избежать задержек в выполнении основного скетча.

Пример звуковой записи для механического телевизора (осторожно, это громко):

Vasiliy Sytchev · Circle


Кроме того, в скетче прописана функция measure(). Она вызывается в функции attachInterrup() внутри setup() каждый раз, как на пине 2 микроконтроллер будет обнаруживать высокий уровень сигнала — значит, метка на реперном диске прошла мимо инфракрасного светодиода и фотоприемника и диск Нипкова совершил один полный оборот. Число оборотов сохраняем в переменную count. Подсчет оборотов ведется каждую секунду с помощью функции millis(), которая указывает количество миллисекунд, прошедших с момента запуска Arduino.

Особенность Arduino заключается в том, что микроконтроллер исполняет записанный в него скетч в непрерывном цикле. Во время каждой новой итерации цикла мы записываем текущее значение millis() в переменную time. На следующем цикле мы снова запрашиваем текущее значение millis() и вычитаем из него значение переменной time, а результат сохраняем в переменную period. Как только значение period становится равно или больше 1000 миллисекунд, мы умножаем значение переменной count (число оборотов в секунду) на 60 — получается число оборотов в минуту; это сделано для простоты. После этого переменную count обнуляем, она будет считаться по новой.


Микроконтроллер выводит диск Нипкова на заданные обороты

Известно, что частота кадров в механическом телевидении с 32-строчной разверткой составляет 12,5 в секунду, или 750 в минуту. Поэтому в функции loop() — тот самый «вечный» цикл Arduino — мы будем добиваться, чтобы электромотор вращался именно с частотой 750 оборотов в минуту. Для удобства используем функцию map(). Она позволяет привести один диапазон значений к другому. В нашем случае приводится диапазон от 0 до 1800 (диапазон оборотов вентилятора) к диапазону от 0 до 255 (диапазон шим-сигнала на выходе Arduino, где 255 — высокий уровень, то есть 5 вольт).

Далее все совсем просто. Работа нашего скетча стартует со значения переменной rotations 750. В loop() указаны три логических оператора. Если в результате подсчетов оборотов диска получается значение в диапазоне от 740 до 760, то скорость вращения электромотора не изменяется. Если значение меньше 740, срабатывает второй логический оператор и скорость мотора увеличивается (через увеличение значения rotations на 10). Если же значение rotations больше 760, скорость мотора уменьшается.


Работа механического телевизора. Из-за небольшого несовпадения частот изображение «плывет»

Этот алгоритм очень прост и не позволяет добиться стабильного изображения (оно периодически искажается по диагонали или превращается в бегущую строку), поскольку скорость электромотора будет «плавать» в очень узких пределах из-за инертности как самого кода и вычислений, так и механической системы (на раскрутку и замедление диска Нипкова необходимо время). Решить проблему можно через усложнение кода — в него можно добавить гистерезис, то есть возможность учета текущего состояния системы.


Однако такой телевизор вполне сгодится для наших целей: во-первых, он позволяет понять принцип передачи относительно сложного изображения с помощью простого аудиосигнала; во-вторых, с его помощью становится ясно, как, используя персистенцию (инерцию человеческого зрения), получать движущиеся изображения.

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


Василий Сычёв

#define rotPIN 2
#define spdPIN 5
#define aPIN   3
#define bPIN   4
unsigned int count = 0;
unsigned int rotations = 750;
unsigned long int time;
unsigned int period = 0;
int spdVal = 0;

void measure() {
    count++;
    period = millis() - time;
    if(period >= 1000) {
        rotations = count * 60;
        count = 0;
        time = millis();
    }
}

void setup() {
    pinMode(spdPIN, OUTPUT);
    digitalWrite(aPIN, HIGH);
    digitalWrite(bPIN, LOW);
    pinMode(rotPIN, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(rotPIN), measure, RISING);
    time = millis();
}

void loop() {
    analogWrite(spdPIN, spdVal);
    if (rotations == 750 || rotations < 750 && rotations > 740 || rotations > 750 && rotations < 760) {
        analogWrite(spdPIN, spdVal);
    }
    if (rotations < 740) {
        rotations = rotations + 10;
        spdVal = map(rotations, 0, 1800, 0, 255);
    }
    if (rotations > 760) {
        rotations = rotations - 10;
        spdVal = map(rotations, 0, 1800, 0, 255);
    }
}

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.