Pull to refresh

Как я искал идею для первого проекта на Arduino или Wake-on-LAN на Arduino

Reading time4 min
Views98K


Предыстория


В свое время насмотревшись видео о том, как люди мастерят различные устройства вроде хексопадов, испытывал уважения к тем людям, кто это мастерил, с желанием научиться делать что-то подобное. Для себя лично по какой-то неведомой мне причине мог ощущать большую разницу в эмоциях от запрограммированного контроллера с банальным миганием светодиода в сравнении со сложным алгоритмом в софтовом продукте, причем выигрывал первый. Решив, что единственный доступный для меня способ достичь того состояния, когда из под моих рук сможет выйдет что-то подобное хексопаду — это начать программирование элементарных вещей. Выбор пал на Arduino в силу доступности самой платформы и избытка информации по ней.

С чего начать?


Наверное, самый частый вопрос, когда начинаешь новое дело — это «с чего начать?» Делать что-то ненужное не хотелось, а что-то очень сложное могло привести к тому, что не разобравшись в деталях мог охладеть к проекту, не осилив его. Тут я вспомнил про одну особенность своего PC, которая доставляла мне достаточно неудобств. В силу определенных обстоятельств мне частенько приходится подключаться к домашнему компьютеру. Естественно, для того чтобы подключиться по RDP, компьютер должен быть включен. Исходя из этого было два варианта: 1) оставлять PC включенным (что по меньшей мере неудобно); 2) пробуждать его перед подключением.

Очевидно, что второе решение более лаконичное как экономически так и практически. Любые попытки заставить стабильно работать wake-on-lan заканчивались тем, что компьютер становился недоступным, так как не выходил из сна. А если быть точнее, он мог был быть пробужден в пределах какого-то ограниченного времени (около 15-30 минут) после отправления в сон. За рамками этого временного интервала разбудить не удавалось. Пробовались разные платы и разные пляски с бубном вокруг биоса. Результат был всегда одинаков. Я допускаю мысль, что все же это возможно при данных условиях на данном железе, но временные затраты на решение задачи были слишком большими. В итоге при очередной «командировке» приходилось оставлять включенный компьютер без присмотра на несколько дней. Я думаю, большинству понятно, что нельзя сказать, что задача удаленного доступа была решена. Учитывая, что все, что требуется при физическом контакте для пробуждения — это короткое нажатие на кнопку (простое замыкание контактов), я решил, что это достаточно простой проект, да и весьма полезный для меня.

Сказано — сделано


Первое, с чего я начал, было определение того, как все будет работать и минимально необходимый набор для решения данной задачи. По функциональной части решение было следующим. Arduino работает как веб-сервер и ждет сигнала. При получении сигнала о включении/выключении проверяет состояние PC (не является ли он уже работающим/выключенным) и, убедившись, что условия выполняются ненадолго, замыкает контакты кнопки включения. Все довольно просто.

Набор так же достаточно простой: Arduino nano, ethernet MINI ENC28J60, провода для подключения контактов и 1 транзистор (изначально думал обойдусь без транзистора, просто подав такое же напряжение как на первом контакте на второй контакт, но эмпирически установил, что плата ждет не появления эквивалентного напряжения на втором контакте, а просто замыкание на землю первого).

Питание берется с USB, а проверка на включение снимается со свободного пина для кулера на материнской плате.

imageimage

Выбор на ethernet MINI ENC28J60 пал в силу небольших размеров и того, что умельцы уже написали библиотеку для работы Arduino с данной платой.

Работает все примерно так: инициируются Mac-адрес, IP, маска подсети, порт и размер буфера. Дальше инициализация платы ENC28J60 и ethernet/ip. Потом в цикле проверяется буфер, не пришло ли что-нибудь запросом. Интересующие нас запрос — это запрашиваемая методом GET страница c адресом на который мы будем реагировать. В случае если получаем запрос на корневую страницу («GET / HTTP...») даем ответ «It works!» имитируя Apache. В заголовках так же всячески имитируем Apache(Server:«Apache/2.4.9 (Win32)», все такое), чтобы Вася, начитавшийся журнала «Хакер», пытался понять, почему же у него не получается сломать сервер. В случае, если запрос идет не к корневой странице, то если запрашиваемая страница не является той, что мы определили для включения/выключения выдаем «404 Not Found».

По подключения все так же не сложно. Рисовать схему смысла не вижу. Так как по сути подключаются между собой 3 платы (Arduino nano, ENC28J60, материнская плата) и 1 транзистор. Я решил, что для тех, кто не силен в схемотехнике, нагляднее будет представить просто таблицу на пересечении колонок, в которой будет подключение.

Arduino nano ENC28J60 материнская плата транзистор
+5 +5USB
D13 SCR
3v3 VIN
GND GND
D2 INT
D12 SO
D11 ST
D10 CS
D8 CPU_fan
D6 база
GND эмиттер
Power SW коллектор
GND GND


image

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

image

При работе после получения запроса на включение/выключение программа смотрит, есть ли напряжение на «CPU_fan», исходя из этого решает, нужно ли подавать питание на транзистор. Если нужно — подает на базу транзистора ток и через время отключает обратно. Ток на базе транзистора позволяет ему открыться и замкнуть контакты «Power SW» и «GND».

Цель достигнута. Более того, получил возможность вывести PC после BSOD'а, так как можем послать сигнал, который будет эмулировать 4 секундное нажатие на кнопку питания.

Заключение


Это далеко не самое сложное из того, что делалось. Были и свои, более сложные проекты, и написание кода «в помощь» другим людям, но, во-первых, для первой статьи хотелось выбрать не сложный «проект» (слишком громкое слово для вышеописанного), отвечающий «песочнице», во-вторых, первый проект — он как первая любовь. Западает в душу. Тем самым хотелось бы попытаться замотивировать, показать, что первый шаг может быть проще, чем кажется. И если хотя бы один человек после прочтения попробует, буду считать, что статья удалась. Самым «маленьким» советую начать с видео от Jeremy Blum.

P.S.: Ждем с коллегой посылки для сборки квадрокоптера и уже подумываем собрать хексопад. А стоило-то лишь попробовать…

Ссылка на скейтч и библиотеку по работе с ENC28J60.
Tags:
Hubs:
+23
Comments22

Articles