Однажды увидел я на просторах ролик, как кто-то подключил лифтовой вызывной пост вместо обычной кнопки включения компьютера. И вот как-то раз я снова вспомнил про это, отчего мне сразу захотелось сделать что-то подобное. Но, раз уж делать, то куда технологичнее. Сделаем такую кнопку, не требующую вскрытия корпуса и подключения напрямую к контактам на материнке. Можно ли это реализовать? Как оказалось, это несколько сложнее, чем я думал…
Итак, в сегодняшней статье сделаем аналог той штуки, который можно будет подключить к любому компьютеру. Заодно разберёмся, как это будет работать, поговорим про USB HID и все его нюансы, посмотрим на начинку лифтовых кнопок разных лет и наконец добавим на рабочий стол артефакт из подъезда двухтысячных.
❯ Суть такова
Давным-давно попалось мне вот такое видео, где компьютер включался вызывным постом от старого лифта.
Также у этого автора было видео и с домофоном в качестве такого же устройства…
Но там всё было просто и понятно: кнопка подключена вместо таковой на корпусе к контактам PWR_SW на материнской плате. А что, если сделать такое отдельным устройством, способным выключать и включать компьютер, скажем, по USB? Этим мы сейчас и займёмся.
❯ Обзор оборудования
Перво-наперво нам понадобится кнопка.
Вот такая стояла в ролике с домофоном. Это ВП-31. Более старые версии ВП-30 и ВП-30М ставились на первые модели лифтов с автоматическими дверями, выпускавшиеся с шестидесятых годов.
В первом же видео был вызывной пост ВП-711 (в моём случае это ВП-710, но по конструкции он очень похож). Это уже поздняя его модификация, с металлической кнопкой. Изначально колпачок был пластиковым, но ввиду его уязвимости перед вандалами (практически во всех тогдашних подъездах эти кнопки жгли) в поздних версиях он был заменён на металлический с отверстием.
Но всё же я сделаю вольное допущение, так что на переделку отправится вот такой вот завалявшийся у меня среди всякого лифтового хлама экземпляр от лифта Карачаровского механического завода с электронным управлением.
Также понадобится какой-то дешёвый микроконтроллер с аппаратным USB. В качестве него была взята плата на чипе RP2040.
Вообще, для такой штуки она довольно избыточна, но по факту это самая дешёвая из платформ, где есть полноценный аппаратный USB. Даже Arduino Pro Micro стоит в полтора-два раза дороже.
❯ Разбираем вызывные посты
Ну а пока что, раз уж начали про кнопки вызова, взглянем на экземпляры разных фирм и годов и посмотрим, как они устроены. Переделывать их мы не будем, про подопытную кнопку поговорим чуть позже. Кому-то, возможно, мои фотографии помогут собрать девайс назад, если после разборки непонятно, что в какое положение ставить.
Первой на очереди идёт ВП-710. С обратной стороны у неё кабельный ввод и заводская табличка. Выпущен мой экземпляр, как видно, в 1981 году. Также видны крепёжные отверстия. Да, кнопка по факту устанавливается с обратной стороны стены.
Передняя часть держится на двух лифтовых спецболтах типа «свиной пятачок». Выкручиваем их.
Колпачок кнопки. Он из некоего дешёвого алюминиевого сплава. Внутри него пружина и вставка из пластмассы.
Сам кнопочный элемент.
Подвижный контакт.
А вот и неподвижная контактная группа. Как видно, кнопка коммутировала довольно внушительный ток, напайки из серебра порядком обгорели.
Основание, на котором смонтированы все эти детали.
А это ВП-31.
Хотя эти две модели некоторое время выпускались параллельно, внутри она сильно отличается от предыдущей…
Колпачок кнопки. На нём кольцо, прижимающееся к контактам на основании. Таким образом, если лифт плохо вызывается, кнопку достаточно слегка провернуть, чтобы замыкать начала ещё не замызганная сторона.
На этот раз вся начинка находится в задней части, а передняя — просто пластина. Контакты и лампочка накаливания смонтированы на детали из карболита.
С обратной стороны ничего особенного.
Всё, больше ничего нет. Просто до гениальности.
Вызывной пост ПЛВ13 Щербинского лифтостроительного завода.
Внутри практически пусто — лишь маленькая плата с тактовой кнопочкой и светодиодами.
❯ USB
А пока что соберём кнопки обратно и перейдём к микроконтроллеру.
По сути прошивка его должна уметь примерно следующее:
- Определять, активен компьютер или нет.
- Уметь выключать его и включать.
И, казалось бы, и то, и другое реализовать несложно.
Уверен, все, у кого есть игровая мышь или клавиатура, замечали, что подсветка на ней загорается лишь тогда, когда компьютер запущен (примерно сразу после того, как инициализируется шина, где-то в момент появления заставки BIOS). В этом легко убедиться, если подключить клавиатуру к заряднику — гореть она не будет.
С включением и выключением компьютера проблем тоже нет. Был когда-то такой образец адового UX как кнопки питания в самом неудачном для них месте на клавиатуре. Многие либо избегали таких моделей, либо заклеивали, снимали или выламывали эти кнопки, дабы избежать случайного нажатия на них.
Конечно, можно отыскать дохлую (залитую или укокошенную) клавиатуру с подсветкой и такими кнопками, вытащить из неё плату управления и припаять провода к начинке вызывного поста. Но это не наш путь, так что будем реализовывать всё сами на МК.
❯ Контролируем активность ПК
Перво-наперво разберёмся с подсветкой.
Немного подумав, решил использовать библиотеку Adafruit TinyUSB (форк tinyusb). В ней как раз есть возможность определять, работает хост или нет.
Теперь открываем первый попавшийся скетч из примеров и дополняем его примерно следующим:
if (TinyUSBDevice.suspended()) {
digitalWrite(LED_BUILTIN,HIGH);
}
else {
digitalWrite(LED_BUILTIN,LOW);
}
Загружаем прошивку.
Как видим, клавиатура горит, а светодиод на плате — неа. Далее отправляем компьютер в спящий режим.
Невероятно! Светодиод действительно мигает! Ну а если снова оживить компьютер, то всё вернётся в исходное состояние.
❯ Удалённое пробуждение
Теперь очередь более сложного. В одном из примеров я нашёл вот такой код:
// Remote wakeup
if (TinyUSBDevice.suspended() && btn_pressed) {
// Wake up host if we are in suspend mode
// and REMOTE_WAKEUP feature is enabled by host
TinyUSBDevice.remoteWakeup();
}
Похоже на часть того, что нам надо.
Однако при замыкании контактов компьютер продолжал спать как убитый. Хотя, казалось бы, все условия для его просыпания были выполнены, что подтвердилось тем, что от малейшего движения мышью машина ожила. Что-то тут не так…
❯ HID и вот это всё
До этого моё знакомство с разработкой USB HID устройств ограничивалось мышью, клавиатурой и джойстиком, отчего мне казалось, что с клавишами управления питанием всё просто: есть некий скан-код, который клавиатура посылает на ПК, отчего тот выключается или включается. Загуглив на удачу «multimedia keys scancodes», нашёл целый список этих кодов для разных клавиатур. Среди прочего там есть и клавиши питания. Но, если попробовать отправить код любой из них, на компьютер это не произведёт ни малейшего впечатления. Почему же? Для этого надо разобраться с тем, что вообще отправляют HID-устройства по USB.
Чтобы передать какую-то информацию, устройство отправляет на хост «отчёт» (HID report) — пакет специального формата. Формат этого пакета описывается дескриптором. В нём выбирается так называемая usage page — проще говоря, тип устройства, которое шлёт пакеты (мышь, клавиатура, джойстик или что-то ещё). Для устройства назначаются параметры, которыми оно управляет (для клавиатуры — скан-коды клавиш, для мыши — координаты курсора, для джойстика — значения осей). Как нетрудно догадаться, кнопки управления питанием никак не связаны с опросом клавиатуры: это часть Desktop page. А, например, мультимедийные клавиши, имеющиеся на многих клавах, — Consumer page.
Среди примеров там есть примерно следующее:
if (!digitalRead(pinButtonS)) {
digitalWrite(pinLed, HIGH);
// Puts PC into sleep mode/shuts it down
System.write(SYSTEM_SLEEP);
//System.write(SYSTEM_POWER_DOWN);
// Simple debounce
delay(300);
digitalWrite(pinLed, LOW);
}
if (!digitalRead(pinButtonW)) {
digitalWrite(pinLed, HIGH);
// Try to wake up the PC
// This might fail on some PCs/Laptops where USB wakeup is not supported
System.write(SYSTEM_WAKE_UP);
// Simple debounce
delay(300);
digitalWrite(pinLed, LOW);
}
Им можно проверить, есть ли вообще реакция компьютера на эти клавиши. Если нет, то, скорее всего, в BIOS отрублено пробуждение ПК от USB.
Убедившись, что BIOS компьютера и параметры электропитания настроены правильно, можно приступать к разработке итоговой проги.
❯ Пишем прошивку
Вообще, создание дескриптора — не такая уж и простая задача, USB-IF даже предоставляют специальную утилиту, облегчающую данный процесс. Но в нашем случае устройство будет выполнять одну-единственную функцию, так что этим процессом можно пренебречь, а дескриптор взять готовый из состава библиотеки. После некоторых размышлений написал вот такую прогу:
#include <Adafruit_TinyUSB.h>
#define BUTTON_PIN 20
#define LED_PIN 21
uint8_t const desc_hid_report[] = {
TUD_HID_REPORT_DESC_SYSTEM_CONTROL(HID_REPORT_ID(1))
};
Adafruit_USBD_HID usb_hid;
void setup() {
usb_hid.setPollInterval(2);
usb_hid.setBootProtocol(HID_ITF_PROTOCOL_NONE);
usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
usb_hid.setStringDescriptor("Elevator Power Button");
usb_hid.begin();
if (!TinyUSBDevice.isInitialized()) {
TinyUSBDevice.begin(0);
}
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
uint8_t is_suspended = 0;
if (TinyUSBDevice.suspended()) {
digitalWrite(LED_PIN, LOW);
is_suspended = 1;
}
else {
digitalWrite(LED_PIN, HIGH);
is_suspended = 0;
}
if (digitalRead(BUTTON_PIN) == LOW) {
if (is_suspended) {
TinyUSBDevice.remoteWakeup();
}
uint8_t control = 0;
if (is_suspended == 0) control = HID_USAGE_DESKTOP_SYSTEM_SLEEP;
else if (is_suspended == 1) control = HID_USAGE_DESKTOP_SYSTEM_WAKE_UP;
usb_hid.sendReport(1, &control, sizeof(control));
delay(100);
while (digitalRead(BUTTON_PIN) == LOW) {
delay(10);
}
control = 0;
usb_hid.sendReport(1, &control, sizeof(control));
}
}
Тут видно, что я вместо питания назначил на неё управление спящим режимом.
Связано это с тем, что на кнопку сна в настройках электропитания повешена гибернация, а выходить из неё от сигнала USB-устройства компьютер также умеет.
Загружаем прошивку, и в диспетчере устройств появляется новая запись. Нужно отрубить всякие отключения устройства для экономии энергии и прочие функции, которые могут не позволить этой штуке запустить ПК.
❯ Переделка кнопки
Теперь дело за малым — запихнуть электронику внутрь корпуса.
Как в во многих других постах, задняя крышка держится на двух гайках.
Внутри одинокая видавшая виды плата.
Помимо микрика на ней имеется ещё и пищалка.
Светодиод подсветки куда-то делся.
На замену отсутствующему впаял трёхмиллиметровый синий диод, самый яркий из тех, что нашлись в местном лабазе с радиодеталями. Как по мне, получилось неплохо.
Схема подключения. Красивой не будет, есть только традиционная.
Резистор для светодиода взял тот, что уже стоял на плате кнопки, благо по номиналу он как раз подходил.
Собираем всё вместе. Разъёма USB на корпус не нашёл, поэтому спаял кабель из USB-B и microUSB. Плату посадил на двусторонний скотч. Немного чёрной ХБ-изоленты также не помешает.
❯ Что же получилось?
Самое время пробовать.
Подключаем кнопку к компьютеру, светодиод загорается.
Жмякаем её, компьютер выключается, светодиод гаснет.
Жмякаем снова, компьютер запускается, светодиод загорается. Всё отлично работает. Аналогичный результат был и на ноутбуке.
❯ На прощание
Вот такая забавная поделка получилась. Само собой, кнопку легко назначить под любую другую задачу (например, нажатие мультимедийных кнопок или какой-то комбинации клавиш).

Уже после того, как я собрал данный девайс, подруга рассказала о том, что подобные штуки существуют и заводского исполнения. Но, понятное дело, наш экземпляр куда антуражнее.
Такие дела.
Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите
Читайте также:
- ➤ Самый маленький ЭЛТ-монитор
- ➤ Просто «включатель» с радаром 24 ГГц для «Умного дома» или автономного использования
- ➤ Случайный PCB-art, «сломавший головы» сотням студентов-электронщиков
- ➤ Netscape Navigator празднует 30 лет. История и технологии, которые важны и сегодня
- ➤ AI персона — инструкция по формированию разума
Автор: MaFrance351