Товары из Китая

Железная дорога как индикатор раскладки и блокировки рабочего стола


Железная дорога как индикатор раскладки и блокировки рабочего стола

Доброго времени суток! Наверное, у каждого здесь была какая-то мечта или завидка из детства. Для многих это была железная дорога из ГДР.

Давайте может быть попробуем закрыть этот гештальт, заодно соберём полезное USB устройство DIY?

Рефлексия

Я вырос в 90х и начале 00х, жили мы в тотальной бытовой нищете. Но от дедушки нам осталась дача, куда меня отправляли иногда летом. У соседа по имени Витя была просто шикарная железная дорога от ГДРвской фирмы Piko, которой я страшно завидовал. Надо отдать должное, Витя мне давал погонять эту дорогу, но своей у меня никогда не было. Так и вырос 🙂

Сейчас я живу в Германии и что-то рефлексировал на тему детства, потом взял и заказал себе на местном Авито (он тут называется Kleinanzeigen — дословно «маленькие объявления») несколько моделей паровозиков и коробку с разными вагончиками, рельсами и прочим. Но ведь так неинтересно, верно? Гонять паровозики по рельсам мне не хотелось, решил поставить на стол и подарить им функционал.

Постановка задачи

Работаю я за компьютером и есть некоторые неудобства:

  • Переключение раскладки: бывает, что печатаешь в один монитор, смотришь в другой, и получается полотно йцукена, а индикатор в трее малоэффективен, его не видно боковым зрением. Поэтому текущую раскладку можно отображать как-то ещё, например светодиодом.
  • Блокировка рабочего стола: у нас на работе есть правило, что рабочий стол обязательно блокировать, кроме того я блокирую дома, что бы киска не прыгала. Проблема в том, что иногда я забываю это сделать, а если отошёл больше чем на пару минут, то мониторы засыпают и что бы понять статус, надо их разбудить (что занимает некоторое время, которое ты должен ждать и стоять как дурак). А если вводить пароль сразу, то есть приличный шанс отправить свой пароль в чат или ещё куда-то, если заблокировать забыл.

Я использую Linux уже много лет и там у меня настроено переключение раскладки на CapsLock и светодиод CapsLock горит когда включена русская раскладка. Это очень удобно, раскладка переключается одним пальцем (мизинцем), кроме того аппаратно отображает статус раскладки — например на ноуте лампочка CapsLock встроена прямо в клавишу. В дороге или спонтанном месте хорошо, но есть проблемы всё равно — на клавиатуру я всё равно особо не смотрю, кроме того у меня дома вообще механика, там лампочки можно сказать что и не видно вовсе:

Железная дорога как индикатор раскладки и блокировки рабочего столаДля индикации блокировки использую ScrollLock — он загорается когда система заблокирована, и гаснет когда нет. Это очень ускоряет дело, можно сразу вводить пароль + enter, когда лампочка ScrollLock горит, пока вводишь мониторы как раз проснуться, а понимание статуса обезопасит от ввода пароля куда не следует.

Таким образом, сама напрашивается идея внешнего устройства, которое отображает это всё светодиодами в удобном месте на столе / под монитором / т.п. Какое-то время у меня был вариант для совсем ленивых — выдранная из клавиатуры платка с диодами, но давайте сделаем более красиво: решил собрать небольшую диораму на столе с железной дорогой, что бы данный статус отображался семафорами.

Железная дорога

Порефлекировав, купил я на местном Авито следующие штучки. Брал всё рандомно, что было в наличии подешевле 🙂 Потом попытался немного посмотреть исторический бекграунд модели и прототипа.

Коробку с рельсами, пультами, вагончиками и парой локомотивов. За всё отдал 40€. Часть Piko, часть Lima.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Состояние в целом неплохое. Итого имеем: две стрелки, кучу рельс двух типов «квадратные» Piko и «реалистичные» от Lima. Два паровых локомотива и россыпь вагонов (в основном грузовые), так же два блока питания Piko Junior.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Локомотивы: один от Piko, второй от Lima. Паравозики совсем простые, явно какой-то начальный уровень. Судя по номеру 98 002 на паравозике Piko, это локомотив серии Sächsische I TV, который строился с 1910 по 1914 годы. Но соответствие внешнего вида, мягко говоря, условное. Паравозик Lima — это прототип американского паравоза Alco 1930, к нему нашлась даже инструкция. На ней стоит дата — октябрь 1970.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Грузовые вагоны — двух-осную платформу (MÄRKLIN H0 4514) докупил отдельно, цена что-то около 10€. Она нам пригодится что бы в неё поставить семейное фото 🙂

