Як я шукав ідею для першого проекту на Arduino або Wake-on-LAN на Arduino



Передісторія

У свій час надивившись відео про те, як люди створюють різні пристрої на кшталт хексопадов, відчував поваги до тих людей, хто це майстрував, з бажанням навчитися робити щось подібне. Для себе особисто з якоїсь невідомої мені причини міг відчувати велику різницю в емоціях від запрограмованого контролера з банальним миготінням світлодіода в порівнянні зі складним алгоритмом у софтовом продукті, причому вигравав перший. Вирішивши, що єдиний доступний для мене спосіб досягти того стану, коли з під моїх рук зможе вийде щось подібне хексопаду — це почати програмування елементарних речей. Вибір припав на 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.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.