Вы спросите, кого мы будем сегодня
кипятить? Да ладно, шучу. Сегодня мы будем
собирать некий девайс. Не, не кипятильник 🙂
Девайс для украшения корпуса, кидания
пальцами, а так же по совместительству для
отображения важной (для тебя) информации и
реалтаймового перепедаливания каких-либо
настроек или запуска прог. А начиналось все
так. Попался мне как-то на глаза светодиод.
Синий. Да еще и сверхяркий. Ну и подумалось,
было бы неплохо такими скучный корпус
разнообразить. Естественно, не без пользы,
не хотелось выкидывать такие деньги ($1 за
штуку) только ради красивой иллюминации.
Дабы не осложнять простоту конструкции 🙂
было решено ничего кроме светодиодов,
тумблеров и проводов не паять, а поэтому
количество светодиодов пришлось
ограничить до восьми, а количество
тумблеров до четырех. Но и этого за глаза
хватает, я вот до сих пор не могу
представить под какие грязнsе цели еще два
тумблера из четырех заюзать. 🙂

Исходя из вышесказанного нам понадобится:

  • Светодиоды синие (сверхяркие) – 8 штук.
    Можно меньше, но больше точно не
    получится, без существенных усложнений
    конструкции.

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

  • Шлейф ATA100, 80-жильный, можно дохлый. А
    можно и 40-жильный, только провод будет
    толще и в два слоя. Можно от флопповода
    отодрать, а можно и вообще любой другой
    найти. В общем, любые 14-жильные провода
    длиной 80 см или сколько тебе там
    понадобится, чтобы от передней 5.25'' панели
    дотянуть внутри корпуса через отверстие
    сзади до разъема LPT-порта.

  • Паяльник, 1 штука, не более 40 ватт, во
    избежание перегрева компонентов.

  • Заглушка на 5.25'' отсек, которую мы будем
    уродовать.

  • Дрель, которой мы будем ее уродовать.
  • Сверла 5 мм под светодиоды и 6 мм под
    тумблеры (изменить согласно размеру
    имеющихся светодиодов и тумблеров)/

  • LPT разъем. Покупается там же, где
    светодиоды.

Начинаем уродовать панельку согласно
рисунку (заранее сорри, с черчением у меня
всегда плохо было):

Сверху – отверстия под светодиоды
сверлом 5 мм и внизу под тумблеры сверлом 6-7
мм. Все расстояния указаны в миллиметрах.

Тумблеры фиксируются прилагающимися к
ним гайками, светодиоды фиксируются
вдавливанием их в дырки (диаметр подобрать
заранее так, чтобы входили плотно). Закончив
монтаж переходим к испытанию паяльником 🙂
Аккуратно, не отламывая, загибай минусы
каждого светодиода (минус – это короткий
вывод, длинный, соответственно, плюс) в одну
сторону вдоль линии расположения и спаивай
вместе. Так же вместе необходимо соединить
и средние контакты тумблеров (если их более
двух). Далее берешь шлейф, медленно и
аккуратно отрезаешь от него полоску в 14 жил,
а потом еще раз такую же. Спаиваешь их
вместе последовательно для удлинения,
надеюсь сообразишь как. Восемь первых жил
припаиваешь к плюсу каждого светодиода,
девятую припаиваешь к общему минусу. Таким
же образом припаиваешь и тумблеры, 14 жил
должно как раз хватить. Теперь распиновка LPT
порта:

Ноги с 2 по 9 – подключаешь соответственно
к плюсам светодиодов по порядку с другой
стороны шлейфа.
Ноги с 10 по 13 – к тумблерам.
Ногу 18 – одновременно к двум проводам,
которые ты подключил к общему минусу
светодиодов и средним контактам тумблеров.

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

С его помощью пишем следующую программу:

PROGRAM rl_con;

USES
zlportio,
windows,
sysutils;

TYPE
// хранит значение для каждой позиции
TPosition = record
mask : byte;
time : integer;
end;

// хранит последовательности позиций
TSequence = object
steps : array of TPosition;
num_steps : integer;
loop : integer;
wait : integer;
Constructor Init;
Procedure AddPosition( amask : byte; atime : integer );
Destructor Done;
end;

// управляет всеми эффектами
TFx = object
seq : array of TSequence;
currentseq,
port,
num_seq : integer;
sw1,sw2,
sw3,sw4 : boolean;

Function AddSequence : integer;
Constructor Init( afilename : string; aport : integer );
Destructor Done;
Procedure Play;
end;

Function String2Mask( s : string ) : byte;
var
cnt : integer;
begin
result := 0;
for cnt := 1 to length(s) do begin
if s[cnt]='x' then result := result or ($1 shl (cnt-1));
end;
end;

Constructor TFx.Init( afilename : string; aport : integer );
var
f : textfile;
s : string;
msk : byte;
time,
sindex : integer;
begin
port := aport;
assignfile( f, afilename );
reset( f );
sindex := -1;

while not eof(f) do begin
readln( f, s );
s := trim( s );

