Сначала я задумался о причинах ложных срабатываний аппаратуры. Наиболее вероятно, что при самотестировании в начале (средствами BIOS), а затем при загрузке драйвера параллельного порта в самой Windows, происходит вывод каких-то данных. При помощи осциллографа я зафиксировал процессы, возникающие на выводах шины данных LPT-порта при включении и отключении компьютера. Как и предполагалось, вначале, при процедуре тестирования BIOS, происходит вывод нескольких байтов, а затем через несколько секунд (уже когда бежит «червячок-индикатор» загрузки Windows XP — все сказанное здесь и далее относится к этой ОС), снова выводится пачка байтов. Естественно, что если схема использует сигнал с какого-либо бита шины данных порта для управления нагрузкой, она реагирует на выводимые байты.
Известно, что для проверки работоспособности схем ввода-вывода часто используется вывод байтов 0×55 и 0xAA (в двоичном коде это 01010101 и 10101010), и я предположил, что именно такие байты и выводит BIOS и Widnwos при тестировании LPT. Если бы мое предположение оказалось верным, можно было бы модифицировать схему и программу так, чтобы управление светодиодом оптронной развязки велось не относительно общего провода сигналом с одной линии шины данных, а с пары линий: когда уровни на выбранной паре линий одинаковы — светодиод будет светиться только при одной-единственной комбинации уровней из четырех возможных. Если это и не решит проблему ложных срабатываний, то существенно уменьшит ее вероятность. Именно с такой идеей я обратился к автору разработки по почте, однако, он ответил, что, хотя идея по его мнению заслуживает рассмотрения, он в настоящее время не может заняться ее проверкой. Ну, а я смог :)
Логического анализатора у меня нет, потому я ограничился проверкой только пары линий D0 и D2. Оказалось, что при тестировании BIOS уровни на этих линиях действительно всегда одинаковы, а вот во время старта Windows бывают моменты, когда они разные, хотя, как и предполагалось, таких моментов очень немного: все «нежелательные» импульсы происходили в течение не более чем 20–50 микросекунд. То есть, я оказался прав наполовину. Однако, "ложный" импульс в пару десятков микросекунд — это вовсе не проблема, он легко фильтруется простейшей RC-цепочкой с постоянной времени, скажем, 10–20 миллисекунд (на 3 порядка больше длительности фильтруемого импульса), что абсолютно не скажется на эксплуатационных удобствах (задержка коммутации нагрузки в 20 миллисекунд абсолютно незаметна человеку).
В общем, путь решения проблемы был намечен. Так как автор не смог (или не пожелал) модифицировать под него свою программу, я решил написать собственный вариант, заодно устранив по возможности все недостатки предыдущего. И вот что получилось.
Новый вариант схемы показан на рисунке 1. По сравнению с прототипом она не сильно изменилась (в расчете на 1 канал, естественно). К выбору типов элементов схемы особых требований не предъявляется, допустима замена элементов на любые, сходные по параметрам. VT2 может потребовать установки на небольшой теплоотвод. VD1 — КД209, 1N400x или иной на ток не менее 0,8А и обратное напряжение не ниже 25В. Оптрон VU1 может быть практически любым транзисторным: ОАТ127, АОТ128, АОТ110, 4N35 и др. Реле должно быть рассчитано на срабатывание при выбранном напряжении питания. Обратите внимание: резистор R7 добавлен в схему в результате исправления ошибки (вначале он отсутствовал). Его сопротивление должно быть от 150 до 240 Ом. Чем меньше напряжение питания, тем меньше сопротивление.
Это не единственный возможный вариант схемы, можно модифицировать ее, оставив, например, только один канал управления и превратив ее в аналог схемы из первоисточника. Можно изменить конструкцию ключевого каскада, применить оптореле, «переставить» линии управления порта… Но при разработке других вариантов схемы необходимо соблюдать 3 важных условия: обязательно обеспечивать гальваническую развязку — раз, ограничивать ток через линии LPT порта на уровне не более 10 мА — два, и обеспечивать соединение контактов 11 и 12 разъема порта с общим проводом порта — три. Несоблюдение первых двух условий может привести к порче компьютера, а третьего — к зависанию программы.
Конструктивно устройство можно выполнить в виде сетевого удлиннителя на 5 розеток (1 обычная розетка для питания компьютера и 4 для управляемых нагрузок). Печатная плата устройства не разрабатывалась.
Пункт «Показать» откроет в центре экрана рабочее окно программы. То же самое произойдет по двойному щелчку на иконке в системном трее. Назначение пунктов "О программе" и "Выход" очевидно, а 4 недоступные (при первом запуске) пункта предназначены для управления соответствующими нагрузками.
На рисунке 3 показано основное окно программы. Галочкой в столбце "Канал" можно разрешить управление соответствующим каналом. Для разрешенных каналов становятся доступны соответствующие поля настройки их параметров (запрещенные каналы всегда выключены).
Каждый канал управления может иметь свое наименование, по умолчанию это просто "Канал" с номером — на рисунке как раз показано, что 3 канала поименованы, а последний — еще нет. Если необходимо, чтобы при запуске программы канал включался автоматически, нужно установить галочку в столбце "Состояние при старте". Галочка в столбце "Состояние сейчас" управляет текущим состоянием канала, т. е. при ее установке нагрузка немедленно включится, при снятии — выключится. Наконец, есть еще одна галочка, общая для всех каналов — "Перед выходом все отключить". Ее назначение, надеюсь, понятно без комментариев.
После того, как все параметры заданы, основное окно можно свернуть, оно при этом не появится в панели задач, а останется, как и ранее, в системном трее. Зато теперь уже меню преобразится (см. рисунок 4 )! Теперь каналы получили заданные названия. Включенные нагрузки в меню отмечаются галочками.
Лично мне такой интерфейс представляется более привычным и удобным, нежели тот, что в программе-прототипе.
В программе предусмотрена возможность "тонкой" настройки, однако она немного завуалирована. Дело в том, что эта возможность предназначена для тех, кто решит изменить схему адаптера, а это может потребоваться по двум причинам:
В обоих случаях наверняка потребуется изменить назначение линий порта LPT, и, чтобы программа могла адекватно на такие модификации реагировать, необходимо "проинформировать" ее об этом. Делается это путем ручной правки файла lptsw.ini, который появляется в папке программы после первого ее запуска. Этот файл необходимо открыть в редакторе, хоть в том же "Блокноте", и добавить в него следующие строки:
[Extra]
1_a = 0
1_c = 4
2_a = 1
2_c = 5
3_a = 2
3_c = 6
4_a = 3
4_c = 7
Будьте внимательны: в этих строках перечислены пары линий для каждого канала — номер канала определяется первой цифрой в строке. После символа "подчеркивание" следует назначение линии — для анода светодиода или для катода ("а" и "_с" соответственно). После знака равенства указан номер линии шины данных LPT-порта, который назначен для соответствующей задачи. В приведенном примере указаны те значения, которые используются программой по умолчанию. Если нужно, например, настроить программу на схему, в которой к нечетным линиям подключены аноды светодиодов а к четным — катоды, надо ввести такие строки:
1_a = 0
1_c = 1
2_a = 2
2_c = 3
3_a = 4
3_c = 5
4_a = 6
4_c = 7
Программа не контролирует корректность заданных значений, если справа или слева от знака равенства будут некорректные значения, поведение программы при управлении нагрузками непредсказуемо (зависаний или ошибок, возможно и не будет, но что и как будет включено — неизвестно). Именно поэтому данная возможность по умолчанию скрыта.
Следует признать, что способ "параллельного" управления несколькими нагрузками очень неудобен: для 4-х нагрузок нужно "дотянуть" до удлинителя аж 8 проводов от разъема порта. Единственное существенное достоинство схемы — простота, особенно при использовании мощных оптореле, например 5П19Т или 5П20Б: в этом случае схема канала управления вырождается в токоограничительный резистор и оптореле. Для управления бОльшим количеством каналов усложнение параллельной схемы становится неоправданным по числу деталей и количеству соединительных проводников. Очевидным выходом в этом случае будет переход на управление через последовательный порт, причем при использовании интерфейса RS485 возможно управление нагрузками на расстоянии до 1 км и более. Но эта тема уже не попадает в рамки данного проекта :)
P.S. Справедливости ради следует признать, что недостатки есть и в моем варианте… Во-первых, толком программу и схему я не протестировал, надеюсь, что кто-нибудь это сделает и поправит меня, если где-то что-то не так окажется… А во-вторых, программа моя немножко (всего раза в 3) больше размером вышла, чем ее праобраз…