Железная дорога как индикатор раскладки и блокировки рабочего стола

И ещё немного вагонов, они уже очень простые, детализация совсем уже никакая.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Как видите, сет очень простой, но главное что у меня теперь есть много рельсового материала. Подумал я и приобрёл ещё дополнительные лоты:

Два великолепных локомотива Fleischmann: Электровоз 1336 E44 и паровоз 1351 BR 55. Обошлись по 44€ каждый. Обе модели производились с 1960 по 1970 годы. Состояние — «только из магазина». Прототип паравоза родом из 1913-1921, электровоза из 1932–1945 периодов. Сами локомотивы представляют 3 эпоху, то есть послевоенную западную Германию (ливрея DB).

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Модели просто великолепные, это уже совсем другой уровень детализации. Металлические шестерни, поручни дверей сделаны отдельными проволочками, каждая деталь сделана просто изумительно. Их страшно было доставать из коробки, думал отломаю что-нибудь сразу. Соседу на даче Вите такое и не снилось конечно 🙂

Железная дорога как индикатор раскладки и блокировки рабочего стола

У электровоза имеется рычажок, который переключает тип питания — через рельсы или через пантограф.

Набор почтового поезда, четыре вагона Рейхсбанн (Fleischmann 5000, 5050, 5051, 5052). Отдал 30€ за всё. Вагоны баварской железной дороги второй эпохи, модели производились с 1970 по 1984 годы. Состояние — «только из магазина».

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Детализация здесь на высшем уровне. У одного вагона даже приоткрыта дверь и там видно посылочки 🙂 Сделаны мельчайшие детали, ручки, заклёпки, перила и поручни. Их можно просто сидеть и разглядывать. Всё просто невероятно маленькое и миленькое.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Всё что Fleischmann — производство ФРГ, Piko — ГДР, а Lima — Италия. На коробках Fleischmann остались ценники в марках.

По сравнению с ними набор от Piko кажется просто дешёвой игрушкой с Алишки.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Итак, с паравозиками разобрались, но чем показывать-то статус будем? Для этого взял так же два семафора, так же оказались Fleischmann. Отдал 15€ за комплект из двух.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Вы только посмотрите на это! Мимишность просто зашкаливает 🙂 Семафоры полностью металлические, и очень аккуратно сделаны. Имеют два сигнала — красный и зелёный.

Железная дорога как индикатор раскладки и блокировки рабочего стола

А внутри — совсем не светодиоды, как я думал, а супер миниатюрные лампочки! Лампы на 16 вольт.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Ну и напоследок, что бы оживить это всё дело — набор из деревьев масштаба H0.

USB HID устройство

Теперь, для управления всем этим нам нужны мозги. Вообще, в том что бы помигать диодами нет никакой хитрости, берём любую Ардуину и через UART управляем. Но такое решение будет требовать софта на компьютере, а это не наш метод — устройство должно работать без драйверов и с любым компьютером. Поэтому реализуем USB HID устройство, именно через этот протокол работает подавляющее большинство перефирии, такие как мышки с клавиатурами.

В качестве базы выбрал микроконтроллер STM32, давно хотел с ними познакомится — низкая цена, поддержка аппаратного USB и целая куча фич. Вообще, в Ардуино есть вариант тоже сделать HID устройство, но там реализация не самая прямая, через загрузчик и прочее.

Заказал на Амазоне несколько плат STM32F103C8T6 Blue-Pill на тест, с доставкой завтра – цена около 10€ за две штучки, на алишке можно взять значительно дешевле (что-то типа 2€ за штучку). Для заливки и отладки у меня уже был JTAG адаптер (который купил для отладки Zigbee), что-то типа 15€ на Алишке, он отлично работает и определяется как родной (хотя явно не оригинал). Работает с GDB.

