Звісно, можливо, ваш годинник має резервну батарею, а мій — конвеєр розгортання!
Швидке прототипування! Фото: Lee Hutchinson
Я хотів годинник, якого, на диво, нібито не існувало.
З дитинства моїми приліжковими годинниками були серії дешевих, простих і довговічних червоних семисегментних світлодіодних годинників-радіо з Walmart чи Target. Вони незмінно вимагають ручного втручання на початку та в кінці переходу на літній час, а також щоразу, коли вимикається живлення. Після нещодавнього збою живлення, коли я стояв біля тумбочки, утримуючи кнопку “TIME” і натискаючи “HOUR”, моє терпіння вичерпалося, і я подумав: “Ми вже чверть 21-го століття. Має бути кращий спосіб!”
Мій ідеальний годинник мав би сам встановлювати час. Він би автоматично регулював літній/зимовий час (або ні, залежно від того, як пройде цей законопроєкт!). Він би керував відхиленням і завжди показував точний час із субсекундною точністю. Він би відображав цей час на червоному семисегментному дисплеї — не синьому, не зеленому, не жовтому і, звісно, не білому. І мені не довелося б встановлювати жодних додатків, що руйнують приватність, щоб він працював.
Просто? Ні. Хоча багато приліжкових годинників відповідають одній або, можливо, двом із цих вимог, я не зміг знайти нічого, що відповідало б усім. Годинники з резервним живленням, що самоналаштовуються, “атомні”, які отримують оновлення через космічний ефір, існують уже багато років і наближають мене до мети, але, чорт забирай, я не зміг знайти жодного з червоним семисегментним дисплеєм, який би мені сподобався (можливо, хтось інший має кращі навички пошуку?).
Деякий час панувало розчарування. Але закриваючи десятки вкладок браузера з безрезультатними пошуками та майже ідеальними, але не зовсім тим, сторінками продуктів, я подумав: “Зачекайте хвилину. У мене є 3D-принтер. Я, начебто, розумний і все таке. Чому б не купити семисегментний дисплей і не зробити власний годинник?”
І ось, стоячи на плечах гігантів, настільки високо, що я майже міг доторкнутися до Місяця, я це зробив.
Це годинник, що робить годинникові речі. Фото: Lee Hutchinson О прекрасний новий світ, де є такі годинники
Для тих, хто не зацікавлений у кількох тисячах слів про процес, ось готовий репозиторій. Він містить список компонентів із цінами та місцями придбання, програмне забезпечення та файли для 3D-друку.
Було два можливі шляхи, якими міг би піти цей сміховинно переобтяжений вихідними проєкт, що маскується під годинник. Один, яким не пішли, починався з Arduino або мікроконтролера, подібного до Arduino. Інший почався з Raspberry Pi або комп’ютерної штуки, подібної до Pi. Я вибрав Pi, використовуючи як Raspberry Pi Zero W, так і Zero 2 W.
Моїм обґрунтуванням було те, що Pi надає мені “заспокійливу ковдру” операційної системи на базі Debian, з Wi-Fi та NTP для вимоги “годинник сам встановлюється та оновлюється”, разом зі звичайним маршрутом віддаленого керування Linux, який я вже знаю.
Вибір семисегментного дисплея був простим: Adafruit виготовляє чудові світлодіодні дисплеї в стилі циферблата з цифрами висотою 1,2 дюйма, і продає набір, який об’єднує потрібний мені дисплей із платою-«рюкзаком», що містить контролер HT16K33, необхідний для керування світлодіодами. Я замовив три і зрештою використав усі для тестування, збирання та вивчення технік паяння.
Дисплей зі сторінки продукту Adafruit. Фото: Adafruit Ах, так, паяння. Я ніколи раніше цього не робив, але семисегментний дисплей довелося припаяти до його плати-рюкзака, тому я взяв набір для початківців-паяльників із Amazon і моток припою 60/40. (Мені також довелося купити настільну лупу, тому що, як я з’ясував, коли почав працювати, мої старі очі вже не можуть так добре фокусуватися на близькій відстані, як раніше).
Відклавши питання корпусу годинника — я був упевнений, що хтось уже розробив 3D-друкований корпус, сумісний з дисплеєм Adafruit, і я мав рацію — я сів зі своїм новим Pi Zero і почав вивчати програмне забезпечення, яке йому доведеться запускати, щоб “говорити” годинником. Я швидко зрозумів, що це занадто складно для мене. Як я часто казав на цих сторінках, я вмію робити “ops” у “devops”… хтось інший має принести “dev”.
Годинник, що перевершує людський розум
Завантажувач образу RPi допоміг мені розпочати, і я зміг увійти до свого Pi Zero. Подумавши трохи, я звузив свої програмні вимоги до списку:
- Хост годинника має бути доступним лише в локальній мережі і не мати доступу з Інтернету.
- Хост годинника має отримувати оновлення з дзеркала apt лише в локальній мережі.
- Хост годинника має синхронізуватися за NTP з NTP-сервером лише в локальній мережі.
- Служба годинника має бути службою systemd, що працює без привілеїв під контекстом виділеного облікового запису служби.
- Служба годинника має використовувати системний час, щоб операційна система керувала NTP і підтримувала синхронізацію з будь-яким літнім/зимовим часом, незалежно від того, чи він діє, чи ні.
- Служба годинника має мати можливість вмикати та вимикати дисплей за розкладом, щоб він був вимкнений більшу частину дня, коли я не в спальні.
- Служба годинника також має мати можливість збільшувати/зменшувати яскравість дисплея за розкладом.
- Служба годинника має мати спосіб керування через CLI для термінальних підключень.
- Дисплей має керуватися через HomeKit, тому що я живу в екосистемі iOS.
- Служба годинника та її залежності мають встановлюватися за допомогою одного скрипта.
- Після встановлення все має бути розгорнуто так, щоб я міг надсилати оновлення за потреби, а не входити й перевстановлювати.
Багато з цих пунктів були легкими і цілком відповідали моєму типовому досвіду роботи з операційними системами. Я скористався перевіреними часом таймерами та службами systemd для значної частини завдань — мені насправді починає подобатися systemd, хай мені грець. Джерела NTP і дзеркал apt у локальній мережі вже існували (я знаю, я знаю, мені слід було б використовувати apt-cacher-ng). Конвеєр розгортання використовував би дії Gitea і був би більш-менш таким самим, як я вже налаштував для іншого проєкту, тому я скопіював його у Минулого Лі. Інтеграція з HomeKit виглядала як стандартне доповнення завдяки HAP-python.
Але я почав хвилюватися, коли шукав приклади того, як спілкуватися з дисплеєм годинника через I2C. Мої значно атрофовані навички Python вже напружувалися, і я абсолютно не зміг би впоратися з цим викликом. Саме в цей момент проєкт перестав бути веселим і став здаватися неймовірно складним.
Тому я переклав завдання кодування на LLM.
“Ти навчив мене мови; і моя вигода від цього в тому, що я знаю, як кодувати”
Шукати допомоги LLM, коли ви не можете перевірити результати, може бути ризиковано, але, на щастя, я пам’ятаю достатньо Python, щоб зрозуміти результати, з допомогою коментарів у коді. Claude Code виявився більш ніж достатньо потужним для цього проєкту — спочатку з Opus 4.8, а потім з новою сучасною моделлю Fable, сили якої я використав на проєкті, що, ймовірно, насправді є завданням рівня стажера.
Це було схоже на те, щоб випустити повну потужність «Зірки Смерті» на комара, але це точно спрацювало. Результатом стала акуратна колекція файлів Python і невелика тестова програма. LLM зробила настільки хорошу роботу, що я також доручив їй інтеграцію з HomeKit, процедуру встановлення, деякі специфічні деталі конвеєра розгортання та більшу частину документації репозиторію.
Я знаю, що це визнання може бути анафемою для багатьох серед коментаторів Ars, але це як є — без LLM я б не закінчив проєкт. Я б роздратувався, розлютився або просто втомився від нескінченного читання постів у StackOverflow, які критикують те, що я намагаюся зробити, як дурне і неправильне.
Робочий простір проєкту. Це дещо відмінна версія від загальнодоступного репозиторію GitHub, з деякими defaults, специфічними для Лі, та дією Gitea. Фото: Lee Hutchinson Сторона програми — це повноцінна служба systemd, яка прослуховує команди з HomeKit; вона також може керуватися локально через Unix-сокет, якщо ви захочете змусити дисплей робити щось із термінальної сесії. Служба працює під обліковим записом служби без привілеїв. Розгортання відбувається через дію Gitea, де я надсилаю тег до свого локального репозиторію Gitea, а runner створює артефакт випуску та передає його на Pi через окремий локальний обліковий запис служби, який може виконувати лише завдання, пов’язані з розгортанням. (Робочий процес розгортання включено до репозиторію проєкту GitHub як адаптований шаблон, якщо хтось із вас матиме точно таку ж конфігурацію, як у мене, і захоче скористатися цим).
Повною глибиною п’ять Autodesk лежить
З фізичного боку я справді знайшов 3D-друкований корпус з ліцензією Creative Commons, розроблений навколо того самого дисплея Adafruit, який я використовував, але він був не зовсім правильним.
Модифікація моделі означала битву з абсурдно недружнім до користувача кошмаром, яким є Autodesk Fusion, тому я зібрався з духом і занурився — і натрапив на ще одну стіну. Параметричне моделювання, особливо обтяжене десятиліттями дурних виборів UI/UX AutoCAD, було ще складнішим, ніж програмування.
Autodesk Fusion, ми знову зустрічаємося. (Дякую Boosted за початковий дизайн.) Фото: Lee Hutchinson Але Fusion тепер постачається з MCP-сервером, тому я потенційно міг би дозволити LLM віддалено керувати програмою та внести зміни для мене. Чи може бути так просто?
Локально розміщений Qwen3.6-35B-A3B-NVFP4 керує Fusion через OpenCode та MCP-сервер Fusion. Це майже спрацювало! Фото: Lee Hutchinson Відповідь виявилася водночас “так” і “не зовсім”. Спочатку я спробував внести зміни з квантованою версією Qwen 3.6-35B (саме цією), що працювала локально на Acer Veriton GN100 з GB10, про який я пишу довгостроковий огляд для Ars.
Qwen 3.6 майже впорався із завданням, зробивши одну з моїх змін, але проваливши іншу; я знову звернувся до Claude Code і Fable, щоб вони зробили більшість коригувань моделі. Проте локальна модель була інтригуючою, і я повернуся до неї в майбутній статті.
З чого роблять прототипи
Щойно програмне забезпечення почало набувати форми, а посилки були доставлені, настав час почати прототипування. Я зайняв кухонний стіл, налаштував свій новий паяльник і спробував зібрати свій перший дисплей Adafruit і рюкзак, не знищивши їх обох — і мені переважно вдалося!
Не судіть про мій робочий простір. (І під “робочим простором” я маю на увазі “кухонний стіл”.) Фото: Lee Hutchinson Натхненний тим, що паяння не було надто поганим, і маючи тепер робочий дисплей, я продовжив. Наступне, що потрібно було вирішити, — це те, що хоча дисплей Adafruit і затемнюваний, навіть при мінімальній яскравості, він все одно виявився занадто яскравим для темної спальні. Це означало, що мені знадобиться щось перед ним, щоб блокувати світло.
Навіть при мінімальній яскравості дисплей Adafruit дуже яскравий вночі. Це я експериментував з комбінаціями димного акрилу та матеріалу NDF. Фото: Lee Hutchinson B&H Photo прийшов на допомогу, оскільки там продаються рулони нейтрального фільтруючого матеріалу за відносно низькою ціною. Однак він виявився крихким і дуже схильним до збору відбитків пальців, тому я поєднав NDF із димним акрилом, що означало знайти постачальника, який би продав мені невеликі кількості акрилу, вирізаного за розміром. (Я знайшов двох — це місце та це місце).
Один акриловий шматок плюс одна смужка 12-відсоткового NDF зменшили яскравість дисплея приблизно до ідеального рівня, порівнянного з моїм існуючим дешевим приліжковим годинником.
Наступною проблемою було пройти через усі необхідні зміни моделі, щоб включити акрил і NDF у корпус годинника. Зрештою, за допомогою магії LLM MCP, я розділив існуючий дизайн на кілька окремих частин і вирізав кишеню для акрилової панелі; я також попросив LLM додати направляючі штифти та отвори для кожної частини. Це все можна було зробити без створення будь-яких нависань, тому вся конструкція друкується без необхідності підтримок.
Весь корпус, нарізаний і готовий до друку. Фото: Lee Hutchinson Я пройшов щонайменше три основні ревізії всього, і я дуже задоволений кінцевим результатом. Остаточна версія в основному тримається разом, хоча передня панель вимагає або трохи електричної стрічки, або пару крапель суперклею, щоб залишатися прикріпленою. Я міг би виправити це, змінивши направляючі штифти так, щоб вони застібалися, а не просто сиділи там, але стрічка для мене працює достатньо добре.
Настав час
Кінцевий результат точно відповідав моїм очікуванням — найкращий критерій успіху, який я можу собі уявити. Оскільки LLM надала основну роботу з кодування та CAD-роботу, я думаю, що я витратив більше часу на очікування поставок, ніж на будь-що інше — це можна пояснити моєю відсутністю планування та легкістю доставки наступного дня.
Ось готовий пристрій, спочатку по частинах, а потім зібраний:
Годинник до збирання… Фото: Lee Hutchinson Годинник до збирання… Фото: Lee Hutchinson
…і після! Фото: Lee Hutchinson …і після! Фото: Lee Hutchinson Годинник до збирання… Фото: Lee Hutchinson …і після! Фото: Lee Hutchinson
І, дивіться! Підтримка HomeKit!
Відстеження журналу служби systemd годинника під час переміщення повзунка яскравості в програмі iOS Home. 16 рівнів яскравості семисегментного дисплея автоматично відображаються на шкалі 0–100% повзунка. Відгук дисплея майже миттєвий. Фото: Lee Hutchinson І він розгортається!
Я використовую Gitea сервер лише в локальній мережі, тому що це весело, і тому, що розгортання речей за допомогою Gitea Actions змушує мене почуватися справжнім системним адміністратором. Фото: Lee Hutchinson Для тих, хто може подумати про те, щоб піти моїми стопами і створити власний 3D-друкований приліжковий втілення нестримного надмірного годинникового споживання — можливо, тому, що поруч немає дорослих, які б сказали вам цього не робити — існує багато різних способів підійти до цього завдання. Використання коду LLM — це, очевидно, вибір, і ви можете зробити інший. Пристрої Raspberry Pi будь-якої моделі зараз надзвичайно дефіцитні, тому хтось із кращими навичками програмування або з більш перебільшеним почуттям пригоди може спробувати це з мікроконтролером ESP32 замість Pi Zero. Насправді, ESP32, ймовірно, є кращим вибором для керування дисплеєм Adafruit, і він поставляється з підтримкою Wi-Fi та I2C без необхідності тягнути за собою Debian.
У будь-якому випадку, це був чудовий хобі-проєкт. Мені довелося паяти, що було і складніше, і легше, ніж я очікував. Я використав кілометри філаменту, друкуючи та передруковуючи різні ітерації корпусу. І я багато чому навчився.
Я витратив… ну, набагато більше грошей, ніж планував, між кількома помилковими початками, паяльником і набором, а також додатковими матеріалами для резервування та виправлень. І я міг би піти на компроміс і придбати звичайний годинник, який робить більшу частину того, що я хочу. Але досвід був веселим, а радість від того, що маєш саме те, що хочеш, безцінна.
Для тих, хто хоче побачити, як працює код, або адаптувати будь-що з нього для власних потреб, ось репозиторій. Насолоджуйтесь! Я просто буду тут, займаючись CI/CD зі своїм приліжковим годинником, що є абсолютно нормальним і нормальним заняттям, яким займаються нормальні люди!
Лі Хатчінсон Старший редактор технічного відділу Лі Хатчінсон Старший редактор технічного відділу Лі — старший редактор технічного відділу, який відповідає за розробку історій для розділів гаджетів, культури, ІТ та відео Ars Technica. Давній член Ars OpenForum із великим досвідом у сфері корпоративних сховищ даних та безпеки, він живе в Х’юстоні.
Подробиці можна знайти на сайті: arstechnica.com
