Что значит lpt порт принтера. Применение LPT-порта. Применение параллельных интерфейсов и LPT-портов

  • 26.01.2024

LPT порт - это то место в компе куда подключается принтер. Но туда можно воткнуть ещё много чего интересного. В том числе и придуманые вами схемы. У меня, например, через LPT порт включался свет в комнате, открывался замок на двери и выключалось радио.

Так выглядит разъем на компьютере.

У него 25 выводов:

N Направление Сигнал
1 Выход Data Strobe
2 Выход Data 0
3 Выход Data 1
4 Выход Data 2
5 Выход Data 3
6 Выход Data 4
7 Выход Data 5
8 Выход Data 6
9 Выход Data 7
10 Вход Acknowledge
11 Вход Busy
12 Вход Paper Out
13 Вход Select
14 Выход Auto feed
15 Вход Error
16 Выход Init
17 Выход Select Input
18-25 Ground

Для простых схем управления нам понадобятся выводы:
2 - 9 - это выходы Data0-7.
18 - 25 - это земля (минус). Обычно(не всегда) они соединены с корпусом компа.
Это основной набор контактов, необходимый для изготовления собственных схем.

Также хочу обратить внимание на вывод 1 - это "Data Strobe". Как я понял, положительный сигнал на этом выходе говорит устройству, что нужно произвести чтение очередной команды. Если мы не запитаем этот выход программно, то принтер просто не будет обращать внимания на остальные выходы.

Для ввода информации в порт используются выводы 10-13, 15 . Подробнее позже.

Выходы порта могут принимать только 2 состояния - log0 и log1 . При включении компьютера состояния выходов быстро меняются, потом переходят в log0. В зависимости от типа материнской платы один-два выхода могут перейти в log1. Далее, при загрузке ОС Windows состояния вхлдов могут снова измениться. После окончания загрузки система не трогает выходы пока не начнется печать или "поиск оборудования".

Источник: zps-electronics.com


C этой схемой также часто просматривают:

Одним из самых старых портов компьютера является LPT-порт или параллельный порт. И хотя LPT-порт сейчас можно увидеть далеко не на всякой материнской плате, тем не менее, читателям, возможно, интересно было бы узнать, что он из себя представляет.

Прежде всего, разберемся с названием порта. Возможно, далеко не все знают, что обозначает аббревиатура LPT. На самом деле, LPT – это сокращение от словосочетания Line Print Terminal (построчный принтерный терминал). Таким образом, становится понятным, что LPT-порт предназначался, прежде всего, для подключения принтеров. Именно поэтому порт LPT имеет и еще одно название – порт принтера. Хотя теоретически могут подключаться к LPT и другие устройства.

LPT-порт имеет давнюю историю. Он был разработан фирмой Centronics (поэтому данный порт часто называют также портом Centronics), производившей матричные принтеры еще до начала эпохи персоналок, в начале 1970-х. А в начале 1980-х LPT-порт стал использоваться фирмой IBM в своих компьютерах и на какое-то время стал стандартным портом для подключения высокоскоростных (на то время) устройств.

Внешний вид параллельного порта на задней панели компьютера

Интерфейс LPT существовал в нескольких редакциях. В оригинальной версии LPT-порт был однонаправленным, то есть мог передавать данные лишь в одном направлении – к периферийному устройству. Разумеется, такая ситуация не устраивала пользователей, поскольку существовали принтеры, которые требовали передачи данных в обоих направлениях. Поэтому впоследствии интерфейс LPT несколько раз был усовершенствован, пока не был разработан его международный стандарт IEEE 1284. В соответствии с этим стандартом интерфейс параллельного порта поддерживал несколько режимов работы и был также совместим со старыми стандартами. Кроме того, интерфейс в своей конечной редакции поддерживал относительно высокие скорости передачи данных – до 5 Мб/с.

Принцип работы параллельного порта

Порт LPT называется параллельным потому, что в подключаемом к нему кабеле данные передаются параллельно, то есть, одновременно по нескольким проводникам. Этим свойством параллельный порт отличается от другого порта компьютера –последовательного порта COM.