Первое с чем столкнулся — странная ситуация со штатной средой разработки, официальная STM32Cube имеет генератор когда, а так же требует Python 2.7 (у которого EOL была объявлена 13 лет назад), в ней надо собирать проект, пример использования можно посмотреть тут.

Хотелось разобраться с чем-то более DIY-like, например с замечательной средой PlatformIO, которая на мой взгляд намного удобнее. Делать будем на базе универсальной RTOS Zephyr. Но, так же как и со ST – примеры есть, но они плохо документированы, однобоки и перегружены часто. Ключевой находкой было репо на Github – какая то реализация клавиатуры. Спасибо тебе большое, автор! Удалось найти внятный и короткий пример.

Собираем прототип, подключаем USB и JTAG (JTAG <-> Плата):

  • GND <-> GND
  • 3V3 <-> 3V3
  • SWCK <-> SWCK
  • SWIO <-> SWO

Клонируем мой проект с GitHub и открываем в IDE (я когда начинал разбираться — сделал на базе из одно HID примеров). И собираем:

platformio run --environment bluepill_f103c8

, VSCode автоматически скачает и поставит все зависимости.

Я наверное не буду тут расписывать подробности написания прошивки. Если вам интересно, можно почитать пост у меня в блоге.

После сборки и заливки прошивки, подключаем устройство по USB и видим сообщения о том что оно определилось:

[12607.715775] usb 1-6.4.2: new full-speed USB device number 16 using xhci_hcd

[12607.865551] usb 1-6.4.2: New USB device found, idVendor=f109, idProduct=0001, bcdDevice= 3.05
[12607.865562] usb 1-6.4.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12607.865567] usb 1-6.4.2: Product: LED indicator
[12607.865571] usb 1-6.4.2: Manufacturer: PWS
[12607.865575] usb 1-6.4.2: SerialNumber: 1
[12607.877078] input: PWS LED indicator as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6.4/1-6.4.2/1-6.4.2:1.0/0003:F109:0001.000B/input/input35
[12607.936300] hid-generic 0003:F109:0001.000B: input,hidraw4: USB HID v1.11 Keyboard [PWS LED indicator] on usb-0000:00:14.0-6.4.2/input0
[12607.937311] input: PWS LED indicator as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6.4/1-6.4.2/1-6.4.2:1.1/0003:F109:0001.000C/input/input36
[12607.937531] hid-generic 0003:F109:0001.000C: input,hidraw5: USB HID v1.11 Device [PWS LED indicator] on usb-0000:00:14.0-6.4.2/input1

Обратите внимание: появляется два устройства — клавиатура и generic-устройство, оно нужно что бы читать дополнительные команды для управления (об этом позже).

Подключаем светодиоды и убеждаемся что всё работает, на пинах A0, A1, A2 появляется статус CapsLock, NumLock и ScrollLock соответственно. На эти пины можно повесить индикаторные светодиоды напрямую, диодов у нас маловато для перегрузки.

Дополнительный канал HID

Как можно заметить, светофора у меня два, итого 4 сигнала, а лампочек на клаве только три 🙂 Я решил сделать так — один светофор (который маневровый) отображает состояние CapsLock (русская раскладка включена) и ScrollLock (рабочий стол заблокирован), а NumLock мне наверное не нужен. Второй светофор будет управляться отдельным каналом USB HID, где можно выводить любое состояние из ОС. Например — состояние мониторинга. Зелёный — всё хорошо, красный — надо посмотреть.

Для этого добавляем ещё один интерфейс HID, уже просто generic, дескриптор можно просто скопировать из примеров:

static const uint8_t hid_led_desc[] = {

HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP),
HID_USAGE(HID_USAGE_GEN_DESKTOP_UNDEFINED),
HID_COLLECTION(HID_COLLECTION_APPLICATION),
HID_LOGICAL_MIN8(0x00),
HID_LOGICAL_MAX8(0x01),
HID_REPORT_ID(0x01),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_OUTPUT(0x01),
HID_USAGE(HID_USAGE_GEN_DESKTOP_UNDEFINED),
HID_INPUT(0x02),
HID_END_COLLECTION,
};

И регистрируем интерфейс вторым. Из-за этого у нас теперь именно два виртуальных девайса в dmesg.

Теперь добавляем правило, которое разрешит запись туда:

SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACE_NUM}="$attr{bInterfaceNumber}"

SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="f109", ATTRS{idProduct}=="0001", ENV{ID_USB_INTERFACE_NUM}=="01", MODE="0666", SYMLINK+="hidraw-led-indicator"

С таким правилом, индикатор появится в системе как файл устройства /dev/hidraw-led-indicator, в которое можно писать любым софтом, скриптом или прямо из баша:

echo -ne 'x00x01' > /dev/hidraw-led-indicator

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

Весь код прошивки на Github: github.com/petrows/keyboard-led-indicator

Собственно инсталляция

Итак, у нас уже почти всё готово, можно собирать воедино. Сразу предупрежу что я не претендую на создание чего-то реалистичного, у меня просто нет материалов для диорамы.

Для начала, надо сконвертировать мимишные семафорчики в светодиоды. Теплые лампочки — это прикольно, но рабочее напряжение аж 16 вольт, для питания надо делать транзисторные ключи и отдельный блок питания. Вы когда-нибудь видели клавиатуру с блоком питания? И я нет 🙂

Железная дорога как индикатор раскладки и блокировки рабочего стола

Разбираем семафорчик и вынимаем лампочки. Прошу не обвинять в вандализме, конверсия обратимая. При необходимости можно припаять площадку для ламп отдельно.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Мне повезло — 3мм светодиоды просто идеально подходят, ничего не надо дорабатывать. Только припаять катод к пружинке, которая прижимала лампочки, т.к. «минус» семафорчикка это весь корпус.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Теперь собираем всё — закрывается оригинальной крышечкой, включаем и проверяем.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Подобрал сопротивления, что бы при 3.3 В была примерно одинаковая яркость красного и зеленого диода, получилось 100 Ом красный, 60 Ом зеленый. Второй семафорчик оснастил белым и синим диодом, будет как бы маневровый семафор (так же установка маневрового семафора на мачте допускается, так что всё вроде верно). Синий и белый диоды существенно ярче, поэтому сопротивления 300 и 600 Ом соответственно.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Для основы взял кусок старого стола, полку 570х250 мм, к ней приклеил кусок из обрезков зеленого ковролина — сойдёт за траву 🙂 Примеряем рельсы и прикидываем где у нас будут семафорчики. Тут понимаем одну проблему — семафорчик видно хорошо только «в лицо», а сбоку намного хуже. Что бы компенсировать это, рельсы сделал чуть по диагонали, так же развернул семафорчики немного к себе.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Фрезеруем каналы для проводов, печатаем коробочку для платы, собираем всё вместе.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Втыкаем деревца, теперь выглядит намного живее! Так же в коробке с рельсами нашлась труба для заправки паравоза водой, поставил между путями.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Устанавливаем паравозики и любуемся 🙂 Я пока не решил, какой именно будет конфиг поездов, начала пока с такого.

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Железная дорога как индикатор раскладки и блокировки рабочего стола

Вот так вот получилось. Смотреть на статус раскладки и блокировки стало теперь немного приятнее 🙂

Выводы

Данное поделие будет работать без драйверов в любой OS. Я думаю отнесу инсталляцию на работу, поставлю на стол, коллеги будут умиляться, а если кто-то будет гонять мой стол, пока меня в офисе нет, то клавиатуру тоже будет отображать. Семафорчики имеют весьма ограниченный угол обзора, возможно надо использовать какие-то другие, либо аккуратно выставлять положение.

Управление вторым каналом HID тоже должно без проблем работать в Windows или OSX, используя модули Python или файлы устройства.

Можно использовать более комплексные светофоры, где несколько сигналов или есть жёлтный, но на Авито такого не было, а за новый хотят 50€. Если попадётся и будет настроение, может доработаю.

Можно использовать электромеханический семафор, у которого палка управляется электромагнитом и меняются светофильтры у лампы через рычаги. К сожалению в тот момент таких в продаже за малый прайс не было, а за новый хотят 50€. Ну и кроме того он может только взаимоисключающий сигнал отображать, хотелось оставить опцию отображения сигналов независимо (отображать ошибки там например).

Электро-механический семафор
Железная дорога как индикатор раскладки и блокировки рабочего стола

Всем хорошего настроения 🙂 Подписывайтесь на мой канал в Телеграм, где я пощщу всякие свои поделки.


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *