← На главную

Steam Controller Auto-Charge подводит контроллер к магнитной зарядке

03.07.2026 22:39 · hackernews

Steam Controller Auto-Charge — открытое веб-приложение, которое само ведёт контроллер Steam Controller к магнитной зарядной подставке. Всё работает через компьютерное зрение и WebHID. Обычная веб-камера сверху смотрит на стол, OpenCV.js отслеживает выбранные пользователем точки на контроллере и на подставке. Алгоритм Lucas-Kanade optical flow двигает контроллер к цели.

Приложение подключается к контроллеру напрямую через WebHID, читает телеметрию из Report 67. Чтобы управлять движением, встроенные линейные резонансные актуаторы (LRA) с двух сторон выдают асимметричные тактильные импульсы частотой 70 Гц — так контроллер ощущает направление. Когда до подставки остаётся меньше 150 пикселей, частота импульсов автоматически падает вдвое — это режим Proximity Creep Mode, чтобы магнитное крепление было мягким.

Зарядка подтверждается через Report ID 121 (0x79), а Report ID 67 (0x43) отдаёт текущий процент батареи и напряжение в милливольтах. Пользователю достаточно поставить подставку, вертикально установить контроллер, открыть веб-интерфейс в браузере на Chromium, нажать «Connect Steam Controller» и затем «✨ Auto-Track». Дальше всё само: Lucas-Kanade optical flow + встроенная в браузер нейросеть на Rust/WASM (CNN) обрабатывает кадры и объезжает препятствия. Страница запоминает включённый режим даже после перезагрузки.

Для сборки нужен только Nix Package Manager — он сам подтянет зависимости и соберёт WASM-модуль командой nix-shell --run "npm install && npm run dev". Если хочется управлять вручную, можно: кликнуть на подставку, потом на верх контроллера, потом на низ.

Внутри проект собран на Vue 3 — файл App.vue отвечает за камеру, интерфейс, PID-трекер и optical flow. steamController.ts — абстракция над WebHID, которая упаковывает команды для LRA и опрос батареи в нужные байты. objectDetector.ts и objectWorker.ts выносят детекцию объектов в Web Worker, чтобы основной трекинг не тормозил. А wasm-object-detect — Rust-часть, скомпилированная в WebAssembly для быстрой обработки.

Проект вдохновлён работой Very Lazy Pixel и опубликован под лицензией MIT.

Читать оригинал →