Картины в воздухеporosenok (p0r0sen0k@yandex.ru) Хакер, номер #110, стр. 110-130-1 Как собрать «призрака» в домашних условияхУ тебя, наверное, не раз возникало желание собрать что-нибудь новое, интересное, то, чем можно было бы удивить свою подругу, родителей, друзей и просто знакомых. Или, например, сделать своими руками неплохой подарок, который было бы не стыдно дарить. Сегодня мы предаставим тебе такую возможность. Мы будем собирать «призрака». Набери в Гугле «Бегущая строка Призрак» ты получишь кучу ссылок, где будут представлены различные реализации этого девайса. Некоторые построены на обычном кулере, некоторые - на двигателе постоянного тока, есть даже вариант устройства, собранный из фена. Мы же с тобой сегодня будем ваять этот девайс из винчестера. Как это работаетОсновным элементом устройства является линейка светодиодов, выстроенных в ряд, друг за другом. Она движется в каком-то направлении, например по кругу (когда устройство строится на кулере), или, как в нашем случае, перемещается из стороны в сторону, для этого у нас используются детали винчестера. При этом через определенные промежутки времени загорается определенная комбинация светодиодов. При большой скорости движения создается впечатление, что выводимая надпись (или изображение) висит в воздухе. Это связано с инерцией нашего зрения. Изображение записывается на сетчатку и некоторое время находится там.
На этом же принципе основано и телевидение. Ты уже знаешь, что за одну секунду выводятся 24 кадра, при этом наши глаза не различают их по отдельности. Объекты на экране передвигаются, причем не рывками, а плавно, как мы привыкли видеть это в реальной жизни. Аналогичным образом устроена динамическая индикация. Возможно, что ты еще не сталкивался с этим словосочетанием, поэтому расскажу об этом более подробно. Динамическая индикация иногда используется в часах или просто при отображении той или иной информации с помощью семисегментных индикаторов. Семисегментный индикатор – это индикатор, который состоит из семи сегментов, используемых для формирования изображения числа. Проще говоря, это семь светодиодов, которые располагаются в форме восьмерки для вывода чисел, ты их наверняка видел в часах. При этом если используются четыре индикатора, то сначала загорится первый, потом второй, третий, четвертый, а затем снова первый, второй и т.д. Смена индикаторов происходит с достаточно большой частотой, и при этом наблюдающему кажется, что все четыре индикатора горят одновременно. Итак, с принципом работы разобрались, можем идти дальше. ИсходникиСхему можно разделить на две функциональные части - блок генерации и блок индикации. Будем рассматривать их по отдельности. Основной задачей блока генерации является постоянная генерация прямоугольных импульсов для обеспечения движения линейки светодиодов. Она решается посредством самого LPT-порта, микроконтроллера (если предполагается, что устройство будет автономным). Или, как в нашем случае, можно реализовать этот блок на отдельной плате. Назначение блока индикации – вывод изображения, то есть включение определенных комбинаций светодиодов через заданные промежутки времени.
Для того чтобы это все собрать, нам понадобится следующее: Блок генерации:
Блок индикации:
И самое главное – блок питания. Можно использовать блок питания, выдающий напряжение от 5 до 20 В. Еще раз повторюсь, что питание можно взять и от компьютера. Я использовал блок питания на 18 В. Чем больше будет напряжение блока питания, тем больше будет сила электромагнита, использующегося для движения светодиодов. Для сборки всего нашего девайса нам нужна основа. Ей для нас послужит пара дощечек ДСП и макетная плата. СобираемНачнем с блока генерации. Его принципиальную схему можно увидеть на рисунке. Принцип работы схемы следующий: стабилизатор КРЕН5А выдает на выходе 5 В, которые в дальнейшем используются для питания микросхем К155АГ1 и К155ЛН1. Два одновибратора К155АГ1, соединенных по кольцевой схеме, образуют мультивибратор. Принцип работы всех микросхем можешь посмотреть в справочнике или в интернете. Светодиод, подсоединенный к выходу 6 верхнего одновибратора, будет применяться для наглядного отображения того, что схема действительно работает и идет генерация импульсов. Инвертор К155ЛН1 в схеме можно не использовать – я задействовал его при сборке схемы и экспериментах с ней, чтобы не спалить одновибратор (их у меня больше не было в запасе, а инверторы были), так как напряжение на транзисторе КТ815Г достаточно большое. По блоку генерации это все. Можешь включить блок питания в розетку. Если ты все собрал правильно, то светодиод, входящий в состав блока генерации, должен начать моргать. Если нет, то проверь еще раз схему.
Надеюсь, что блок генерации у тебя заработал, и поэтому можно переходить к блоку индикации. Одной из основных частей блока индикации является электромагнит, который будет отвечать за перемещение линейки светодиодов. Для того чтобы заполучить такой электромагнит, нужно сначала раздобыть винчестер. Сняв верхнюю крышку винчестера, ты сразу увидишь блок привода головок. Там стоят два постоянных магнита и катушка электромагнита, укрепленная на считывающих головках жесткого диска. Он отвечает за позиционирование магнитных головок винчестера. Тебе нужна вся конструкция с постоянными магнитами и самим электромагнитом привода головок. Как правило, ее всю без потерь можно легко извлечь из харда. Кстати, можешь выкрутить его вместе с небольшой платой, находящейся рядом с ним. На этой плате уже выведены два контакта, которые можно использовать в дальнейшем для управления электромагнитом. Если решишь не задействовать эту плату, то аккуратно выведи два провода, идущие от катушки электромагнита. Теперь необходимо подготовить конструкцию, на которую это все будет крепиться. Я сделал просто: взял два куска ДСП и с помощью саморезов соединил их вместе в форме буквы Т. К получившейся конструкции саморезами прикручиваем наш магнитный блок. Только сначала примотаем изолентой к головкам спицу, на нее в дальнейшем мы напаяем светодиоды. Прикрепив электромагнит, можно припаивать светодиоды. Для этой цели лучше использовать кислоту. Светодиоды припаивай катодом к спице, чтобы потом спицу прицепить на общий провод (он же ноль). Если не знаешь, где анод, а где катод, используй обычную батарейку на 1,5 В. Подсоедини светодиод к батарейке. Гореть он у тебя будет лишь в том случае, если анод подключен к плюсу, а катод - к минусу. Теперь, когда светодиоды припаяны, можно к аноду каждого светодиода припаять отдельный провод (используй для этого тонкий медный провод, о котором говорилось выше). Также нужно будет один провод припаять к спице, его мы в дальнейшем подцепим на ноль. В итоге у тебя должно получиться восемь проводов, которые будут висеть на спице. После того как ты справишься с этой задачей, прикрепи все проводки к спице с помощью скотча. Это делается с той целью, чтобы провода не болтались в воздухе, когда электромагнит начнет работать. Для того чтобы в дальнейшем заставить электромагнит нормально колебаться, необходимо добавить в конструкцию еще пару резинок. Пока просто прикрепи их так, как показано на фотке. Позже с помощью саморезов мы настроим силу их натяжения. Можешь подключать электромагнит к схеме генерации. У электромагнита выведены на отдельную плату два контакта, именно к ним и нужно будет припаиваться. Однако, прежде чем брать в руки паяльник, можешь подать на эти два контакта напряжение, чтобы убедиться, те ли два контакта ты нашел. Если это они, то спица отклонится либо вправо, либо влево. Осталось последнее – подцепить это все к LPT-порту. Для этого берем в руки 25-пиновый разъем (для LPT-порта), витую пару (понадобится две штуки, так как семь проводов на светодиоды, один провод – плата генерации и еще один - земля) и паяем, в соответствии с распиновкой LPT, в следующем порядке:
Вот, в принципе, мы и собрали девайс. Осталось только его немного подрегулировать. ОтлаживаемВключаем блок питания в розетку и наблюдаем за поведением электромагнита. С большой долей вероятности спица со светодиодами у тебя не будет колебаться из стороны в сторону. В лучшем случае будут небольшие колебания, чем-то напоминающие судороги :). Но этого и следовало ожидать, мы ведь еще не настроили резинки. Для начала можешь попробовать менять натяжение резинок руками, при этом ты заметишь, как изменяются колебания спицы. После того как тебе удастся найти такое натяжение резинок, при котором будут происходить колебания хорошей амплитуды, нужно его зафиксировать. Для этого используй саморезы, можешь либо вкручивать/выкручивать их до нужного напряжения резинок, либо просто намотать на них резинки. Когда справишься и с этим, можешь переходить к кодингу. КодимЯ написал простенькую программу, которая позволяет выводить изображения с помощью созданного нами девайса. Приводить полностью ее листинг я не стану, поскольку он достаточно объемный, ограничусь лишь отдельными его частями. Для того чтобы управлять светодиодами, нам понадобится писать в порт, а также читать из него. Как ты знаешь, операционные системы семейства NT не позволяют этого делать. То есть позволяют, но для этого придется немного пошаманить. Чтобы не писать драйвер, я заюзал уже готовое приложение UserPort. Ты найдешь его на диске. Когда приложение запущено, можно спокойно использовать команды in и out. Я написал программу на VisualC++ v6.0, ты же можешь задействовать Pascal, C/C++, Assembler и даже Turbo Prolog. Алгоритм работы программы будет следующий:
Изображения, которые предполагается выводить, я представил в виде отдельных массивов. Например, изображения, которые ты видишь на скрине, выглядят в программе следующим образом: BYTE SimbolArray4[]={0x00,0x41, 0x41, 0x41, 0xFF, 0x08, 0xFF, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x1C, 0x2A, 0x7B, 0x7B, 0x2A, 0x1C, 0x00}; Здесь «0x41, 0x41, 0x41, 0xFF, 0x08, 0xFF, 0x41, 0x41, 0x41» представляет знак ][, а «0x1C, 0x2A, 0x7B, 0x7B, 0x2A, 0x1C» - рожицу. Ты же можешь в дальнейшем описать каждый символ из набора ASCII в виде битовой матрицы (ну это так, на будущее). Цикл, в котором осуществляется вывод изображения, выглядит следующим образом: while(true) { pause(500); //Небольшая задержка перед выводом rez=inportb(0x379); //Читаем из порта содержимое регистра состояния. Нас интересует бит ACK if(!(rez&64)) //Если бит ACK сброшен, то начинаем вывод изображения { if(m_Left) //Если истина, то выводим изображение при перемещении вправо { pause(PauseTime); //Небольшая пауза, устанавливается опытным путем. Нужна, чтобы откалибровать вывод изображения for(int i=0;i<SIMBOL_ARRAY_LENGTH;i++) //Может выводиться несколько изображений { switch(WordShow) { case 1:outportb(0x378,SimbolArray[i]); break; case 2:outportb(0x378,SimbolArray2[i]); break; case 3:outportb(0x378,SimbolArray3[i]); break; case 4:outportb(0x378,SimbolArray4[i]); break; } pause(Pause1); } countShow++; //Если вывели символ более 50 раз, if(countShow>50) //то можно выводить следующий { WordShow++; countShow=0; if(WordShow>WordShowMAX) WordShow=1; } } ExitLoop2=FALSE; } if(!ExitLoop2) while(true) { pause(500); rez=inportb(0x379); if((rez&64)) { if(m_Right) // Если истина, то выводим изображение при перемещении влево { pause(PauseTimeR); //Опять делаем задержку перед выводом for(int i=SIMBOL_ARRAY_LENGTH-1;i>=0;i--) { switch(WordShow) { case 1:outportb(0x378,SimbolArray[i]); break; case 2:outportb(0x378,SimbolArray2[i]); break; case 3:outportb(0x378,SimbolArray3[i]); break; case 4:outportb(0x378,SimbolArray4[i]); break; } pause(Pause1); } } ExitLoop2=true; } if(ExitLoop2)break; } } Таким образом, программа позволяет делать следующее:
Конец мучениямНадеюсь, у тебя получилось собрать описанный девайс. Теперь ты можешь похвастаться перед своими друзьями тем, какой ты крутой электронщик. Если будут вопросы, пиши, постараюсь ответить на них. DVDНа диске ты найдешь драйвер для работы с портами ввода/вывода, подробное описание выводов LPT-порта, полный листинг программы. |