Проводников, передающих сами данные, в кабеле Centronics насчитывается 8. Кроме того, в кабеле присутствует несколько линий, по которым передаются управляющие сигналы.

Хотя параллельный порт большей частью используется для подключения принтеров, тем не менее, существовали и другие его применения. Во-первых, при помощи порта LPT можно напрямую соединить два компьютера – посредством специального кабеля Interlink. До широкого распространения сетевых карт Ethernet подобное соединение, хоть и не обеспечивавшее пользователю большую скорость передачи данных, зачастую было, тем не менее, единственным способом связать два компьютера. Существуют также электронные ключи, предназначенные для подключения к порту LPT.

Кабель для передачи данных между компьютерами - Interlink

Как и в случае многих других устройств на материнской плате, режимы работы параллельного порта часто можно настроить через BIOS Setup. Как правило, для этого используются такие опции BIOS, как Parallel Port, Parallel Port IRQ, Parallel Port DMA и т.п.

Разъем параллельного порта на материнской плате и кабель Centronics

Разъем порта LPT обычно располагается непосредственно материнской плате, хотя до середины 1990-x гг. он обычно присутствовал на вставляемой в слот расширения так называемой мультикарте, на которой были также расположены другие порты компьютера. Выход порта представляет собой 25-контактный разъем типа «розетка», который называется разъемом DB25.

ISA мультикарта с LPT(DB25 - «мама») и игровым портом на борту.

Для подключения к принтеру используется специальный кабель ­­– кабель Centronics. Один конец (вилка) кабеля Centronics подключается к порту, другой (также вилка) – к специальному разъему принтера. Последний разъем имеет 36 контактов. Следовательно, особенностью кабеля Centronics является то, что он имеет разные разъемы с обеих сторон.

Внешний вид кабеля Centronics.

Хотя часто разъем кабеля для материнской платы называется разъемом Centronics, тем не менее, строго говоря, разъемом Centronics называется лишь 36-контактный разъем для подключения к принтеру, а не к материнской плате. Разъем кабеля для подключения к порту называется разъемом Amphenolstacker, от названия разработавшей его американской фирмы Amphenol, производящей разъемы.

Особенности работы параллельного порта

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

Максимальное напряжение, использующееся в сигнальных линиях порта, составляет +5 В. Для простой передачи данных требуется всего лишь десять сигнальных линий – это 8 линий собственно данных, линия строб-сигнала, то есть, сигнала о готовности порта к передаче данных, и линия занятости. Остальные линии используются для совместимости со стандартом Centronics.

LPT-порт типа «мама» с нумерацией контактов.

Назначение выводов разъема параллельного порта DB25:

  • 1 – Data strobe (Строб-сигнал)
  • 2-9 – Данные, биты 0-7
  • 10 – Acknowledge (Подтверждение от принтера)
  • 11 – Busy (Занят)
  • 12 – Paper Out (Кончилась бумага)
  • 13 – Select (Принтер активен)
  • 14 – Auto Feed (Автоматическая подача)
  • 15 – Error (Ошибка)
  • 16 – Init (Инициализация принтера)
  • 17 – Select Input (Выбор устройства)
  • 18-25 – Земля

Заключение

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

Итак, настало время написать простую программу, иллюстрирующую приемы чтения и записи данных в LPT порт. Пока напишем ее в консольном варианте, дабы на этапе понимания и разбора этой программы не пришлось "копаться" в дебрях кода под Windows (не переживайте, следующая статья будет посвящена как раз приложению c визуальным интерфейсом).


Прежде чем двигаться дальше и писать программу, необходимо разобраться с LPT портом, посмотреть из чего он состоит и как нам воспользоваться им в своих целях. Если говорить на бытовом уровне, то можно сказать, что LPT порт это набор контактов, на которых мы можем установить напряжение 0 или +5 В (логическая 0 и 1) из программы или это может сделать внешнее устройство снаружи.



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

Из рисунка видно, что выводы порта можно разделить на четыре группы: это "земляные" выводы. Они обозначены черным цветом (контакты 18-25). Все они соеденены между собой, поэтому для своих разработок в качестве земли можно использовать любой из них.

