Як я шукав ідею для першого проекту на 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, а перевірка на включення знімається з вільного піна для кулера на материнській платі.

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

Працює все приблизно так: ініціюються Mac-адреса, IP, маска підмережі, порт і розмір буфера. Далі ініціалізація плати ENC28J60 і ethernet/ip. Потім в циклі перевіряється буфер, чи не прийшло що-небудь запитом. Запит - це запитувана методом GET сторінка з адресою, на яку ми будемо реагувати. У разі якщо отримуємо запит на кореневу сторінку («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

 

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

При роботі після отримання запиту на включення/вимикання програма дивиться, чи є напруга на "CPU_fan", виходячи з цього вирішує, чи потрібно подавати харчування на транзистор. Якщо потрібно - подає на базу транзистора струм і через час відключає назад. Струм на базі транзистора дозволяє йому відкритися і замкнути контакти «Power SW» і «GND».

Мета досягнута. Більш того, отримав можливість вивести PC після BSOD'a, так як можемо послати сигнал, який буде емулювати 4 секундне натискання на кнопку живлення.

Ув'язнення

Це далеко не найскладніше з того, що робилося. Були і свої, більш складні проекти, і написання коду «на допомогу» іншим людям, але, по-перше, для першої статті хотілося вибрати не складний «проект» (занадто гучне слово для вищеописаного), що відповідає «пісочниці», по-друге, перший проект - він як перше кохання. Заходить в душу. Тим самим хотілося б спробувати замотивувати, показати, що перший крок може бути простіше, ніж здається. І якщо хоча б одна людина після прочитання спробує, буду вважати, що стаття вдалася. Найменшим раджу почати з відео від Jeremy Blum.

P.S.: Чекаємо з колегою посилки для складання квадрокоптера і вже подумуємо зібрати хексопад. А варто було лише спробувати...

Посилання на скейтч і бібліотеку по роботі з ENC28J60.