«Вічний» наручний годинник DIY
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Привіт, DOU. Сьогодні я хочу поділитись з вами моїм невеличким досвідом розробки опенсорс-проєкту «вічного» наручного годинника.
Відео з демонстрацією:
Так, нічого вічного не буває, це скоріше про маркетинг, проте я закладаю серйозну базу на довготривалу роботу. Звісно в межах моїх знань та навичків.
Годинник має 12 мініатюрних сонячних панельок та стільки ж червоних світлодіодів. Кількість для сонячних елементів я вибрав не просто так (і не для симетрії), але про це трішки пізніше. Також присутній
Цей проєкт (кодове ім’я LumiTime) я публікую повністю в опенсорс (тобто прошивка та апаратне забезпечення) з ліцензією MIT: github.com/...ac/PerpetualLEDWristwatch
Передісторія
Діло було років з
Звісно тоді я не мав навичків того, як зробити власний, задумати та втілити своє бачення, але амбіція лишилась. З роками досвід накопичувався, я приблизно почав уявляти, як у мене все має працювати в плані коду, дизайну, заліза.
Приблизно рік тому мені сниться сон, де я йду якимось селом і в листі на дорозі знаходжу Rolex; знаходжу господаря та віддаю йому його, йду далі такий засмучений.
Rolex для мене є фаворитом у темі наручних годинників, насамперед завдяки вкладу в цю технологію компанією, тому я у сні трохи засмутився, але йду далі, і тут бачу дорогою ще один годинник. Піднімаю, а там чітка візуалізація моєї ідеї бінарного годинника. Я тисну на кнопку та бачу алгоритм його роботи, який був дуже простий: два миготіння світлодіодами у різній комбінації, і тоді «всі зорі зійшлись», я збагнув, як все повинно працювати. Звісно передумовою цього був проведений «мозковий штурм»:
Я втілив його в життя, але це вже інша історія. Бінарний годинник був трішки менший і живився лише від батарейки CR2032, якщо комусь цікаво, у мене на GitHub є репозиторій із цим проєктом.
Як працює мій «вічний» годинник
Кожні 0,5 секунди ЦП прокидається (час ітерації циклу 100 нс), збільшує значення міллісекунд і переходить у сплячий режим
Наручний годинник має одну кнопку NOW, а також 12 червоних світлодіодів, розташованих по колу та підписані римськими цифрами. До того ж особливу увагу я приділив старій римській четвірці (відсилаючись до годинникового ремесла). Якщо натиснути кнопку, девайс покаже час на світлодіодах за наступним алгоритмом: спочатку години (1, 2, 3, 4, 5, 6 і т. д.), а потім — хвилини з 5 хв. точністю (5, 10, 15, 20, 25, 30 тощо). Час на показ 0,5 секунди для годин і 0,5 для хвилин, і тоді перехід знову в сплячий режим.
Енергоспоживання:
Наскільки мені вдалось заміряти енергоспоживання годинника в режимі очікування — 5 мкА, акумулятор LIR2430 має нехай 50mAh, звідси можемо приблизно прикинути...
Під час роботи годинник споживає майже 2,5 мА, працює він одну секунду, якщо дивитись час кожні чотири години по одному разу(6 разів на добу), виходить майже рік автономної роботи, звісно без сонячної підзарядки. Остання суттєво додає до тривалості, наприклад, година на відкритому сонці — це майже 300 годин автономної роботи. Або година зарядки в похмуру погоду без сонця дає майже 14 годин автономного ходу.
Друкована плата (PCB):
Лицьова сторона плати виглядає ось так:
Я вирішив її сильно не навантажувати деталями, тому що хотів місце для логотипу Open Source Hardware. Для мене це важливо, щоб мій годинник розказував про свою належність до відкритого програмного забезпечення, бо вірю, що цей напрям міняє світ (у всякому випадку мій точно змінив). Мінімальний розмір доріжок 0,3 мм, стільки ж мінімальний отвір.
Задня сторона плати має всього 10 деталей, компоненти вибрав розміру 0805:
Усе паяється звичайним паяльником, якщо постаратись. Алгоритм збірки такий: спочатку треба взяти штук 15 сонячних панельок, на сонячному світлі вибрати 12 таких, які видають найбільшу напругу і струм. Це трішечки клопіткий процес, але одна слабка панель знизить ефективність всієї зарядки.
Потім треба швидко запаювати ніжки панельок, далі так само з світлодіодами, бо вони бояться перегріву. Потім уже мікроконтролер і все інше, кнопку я запаював вже після миття плати.
До речі про миття: оскільки це низькоспоживний проєкт, відмити плату від флюсів обов’язково, бо вони з часом можуть викликати оксиди, які почнуть споживати якийсь струм. Я мив звичайним спиртом, але разів з п’ять, і ще додатково відшкрябував дерев’яною зубочисткою (фото зверху статті зроблене ще до мийки). І, звичайно, BPW34S мають бути кришталево чисті.
Плата має 35 мм у діаметрі:
Справа в тім, що 35 мм — це стандартний розмір циферблата, і мені не прийдеться розробляти власний корпус, а можна взяти вже з використаного чи несправного годинника.
Дуже важливо, щоб товщина плати була 0,8 мм, інакше у стандартний корпус не поміститься разом з акумулятором.
Схемотехніка:
Він має просту схему (загалом 35 компонентів), для економії виводів використав так зване мультиплексування методом Чарлі (Charlieplexing).
У цьому проєкті я використовую для заряджання 12 датчиків світла BPW34S, які працюють у режимі генерації, на ясному сонці один елемент видає
Зробив примітивну схему заряджання — використовую два компоненти, ZD1, щоб знизити напругу 6 -> 4,7 В і додав захист від витоку струму в сонячні панелі (саме так, сонячні панелі будь-якого розміру, як генерують, так і споживають) за допомогою діоду D1 з назвою LL4148 (він має невеликий зворотний струм):
Діод додає падіння напруги в 0,7 В (4,7-0,7=4,0 В), виходить, що акумулятор не перезаряджається вище 4 В, все просто... Але він не буде заряджатись і до 100%, проте така ціна компромісу. На жаль, стабілітрона на 4,9 В я не знайшов у продажу, можна спробувати підібрати діод Шотткі з меншим падінням напруги (не 0,7, а, скажімо, 0,5 В), проте падіння напруги залежить і від струму (графік ліворуч на скрині), тому я вирішив не додавати собі роботи під час тестування.
Як прошити мікроконтролер ATtiny13
На платі присутні піни для програмування, я зазвичай підпаюю до них тонкі дроти з LPT-кабелю, вони досить гнучкі, щоб не повиривати доріжки, і досить м’які.
Підмикаємося до програматора (використовую плату Arduino Nano з скетчем AVR as ISP) так: 3V-контакт підмикається до 5V на Arduino, MI->MISO програматора (цифровий пін 11), MO->MOSI (пін 12), CK->SCK (пін 13) RS->Reset (цифровий пін 10) та GD-> це GND.
Далі треба додати ядро для підтримки мікроконтролера ATtiny13. Усе дуже класно описано ось тут.
ATtiny13 налаштування:
- Board: ATtiny 13;
- BOD: BOD Disabled;
- Clock: 1.2 MHz internal osc;
- Compiler LTO: Enable;
- Port: (Ваш порт Arduino);
- Programmer: Arduino as ISP.
Після вибору параметрів треба записати налаштування в мікроконтролер (виставити fuse-біти), натиснувши кнопку Burn Bootloader або «Записати завантажувач».
Як бачите BOD, тобто механізм відстежування низької напруги живлення я вимкнув, щоб не було зайвого споживання мікроконтролером. Також у моєму проєкті не передбачений ніякий захист від глибокого розряду мікроконтролером, тому що він може працювати аж до 1,8 В, проте це теж ціна компромісу, максимально низького споживання.
До речі, одна з причин, чому я вибрав саме червоні світлодіоди, а не, скажімо, сині чи зелені, тому що вони мають найнижчу (у видимому спектрі) напругу свічення, якраз приблизно від 1,8 В. Це тягнеться з попереднього проєкту бінарного наручного годинника, де живлення було не від акумулятора, а саме від батарейки, щоб максимально витягнути з неї всі соки.
Вихідний код
Вихідний код (12LEDWachATtiny13.ino) або прошивка у вигляді «бінарника» для контролера лежить тут.
Всім заправляє моя реалізація скінченного автомату (finite-state machine). Сумарно вийшло 187 стрічок коду, звісно, це з коментарями та косметичною складовою. Але це ще не кінець — немає механізму «заводу» годинника, він поки що лише стартує з «зашитого» в ньому часу.
З ресурсами я вписався у:
Скетч використовує 856 байтів (83%) місця зберігання для програм. Межа 1024 байтів.
Глобальні змінні використовують 7 байтів (10%) динамічної пам’яті, залишаючи 57 байтів для локальних змінних. Межа 64 байтів.
Час, з якого починає йти годинник, задається у стрічках 26 та 27.
Road map та мінуси проєкту
Дорожня карта:
- Перше, ні нульове, що я буду допрацьовувати з часом — додавання зовнішньої RTC мікросхеми для підвищення точності ходу, або хоча б використаю якийсь точний генератор частоти у пару герц, який дозволить зняти залежність точності ходу від температури та напруги живлення, бо WDT — це, по суті, простий RC ланцюжок з усіма його мінусами.
- Додавання механізму заводу часу з допомогою кнопки. Тобто натискаємо кнопку, тримаємо її, скажімо, 20 секунд, і він починає перебирати числа по колу кожні пів секунди. Якщо відпустити кнопку, годинник запам’ятовує години і так само перебирає хвилини до натиснення, третій параметр буде калібрувальна константа (для більш точного підлаштування ходу).
- Апргейд CPU на щось більш сучасніше, як не крути, ATtiny13 — це вже досить застарілий мікроконтролер, якщо говорити про Microchip, вони відносно нещодавно випустили старші моделі, як, наприклад, ATtiny212 з низкою нових фішечок, зокрема й інтегрованим RTC та хорошими низькоспоживаючими режимами. Або апгрейд на іншу архітектуру, наприклад, RISC-V.
- Апгрейд циферблату до електронних чорнил, з можливістю кастомізації скінів. Оновлятиму картинку, скажімо, два рази в хвилину, і це буде не сильно енергозатратно + час завжди на виду, не треба натискати кнопку (як у класичному аналоговому годиннику), але прийдеться тоді відмовитись від сонячних панельок.
- Апгрейд на більш потужний акумулятор, наприклад, LIR3032, де ємності у кілька разів більше, але для цього вже треба робити власний корпус, тому що товщина не дозволить помістити все у стандартний корпус з 35 циферблатом.
- Додавання зарядної станції, як окремого пристрою, де буде потужний світлодіод теплого свічення, годинник буде кластись циферблатом донизу та відбуватиметься синхронізація часу, тому що сонячні панелі будуть точно повторювати імпульси світла, якими можна кодувати той самий UART-протокол, а живлення від панелей подати ще і до ніжки RXD-мікроконтролера, що теоретично дасть повну герметичність.
- Знизити енергоспоживання до моєї цілі в 0,5 мкА, що дасть до десяти років автономного ходу без підзарядки від сонця.
Мінуси наявного рішення:
- Низька точність, залежність від температури та напруги живлення (така ціна наявної простоти виконання).
- Відсутність захистів від глибокого розряду акумулятора.
- Відсутність можливості завести годинник, наразі в мене немає механізму задання часу з допомогою кнопки, лише зміна часу в коді, тобто годинник після прошивки та подачі батарейного живлення починає йти з запрограмованого в ньому часу.
- Наявний акумулятор має дуже великий саморозряд, приблизно
3-5 процентів в місяць, тобто за рік він сам себе «з’їсть» на половину лиш за рахунок внутрішньої хімії.
Місія та візія проєкту
Це мій нульовий проєкт, де я подумав, що було б класно сформулювати їх, після довгої бесіди з ChatGPT вдалось сформулювати наступне.
Місія: «Розробити простий і екологічно чистий годинник, який поєднує інноваційні технології з мінімальною кількістю компонентів, забезпечуючи енергоефективність, доступну для всіх».
Візія: «Ми прагнемо створити світ, де енергозберігаючі технології будуть доступні кожному, де наш годинник буде символом піклування про навколишнє середовище та інноваційних рішень у сфері енергоефективності».
Найкращі коментарі пропустити