Красным цветом обозначены выводы так называемого регистра Data (контакты 2-9). Под регистром будем понимать (на бытовом уровне) объдинение группы контактов LPT порта. В регистре Data их 8 штук. Это самый толковый регистр - он позволяет нам как из программы, так и из внешнего устройства установить на его контактах лигическую 0 или 1, т.е. он двунаправленный. Именно его мы и использовали в нашей первой программе Port.exe - подключали светодиод ко 2-му выводу порта (как теперь видно, этот вывод принадлежит регистру Data, является его нулевым битом) и 25 выводу (земля), и спомощью программы управляли подачей напряжения на вывод 2 относительно земли. Чтобы обращаться к этому регистру, надо знать его адрес: 0x378 - в 16-ричной системе или 888 в десятичной.


На рисунке написано &H378 - это тоже самое что и 0x378, просто первое обозначение присуще языку Pasсal и ему подобным, мы же пишем на Си.


Опять вспоминая программу Port.exe , заметим, что обращались мы к регистру с помощью следующей функции _outp(Address, 0); , где переменная Address была предварительно определена как 888. Теперь понятно, что этим мы указывали функции _outp() , что мы хотим работать именно с регистром Data.

Продолжим рассмотрение порта. Осталось еще два регистра. Следующим будет регистр Status (контакты 10-13, 15). Это однонаправленный регистр. Управлять им можно только "снаружи", через внешнее устройство (имеется в виду изменять данные на нем; читать можно из любого регистра в любую строну). Он имеет адрес 0x379 - в 16-ричной системе или 889 в десятичной. И регистр Control (контакты 1, 14, 16-17). Он имеет всего 4 контакта и может управляться только программой. Его адрес: 890 в десятичной системе.



Теперь рассмотрим, а как происходит запись и чтение данных в регистры LPT порта, т.е. как нам установить на нужных выводах 0 или 1.


Запись/чтение данных в регистр Data

Итак, рассмотрим сразу практическую задачу. Хочу чтобы на выводе LPT порта под номером 3 (бит D1 регистра Data ) была установлена логическая 1 (т.е. чтобы между ним и землей было +5 В) и на остальных выводах этого регистра (2,4-9 выводы порта) были нули. Пишем код:

Int Address = 888; int data = 2; Out32(Address, data);

Я использовал функцию Out32() библиотеки inpout32.dll , будем привыкать к ней, т.к. дальнейшие примеры будем разбирать именно на этой библиотеке. Если этот код выполнить, то получится что на выводе порта 3 есть +5 В, а на 2,4-9 "висит" ноль. Как это получилось?

Начнем разбираться: первым параметром функции Out32() мы передаем число 888. Как вы уже знаете, это адрес регистра Data LPT порта. Теперь функция знает куда ей писать данные. Далее вторым параметром мы передаем число 2, т.е. значение для записи в порт. Прошу обратить внимание, что двоика в десятичной системе счисления. Что происходит далее? Для лучшей визуализации процесса, переводим число 2 из десятичной в двоичную систему счисления. Каждый разряд двоичного числа справо на лево записывается по порядку в регистр начиная с младшего разряда D0 (вывод 2 порта) и заканчивая старшим D7 (вывод 9). Если вы переведете число 2 из десятичной в двоичную систему счисленияи дополните число по 8 разрядов (по числу разрядов в регистре) то получите 00000010 . Нулевой разряд двоичного числа - 0 (самую правый) записывается в D0, далее 1 записывается в D1. И так до конца, все 8 разрядов.

Ну что, устали немного пока прочитали? Сейчас станет понятнее. Давайте в регистр Data запишем число 245. Пишем код:

Int Address = 888; int data = 245; Out32(Address, data);

Опять переводим 245 в двоичную систему счисления и справо на лево записываем разряды числа в соответсвующие биты регистра. В итоге получим, что на выводах LPT порта под номерами 2,4,6-9 присутствует напряжение +5 В, на выводах 3,5 - ноль.

Ну что, теперь я думаю, с записью данных в регистр Data мы разобрались. Надо отметить, что диапозон десятичных чисел, которые можно записать в регистр Data лежит в пределах от 0 до 255 . Регистр он у нас 8-ми разрядный, значит максимальное число комбинации 0 и 1 на его выводах составляет 2 8 -1=256-1=255.


Чтение данных

Теперь давайте считаем ранее записанные данные в порт, а именно узнаем текущий статс регистра Data . Мы хотим узнать, на каких выводах регистра Data сейчас высокий уровень напряжения, а на каких низкий. Помните, выше мы записали в порт число 245? Давайте его сейчас получим из порта. Пишем код:

Int Address = 888; int data; data = Inp32(Address);

Inp32() - это функция для чтения данных из порта библиотеки inpout32.dll . Единственным параметром для нее является адрес того регистра, откуда мы хотим прочесть данные. На выходе она возвращает десятичное число, соответствующее текущему содержомому регистра. Выполнив этот код, переменная data будет содержать число 245. Что это значит? Чтобы разобраться, переводим число 245 из десятичной в двоичную и смело можем сказать что на выводах порта 2,4,6-9 сейчас +5 В а на выводах 3,5 0 В. (см. рисунок выше)


Запись/чтение данных в регистр Control

Теперь поуправляем регистром Control. Он однонаправленный, данные в него может записать только наша программа. Обратите внимание на несколько особенностей этого регистра. Во-первых, он содержит всего четыре рабочих вывода. Значит в него можно записать число в диапозоне от 0 до 2 4 -1=16-1=15. Во-вторых, он имеет очень непрятную особенность: некоторые из его выводов инвертированы, т.е. если вы на этот вывод пишете 1, то на ней устанавливается 0. И наоборот, читаете 1, а на самом деле там 0. Поэтому, значение записываемых данных и читаемых данных не совсем очевидны. Приведу пример записи числа в регистр Control. Пишем код:

Int Address = 890; int data = 10; Out32(Address, data);

И пример чтения:

Int Address = 890; int data; data = Inp32(Address);

Запись/чтение данных в регистр Status

Наконец, добрались до регистра Status . Он однонаправленный, данные в него может записать только внешнее устройство , т.е. мы в программе можем только читать содержимое этого регистра. Причитав данные из Status , и переведя их в двоичное число, сразу довольно трудно понять что же реально творится с напряжениями на выходах этого регистра. Во-первых, он тоже имеет инвертированные выводы, а во-вторых рабочими являются биты под номерами 4-7, а 0-3 не используются, и следовательно число записывается довольно хитро.

Возникает вопрос, а как эти данные на нем установить? Довольно просто. В качестве внешнего устройства, пока, будете выступать вы. Выполните такой код.

Int Address = 889; int data; data = Inp32(Address);

Вы получите некоторое число. Теперь возмите проводник и соедините им любой из земляных выводов порта (18-25) с каким-нибудь выводом регистра Status (10-13, 15), например с десятым. И снова выполните чтение. Вы получите другое число. Уберите проводник. Прочитав, получете исходное число. Как это работает? Исходно, на всех выводах этого регистра находится высокий уровень напряжения +5 В. Когда мы соеденили один из его выводов с землей, то на нем, соответственно, напряжение стало равным нулю, т.е. логический ноль. Можно попробовать замыкать и другие выводы регистра Status на землю, замыкать сразу несколько.

Следует заметить, что при таких опытах с регистром Status возникает не совсем понятная ситуация с другими выводами порта LPT. После первого замыкания выводов Status , начинают мигать выводы Data и Control . Это связано с тем, что порт LPT предназначен для подключения принтера, а выводы Status он использует, для того чтобы сообщить компьютеру некоторую служебную информацию. Изменения на выводах Status регестрирует системный драйвер операционной системы. Он же проводит и ответные действия, для нас наблюдаемые в виде периодического изменения состояния других выводов. Тут уж ни чего не поделаешь. Я обычно, просто в начале работы с портом далаю замыкание какой-нибудь линии регистра Status на землю и жду примерно минуту, пока драйвер не "утихомирится". После этого порт свободен, и новые операции над регистром Status не приводят к неконтролируемым процессам в порту.


© Дмитрий Иванов
2005-2006

На Хабре об управлении лампой через интернет, появилась идея управлять освещением дома с компьютера, а так как у меня уже настроено управление компьютером с сотового телефона, то это значит, что и светом можно будет управлять с того же телефона. После демонстрации статьи одному из моих коллег по работе, он сказал, что ему это как раз и нужно. Так как он часто за фильмами, которые смотрит на компьютере, засыпает. Компьютер через некоторое время после окончания фильма тоже засыпает и отключает монитор, а вот свет в комнате остается включённым. Т.е. было решено, что вещь это полезная, и я начал собирать информацию и детали для этого чуда.
Остальная информация под habracut (осторожно много картинок - трафик).

Схема устройства

За исходную схему была взята одна из схем , найденных в Internet и выглядела она вот так:

Но только с небольшим изменением: между 1-ым пином оптопары 4N25 и 2-ым пином LPT был добавлен резистор на 390 Ом, и еще добавлен светодиод для индикации включения. Схема была собрана в тестовом режиме, т.е. просто соединена проводами так как нужно и проверена. В этом варианте она просто включала и выключала старый советский фонарик.
Было решено, что если уже делать управление, то не для одного устройства, а минимум на 4 устройства (из расчёта: одна лампа на столе, люстра на два выключателя, запасная розетка). На данном этапе стало необходимо построение полной схемы устройства, начался выбор различных программ.
Были установлены:

  1. KiCAD
  2. Eagle
Посмотрев все их них я остановился на Eagle, так как в его библиотеке были «похожие» детали. Вот что получилось в нем:

На схеме использован порт DB9 т.е. обычный COM порт, это сделано из соображений экономии как места на плате, так и самих разъёмов (COM"вские у меня были), а так как мы будем использовать только 5 проводников, то этого нам хватит с запасом. Таким образом делаем еще и переходник с DB25 (LPT) на DB9 (COM), в моем случае делается он следующим образом:
LPT 2-9 pin = COM 1-8 pin - это управляющие пины данных;
LPT 18-25 pin (зачастую они соединены между собой) = COM 9 pin - это наша земля.
Так же в схеме используется дополнительное питание на 12В для питания реле, по плану это будет простое китайское зарядное или может быть крона на 9В (одно реле срабатывает нормально, надо проверить на 4 одновременно). Отдельное питание и гальваническая развязка с помощью оптопары используется для того чтобы обезопасить порт компьютера. При желании можно конечно запитаться от 12В блока питания компьютера, но это каждый делает сам и на свой страх и риск.

Необходимые детали для создания устройства
  1. COM порт - 1 шт
  2. коннектор питания - 1 шт
  3. светодиод зелёный - 4 шт
  4. оптопара 4n25 - 4 шт
  5. посадочное место под оптопару (у меня было только на 8 ног) - 4 шт
  6. резистор 390 Ом - 4 шт
  7. резистор 4,7 кОм - 4 шт
  8. транзистор КТ815Г - 4 шт
  9. реле HJR-3FF-S-Z - 4 шт
  10. зажимы на 3 контакта - 4 шт
  11. фольгированный текстолит

Подготовка схемы печатной платы

Попытавшись использовать Eagle для подготовки печатной платы я понял, что это будет сложновато и решил найти более простой вариант. Этим вариантом стала программа sprint layout 5 пусть она и в исполнении для windows, но без проблем запускается в wine под linux. Интерфейс у программы интуитивно понятный, на русском языке и в программе имеется достаточно понятная помощь (help). Поэтому все дальнейшие действия по разработке печатной платы производились в sprint layout 5 (далее SL5).
Хоть и многие используют данную программу для разработки плат своих устройств, в ней не оказалось необходимых мне деталей (даже в куче скачанных коллекций макросов). Поэтому пришлось сначала создать недостающие детали:
  1. COM порт (тот что был не совпал с моим, по отверстиям крепления)
  2. гнездо питания
  3. зажим на три контакта
  4. реле HJR-3FF-S-Z
Вид этих деталей:

После добавления необходимых деталей началось само проектирование печатной платы. Проходило оно в несколько попыток, было их около пяти. Каждый вариант платы печатался на картоне прокалывались отверстия и в них вставлялись детали. Собственно так и было выяснено, что мой COM порт не совпадает с тем который был в SL5. Так же всплыла небольшая ошибка в схеме реле - реально корпус реле был сдвинут на 2-3 мм. Естественно все ошибки были исправлены.
На первом печатном варианте выяснилось еще и не правильное подключение транзистора, были перепутаны два контакта.
После всех исправлений и подгонок получилось плата следующего вида:

В SL5 есть функция «Фотовид» для просмотра платы, вот как она выглядит в нем:

На финальном варианте платы будут еще немного подправлены дорожки, а в остальном она выглядит так же.

В SL5 так же есть удобный вариант печати платы, можно скрывать не нужные слои и выбирать цвет печати каждого слоя, что очень пригодилось.

Подготовка печатной платы

Плату решено было делать методом ЛУТ (лазерно-утюговая технология). Далее весь процесс в фото.

Вырезаем необходимого размера кусок текстолита.

Берем самую мелкую наждачку и аккуратно зачищаем медную поверхность.

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

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

Далее необходимо подготовить раствор для травления. Я использовал для этого хлорное железо. На банке с хлорным железом написано, что раствор необходимо делать 1 к 3. Я немного отступил от этого и сделал 60 г хлорного железа на 240 г воды, т.е. получилось 1 к 4, не смотря на это травление платы происходило нормально, только немного медленнее. Обратите внимание на то, что процесс растворения сухого хлорного железа в воде идёт с выделением тепла, поэтому всыпать его в воду необходимо небольшими порциями и размешивать. Естественно для травления необходимо использовать не металлическую посуду, в моем случае это была пластиковая ёмкость (вроде от селёдки). У меня получился вот такой раствор:

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

Весь процесс травления у меня занял 45 минут, хватило бы и 40 минут, но я был просто занят ещё одним делом.
После травления промываем плату с мылом отрываем скотч с леской и получаем:

Внимание! Не выливайте раствор хлорного железа в раковину (канализацию) - это может повредить металлические детали раковины, да и вообще раствор может ещё пригодиться.
Далее нам необходимо смыть тонер, это успешно делается тем же растворителем 646, который использовался для обезжиривания (долгий контакт растворителя с кожей может её повредить).

Следующим шагом является сверление отверстий. У меня на плате предусмотрены были отверстия 1мм и 1.5 мм изначально, так как найти более тонких свёрл не удалось. Так же найти у нас в городе цанговый патрон для крепления его на электромоторчик не удалось, поэтому все делалось большой дрелью.

Первое устройство подошло

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

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

После сверления необходимо провести лужение платы. Для этого я использовал старый способ - паяльник, флюс ТАГС и олово. Хотелось попробовать с использованием сплава Розе, но его не найти у нас в городе.

После лужения получаем следующий результат:

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

Монтаж деталей

Для проверки правильности платы изначально собираю только одну(из четырёх) линию деталей, мало ли где закралась ошибка.

После монтажа деталей идём и подключаем устройство к компьютеру через LPT, для этого спаян переходник с DB25(LPT) на DB9(COM) в следующем виде:

  • 2 пин DB25 к 1 пину DB9
  • 3 пин DB25 к 2 пину DB9
  • 4 пин DB25 к 3 пину DB9
  • 5 пин DB25 к 4 пину DB9
  • 6 пин DB25 к 5 пину DB9
  • 7 пин DB25 к 6 пину DB9
  • 8 пин DB25 к 7 пину DB9
  • 21 пин DB25 (можно любой с 18 по 25) к 9 пину DB9
Так как в качестве провода использовалась обычная витая пара, то не хватило одного проводка, но для данного устройства достаточно только пяти проводов, так что данный вариант подходит. В качестве включаемой нагрузки у нас выступает простой советский фонарик. Ну и в качестве блока питания - универсальный китайский блок питания (4 коннектора и питание от 3 до 12 в). Вот все в сборе:

А вот уже устройство работает:

На этом закончился ещё один вечер и монтаж остальных деталей был оставлен на следующий день.

А вот и уже полностью собранное устройство:

Ну и небольшое видео о том как это работает (качество не очень, не было чем снять нормально)

Вот и все, осталось только найти нормальный корпус для устройства и запускать его в дело.

Программная часть

Естественно для управления LPT портом нужно какое-то ПО, но так как у меня дома linux, то было решено просто написать простейшую программку самому, а в последствии её уже дописать и адаптировать как надо. Выглядела она примерно так:
#include
#include
#include
#include
#define BASE 0x378
#define TIME 100000
int main ()
{
int x = 0x0F;
int y = 0x00;
if (ioperm (BASE, 1, 1))
{
perror ("ioperm()");
exit (77);
}
outb (x, BASE);
return 0;
}

Данная программка отправляет в LPT порт 0x0F = 00001111, т.е. подает 1 на 2-5 пины (Data0-Data3), а это и есть наше управляющее напряжение между 2-5 пинами и землей (18-25 пины), таким образом будут включаться все четыре реле. Точно так же действует программа для отправки 0x00 в порт для отключения, просто вместо x отправляется y - outb (y, BASE). Еще можно прочитать состояние порта:
#define BASEPORT 0x378 /* lp1 */
...
printf("статус: %d\n", inb(BASEPORT));
...

Единственный нюанс этой программки в том, что её необходимо выполнять от root, так как простому пользователю не доступна функция ioperm. Думаю, как решать такую проблему можно не рассказывать, каждый выберет более подходящий ему вариант.

В последствии программа была доработана так, что бы передавая ей параметры командной строки можно было указывать с каким устройством и что сделать.
Вывод «sw --help»:
Программа для управления реле через LPT порт.
У программы может быть один или два параметра.
Формат параметров: sw [номер устройства] [действие]
номер устройства - от 1 до 8
действие - "on", "off", "st" - включение, выключение, статус
Пример: "sw 2 on" для включения второго устройства или "sw --help" для вывода помощи

PS если кому понадобится, то потом могу где-нибудь выложить файл схемы платы в sl5 и исходник программки управления.

Порт параллельного интерфейса был введен в PC для подключения принтера -LP"T-порт (Line PrinTer - построчный принтер).

Адаптер параллельного интерфейса представляет собой набор регистров, расположенных в пространстве ввода/вывода. Регистры порта адресуются от­носительно базового адреса порта, стандартными значениями которого являют­ся 386h, 378h и 278h. Порт имеет внешнюю 8-битную шину дан­ных, 5-битную шину сигналов состояния и 4-битную шину управляющих сиг­налов.

BIOS поддерживает до четырех LPT-портов (LPT1-LPT4) своим сервисом - прерыванием INT 17h, обеспечивающим через них связь с принтерами по интерфейсу Centronics. Этим сервисом BIOS осуществляет вывод символа, инициа­лизацию интерфейса и принтера, а также опрос состояния принтера.

Интерфейс Centronics

Понятие Centronics относится как к набору сигналов и протоколу взаимодейст­вия, так и к 36-контактному разъему, устанавливаемому на принтерах. Назна­чение сигналов приведено в табл. 1.

Таблица 1.

Сигналы интерфейса Centronics

Назначение

Строб данных. Данные фиксируются по низкому уровню сигнала
Линии данных. Data 0 (контакт 2) - младший бит
Acknowledge - импульс подтверждения приема байта (запрос на прием сле­дующего). Может использоваться для формирования запроса прерывания
Занято. Прием данных возможен только при низком уровне сигнала
Высокий уровень сигнализирует о конце бумаги
Сигнализирует о включении принтера
Автоматический перевод строки.
Ошибка: конец бумаги, состояние OFF-Line или внутренняя ошибка принтера
Инициализация
Выбор принтера (низким уровнем). При высоком уровне принтер не воспринимает остальные сигналы интерфейса
Общий провод интерфейса

Направление

(вход/выход) применительно к принтеру.

Интерфейс Centronics поддерживается большинством принтеров с параллель­ным интерфейсом, его отечественным аналогом является интерфейс ИРПР-М.

Традиционный LPT-порт

Традиционный порт SPP (Standard Parallel Port) является одно­направленным портом, на базе которого программно реализуется протокол обмена Centronics. Порт обеспечивает возможность вырабатывания запроса ап­паратного прерывания по импульсу на входе АСК#. Сигналы порта выводятся на разъем DB-25S (розетка), установленный непосредственно на плате адаптера (или системной плате) или соединяемый с ней плоским шлейфом. Название и назначение сигналов разъема порта (табл. 2) соответствуют интерфейсу Centronics.

Таблица 2.

Разъем стандартного LPT-порта

Контакт DB-25S

Провод шлейфа

Назначение

18, 20, 22, 24, 26

* I/O задает направление передачи (вход/выход) сигнала порта; 0/I обозначает выходные линии, состояние которых считывается при чтении из соответствующих портов вывода.

** Символом «\» отмечены инвертированные сигналы (1 в регистре соответствует низкому уров­ню линии).

*** Вход Ack# соединен резистором (10 кОм) с питанием +5 В.

Стандартный порт имеет три 8-битных регистра, расположенных по сосед­ним адресам в пространстве ввода/вывода, начиная с базового адреса порта (BASE).

Data Register (DR) - регистр данных, адрес= BASE. Данные, записанные в этот порт, выводятся на выходные линии интерфейса. Данные, считанные из этого регистра, в зависимости от схемотехники адаптера соответствуют либо ранее записанным данным, либо сигналам на тех же линиях.

Status Register (SR) - регистр состояния, представляющий собой 5-битный порт ввода сигналов состояния принтера (биты SR.4-SR.7), адрес= BASE+1. Бит SR.7 инвертируется - низкому уровню сигнала соответствует единичное значе­нию бита в регистре, и наоборот.

Назначение бит регистра состояния (в скобках даны номера контактов разъема):

SR.7-Busy - инверсные отображения состояния линии Busy (11);

SR.6 -АСК (Acknowledge) - отображения состояния линии Ack# (10).

SR.5 -РЕ (Paper End) - отображения состояния линии Paper End (12).

SR.4-Select - отображения состояния линии Select (13). Единичное зна­чение соответствует cигналу о включении принтера.

SR.3-Error - отображения состояния линии Error (15).

SR.2 - PIRQ - флаг прерывания по сигналу Ack# (только для порта PS/2). Бит обнуляется, если сигнал Ack# вызвал аппаратное прерывание. Единич­ное значение устанавливается по аппаратному сбросу и после чтения ре­гистра состояния.

SR - зарезервированы.

Control Register (CR) - регистр управления, адрес=ВА5Е+2. Как и регистр дан­ных, этот 4-битный порт вывода допускает запись и чтение (биты 0-3), но его выходной буфер обычно имеет тип открытый коллектор. Это позволяет более корректно использовать линии данного регистра как входные при программи­ровании их в высокий уровень. Биты О, 1, 3 инвертируются - единичному зна­чению в регистре соответствует низкий уровень сигнала, и наоборот.

Назначение бит регистра управления:

CR - зарезервированы.

CR.5 - Direction - бит управления направлением передачи (только для портов PS/2). Запись единицы переводит порт данных в режим ввода.

CR.4 -ACKINTEN (Ack Interrupt Enable) - единичное значение разрешает пре­рывание по спаду сигнала на линии Ackff - сигнал запроса следующего байта.

CR.3 - Select In - единичное значение бита соответствует низкому уровню на выходе Selecting (17) - сигналу, разрешающему работу принтера по интерфейсу Centronics.

CR.2 - Init - нулевое значение бита соответствует низкому уровню на выходе Imt# (16) - сигнал аппаратного сброса принтера.

CR.1 - Auto LF - единичное значение бита соответствует низкому уров­ню на выходе Auto LF# (14) - сигналу на автоматический перевод строки (LF - Line Feed) по приему байта возврата каретки (CR - Carriage Return).

CR.O -Strobe - единичное значение бита соответствует низкому уровню на выходе Strobeff (1) - сигналу стробирования выходных данных.

Запрос аппаратного прерывания (обычно IRQ7 или IRQ5) вырабатывается по отрицательному перепаду сигнала на выводе 10 разъема интерфейса (АСК#) при установке CR.4=1. Прерывание вырабатывается, когда принтер подтвер­ждает прием предыдущего байта.