Предыстория
После прочтения статьи на Хабре об управлении лампой через интернет, появилась идея управлять освещением дома с компьютера, а так как у меня уже настроено управление компьютером с сотового телефона, то это значит, что и светом можно будет управлять с того же телефона. После демонстрации статьи одному из моих коллег по работе, он сказал, что ему это как раз и нужно. Так как он часто за фильмами, которые смотрит на компьютере, засыпает. Компьютер через некоторое время после окончания фильма тоже засыпает и отключает монитор, а вот свет в комнате остается включённым. Т.е. было решено, что вещь это полезная, и я начал собирать информацию и детали для этого чуда.
Остальная информация под habracut (осторожно много картинок — трафик).
Схема устройства
За исходную схему была взята одна из схем, найденных в Internet и выглядела она вот так:
![Схема предшественник](https://habrastorage.org/storage/habraeffect/04/5e/045e91ff88c977bba301a86350ce9a57.jpg)
Но только с небольшим изменением: между 1-ым пином оптопары 4N25 и 2-ым пином LPT был добавлен резистор на 390 Ом, и еще добавлен светодиод для индикации включения. Схема была собрана в тестовом режиме, т.е. просто соединена проводами так как нужно и проверена. В этом варианте она просто включала и выключала старый советский фонарик.
Было решено, что если уже делать управление, то не для одного устройства, а минимум на 4 устройства (из расчёта: одна лампа на столе, люстра на два выключателя, запасная розетка). На данном этапе стало необходимо построение полной схемы устройства, начался выбор различных программ.
Были установлены:
- PBC
- KiCAD
- gEDA
- Eagle
Посмотрев все их них я остановился на Eagle, так как в его библиотеке были «похожие» детали. Вот что получилось в нем:
![Схема устройства в Eagle](https://habrastorage.org/storage/habraeffect/c2/08/c2086a2d11442e91bb2b0f04aa621cb7.png)
![Схема устройства с деталями](https://habrastorage.org/storage/habraeffect/ab/12/ab1281db07a6d8240e6554506b37742f.png)
На схеме использован порт 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
Вид этих деталей:
![Созданные детали в sl5](https://habrastorage.org/storage/habraeffect/59/a4/59a47f704584d3f7408ef1fab17bd852.png)
После добавления необходимых деталей началось само проектирование печатной платы. Проходило оно в несколько попыток, было их около пяти. Каждый вариант платы печатался на картоне прокалывались отверстия и в них вставлялись детали. Собственно так и было выяснено, что мой COM порт не совпадает с тем который был в SL5. Так же всплыла небольшая ошибка в схеме реле — реально корпус реле был сдвинут на 2-3 мм. Естественно все ошибки были исправлены.
На первом печатном варианте выяснилось еще и не правильное подключение транзистора, были перепутаны два контакта.
После всех исправлений и подгонок получилось плата следующего вида:
![Финальный вид платы](https://habrastorage.org/storage/habraeffect/22/d2/22d215e598299ee21a7549fed3fa8adf.png)
В SL5 есть функция «Фотовид» для просмотра платы, вот как она выглядит в нем:
![Фотовид платы с прозрачностью](https://habrastorage.org/storage/habraeffect/55/72/55723d908796bb4b9ead9dd74a8ceba8.png)
![Фотовид платы без прозрачности](https://habrastorage.org/storage/habraeffect/7c/29/7c29262a7b586e891bfa52117ae941e9.png)
На финальном варианте платы будут еще немного подправлены дорожки, а в остальном она выглядит так же.
В SL5 так же есть удобный вариант печати платы, можно скрывать не нужные слои и выбирать цвет печати каждого слоя, что очень пригодилось.
Подготовка печатной платы
Плату решено было делать методом ЛУТ (лазерно-утюговая технология). Далее весь процесс в фото.
Вырезаем необходимого размера кусок текстолита.
![Подготовка текстолита](https://habrastorage.org/storage/habraeffect/df/48/df48581a92fca39b91010af7449c3f08.jpg)
Берем самую мелкую наждачку и аккуратно зачищаем медную поверхность.
![Зачищеная поверхность](https://habrastorage.org/storage/habraeffect/4d/7d/4d7dadc7cffbe842c1c6f30ec2220f1e.jpg)
После зачистки поверхности её необходимо промыть и обезжирить. Промывать можно водой, а обезжиривать ацетоном (в моем случае это был растворитель 646).
Далее печатаем на лазерном принтере на мелованной бумаге нашу плату, не забыв в принтере установить самую жирную печать (без экономии тонера). Этот вариант получился немного не удачным, так как размазался тонер, но другая попытка была в самый раз.
![Печатная заготовка для ЛУТ](https://habrastorage.org/storage/habraeffect/bb/9c/bb9ccbd98f0dabd9aa1548d9d667c06b.jpg)
Теперь необходимо перенести рисунок с бумаги на текстолит. Для этого вырезаем рисунок и прикладываем его к текстолиту, стараемся его выровнять как нужно и после этого прогреваем утюгом. Необходимо тщательно прогреть всю поверхность, что бы тонер расплавился и прилип к медной поверхности. Потом даем плате немного остыть и идём мочить её под струей воды. Когда бумага достаточно хорошо промокнет её необходимо отделить от платы. На плате останется только прилипший тонер. Выглядит это так:
![Плата после нанесения рисунка](https://habrastorage.org/storage/habraeffect/86/7c/867c53727bb4595de640b8c301b27565.jpg)
Далее необходимо подготовить раствор для травления. Я использовал для этого хлорное железо. На банке с хлорным железом написано, что раствор необходимо делать 1 к 3. Я немного отступил от этого и сделал 60 г хлорного железа на 240 г воды, т.е. получилось 1 к 4, не смотря на это травление платы происходило нормально, только немного медленнее. Обратите внимание на то, что процесс растворения сухого хлорного железа в воде идёт с выделением тепла, поэтому всыпать его в воду необходимо небольшими порциями и размешивать. Естественно для травления необходимо использовать не металлическую посуду, в моем случае это была пластиковая ёмкость (вроде от селёдки). У меня получился вот такой раствор:
![Раствор хлорного железа](https://habrastorage.org/storage/habraeffect/94/c7/94c7a5cbd2d674cd835b8314b3fcaf7c.jpg)
Перед тем как опустить плату в раствор, я с помощью скотча приклеил к её обратной стороне леску, что бы было удобнее доставать и переворачивать плату. Если раствор попадет на руки надо быстро его смыть с мылом (мыло его нейтрализует), но пятна могут все равно остаться, все зависит от конкретных условий. Пятна с одежды вообще не выводятся, но мне повезло этого не проверить на себе. Погружать плату в раствор надо медью вниз и не всю плашмя, а под углом. Время от времени плату желательно очищать от отработки, так как она мешает дальнейшему травлению. Делать это можно при помощи ватных палочек.
![Плата после 10-15 минут травления](https://habrastorage.org/storage/habraeffect/06/b6/06b6d07da11c486939f362a8bdf7e7f4.jpg)
![Плата после 38 минут травления](https://habrastorage.org/storage/habraeffect/50/e7/50e7e4603b760735f13a538d2ccd3966.jpg)
Весь процесс травления у меня занял 45 минут, хватило бы и 40 минут, но я был просто занят ещё одним делом.
После травления промываем плату с мылом отрываем скотч с леской и получаем:
![Плата после травления и промывки (на просвет)](https://habrastorage.org/storage/habraeffect/71/66/71669a26808e8ec2803f944e26fd624a.jpg)
![Плата после травления и промывки](https://habrastorage.org/storage/habraeffect/4a/f8/4af81bcc912a8f373bf6c36232e3fd50.jpg)
Внимание! Не выливайте раствор хлорного железа в раковину (канализацию) — это может повредить металлические детали раковины, да и вообще раствор может ещё пригодиться.
Далее нам необходимо смыть тонер, это успешно делается тем же растворителем 646, который использовался для обезжиривания (долгий контакт растворителя с кожей может её повредить).
![Плата после удаления тонера](https://habrastorage.org/storage/habraeffect/59/78/5978fa617f35d2e571b61bea1a56b98a.jpg)
Следующим шагом является сверление отверстий. У меня на плате предусмотрены были отверстия 1мм и 1.5 мм изначально, так как найти более тонких свёрл не удалось. Так же найти у нас в городе цанговый патрон для крепления его на электромоторчик не удалось, поэтому все делалось большой дрелью.
![Подготовка к сверлению](https://habrastorage.org/storage/habraeffect/f7/e6/f7e6786fd00d4dca2c0aff04f9fc720c.jpg)
Первое устройство подошло
![Первый девайс подошел](https://habrastorage.org/storage/habraeffect/a7/b6/a7b66200537c108f9327d9b024704a1c.jpg)
На первый раз я взял только два сверла, а при использовании такой дрели этого оказалось мало. Одно сверло сломалось, а второе погнулось. Все что я успел просверлить в первый день:
![А на этом все на сегодня](https://habrastorage.org/storage/habraeffect/18/bc/18bc74f8e1a5e674cdc5720f831b89f0.jpg)
На следующий день я купил пять свёрл. И их как раз хватило, так как если они не ломаются (кстати из пятёрки сломал только одно), то тупятся, а при сверлении тупыми — портятся дорожки, медь начинает отслаиваться. После полного сверления платы получаем:
![Плата полностью просверлённая, на просвет](https://habrastorage.org/storage/habraeffect/2b/34/2b347faef9918a4bcab161d488885526.jpg)
![Плата полностью просверлённая, сторона деталей](https://habrastorage.org/storage/habraeffect/b4/1d/b41ddf14a03fae82ffc1a8a51991d6b2.jpg)
После сверления необходимо провести лужение платы. Для этого я использовал старый способ — паяльник, флюс ТАГС и олово. Хотелось попробовать с использованием сплава Розе, но его не найти у нас в городе.
![Процесс лужения](https://habrastorage.org/storage/habraeffect/5e/f0/5ef05acfd70fc0831c1e8fc186e42acf.jpg)
После лужения получаем следующий результат:
![Плата после лужения, вид 1](https://habrastorage.org/storage/habraeffect/fe/fa/fefae0c8c98a0f7e697d877f4796660f.jpg)
![Плата после лужения, вид 2](https://habrastorage.org/storage/habraeffect/d5/9e/d59eb2ebcf269590f825cced5b7a65e4.jpg)
Далее необходимо промыть плату для удаления остатков флюса, так как ТАГС водоотмывной, то делать это можно или водой или спиртом. Я сделал что-то среднее — отмывал старой водкой и протирал ватными палочками. После всех этих действий наша плата готова.
Монтаж деталей
Для проверки правильности платы изначально собираю только одну(из четырёх) линию деталей, мало ли где закралась ошибка.
![Плата с одним рядом деталей](https://habrastorage.org/storage/habraeffect/24/ef/24efb31f91db4472a80f204e5e3ff9ce.jpg)
После монтажа деталей идём и подключаем устройство к компьютеру через 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 в). Вот все в сборе:
![Устройство собрано для теста](https://habrastorage.org/storage/habraeffect/46/d0/46d02935c75894e8ce7fe48e10d689f1.jpg)
А вот уже устройство работает:
![Устройство успешно работает](https://habrastorage.org/storage/habraeffect/69/74/6974d4132e4c2b8fb075a23a2682d01c.jpg)
На этом закончился ещё один вечер и монтаж остальных деталей был оставлен на следующий день.
А вот и уже полностью собранное устройство:
![Полностью укомплектованная плата - дорожки](https://habrastorage.org/storage/habraeffect/d9/46/d946ac05bc5eef716018c935a0ac0db4.jpg)
![Полностью укомплектованная плата - детали](https://habrastorage.org/storage/habraeffect/7a/90/7a9030e3f9283b8d7c5634f5a9872862.jpg)
Ну и небольшое видео о том как это работает (качество не очень, не было чем снять нормально)
Вот и все, осталось только найти нормальный корпус для устройства и запускать его в дело.
Программная часть
Естественно для управления LPT портом нужно какое-то ПО, но так как у меня дома linux, то было решено просто написать простейшую программку самому, а в последствии её уже дописать и адаптировать как надо. Выглядела она примерно так:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#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 и исходник программки управления.