Примеры схем для LPT порта
ПодробностиКатегория: Компьютер
В этой статье приводятся несколько примеров радиосхем управляемых при помощи LPT порта. Этого вполне хватит для изучения принципов работы LPT порта, а также для первых шагов в программировании LPT порта. Для начала рекомендуем спаять себе небольшую схемку:
выводы на схеме от 18 до 25 можно не замыкать между собой;
резисторы по 470 Ом можно подключить к любому из них.
Резисторы в схеме служат для ограничения потребляемого тока. Напряжение между сигнальным выводом LPT и общем проводом должен быть в не более 2,4V. Ток – около 2.6 mA. Т.е. очень мало, но на самом деле современные материнские платы расчитаны на большую нагрузку и очень часто имеют защиту от короткого замыкания.
В любом случае, с портом нужно обращаться очень аккуратно, т.к. без него материнская плата компьютера может вообще отказаться работать.
Вот самая простая схема подключения реле:
Думаю, что объяснять здесь ничего не нужно. Data – это один из выходов LPT порта, например, вывод 2 (Data-0).
Если на нем появится log1, транзистор откроется, сработает реле K1 и подключит какую-то более мощную нагрузку..
В этой схеме LPT порт напрямую подключен к транзистору и в случае его пробоя на выходе data может оказаться опасное для порта напряжение. Чтобы защитить порт нужно использовать гальваническую развязку.
Схема с применением оптопары.
В данной схеме порт отделен от высоковольтной части и ему почти ничего не угрожает. В этой схеме я ставил опто изолятор 4N25 – самый дешевый и маленький. Катушка на схеме – это реле на 12 вольт. Во время экспериментов я подключил к этой схеме реле РЭС22, а к нему настольную лампу. Для пробы написал программку, которая управляла лампой по часам…
Есть спец. микросхемы работы с LPT портом. Они обеспечивают гальваническую развязку, инвертируют выходной сигнал и тд. Мне известна пока только две 74HCT573 и 74ALS373
Это схема подключения 74ALS373. Как она работает я не знаю, я не использовал микросхемы вообще, обходился просто связкой оптопара+транзистор или оптопара+симистор.
Кстати, вот примерчик управления симистором:
Эту схемку я просто воткнул вместо выключателя от основного освещения в своей комнате. Очень пригодилось когда настраивал LPT-стробоскоп. Можно было не вставая с места выключить на время свет.
Ещё один пример практического использования LPT порта, наверно самый удачный.
Это стробоскоп управляемый через LPT интерфейс.
В предыдущей статье я обещал рассказать о чтении информации с LPT порта и привести несколько схем датчиков. Пока просто расскажу о программировании и о подключении кнопочек, а дальше по ситуации.
Схема подключения кнопок и переключателей оказалась такойже простой как и схема подключения светодиодов:
Для ввода информации я использовал 5 стандартных входов – выводы 10, 11, 12, 13 и 15. Первоначальное состояние выводов – log1, т.е. на них напряжение 5V. Мой тестер сказал, что там не 5, а 4.
7V, может тестер не точно показывает, может блок питания в компе слабоват, а может так и надо – не важно. Следовательно, замкнув вывод порта на землю (выводы 18-25), мы переведем его в состояние Log0. Замыкать вывод прямо на землю я не рискнул и соединил его с землей через резистор в 470 ом.
Можно обойтись и без резистора – всё отлично работает, но лучше не рисковать. Для дальнейших экспериментов я собрал себе панельку из 5 кнопочек по приведенной выше схеме и достал с архивного диска компилятор Turbo Pascal 7.1 (то же что и Pascal 7.0). Тем, кто не умеет работать с портами, советую прочитать предыдущую статью “Основы программирования LPT”, тк.
сейчас я уже не буду подробно описывать как и почему.Как я уже говорил, считать значение на выходах порта можно одной строчкой: data := port[$378], где $378 – базовый адрес порта. Это выходы, ими управлять мы уже умеем. А входы нахотятся по адресу “базовый+1”, те.
$379 пробуем считать:Var data:byte; {переменная DATA типа byte} data := Port[$379]; {читаем значение порта в data} writeln(data); {выводим значение на экран}
В результате на экране останется число 120 (у меня так :)). Нажимаем одну из кнопок, запускаем программу ещё раз – число изменилось. Чтобы не мучиться с запуском программы и её закрытием, а просто жать на кнопки и смотреть, я немного доработал программу:
while not keypressed do {пока не нажата кнопка на клавиатуре…} begin {повторяем код от сюда…..} data := port[$379]; {читаем значение порта в data} gotoxy(1,1); {ставим курсор в позицию 1,1 на экране} write(' '); {пишем пробелы чтобы замазать текст} gotoxy(1,1); {возвращаем курсор назад в позицию 1,1} write(data); {выводим значение на экран} delay(100); {задержка в 100мс.(не точно!)}
Для тех кто работает в Delphi, маленькая вставочка на ассемблере, тк. я не знаю как в дельфи правильно работать с портами:
Эта программа будет делать следущее: выведет значение порта на экран, подождет 100мс, вернет курсор в начало строки и заменит старое значение на новое и так до тех пор, пока не нажата кнопка на клавиатуре.
Теперь можно запустить программу, убрать клавиатуру с мышкой в сторону и наблюдать за изменениями. Вот теперь начинается головоломка…
Методом тыка я нашел, что каждой кнопке соответствует своё значение (свой бит), значения присвоены очень странно, может позже я разберусь почему, но пока просто выложу их:
вывод | значение |
10 | 64 |
11 | 128 |
12 | 32 |
13 | 16 |
15 | 8 |
Я не случайно выделил 11 вывод жирным, он отличается от других – он логически инвертирован, те. если все наши кнопки система считает отжатыми, то эту она считает замкнутой. А если её замкнуть, то система будет думать что кнопка отжата. Теперь как это всё влияет на общее число которое мы считали (120): Если нажать на одну из наших кнопочек, то от общего числа отнимется значение этой кнопочки (см. таблицу). Например, мы нажимаем кнопку подключеную к выводу 10 и число сразу уменьшается на 64 (см. прогу), отпустим и значение снова увеличится на 64. А теперь, нажмем кнопку на выводе 15 – значение уменьшилось на 8, отпустили и оно опять увеличилось. А что будет если нажать особенную 11 кнопку? Нажимаем – значение не уменьшилось, а возрасло, отпустили и оно опять уменьшилось. Вот чем эта кнопка отличается от остальных 4. А теперь по русски, как узнать программе что нажато? Я делал так: Запоминаю что сейчас в порте, при изменении значения сравниваю что было и что получилось, если отличается на 64, значит нажата 10кнопка, если отличается на 32, значит 12 кнопка и тд. Чтобы определить нажата или отпущена, нужно учитывать увеличилось число или уменьшилось. То есть, если число стало меньше на 32, то нажата кнопка 12, а если число увеличилось на 32, значит кнопку 12 отпустили. НО! тут нужно учитывать, что кнопка со значением 128 (11вывод) работает наоборот.
Вот то же самое, только на программерском:
var bylo,stalo : word; razn : integer ;-64 : writeln('нажата кнопка 10 !'); 64 : writeln('отпущена кнопка 10 !'); -32 : writeln('нажата кнопка 12 !'); 32 : writeln('отпущена кнопка 12 !'); 128 : writeln('нажата кнопка 11 !'); -128 : writeln('отпущена кнопка 11 !');
Надеюсь, что этого кода достаточно для начала, дальше уже можно самостоятельно разобраться или спросить помощи на форуме Теперь снова об электронике… В простейшем варианте можно использовать кнопочки или переключатели как в экспериментальной панельке, можно поставить геркон, тк.
это тоже кнопочка, только магнитная, можно контакты реле… Но тут нужно помнить про такую нехорошую вешь, как “дребезг” контактов – расшатаный или просто некачественный выключатель обязательно будет давать повторные срабатывания в программе.
Если точность не нужна, то можно просто увеличить задержку с 100 мс до, например, 1 секунды и тогда программа просто не обработает повторные нажатия. А если нужна точность, то нужно что-то придумывать.
Теоретически, связать порт можно с любым низковольтным устройством через транзистор, те.
замыкать контакты не кнопкой, а транзистором.
Например, у нас есть схема, в которой светодиод загорается когда кто-то проходит рядом с устройством, если светодиод подключен прямо к выводу микросхемы, просто подпиваем к ножке микросхемы вместо светодиода резистор, а резистор к базе транзистора эмиттер с коллектором которого подключены вместо выключателя к ножке. Ух, во сказал, аж сам не понял. Просто лень рисовать схему, а примерчик этот из моей практики…
Источник: zps-еlесtrоnics.cоm
Источник: http://radiofanatic.ru/kompyuter/503-primery-skhem-dlya-lpt-porta.html
LPT мигает светодиодом
Эту статью я написал года четыре назад. А сейчас внезапно нашёл её, и решил выложить в блог. Довольно забавно 🙂 Предупреждаю, я не несу ответственности за то, что может произойти с вашей техникой в результате применения данной информации.
В последнее время довольно долгое время меня мучила мысль о том, что неплохо бы как-нибудь своими силами связать компьютер с внешним миром.
Плюс ко всему впустую простаивающий параллельный порт принтера меня угнетал, ибо у меня принтер подключён через USB.
Я просмотрел несколько статей, описаний и прочей литературы, и то что у меня вышло в результате экспериментов назвать оригинальным язык не поворачивается, но, тем не менее, это может показаться кому-то интересным.
Задача стоит весьма тривиальная: научиться управлять мерцанием светодиода, подключённого к ПК через LPT-порт. Почему именно LPT? Потому что он довольно прост и в меру интересен.
Поехали!
Подготовка
Итак, что нам нужно для воплощения этого ужаса в реальное существо:
- ПК
- Компилятор какого-нибудь языка программирования (Assembler, С, С++, Pascal, etc…).
- Некоторый программный инструментарий
- Светодиод на 5В
- LPT-шнур
Шнур у меня был только разрезанный, но вы можете использовать любой, главное всё правильно соединять. Вот мой шнур, с уже выведенными контактами для подключения светодиода (об этом речь пойдёт далее):
Вот, собственно, светодиод, купленный на ближайшем базаре за несколько денег. Он который будет светиться ярким синим светом:
Железо
Прежде чем приступить к практике, немного теории.
Как работаете LPT-порт? Об этом достаточно много написано, однако я всё-таки кратко расскажу как обстаят дела.
Параллельный порт ПК обычно используется для подключения принтеров, но на этом его возможности не ограничиваются. К нему можно подключать любое внешнее, самодельное устройство. LPT-порт имеет 25 пинов, но не все 25 необходимы. В нашем примере, например, нужно только 2. Рассматривать предназначение всех не будем.
Подключать светодиод будем плюсом к 2 пину, а минусом – к пину 18. Смотрите, не перепутайте, в противном случае светодиод может сгореть. Лучше предварительно проверить где у него плюс, где минус на маломощной батарейке.
Если у вас шнур папа-мама, то есть при подключении к компьютеру, на вашем конце шнура остаются входы, дело простое – просто воткнуть в нужные пины диод. Следует быть осторожным, неправильно подключив, можно повредить LPT-порт.
Лично я, раскурочив шнур, определил, какой относится к D0, какой к земле, и у меня всё выглядит примерно так, как показано на следующем рисунке. Я сидел с пробником, и вычислял, какая линия относится к D0. Очень занимательно! Вы можете найти более удочное решение.
В мерах предосторожности можно последовательно к диоду припаять сопротивление. Рекомендуют 470 Ом. На счёт заземления: кто-то заземляет не на пин GRD, а на корпус коннектора, но я предпочитаю пин.
На этом этапе вы должны представлять себе, как можно подключить светодиод к LPT-порту.
Программная часть
Подключить светодиод к компьютеру мы готовы, но вот, дальше-то что? А дальше самое интересное: управление им с бортового пульта. С одним светодиодом много не сделаешь: только включать/выключать его можно.
Но зато можно менять частоту мигания, можно подключить ещё 7 светодиодов к остальным пинам D1-D8, и сделать светомузыку.
Или приобрести яркие белые светодиоды, и сделать настольную лампу, питающуюся от LPT-порта, которая включается, когда вы начинаете печатать, чтобы подсветить вам клавиатуру.
Можно вывести зелёненький светодиод куда-нибудь на видное место и написать программу, мигающую им, когда вам на E-mail приходит письмо. Сколько всего можно сделать только лишь с использованием светодиода! А подковав себя в электронике, можно собирать полноценные внешние устройства, но это, к сожалению, выходит за рамки данной скромной статьи.
Управление LPT-портом зависит от ОС. В былые времена, операционные системы DOS и Windows 95/98 разрешали пользовательским программам напрямую иметь доступ к железу.
С появлением Windows NT/2000/XP всё изменилось, теперь общение с портами напрямую пользовательским программам запрещено, а разрешено только коду, выполняющемуся в режиме ядра.
Всё это сделано в целях защиты и в других нужных и полезных целях, однако всё это одновременно и усложняет нашу задачу по подмигиванию светодиодом. Нам пришлось бы писать специальный драйвер устройства, разбираться в HAL (Hardware Abstraction Layer) и прочих премудростях.
Вы можете заняться этим, почитав материалы по Microsoft DDK (Device Driver Kit). Но существует несколько обходных путей, позволяющих напрямую общаться с нашим LPT. Вообще, так делать не рекомендуется, но всё же, мы сделаем именно так, ибо так проще и нагляднее.
Другими словами, напрямую получить доступ к регистрам LPT-порта просто так не удастся. Вы можете работать с драйвером устройства LPT как с обычным файлом при помощи функций CreateFile, ReadFile, WriteFile, а так же получать некоторую информацию о состоянии устройства функцией DeviceIoContol. Но работать с регистром, например, D0, который включает наш светодиод, не получится.
В ОС Linux всё обстоит по-иному. Там можно делать всё просто, имея на то специальные права. Необходимо только узнать по какому адресу находится ваш LPT. Обычно он находится по адресу 0378h. Узнать адрес в вашей системе можно, просмотрев файл /proc/ioports. Хотя, проще работать с файлом устройства /dev/lp0.
Разберём, как справиться с ОС Windows, потому что это немного сложнее.
Перед тем, как перейти непосредственно к программированию своими силами, проверим, работает ли всё это дело, собранное в прошлой части статьи. Для этого я использую чудесную программу мониторинга параллельного порта, так и названную: Parallel Port Monitor by Neil Fraser.
Как делаю я: запускаю программу, выключаю в ней все пины с 2 до 9, затем подключаю светодиод к LPT-порту (в нашем случае во второй пин, в D0). После этого в Parallel Port Monitor подаю единицу на D0. Светодиод должен загореться. Если ничего не произошло, возможно, вы неправильно его подключили или же в программе выбрали не тот LPT-порт. Попробуйте LPT1, LPT2, LPT3, если у вас их несколько.
Светодиод мигает? Отлично. Теперь можно побаловаться с ним своим программным кодом. Как было сказано ранее, это делать мы будем обходным путём. Если вы используете Windows 95/98/ME, можете сразу перейти к написанию программы, обходные пути вам не нужны, эти версии ОС Windows позволяют напрямую обращаться к портам.
1) Использование драйвера UserPort
Программа UserPort (автор Tomas Franzon), это системный драйвер режима ядра для Windows NT/2000/XP, который позволяет обращаться к портам ввода-вывода напрямую. Как раз то, что нам необходимо. Найти её в любом поисковике не составит труда. Скачав, настроив, согласно документации и запустив, мы получаем возможность мигать светодиодом из наших программ.
Сперва определим адреса портов в Device Manager. Видим, LPT1 по адресу 0378-037F. Именно туда мы и будем писать биты управления светодиодом. Пишем 1 – на контакты светодиода подаётся напряжение +5В, он загорается, пишем бит 0 – светодиод гаснет.
Напишем тестовую программу, мигающую светодиодом раз в секунду. Исходный текст приведён ниже. Здесь я использовал С++ со вставками ассемблерного кода и компилятор Visual C++. Вы можете использовать свой любимый язык программирования и компилятор, суть не меняется.
#include #include void doLight(bool on) { __asm { mov DX,0378h mov AL,on out DX,AL } } int main() { while(1) { doLight(true); std::cout
Источник: https://bitsofmind.wordpress.com/2008/08/07/led-and-lpt-port/
Управление устройствами на 220в через LPT порт (полный цикл создания)
После прочтения статьи на Хабре об управлении лампой через интернет, появилась идея управлять освещением дома с компьютера, а так как у меня уже настроено управление компьютером с сотового телефона, то это значит, что и светом можно будет управлять с того же телефона.
После демонстрации статьи одному из моих коллег по работе, он сказал, что ему это как раз и нужно. Так как он часто за фильмами, которые смотрит на компьютере, засыпает. Компьютер через некоторое время после окончания фильма тоже засыпает и отключает монитор, а вот свет в комнате остается включённым. Т.е.
было решено, что вещь это полезная, и я начал собирать информацию и детали для этого чуда. Остальная информация под habracut (осторожно много картинок — трафик).
Схема устройства
За исходную схему была взята одна из схем, найденных в Internet и выглядела она вот так:
Но только с небольшим изменением: между 1-ым пином оптопары 4N25 и 2-ым пином LPT был добавлен резистор на 390 Ом, и еще добавлен светодиод для индикации включения. Схема была собрана в тестовом режиме, т.е. просто соединена проводами так как нужно и проверена.
В этом варианте она просто включала и выключала старый советский фонарик. Было решено, что если уже делать управление, то не для одного устройства, а минимум на 4 устройства (из расчёта: одна лампа на столе, люстра на два выключателя, запасная розетка). На данном этапе стало необходимо построение полной схемы устройства, начался выбор различных программ.
Были установлены: Посмотрев все их них я остановился на 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В блока питания компьютера, но это каждый делает сам и на свой страх и риск.
Необходимые детали для создания устройства
- COM порт — 1 шт
- коннектор питания — 1 шт
- светодиод зелёный — 4 шт
- оптопара 4n25 — 4 шт
- посадочное место под оптопару (у меня было только на 8 ног) — 4 шт
- резистор 390 Ом — 4 шт
- резистор 4,7 кОм — 4 шт
- транзистор КТ815Г — 4 шт
- реле HJR-3FF-S-Z — 4 шт
- зажимы на 3 контакта — 4 шт
- фольгированный текстолит
Подготовка схемы печатной платы
Попытавшись использовать Eagle для подготовки печатной платы я понял, что это будет сложновато и решил найти более простой вариант. Этим вариантом стала программа sprint layout 5 пусть она и в исполнении для windows, но без проблем запускается в wine под linux.
Интерфейс у программы интуитивно понятный, на русском языке и в программе имеется достаточно понятная помощь (help). Поэтому все дальнейшие действия по разработке печатной платы производились в sprint layout 5 (далее SL5).
Хоть и многие используют данную программу для разработки плат своих устройств, в ней не оказалось необходимых мне деталей (даже в куче скачанных коллекций макросов).
Поэтому пришлось сначала создать недостающие детали:
- COM порт (тот что был не совпал с моим, по отверстиям крепления)
- гнездо питания
- зажим на три контакта
- реле 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
“, inb(BASEPORT)); …
Единственный нюанс этой программки в том, что её необходимо выполнять от root, так как простому пользователю не доступна функция ioperm. Думаю, как решать такую проблему можно не рассказывать, каждый выберет более подходящий ему вариант.
В последствии программа была доработана так, что бы передавая ей параметры командной строки можно было указывать с каким устройством и что сделать. Вывод «sw –help»:
Программа для управления реле через LPT порт. У программы может быть один или два параметра.
Формат параметров: sw [номер устройства] [действие] номер устройства – от 1 до 8 действие – “on”, “off”, “st” – включение, выключение, статус
Пример: “sw 2 on” для включения второго устройства или “sw –help” для вывода помощи
PS если кому понадобится, то потом могу где-нибудь выложить файл схемы платы в sl5 и исходник программки управления.
Источник: https://habr.com/post/112511/
LPT-порт в схемах на микроконтроллере
Компьютер обрабатывает сигналы параллельными потоками, поэтому ему легче «общаться» с параллельными, а не с последовательными внешними портами. В 1984 г. в составе IBM PC впервые появился параллельный порт. Задуман он был как средство подключения матричных принтеров, отсюда и название LPT — Line PrinTer или Line Printer Terminal.
В дальнейшем для принтеров стали использовать быстродействующий интерфейс USB, а LPT-порт начал постепенно вытесняться из компьютерных спецификаций. Остряки сравнивают LPT с чемоданом без ручки — и выбросить жалко, и тащить невозможно. Тем не менее, «ветеран» ещё на многое способен, если, конечно, он присутствует в конкретном компьютере.
Разъём LPT-порта имеет 25 контактов. Нормой «де-факто» считается розетка DB-25F в компьютере и вилка DB-25M в ответном кабеле (Табл. 4.2). Нумерация контактов вилок и розеток зеркальная (Рис. 4.7, а, б).
Таблица 4.2. Раскладка сигналов в 25-контактном разъёме LPT-порта
DB-25 | Цепь | Расшифровка | Функция | Направление |
1 | STROBE | Strobe | Строб | Вход/выход |
2…9 | D0…D7 | Data Bit | Данные | Вход/выход |
10 | ACK | Acknowledge | Подтверждение | Вход |
11 | BUSY | Busy | Готовность | Вход |
12 | РЕ | Paper End | Нет бумаги | Вход |
13 | SEL | Select | Выбор | Вход |
14 | AUTOFD | Autofeed_____ | Автоперенос | Вход/выход |
15 | ERROR | Error | Ошибка | Вход |
16 | INIT | Initialize | Инициализация | Вход/выход |
17 | SELIN | Select In | Выбор входа | Вход/выход |
18…25 | GND | Ground | «Земля» | Общий |
Рис. 4.7. Внешний вид спереди 25-контактных разъёмов LPT-порта: а) розетка DB-25F в компьютере; б) вилка DB-25M в соединительном кабеле.
Первоначально линии LPT-порта были однонаправленными SPP (Standard Parallel Port).
Часть из них работала только на вход, часть — только на выход, что по набору сигналов и протоколу обмена соответствовало принтерному интерфейсу «Centronics». В 1994 г.
был утверждён новый стандарт параллельного интерфейса IEEE 1284, предусматривающий двунаправленные линии и три режима работы: SPP, EPP (Enhanced Parallel Port), ECP (Extended Capabilities Port).
Уровни электрических сигналов LPT-порта совпадают с обычными «пятивольтовыми» логическими микросхемами. Раньше в компьютерах применялись буферные TTJl-микросхемы серии 74LSxx, позднее — КМОП-микросхемы и БИС, примерно эквивалентные серии 74ACxx. В последнем случае можно ориентировочно считать, что НИЗКИЙ уровень равен 0.1..0.2 В, а ВЫСОКИЙ — 4.5…4.9 В.
Стандартом регламентируется нагрузка 14 мА по каждому выходу при сохранении напряжения не менее +2.4 В ВЫСОКОГО и не более +0.4 В НИЗКОГО уровня. Однако в разных материнских платах выходные буферы LPT-порта могут иметь разную нагрузочную способность, в том числе и ниже стандарта («слабый» порт).
Требования к соединительным кабелям, подключаемым к LPT-порту:
• сигнальные провода должны быть свиты в пары с общим проводом GND;
• каждая пара должна иметь импеданс 56…68 Ом в диапазоне частот 4… 16 M Гц;
• если применяется плоский ленточный кабель, то сигнальные провода должны физически чередоваться с общим проводом GND (локальные экраны);
• уровень перекрёстных помех между сигналами не более 10%;
• кабель должен иметь экран, покрывающий не менее 85% внешней поверхности. На концах кабеля экран должен быть окольцован и соединён с «земляным» контактом разъёма;
• в разъёме кабеля можно запаять на контакты 1…17 последовательные резисторы C2-23 (OMJIT-O.125) сопротивлением 100…300 Ом (Рис. 4.8). Это позволит защитить компьютер от случайных коротких замыканий в нагрузке и уменьшить высокочастотный «звон» на фронтах сигналов.
Рис. 4.8. Электрическая схема LPT-кабеля с «антизвонными» резисторами.
Схемы соединения MK с LPT-портом можно разделить на три группы:
• приём сигналов от компьютера (Рис. 4.9, а…з);
• передача сигналов в компьютер (Рис. 4.10, а…д);
• приём/передача сигналов одновременно (Рис. 4.11, a…e).
В схемах приняты некоторые упрощения. В качестве входного сигнала указывается в основном «DO», а в качестве выходного — «АСК», хотя могут быть и другие, перечисленные в Табл. 4.2. На каждом конкретном компьютере работоспособность самодельных схем необходимо проверять экспериментально, что связано с наличием «сильных» и «слабых» LPT-портов по нагрузочной способности.
Рис. 4.9. Схемы ввода сигналов из LPT-порта в MK (начало):
а) резистор R1 ограничивает входной ток. Элементы R2, C1 могут отсутствовать, но они уменьшают «звон» на фронтах сигналов при длинном кабеле;
б) буферный транзистор VT1 инвертирует сигнал. Диод VD1 не обязателен, но он защищает транзистор от ошибочной подачи большого отрицательного напряжения. Если не ставить резистор R2, то схема останется работоспособной, однако при отстыковке кабеля от LPT-порта возможны ложные срабатывания транзистора VT1 от внешних помех и наводок;
в) диод VD1 отсекает помехи и повышает порог срабатывания транзистора VT1. Резистор R1 надёжно закрываеттранзистор VT1 при НИЗКОМ уровне с LPT-порта;
г) буферный логический элемент DD1 имеет выход с открытым коллектором. Фронты сигналов формируются элементами R1, C1. Можно вместо инвертора DD1 поставить повторитель К155ЛП9, сделав соответствующие изменения в программе MK и компьютера;
д) триггер Шмитта DD1 (замена — К555ТЛ2) повышает помехоустойчивость. Чем меньше сопротивление резисторов R1, R2, тем больше крутизна фронтов сигнала. При отключённом кабеле от LPT-порта резистор R1 не даёт входу микросхемы DD1 «висеть в воздухе»;
е) последовательное включение двух логических элементов DD11, /)/)/.2увеличивает (восстанавливает) крутизну фронтов сигнала. Резистор R1 устраняет выбросы, «звон»;
Рис. 4.9. Схемы ввода сигналов из LPT-порта в MK (окончание):
ж) данные, поступающие от LPT-порта, предварительно помещаются в промежуточный регистр DD1. Запись производится при ВЫСОКОМ уровне на входе «С» микросхемы DD1, хранение — при НИЗКОМ.
Такое решение устраняет помехи, поскольку в LPT-порт в зависимости от установленных в компьютере драйверов периодически могут выводиться случайные данные.
Их устраняют программно, например, путём многократного считывания входного сигнала с линий MK;
з) буферизация LPT-порта мощными транзисторными ключами, находящимися в микросхеме DA1 фирмы Texas Instruments. Резисторы R1…R8 могут иметь в 10… 15 раз более низкие сопротивления, что позволяет подключить параллельно выходам микросхемы А4/другие узлы устройства.
Рис. 4.10. Схемы вывода сигналов из MK в LPT-порт (начало):
а) непосредственное подключение выхода MK без буферных элементов. Резисторы R1, R2 уменьшают отражение сигналов в линии. Кроме того, резистор R2 защищает выход MK от случайного короткого замыкания с цепью GND в проводах соединительного кабеля;
б) триггер Шмитта DD1 служит защитным буфером для MK при аварийной ситуации на выходе (короткое замыкание или подача большого напряжения);
в) микросхема DD1 имеет выход с открытым коллектором, что защищает её от короткого замыкания в проводах и разъёмах соединительного кабеля;
г) подача двух противофазных сигналов в компьютер. Цель — программная необходимость или организация дублирующего (контрольного) канала передачи данных;
д) опторазвязка на элементах HL1, BL1, которые применяются в компьютерных механических «мышах». Транзистор КГ/усиливает и инвертирует сигнал. Для нормальной работы устройства компьютер должен выставить ВЫСОКИЙ уровень на линии «D8».
Рис. 4.11. Комбинированные схемы ввода/вывода сигналов между MK и LPT-портом (начало):
а) если компьютер выставляет на линии «DO» ВЫСОКИЙ уровень, то MK в режиме выхода может генерировать сигнал «АСК» через резистор R1. Если MK переводится в режим входа, то компьютер может передавать ему данные по линии «DO» через диод VD1 при этом внутренний « pull-up» резистор MK формирует ВЫСОКИЙ уровень;
б) сигнал от LPT-порта вводится в MK через инвертор на транзисторе VT1 при этом компьютер должен выставить ВЫСОКИЙ уровень на линии «D2». Информация в MK вводится с линии «DO» через резистор R1 Высокое сопротивление резистора R1 физически развязывает входной и выходной каналы;
Рис. 4.11. Комбинированные схемы ввода/вывода сигналов между MK и LPT-портом (окончание):
б) сигнал от LPT-порта вводится в MK через инвертор на транзисторе VT1, при этом компьютер должен выставить НИЗКИЙ уровень на линии «DO». Информация в МК вводится через элементы R1, R3, VT2;
г) сигнал от LPT-порта вводится в MK через повторитель на транзисторе VT1, при этом компьютер должен выставить ВЫСОКИЙ уровень на линии «DO». Информация в MK вводится через повторитель на микросхеме DD1
ж) сигналы «D0»…«D3» вводятся в MK при НИЗКОМ уровне на линии «INIT», при этом компьютер должен настроить линии «D4»…«D7» как входы.
В настройках BIOS компьютера надо установить двунаправленный режим EPP или ЕСР для LPT-порта. Информация в компьютер из МК передаётся по линиям «D4»…«D7» при ВЫСОКОМ уровне на линии «INIT».
Резистор R1 переводит выходы микросхемы DD1 в Z-состояние при отключённом кабеле от LPT-порта;
e) сигнал от MK в LPT-порт вводится через повторитель DD1.2, при этом компьютер должен выставить ВЫСОКИЙ уровень на линии «D2» и НИЗКИЙ уровень на линии «D5». Информация в MK вводится через повторитель DD1.1 при НИЗКОМ уровне налинии «D2». Стробирование сигналов по входам «Е1», «Е2» микросхемы DD1 повышает достоверность передачи данных.
Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).
Источник: http://nauchebe.net/2014/03/lpt-port-v-sxemax-na-mikrokontrollere/
1.2 Описание схемы электрической принципиальной
Управлять вентиляторами можно лишь при условии, что материнская плата компьютера оснащена необходимыми для этого электронными регуляторами, а так бывает далеко не всегда. Если встроенных регуляторов нет, поможет блок.
По командам формируемым программно на линиях порта LPT компьютера, он обеспечивает разельное шестнадцатиступенное регулирование частоты вращения трёх вентиляторов, изменяя подаваемое на них напряжение от 5…5,5в до 11,7…11,8в, что соответствует изменению чачтоты вращения от 40 до 100% максимальной.
К розетке LPT системного блока компьютера подключают вилку Х1. Счетверенный транзисторный оптрон U1 предназначен для гальванической развязки цепей порта LPT и цепей управления вентиляторами. Ток через излучающие диоды оптронов ограничен резисторами R1-R4.
Три канала управления вентиляторами, подключаемыми к вилкам Х2, Х4 и Х5, построены по одинаковым схемам, однако в одном из них (управляющим вентилятором №1) предусмотрен узел защиты на микросхеме DD1, назначение и работа которого будут рассмотрены позже.
Вилку Х3 соединяют с имеющейся в каждом компьютере стандартной кабельной розеткой, предназначенной для питания дисководов.
Работу его каналов рассмотрим на примере первого, построенного на счетчике DD2.1, диодах VD3-VD6 и транзисторах VT1, VT4.
Цикл начинается по окончании общего для всех каналов импульса начальной установки, формируемого программно на линии DATA1 порта LPT и поступающего на входы R их счетчиков через оптрон U1.2. Через некоторое время с линии DATA2 через оптрон U1.
1 на вход CN счетчика начинают поступать счетные импульсы, с каждым из которых изменяется состояние выходов счетчика. Резисторы R11-R14 и диоды VD3-VD6 образуют преобразователь кода в напряжение, пропорциональное числу импульсов, поступивших на вход счетчика в данном цикле.
Оно поступает на вентилятор через усилитель на транзисторах VT1 и VT4. Поскольку циклы регулирования повторяются с периодом приблизительно 3 с, напряжение на вентиляторе большую часть времени остается неизменным, пульсации сглаживает конденсатор С4.
На нулевой ступени регулирования (счетных импульсов нет) вентилятор вращается с минимальной частотой, которую устанавливают подстроечным резистором R37. Максимальную частоту вращения (пришло 16 импульсов) регулируют подстроечным резистором R24.
Узел защиты на микросхеме DD1 представляет собой два реле времени: первое – на элементах R9, C1, VD1, DD1.2, DD1.4, второе – на R10, C2, VD2, DD1.3, DD1.5, DD1.6. Пока на вход элемента DD1.
1 регулярно поступают импульсы установки счетчиков в исходное состояние, конденсаторы С1 и С2 периодически подзаряжаются, уровни напряжения на выходах элементов DD1.4 и DD1.6 и в точке соединения диодов VD15, VD17 – низкие.
Диод VD16 закрыт, узел защиты не влияет на работу канала управления вентилятором.
Если управляющая программа не запущена, остановлена или в ее работе произошел сбой, вентилятор №1 (как правило он охлаждает процессор) должен вращаться с достаточной для эффективного охлаждения скоростью.
В подобной ситуации импульсы начальной установки отсутствуют, и в зависимости от уровня сигнала на линии DATA1 на выходе элемента DD1.1 установлен постоянный высокий или низкий уровень.
Приблизительно через 8 с после прекращения импульсов один из конденсаторов С1, С2 разрядится и на выходе подключенной к нему цепочки логических инверторов будет установлен высокий уровень. Через диод VD15 или VD17 он поступил на делитель напряжения из резисторов R36, R43, R44.
С подвижного контакта переменного резистора R43 через R35 и открывшийся диод VD16 напряжение поступит на базу транзистора VT1, что приведет к увеличению частоты вращения вентилятора №1. С возобновлением импульсов начальной установки конденсаторы С1 и С2 зарядятся и нормальная работа канала управления восстановится.
Вентиляторы №2 и №3 обычно охлаждают менее ответственные узлы компьютера, поэтому их защита от прекращения компьютерного управления не предусмотрена.
Плата установлена в стандартную заглушку пятидюймового отсека системного блока компьютера. Она закреплена гайкой, навинченной на резьбовую втулку переменного резистора R43. Вилки установлены на достаточно длинных для подключения к вентиляторам и розетке питания жгутах из проводов черного (-, общий) и желтого (+,+12В) цветов.
Для управления вентиляторами разработана программа FanControl, но чтобы она смогла работать в автоматическом режиме, на компьютере нужно предварительно установить и запустить программу SpeedFan.
Источник: http://prog.bobrodobro.ru/110335
Учимся работать с LPT портом
Доброго времени суток кодеры, и остальные маньяки компьютерной индустрии. Сегодня я расскажу тебе как можно управлять LPT портом и использовать его в своих целях. Так что запасайся сникерсами и терпением. В конце я покажу интересный пример его использования.
LPT порт имеет 25 контактов на которых может быть установлено 0 или +5В (0 или 1). Устанавливать значения можно программным путем или с помощью внешнего устройства. Давайте рассмотрим следующий рисунок который поможет нам в работе.
(Сразу признаюсь, рисунок не мой, он взят с сайта www.pcports.ru, где есть много информации на данную тему).
Как мы видим, выводы порта можно разделить на четыре группы. Восемь крастных выводов относятся к регистру Data. Чтобы к нему обращаться, надо знать его адресс: 378h – в 16-ричной системе или 888 – в 10-ричной.
Биты этого регистра могут быть установлены (или сброшены) как программно, так и внешним устройством. Выводы обозначенные черным цветом являются земляными.
Все они соединены между собой и для наших целей мы можем использовать любой.
Зеленым цветом обозначены контакты, устанавливать значение которых можно только через внешнее устройство. То есть программно мы их изменить не можем. Мы можем только считывать их состояние. Они относятся к регистру Status, который имеет адрес 379h в 16-ричной или 889 в 10-ричной системе.
И регистр Control, выводы которого обозначены синим цветом. Он как и регистр Status однонаправленный, но тут его состояние изменять можно только программно.
Ну что, надо бы и на практике закрепить. Давай вспомним старый, добрый Ассемблер. Для работы с портами он предоставляем нам две команды: in и out. Команда in загружает данные в аккумулятор из порта устройства ввода/выводы. Пример:
n аккумулятор, порт.
В этом случае можно выводить из портов с адресами до 255. Нам этого недостаточно. Используя регистровую адресацию можно выводить из портов до 65536. Вот пример:
in аккумулятор, dx.
То есть адрес порта должен быть заранее помещен в регистр dx. Команда out наоборот – помещает в порт данные из аккумулятора. Пример: out dx, аккумулятор. Здесь также используется регистровая адресация, что бы можно было работать с портами, адреса которых до 65536.
Теперь запускаем наш любимый Делфи, ставим на форму кнопку и по событию ее нажатия пишем следующий ассемблерный код (это называется ассемблерная вставка (примечание Soffrick'а – Inline assembler) и она записывается между ключевыми словами asm и end):
(этот пример не будет работать в Windows NT.
Потом расскажу как это побороть)
procedure TForm1.Button1Click(Sender: TObject);
asm //обозначает, что дальше пойдет ассемблерный код mov dx,888 //засылаем в регистр dx адрес нашего порта в 10-чной системе mov al,00000001b //в аккумулятор засылаем “маску” в двоичной сис. out dx,al //выводим в порт (а точнее в регистр Data знач. 00000001
end;
Теперь обьясню чего мы добились. Давай посмотрим на наш рисунок, а точнее на красные разьемы которые соответствуют битам от D0 до D7 регистра Data. А теперь угадай какой из них мы установили в 1. Правильно, бит D0, а следовательно и контакт №2 установлен в 1.
А это значит, что на этом контакте сейчас находится +5 Вольт. Проверяется легко. Нужно взять светодиод и его “+” засунуть во второй контакт, а его “-” в 25-й (тоесть заземлить).
Вот тут я должен тебя предупредить, что подключение к LPT порту всяких самодельных устройств (сделанных не грамотно) может обернутся выходом из строя материнской платы. Обычно длинный усик светодиода – это “+” (лучше проверить это с помощью батарейки).
Наш светодиод должен загореться. Но вот не задача. Наша программа при нажатии на кнопку ругается. Дай угадаю, у тебя винда не 9х.
Дело в том, что ОС Windows NT (2000, XP) с целью обеспечения безопасности использования совместных аппаратных ресурсов компьютера, запрещает к ним прямой доступ из программ пользовательского режима. И чтобы обратиться к порту, необходимо все операции проводить через драйвер. Я предлагаю использовать библиотеку Inpout32.dll.
Скачать ее можно здесь http://www.pcports.ru/files/inpout32.rar. Эта библиотека, при работе с NT, обращения к ней конвертирует в запросы к стандартному драйверу ОС, через который и идет обмен данными с портом. Узнать больше об этой библиотеке и ее авторе можно здесь: http://www.logix4u.net/inpout32.htm.
Эта библиотека содержит две следующие функции которые нам пригодятся. Вот их описание:
Inp32(PortAdr: word): byte.
Ей передается адрес порта, а она возвращает значение которое в нем установлено. Внимание, значение передает в десятичной системе. Следующая функция:
Out32(PortAdr: word; Data: byte): byte.
Из описания видно что она тоже может возвращать какой то результат, но нам это не понадобится. Она отсылает в указанный порт указанное значение (тоже в 10-чной сис.).
Снова открываем наш отчаянно закрытый после первой попытки Делфи и делаем следующее. Нам необходимо объявить функции из библиотеки.
Для этого в нашем исходнике после перечня модулей и перед объявлением типов пишем следующее:
…
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll'; function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
type TForm1 = class(TForm)
…
Здесь мы объявили две функции. Указали, что вызываться они будут стандартным способом (написав stdcall), а также мы указали, что процедура внешняя и находится в библиотеке (external 'inpout32.dll').Кстати, эта библиотека должна находиться в папке вместе с исполняемым файлом. Далее кидаем на форму кнопку и по ее нажатию пишем:
Out32(888,1);
Компилируем, запускаем и о чудо, загорелся наш светодиод. А теперь давай вспомним “маску” (00000001) из предыдущего примера. Наша единица, которая передается во втором параметре в порт 888 (регистр Data) в 10-чной сис. равносильна 00000001 в 2-чной.
То есть, если взять еще два светодиода, и “+” одного засунуть в 3-й контакт LPT порта, а “+” другого, например в пятый, а ихние минусы конечно заземлить подключив к 25-му выводу, то для того что бы их все зажечь, надо во втором параметре функции Out32 отправить на порт 11: Out32(888,11), потому что 11, в двоичной системе будет выглядеть так 00001011. Непонятно? Попробуй эти нолики и единички визуально наложить на рисунок, начиная с девятого контакта и до 2-го. Теперь не сложно догадаться, что на контактах 5,3 и 2 будет установлено напряжение +5В и наши светодиоды, которые мы туда засунули, будут гореть. Теперь мы можем сделать что-нибудь по интереснее, например мигалку. Используя таймер это не сложно сделать. Попробуй сам.
Ну вот вроде бы и все, что я хотел тебе рассказать сегодня. В следующей статье я расскажу как сделать так, что бы радиоуправляемая машинка управлялась не с пульта, а с клавиатуры. Удачной компиляции.
Written by: Kastor
Источник: http://www.vr-online.ru/content/uchimsja-rabotat-s-lpt-portom-1034
LptSW — программа управления нагрузками при помощи LPT-порта
Толчком к разработке всего проекта послужила статья «Программное управление отключением компьютерных АС» в журнале Радиолюбитель № 9 за 2007 год.
У описанной там программы
и схемы имеются, на мой взгляд, некоторые недостатки:
- управление только одной нагрузкой, хотя резервы линий порта имеются;
- чрезвычайно лаконичный интерфейс, на грани неудобного;
- необходимость использования специальных библиотек для доступа к портам компьютера напрямую;
- ложные срабатывания схемы при загрузке операционной системы (о чем сам автор упоминал).
Сначала я задумался о причинах ложных срабатываний аппаратуры. Наиболее вероятно, что при самотестировании в начале (средствами 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. По сравнению с прототипом она не сильно изменилась (в расчете на 1 канал, естественно).
К выбору типов элементов схемы особых требований не предъявляется, допустима замена элементов на любые, сходные по параметрам. VT2 может потребовать установки на небольшой теплоотвод.
VD1 — КД209, [datasheet=1N4001]1N400x[/datasheet] или иной на ток не менее 0,8А и обратное напряжение не ниже 25В.
Оптрон VU1 может быть практически любым транзисторным: [datasheet=aot127]АОТ127[/datasheet], [datasheet=aot127]АОТ128[/datasheet], [datasheet]AOT110[/datasheet], [datasheet]4N35[/datasheet] и др. Реле должно быть рассчитано на срабатывание при выбранном напряжении питания.
Это не единственный возможный вариант схемы, можно модифицировать ее, оставив, например, только один канал управления и превратив ее в аналог схемы из первоисточника.
Можно изменить конструкцию ключевого каскада, применить оптореле, «переставить» линии управления порта… Но при разработке других вариантов схемы необходимо соблюдать 3 важных условия: обязательно обеспечивать гальваническую развязку — раз, ограничивать ток через линии LPT порта на уровне не более 10 мА — два, и обеспечивать соединение контактов 11 и 12 разъема порта с общим проводом порта — три. Несоблюдение первых двух условий может привести к порче компьютера, а третьего — к зависанию программы.
Конструктивно устройство можно выполнить в виде сетевого удлиннителя на 5 розеток (1 обычная розетка для питания компьютера и 4 для управляемых нагрузок). Печатная плата устройства не разрабатывалась.
Управляющая программа в виде исполняемого файла доступна для скачивания здесь. Программа тестировалась в Windows XP Pro SP2. Она обладает следующими возможностями и особенностями:
- Не требует инсталляции, ничего не пишет в системный реестр
- После запуска работает в системном трее Windows
- При помощи всплывающих подсказок информирует о состоянии нагрузок
- Управление режимами ведется при помощи всплывающего меню по щелчку правой кнопкой на иконке в системном трее
- Позволяет управлять четырмя раздельными нагрузками
- Каждый из 4-х каналов нагрузки может иметь заданное пользователем название для удобства работы
- При запуске программы заранее указанные нагрузки могут включаться автоматически
- При завершении программы все нагрузки могут быть или автоматически отключены, или оставлены в текущем состоянии
- Имеет простой интерфейс в стандартном стиле Windows
- Не использует для работы с портом дополнительных библиотек
Рисунок 2
Всплывающее меню программы имеет (по умолчанию) вид, показанный на
рисунке 2
.
Пункт «Показать» откроет в центре экрана рабочее окно программы. То же самое произойдет по двойному щелчку на иконке в системном трее. Назначение пунктов «О программе» и «Выход» очевидно, а 4 недоступные (при первом запуске) пункта предназначены для управления соответствующими нагрузками.
Рисунок 3. Вид основного окна
На рисунке 3 показано основное окно программы. Галочкой в столбце «Канал» можно разрешить управление соответствующим каналом. Для разрешенных каналов становятся доступны соответствующие поля настройки их параметров (запрещенные каналы всегда выключены).
Каждый канал управления может иметь свое наименование, по умолчанию это просто «Канал» с номером — на рисунке как раз показано, что 3 канала поименованы, а последний — еще нет.
Если необходимо, чтобы при запуске программы канал включался автоматически, нужно установить галочку в столбце «Состояние при старте». Галочка в столбце «Состояние сейчас» управляет текущим состоянием канала, т. е. при ее установке нагрузка немедленно включится, при снятии — выключится.
Наконец, есть еще одна галочка, общая для всех каналов — «Перед выходом все отключить». Ее назначение, надеюсь, понятно без комментариев.
После того, как все параметры заданы, основное окно можно свернуть, оно при этом не появится в панели задач, а останется, как и ранее, в системном трее. Зато теперь уже меню преобразится (см. рисунок 4)! Теперь каналы получили заданные названия. Включенные нагрузки в меню отмечаются галочками.
Лично мне такой интерфейс представляется более привычным и удобным, нежели тот, что в программе-прототипе.
В программе предусмотрена возможность «тонкой» настройки, однако она немного завуалирована. Дело в том, что эта возможность предназначена для тех, кто решит изменить схему адаптера, а это может потребоваться по двум причинам:
- Неудобная разводка платы адаптера по имеющейся схеме
- Процедура самотестирования BIOS работает не так, как на моей материнской плате, из-за чего пары линий шины данных LPT не обеспечивают реализации вышеописанных функций
В обоих случаях наверняка потребуется изменить назначение линий порта 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 км и более. Но эта тема уже не попадает в рамки данного проекта.
Источник: http://radio-hobby.org/modules/news/article.php?storyid=320