if s='seq' then begin
sindex := AddSequence;
while copy(s,1,4)<>'loop' do begin
readln( f, s );
s := trim( s );
msk := string2mask( copy(s,1,pos(' ',s)-1) );
time := strtoint( copy(s,pos(' ',s)+1, length(s)-pos(' ',s)) );
seq[sindex].AddPosition( msk, time );
end;
end;
if (copy(s,1,4)='loop') and (sindex>=0) then begin
seq[sindex].loop := strtoint( copy(s,pos(' ',s)+1,length(s)-pos(' ',s)) );
end;
if (copy(s,1,4)='wait') and (sindex>=0) then begin
seq[sindex].wait := strtoint( copy(s,pos(' ',s)+1,length(s)-pos(' ',s)) );
end;
end;

closefile( f );
end;

Destructor TFx.Done;
var
cnt : integer;
begin
for cnt := 0 to num_seq-1 do begin
seq[cnt].Done;
end;
finalize( seq );
end;

Function TFx.AddSequence : integer;
begin
inc( num_seq );
SetLength( seq, num_seq );
seq[ num_seq-1 ].Init;
result := num_seq-1;
end;

Procedure TFx.Play;
var
cnt,
loopcnt,
pcnt : integer;
comst : byte;
begin
while true do begin
for cnt := 0 to num_seq-1 do begin
for loopcnt := 0 to seq[cnt].loop-1 do begin
for pcnt := 0 to seq[cnt].num_steps-2 do begin
sw1 := (portreadb( port+1 ) and (1 shl 6)) > 0;
if sw1 then begin
portwriteb( port, seq[cnt].steps[pcnt].mask );
sleep( seq[cnt].steps[pcnt].time );
end;
end;
end;
portwriteb( port, 0 );
sleep( seq[cnt].wait );
end;
end;
end;

Constructor TSequence.Init;
begin
num_steps := 0;
end;

Destructor TSequence.Done;
begin
finalize( steps );
end;

Procedure TSequence.AddPosition( amask : byte; atime : integer );
begin
inc( num_steps );
SetLength( steps, num_steps );
steps[ num_steps-1 ].mask := amask;
steps[ num_steps-1 ].time := atime;
end;

VAR
fx : TFx;

BEGIN
zliosetiopm( true );
Fx.Init( 'fx1.rl', $378 );
Fx.Play;
Fx.Done;
END.

Тем кто знает Pascal не составит труда
разобраться в программе и без комментариев.
Программа читает эффекты из файла и
начинает их воспроизводить. При
переключении первого тумблера эффект
приостанавливается, при переключении
обратно снова воспроизводится. Остальные
тумблеры не задействованы. Думаю,
доработать программу под свои цели все
смогут без особого напряга. Если что-то не
понятно, можете спрашивать, мое мыло: dnksoftware
[собака] hotbox.ru.

Пример файла с эффектами:

seq
-------- 30
xxxxxxxx 30
loop 15
wait 1000

seq
-xxxxxx- 200
--xxxxxx 200
-xxxxxx- 200
xxxxxx-- 200
loop 15
wait 1000

seq
---xx--- 20
--x--x-- 20
-x----x- 20
x------x 20
-------- 1000
loop 5
wait 500

seq
x------x 100
xx----xx 100
xxx--xxx 100
xxxxxxxx 100
-xxxxxx- 100
--xxxx-- 100
---xx--- 100
-------- 100
loop 10
wait 500

seq
x------x 150
-x----x- 150
--x--x-- 150
---xx--- 150
-------- 150
loop 5
wait 500
seq
x------- 50
-x------ 50
--x----- 50
---x---- 50
----x--- 50
-----x-- 50
------x- 50
-------x 50
-------- 100
loop 10
wait 500
seq
x------- 50
-x------ 50
x-x----- 50
-x-x---- 50
--x-x--- 50
---x-x-- 50
----x-x- 50
-----x-x 50
------x- 50
-------x 50
-------- 100
loop 10
wait 500
seq
x---x--- 150
-x---x-- 150
--x---x- 150
---x---x 150
loop 30
wait 500
seq
x------- 100
xx------ 100
xxx----- 100
xxxx---- 100
xxxxx--- 100
xxxxxx-- 100
xxxxxxx- 100
xxxxxxxx 100
-xxxxxxx 100
--xxxxxx 100
---xxxxx 100
----xxxx 100
-----xxx 100
------xx 100
-------x 100
-------- 100
loop 10
wait 500
seq
xxxx---- 200
-------- 50
----xxxx 200
-------- 50
loop 15
wait 3000

Программа компилируется с помощью Delphi. Я использовал 7 версию, но должно работать и на более ранних, ибо ничего экзотического я в программе не использовал. При запуске программа вешается в памяти и пожирая ваши драгоценные 1.3 мегабайта приводит в действие девайс до тех пор, пока ее не снимут с помощью трех волшебных клавиш 🙂

Самое ответственное при попытке повторить сей девайс – это правильно продырявить панельку, чтобы светодиоды не вываливались, а тумблеры наоборот свободно вставлялись и прикручивались гайками 🙂

В общем, творческих успехов всем мастерам паяльника и напильника 🙂

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии