Так уж сложилось, что я достаточно продолжительное время «неровно дышу» к теме лазерной проекции. Началось это достаточно давно, ещё во время студенчества, когда мы с моим соседом вдвоём собрали лазерную цветомузыку, которую применяли для ведения дискотек в небольшом кафе, а также, в дальнейшем, для своих студенческих вечеринок. В те времена (2000-2001 годы), возможности были достаточно ограничены, мы не умели программировать и работать с микроконтроллерами, вследствие чего поделки были достаточно простыми. В данный момент всё существенно изменилось и, используя доступность материальной базы, — можно собирать достаточно интересные и полезные вещи, например, лазерный проектор. Как это сделать — мы и поговорим в статье.
Лазерные проекционные системы достаточно широко используются в разных сферах. Например, они могут использоваться:
- в качестве лазерных сканеров, для оцифровки трёхмерных объектов и создания 3D моделей;
- для целей шоу, когда разноцветные лазерные проекции раскрашивают архитектурные объекты или танцующую толпу людей на дискотеке;
- в качестве сканера штрихкодов в магазинах;
- для экспонирования, при осуществлении лазерной печати и множестве иных применений.
Среди всех этих примеров особняком стоит использование лазера для создания разнообразных проекций. Некоторые производители видеопроекторов используют лазерные источники света даже для формирования изображения. Плюсом такого способа является отсутствие необходимости фокусировки — изображение имеет высокую чёткость по всему полю, не смотря, на то, что не применяется специальный выходной объектив (как на обычных видеопроекторах).
Для развёртки луча при создании изображения в лазерном проекторе применяются разные методы, среди которых наиболее часто используются МЭМС-устройства, которые представляют собой микрозеркало, колеблющееся с очень высокой частотой, что позволяет лучу пробегать строка за строкой по экрану.
Ещё одним способом осуществления развёртки является использование высокоскоростных электроприводов, которое перемещают с высокой частотой зеркала горизонтальной и вертикальной развёртки. Такие приводы в английской терминологии можно найти по ключевым словам «laser galvo».
Подобные приводы являются по своей сути высокоточными и высокоскоростными электродвигателями, специально предназначенными для быстрой смены направления движения.
Устройства подобного рода приводов являются достаточно дорогими, большими в размерах и потребляющими много энергии.
Также в целях развёртки луча можно использовать микрозеральные DMD-чипы от DLP- проекторов (если лазерный луч используется в качестве своеобразного «фонарика», и развёрнут в размер микрозеркального чипа).
Как можно увидеть по приведённому описанию, количество способов развёртки лазерного луча достаточно велико.
Однако, если какой-либо самодельщик захочет собрать подобное устройство самостоятельно и за скромную цену, он столкнётся с массой проблем — что и произошло со мной, когда я попытался собрать свой лазерный проектор, с применением mems-зеркала. Мне удалось найти достаточно недорогое устройство на известном китайском сайте, однако попытка приобрести натолкнулась на отсутствие документации по устройству. Китайский продавец ни под каким соусом не захотел предоставлять подробную информацию, а 157 неё, подобное сложное устройство является просто «кирпичом», оживить который, конечно, можно, но будет весьма затруднительно и займёт массу времени. К тому же результат, скорее всего, будет весьма плачевным, как показывает опыт некоторых самодельщиков:
Копая эту тему глубже, я нашёл весьма любопытный способ развёртки луча, который был предложен одним из энтузиастов. Он предложил создать устройство, которое позволяет проецировать большие бегущие строки, прямо на облаках!
Для этого он искусственно снизил его возможности: так как для проецирования надписей совершенно необязательно иметь высокое разрешение, он предложил следующий подход: собирается цилиндрический барабан, снабжённый зеркалами, расположенными по периметру.
Каждое зеркало отклонено на небольшой угол. При вращении барабана, если мы наведём на него лазерный луч, — он будет прочерчивать на экране несколько горизонтальных линий. Теперь, если мы будем включать и выключать луч по определённому алгоритму, — то мы сможем легко формировать бегущие строки!
К сожалению, автор не довёл свою работу до конца, по причинам мне неизвестным. Вероятно, у него просто не было 3D принтера, так как его применение работу существенно облегчило бы и она была бы выполнена с минимальными отклонениями от изначальной задумки (ручное изготовление такого барабана довольно трудоёмко).
Кстати, это может быть одним из методов создания вашего собственного устройства, если вы примените 3D принтер и стандартные небольшие зеркальца, которые можно купить в готовом виде (они часто встречаются в виде самоклеящийся микрозеркал, которые можно отдирать с больших панелей. Подобные панели с отклеивающимися зеркальцами встречаются на строительных рынках, и применяются для оформления ночных клубов, дискотек, создания дискотечных зеркальных шаров).
Но такой способ показался мне слишком экстенсивным и недостаточно технологичным. Поэтому мне пришла в голову следующая идея: а что если взять за основу принцип отклонения 2 микрозеркал, положенный в основу устройств на основе galvo-приводов, но существенно упростить и удешевить его — для этого зеркала должны вращаться непрерывно!
Тогда, в качестве их приводов можно будет использовать простые и дешёвые микродвигатели, лазерный луч будет включаться по определённому алгоритму! Этого будет вполне достаточно для развёртки луча по вертикали и горизонтали!
Как всегда, когда приходит какая-либо хорошая идея, — «интернет бывает девственно пуст» :-) В сети удалось найти только одно подобное устройство, которое было создано, видимо, группой студентов, в студенческой лаборатории. Никаких дополнительных комментариев и объяснений устройства нет, можно только заглянуть его в действии:
Как можно заметить в этом видео, они использовали тот самый принцип, который показался мне весьма интересным: два вращающихся зеркала разворачивают луч по вертикали и по горизонтали.
Именно такой принцип, я и положил в основу концепции, которая будет рассмотрена ниже. В данный момент эту концепцию стоит рассматривать именно как некую заготовку, в которой большинство работ проведено, и вы можете её взять практически в готовом варианте и с минимальными усилиями завершить, создав свой собственный лазерный проектор.
Ещё одним весьма интересным плюсом такого устройства, использующего два вращающихся зеркала является возможность использования для проецирования достаточно мощных лазеров, (например, мощные лазерные указки), так как вращающиеся зеркала весьма эффективно охлаждаются о воздух и не будут перегреваться при работе.
Итак, приступим! Для начала давайте сформулируем задачу. Нам необходимы проецировать надписи, которые:
- должны быть достаточно высокого разрешения (раз уж мы не ограничены разрешением по вертикали, как в случае с вращающимся зеркальным барабаном, хотелось бы получить максимально чистые и аккуратные надписи);
- использовать понятный и хорошо читаемый шрифт;
- пробегать по «экрану» (любой плоской поверхности, на которую мы проецируем эти надписи) с регулируемой скоростью.
После осознания поставленной задачи становится понятно, что, так как у нас зеркала вращающиеся, то если мы просто наведём на них лазер, то каждое зеркало будет его разворачивать в пределах 180°. Это слишком много, и необходимо ограничить подобный угол.
Я примерно логически для себя прикинул, что если мы возьмём за данность, что будем проецировать надпись длиной в 5 метров с расстояния в 10 метров, то необходимый угол развёртки луча составит 28 с небольшим градусов (для ровного счёта возьмём его за 28).
Угол вертикальной развёртки можно для ровного счёта взять также примерно в районе 28°, Хотя в реальности он будет ещё меньше, так как мы будем проецировать всего лишь строки. С этой величиной следует поэкспериментировать, выставляя её по образу и подобию того, как выставляется горизонтальная развёртка.
Общий принцип, положенный в основу обоих развёрток, выглядит приблизительно следующим образом: есть два электродвигателя, на ось каждого из которых насажено микрозеркало, которое может вращаться вместе с осью. «Рама» для крепежа зеркала — распечатана на 3D принтере. В нижней части этой рамы расположены два диска.
Нижний диск имеет прорезь и вся рама изготовлена из чёрного ABS пластика (т.к. он не отражает инфракрасный луч — это проверено, протестил).
Сверху над этим диском находится ещё один такой же диск, только белого цвета, изготовленный из белого ABS-пластика.
Рядом с осью двигателя, параллельно ей, расположен инфракрасный датчик. Рама вместе с дисками, при вращении — постоянно проходит над этим датчиком. Так как сама рама изготовлена из чёрного ABS-пластика, датчик срабатывает только в тот момент, когда над ним проходит прорезь, через которую видно белый кусочек другого диска, от которого отражается инфракрасный луч.
Вся суть работы обоих развёрток луча заключается в том, что мы начинаем отсчёт времени, после того как сработал соответствующий датчик, величина промежутка времени должна быть такой, чтобы за это время, луч описал сектор в 28°.
Эффект бегущей строки достигается за счёт того, что мы начинаем воспроизведение с крайнего правого положения, отрезка времени, который равен 28°, после чего постепенно уменьшаем это время и, таким образом, надпись проползает видимый сектор справа налево.
Говоря о способе воспроизведения изображения, то есть, в нашем случае надписи, можно сказать, что надпись состоит из коротких отрезков, в течение которых лазер включён и других отрезков, в течение которых лазер выключен. Как спроектировать такие отрезки? Мне показалось достаточно интересной идея следующего плана:
- взял и нанёс каждую букву алфавита, в натуральный размер на тот будущий экран для проекции (который я взял за основу в самом начале, имеющий длину в 5 м). Для этого я использовал программу coreldraw;
- после чего, каждую букву я экспортировал в виде картинки. Далее, используя веб-сервис по переводу картинок в ASCII-код, с использованием только символов 0 и 1 — я получил практически готовую матрицу, которую, если загрузить тем или иным способом в микроконтроллер и воспроизводить, — то можно получить отображение этой буквы (кликабельно):
Новогодний энтузиазм у меня бил за край (проектировал в новогодние), поэтому я сделал ряд подобных матриц (на несколько символов) и начал загружать их в Arduino IDE в виде массивов цифр. После того как на 10 массиве у меня память микроконтроллера была почти исчерпана — я понял: «что-то, брат, ты делаешь совсем не то!» :-)))). Кроме того, я использовал массивы строк — что при внушительном их размере, ужасает уже само по себе… И начал думать, как бы мне оптимизировать это всё…
В ходе размышлений мне пришла следующая идея: так как каждая матрица буквы состоит из нулей и единиц, и, по сути, нам нужно просто отметить промежутки, в течение которых лазер должен быть включён и выключен, — нам достаточно всего лишь создать компактную матрицу, которая содержит в себе количество нулей и единиц на определённом промежутке. То есть, другими словами, для создания компактной матрицы нам не нужно загружать 100 единиц в микроконтроллер — достаточно всего лишь написать цифру 100 и далее её умножить (уже при выполнении) на время горения одного «пикселя». Аналогично и с пробельными местами, которые отмечены нулями. Кроме того, необходимо тем или иным способом пометить места, где оканчивается строка (я в качестве такого маркера конца строки взял число 50 000. Почему? А просто потому, что: пускай будет:-))) )
Подобная идея показалась мне достаточно перспективной, и я активно взялся за работу: так как обработка каждой буквы алфавита вручную — это невозможно, — я решил написать скрипт, который произведёт эту работу за меня.
Таким образом, весь процесс перевода букв большого размера в матрицу из нулей и единиц оптимизированного типа, выглядит как выполнение ряда следующих пунктов (пишу подробно, если вы захотите использовать свой шрифт для проецирования):
- Сделать букву в натуральный размер в Corel Draw;
- Перевести её в картинку jpeg;
- Загрузить её в сервис по переводу картинок в ASCII-вид;
- Скопировать получившуюся матрицу из 0 и 1 и вставить в Microsoft Word;
- Сохранить эту матрицу в формате .txt;
- Запустить скрипт на Java, которому указать: 1) папку, из которой брать сырые матрицы для обработки; 2) папку, в которую складывать готовые матрицы оптимизированного типа;
- Вставить готовые матрицы в Arduino IDE.
Теперь несколько примечаний по поводу работы скрипта:
Он написан таким образом, чтобы полностью подготовить готовые массивы по каждой букве. То есть фактически вам их практически не нужно править и можно загружать целиком в Arduino IDE.
Описанным выше пошаговым способом можно готовить буквы для шрифтов разного типа, например, я подготовил для шрифта Arial Regular Bold.
Описанный скрипт Java для подготовки массивов я выложил здесь, на свой github.
И если сами изначальные матрицы (после перевода буквы — в картинку — в ASCII-код) весили всё равно немало:
То, после обработки скриптом-вес всего алфавита уменьшился кардинально и без проблем поместился в микроконтроллер:
Говоря о самой реализации физического устройства, то я посчитал интересным изготовить его на базе микроконтроллера esp32, поэтому весь скетч в Arduino IDE написан именно под него.
Для удобства скетч разделён на 8 вкладок.
Он снабжён практически всем необходимым для успешной реализации проекта с минимальными усилиями (однако повторюсь, что его следует воспринимать именно как некую заготовку, «раму», которая потребует соответствующих доделок, как и, возможно, отладки. Однако, все основные работы проведены и вам будет легко реализовать свой проект, взяв за основу мой).
Для того чтобы ваша бегущая строка появилась, — необходимо передать соответствующую строку с фразой или словом в функцию Laser_printer().
Эта функция, в свою очередь, вызывает следующую функцию — Characters_handler(), в которую передаются массивы, скажем так «низкого уровня», которые содержат подборки цифр, состоящих из промежутков включения-выключения лазера для воспроизведения той или иной буквы.
Кроме того, скетч снабжён алгоритмом PID-контроллера, который отвечает за то, чтобы один двигатель из двух использующихся (вертикальной развёртки) — запаздывал на определённую величину.
Величина этого опоздания поддерживается с помощью алгоритма PID-контроллера. Физический смысл этого заключается в том, чтобы дать время одному из двигателей прочертить горизонтальную линию, прежде чем двигатель вертикальной развёртки эту линию сместит на один шаг выше.
Скетч прошивки можно скачать вот по этой ссылке.
Интересная информация: не так давно группа молодых стартаперов создала самый компактный в мире лазерный проектор, который можно использовать для разнообразных целей. Он привлёк большое внимание общественности, и даже популярная певица Мадонна использовала его для одного из своих шоу.
Завершая рассказ, отмечу следующее: использование вращающихся зеркал таит в себе очень много интересных плюсов. Из которых наиболее существенными, на мой взгляд, являются дешевизна создания подобного устройства и активное охлаждение об воздух во время вращения, что позволяет использовать мощные лазеры для проецирования.
Разработок подобного рода в сети я не видел, равно как и выложенного в открытый доступ исходного кода. Так как подобный проект допускает использование самых недорогих эл.двигателей, инфракрасных датчиков и (не самой дешёвой, но всё же) esp32 — его стоимость может вполне уложиться в заявленные 500 рублей (по себестоимости компонентов) ;-)
Кто знает, может быть ваше устройство, построенное на базе моего проекта, — тоже станет достаточно известным? ;-)