Что стоит самому разработать электронные наручные часы. Можно ли сделать часы простыми и одновременно эффектными. Как совместить в одних часах отладочное средство для изучения программирования и полезный гаджет.
Это были не вопросы, а скорее план действий по разработке наручных часов, которые мне захотелось сделать пару лет назад. Не сказать, что моё увлечение часами помогло мне прокачать мои способности, но времени на это ушло прилично. В результате у меня накопился некий опыт, которым я бы хотел поделиться с теми, кому близка тема создания электронных гаджетов.
Дизайн часов
Перечислю несколько ключевых критериев дизайна часов, которые я для себя определил, когда начинал проект и к чему в результате пришёл:
– Универсальная 3D модель корпуса, по которой можно было бы сделать детали как из пластика, так и из металла. Минимум деталей, несложная обработка, максимально простой доступ к плате и возможность разборки без специальных инструментов.
– Батарея ёмкостью не менее 200мАч, на случай нахождения часов в активном режиме длительный отрезок времени. За основу был взят LiPo аккумулятор формата 303030, габариты которого примерно 30мм х 30мм в основании и высотой до 4мм.
– Светодиодная индикация без применения специальных драйверов и встроенных контроллеров типа WS2812. В зависимости от назначения светодиодов, были выбраны следующие размеры:
0402 - для бегущей строки размером 7 строк на 13 столбцов, так чтобы можно было полностью показать до 4х цифр и разделитель-двоеточие без необходимости скроллинга
0603 - для секунд
3528 - двухцветные светодиоды для отображение часов либо зеленым, либо красным в зависимости от времени суток
В итоге, общее количество светодиодов индикации с учетом разных цветов составило:
7*13 (бегущая строка) + 60 (секунды) + 2*12 (часы день/ночь) = 175
Двухцветные светодиоды 3528 могут различаться типом линзы, может быть круглая линза как на рисунке выше, либо весь корпус светодиода делается прозрачным. Различные варианты формы корпуса светодиодов позволяют в дальнейшем менять не только внешний вид циферблата, но также влияют на общую высоту платы. На рисунке ниже приведены циферблаты часов с разной формой светодиодов:
Для управления светодиодами был выбран механизм charlieplexing, в котором на пересечении матрицы управления светодиоды включаются встречно параллельно и они управляются не только 0 или 1, но также и Z-состоянием. При таком механизме управления, к n - выводам GPIO можно подключить до n^2 - n светодиодов.
Так как количество светодиодов равнялось 175, то для их управления понадобилось 14 выводов GPIO. При этом каждая цепь управления была усилена простым транзисторным драйвером на случай одновременного включения нескольких светодиодов по одному из выходов.
Основные функции часов
Помимо часов, также были добавлены ряд вспомогательных функций, которые значительно расширяют возможные варианты применения, а также делают часы более удобными. Список всех функций выглядит следующим образом:
Часы (RTC контроллера ESP32-PICO либо RP2040)
Компас (QMC5883L)
3-осный акселерометр (LIS3DH)
WiFi / BT (встроенный ESP32-PICO)
USB/UART или USB (ESP32-PICO или RP2040)
Вибромотор (Z30C1T8219732)
Qi Charger (T3168)
LiPo Charger (TP4054)
Динамик (в одном из вариантов)
Датчик света (GT36516)
Некоторые функции пока не были добавлены по разным причинам, в основном из-за ограниченного бюджета, либо технических сложностей контакта с внешней средой:
Цифровой микрофон
NFC память
TOF (Gesture Control)
Барометр
Контроллер часов
В двух разных моделях часов были установлены микроконтроллеры ESP32-PICO-D4 и RP2040. Выбор этих чипов был связан с их хорошей доступностью, низкой стоимостью и отличной поддержкой среди разработчиков софта и железа.
Отладка программ и прошивка Flash производится с помощью USB подключения. В варианте с ESP32 возможно обновления программы по OTA.
В микросборке ESP32-PICO ОЗУ и Flash размещены внутри корпуса чипа, дополнительная внешняя память не добавлялась. Для RP2040 был установлен чип W25Q128 объёмом 128 Мбит.
Структурная схема часов
Обе модели часов были построены на основе одного проекта платы. Отличия заключались только в отдельных функциях. Для примера ниже приведена структурная схема часов с ESP32-PICO:
Вся схема запитывается либо от LiPo аккумулятора, либо от USB. Для зарядки аккумулятора можно использовать либо USB соединение, либо беспроводную схему на основе простого контроллера и интегрированной в плату антенны. Вариант с беспроводной зарядкой больше подходит для корпуса часов из пластмассы.
Для подключения к компьютеру используется контроллер USB/UART CH340, на котором также собрана схема программатора для ESP32. Данная схема позволяет сбрасывать ESP32 и переводить этот чип в режим загрузки с помощью дополнительных сигналов RTS и DTR. Это стандартное решение, которое применяется на многих отладках.
Дополнительные сенсоры типа акселерометра и компаса подключаются по I2C шине. Есть контроль напряжения аккумулятора с помощью внутреннего АЦП. Светодиоды, вибромотор и кнопки часов заведены на GPIO микроконтроллера.
Для часов на RP2040 вместо WiFi/BT антенны были предусмотрены контактные площадки для подключения внешней матрицы для мелких светодиодов типа WS2812, а также был добавлен динамик:
Конструкция печатной платы
Печатная плата часов прежде всего проектировалась как основной элемент дизайна. Внешний вид часов, их циферблат, должен был подчеркнуть, что это в первую очередь средство для разработки, а уже потом просто очередной гаджет.
Диаметр платы составил 42мм без учета выступающих элементов. Сверху платы были установлены светодиодная индикация, компас, акселерометр и датчик света. Все остальные компоненты были расположены строго снизу. Выступающими элементами платы остались только антенна WiFi/BT и две кнопки.
В варианте с RP2040 вместо антенны были размещены контактные площадки для подключения внешней светодиодной ленты WS2812. Вариант часов с дополнительной лентой WS2812, это пока концепт, над которым ещё идёт работа.
Технологические нормы на изготовление платы выбирались с учетом низкой стоимости изготовления и без повышающего коэффициента сложности. В итоге, все равно пришлось изучать конкретные возможности производств, так как базовые технологические возможности все таки имеют некую вариацию.
Для данной платы были выбраны следующие основные нормы, мм:
Проводник / зазор: 0.125 / 0.125
Спираль толщина / зазор: 0.2 / 0.2
Переходное отверстие диаметр / площадка: 0.25 / 0.5
Важным элементом конструкции платы стала встроенная антенна, которую планировалось использовать для беспроводной зарядки и NFC. Однако в конце, чип памяти с поддержкой NFC был убран и этот режим так и не был опробован. Зато схема беспроводной зарядки оказалась полностью работоспособной, хотя стоит признать, что размещение антенны на циферблате больше подходит для NFC, чем для зарядки:
Форма и заливка полигонов питания в виде сетчатой структуры, были выбраны специально для уменьшения потерь схемы беспроводного заряда аккумулятора. Интересно отметить, что во время заряда плата все таки хоть и незначительно, но нагревается за счет потерь в печатной катушке и полигонах.
Важным условием при проектировании платы, было также требование обеспечить достаточное расстояние между элементами чтобы их установку можно было проводить вручную. Это хорошо видно по сохранившейся шелкографии пассивных компонентов. Обычно этим пренебрегают и используют в качестве границ между элементами Placement Outline, который обеспечивает некое минимальное расстояние между соседними элементами без необходимости сохранения всех элементов шелкографии.
Про монтаж платы часов
Одна из самых интересных операций - это монтаж платы. Было заранее понятно, что результат монтажа вручную большого количества светодиодов индикации, может существенно повлиять на внешний вид платы. Поэтому, сразу вместе с платой был заказан трафарет для нанесения паяльной пасты. При этом оставалось бы только расставить компоненты и надеяться на то, что они сами будут центроваться во время оплавления.
Минимальный размер отверстия для нанесения пасты составил 0.35мм х 0.2мм. По общим рекомендациям для такого размера лучше всего подходила паста 3-4 класса, в результате остановился на 4 классе безотмывочной пасты.
Первое с чего начал монтаж - вырезал по контуру полость для фиксации платы на время нанесения пасты. В качестве основы использовал гетинакс, а отверстие вырезал в картоне подходящей толщины:
Далее совместил отверстия в трафарете с площадками на плате, зафиксировал трафарет скотчем и нанёс пасту. По сути нанес небольшое количество пасты на пластиковую банковскую карточку и прошелся по всей поверхности как шпателем, стараясь чтобы все было сделано за один проход. Результат нанесения пасты очень хорошо контролировался визуально, при хорошем нанесении были видны четкие столбики пасты:
Самое нудное, это расстановка компонентов, не помню уже сколько на это времени уходило, но особо с этим тянуть нельзя, так как паста сохнет.
Оплавлять пасту решил с помощью подогревателя плат и фена. Посмотрел на термопрофиль, прикинул примерно по времени когда какая фаза наступит и приступил. В итоге после пайки второй платы уже четко знал какую температуру надо выставить на подогревателе по времени, когда начинать дуть феном и сколько градусов лучше всего выставить.
Для себя нашел два основных момента, на которых надо особенно тщательно отрабатывать действия. Первый момент - температура фена не должна быть настолько высокой чтобы пластик светодиодов начал желтеть, второй момент - важно поймать состояние пасты между началом её оплавления и моментом когда она уже начинает “кипеть”. Другими словами, идеально чтобы в процессе оплавления поймать момент когда паста начинает плавиться и в этот момент быстро довести её до полного расплавления феном. Потом уже можно выключить печку и дать плате спокойно остыть.
Результат оплавления показан ниже. Все компоненты сами нашли центр, ничего практически двигать пинцетом в процессе пайки не пришлось:
Конструкция корпуса
Над дизайном корпуса пришлось изрядно подумать. Хотелось сделать простой дизайн, состоящий из небольшого количества деталей, которые можно было бы изготовить из алюминия или поликарбоната.
Достаточно сложно было выдержать общую высоту корпуса, в какой то момент даже решил снять ограничение, сделать все по-уму и уже после этого оптимизировать. В результате такого подхода появился первый вариант корпуса высотой 18мм:
Основной корпус был разделен на уровни за счет бортиков. Сначала на самое дно укладывался аккумулятор, далее крышка батарейного отсека, плата, кольцо уплотнитель, стекло и уже в самом конце держатель стекла. Вся конструкция скреплялась только за счет винтов М2.5, для которых нарезалась резьба в основном корпусе. Для корпуса из пластика, можно было установить резьбовые втулки:
Важными элементами корпуса были также стекло и ремешок. В качестве материала для стекла был выбран поликарбонат. Защитное стекло толщиной 0.3мм клеилось на стекло из поликарбоната после фрезеровки:
В плане ремешка, очень помог ремешок NATO, который можно было не надевать на цапфы, а сделать для него своего рода полость в корпусе. При этом основная часть ремешка вставлялась в полость, а сверху укладывалась петля ремешка:
Полость была создана за счет нижней пластины. При этом меняя конструкцию нижней пластины, можно было бы устанавливать не только ремешки NATO, но и другие, главное чтобы они были цельными по всей длине:
Немного пришлось помучиться с разъёмом Type-C, который был предназначен как для зарядки аккумулятора, так и для отладки программ. Сначала сделал достаточно большое отверстие в корпусе, которое закрывалось заглушкой:
Решение с заглушкой оказалось вполне рабочим, но стоимость изготовления этой детали была довольно высокой. В результате сначала пришел к варианту корпуса с открытым гнездом, а потом решил разместить стандартный магнитный адаптер Type-C для быстрого подключения кабеля:
После оптимизации конструкции удалось уменьшить высоту корпуса до 12.5мм. Для этого пришлось убрать крышку батарейного отсека и крепить аккумулятор на скотч к основанию корпуса, уменьшить толщину платы до 1мм и вернуться к цапфам для крепления ремешка:
Программирование и отладка
Обе платы часов были спроектированы с учётом их использования как средства разработки, для которых были реализованы стандартные механизмы загрузки. Хотя были определенные особенности использования GPIO на плате с ESP32-PICO-D4, связанные с режимом Boot.
Так получилось, что GPIO2, отвечающее за режим BOOT, было использовано как SCL для I2C. Соответственно на этот пин была установлена подтяжка pull-up, что мешало переводу чипа в режим BOOT. Поэтому, пришлось резисторную подтяжку убрать и включать подтяжку программно уже после загрузки.
Также контроллер CH340, который удалось достать, не поддерживал DTR, а вместо этого использовал этот пин как индикатор передачи. Cоответственно пришлось вешать GPIO0, отвечающее за Serial BOOT на одну из кнопок. В результате, если надо было перевести часы в режим BOOT, то приходилось зажимать ту самую кнопку. Кстати говоря, в часах на RP2040, режим BOOT также активировался нажатием этой кнопки, но там изначально так и задумывалось.
В основном все тесты часов проводились на языке MicroPython. Были проверены компас, акселерометр, NTP для синхронизации и установки часов по WiFi и т.д. Особо глубоко не углублялись в программирование, ограничились только парой рабочих примеров.
В одном из таких примеров, бегущая строка применялась для отображения символа наиболее подходящего для текущей активности, связанной со временем суток:
Утром - яичница
Полдень - сон
В районе часа - тарелка супа
До 18 часов - работа
После 18 часов - идущий домой счастливый человек или машина
После 20 часов - телевизор
И далее - сон
О планах
В планах сделать еще модели часов на RISC-V компании WCH и заменить Lattice iCE40, на котором также была разработана одна из плат, на Gowin GW1.
Много задумок по корпусам ещё остаётся на бумаге или в виде моделей. Пока корпуса изготавливались на опытном предприятии, где были определённые технологические ограничения на материал, механическую обработку и финишное покрытие. Тем не менее, изготовление десятка корпусов не вызвало особых проблем, да и ограничения позволили значительно снизить сложность обработки и более тщательно проработать дизайн.
По мере появления нового результата буду отмечаться здесь на Хабре, но учитывая что проект развивается чисто по фану, делать это регулярно сложно. Если есть интерес к проекту, то можно присоединиться к обсуждению деталей в специальном канале, где информация будет обновляться более часто.