Любительский проект по сборке с нуля уникального настенного дисплея с функцией часов и возможностью дополнительного апгрейда. Вооружаемся шаговыми двигателями, МДФ, платами, кучей проводов и вперёд.

Цель проекта была двоякая: мне хотелось создать стильные часы, которые украсили бы собой голую стену, и одновременно обеспечить максимально тихую работу механизма. Вдохновили меня на эту затею другие впечатляющие проекты, которые я перечислил ниже, хотя во многих задействовались шумные сервоприводы. Взяв за основу собственную идею по модернизации тихих шаговых двигателей для 3D-принтеров, я с нуля собрал всю конструкцию, протестировал её и написал необходимый код, на что ушло где-то 2-3 месяца.

Все программные и аппаратные файлы доступны на GitHub

Примеры решений


  1. John Burd
  2. Brett Oliver
  3. Michael Klements
  4. Jacky Mok
  5. OTVINTA
  6. Viraj Gandhi


Вот пара ссылок, которые оказались полезны для понимания принципа действия шаговых двигателей:


Выбор двигателя


Чтобы добиться максимально тихой механической работы, я хотел полностью избежать использования серводвигателей (что исключило 5 из 6 имевшихся примеров решений). Серводвигатели изначально не задуманы для тихой работы. Даже ряд имеющихся у меня передовых решений от Robotis довольно сильно шумят.


Поэтому я выбрал один из самых популярных шаговых моторов, 28BYJ-48 (версию 12В). Хотя в связи с наличием в них внутренних шестернёй, у меня все равно оставались сомнения относительно их шумности.

Предварительный тест драйвера шагового двигателя



В качестве первого основного теста я подключил моторчик 28YJ-48 к имевшейся под рукой плате Adafruit TB6612 (подключение 12В здесь не показано).

В начальном тесте использовался базовый образец программного обеспечения: Stepper: setSpeed(rpms)

В сравнении с любым серводвигателем уровень шума оказался намного ниже. Тем не менее из теста стало понятно, что «обычный» драйвер вроде TB6612 с понижением шума от мотора и шестернёй справляется слабо.

Использование тихих драйверов



Я взял TMC2208-V3.0 от BIGTREETECH. Эти модули используются в основном в 3D-принтерах, чтобы сделать их движение максимально тихим. В них имеется режим UART, позволяющий параллельно подключить несколько модулей, задействовав всего один контакт микроконтроллера. Замена предыдущего драйвера на этот сразу же привела к значительному улучшению — практически полной тишине! Недостаток здесь в том, что реализация этих драйверов окажется намного сложнее…


Нюансы системы



Каждому TMC2208 нужно не менее четырёх сигналов: активация (EN), направление (DIR), STEP и UART. Чтобы избежать нехватки цифровых контактов ввода-вывода, я решил использовать для контактов активации и направления каждого драйвера сдвиговые регистры. Помимо этого, как я уже сказал, подключения UART могут быть общими для всех драйверов, задействуя всего один контакт микроконтроллера.

Можно было бы и каждый сигнал STEP отправить на сдвиговые регистры, но это бы сильно ударило по быстродействию при управлении всеми 28 моторами с одного микроконтроллера.

Системная архитектура для одного числа



Высокоуровневая схема подключения для одного 7-сегментного числа, использующая предыдущую схему. Линия STEP для каждого бесшумного шагового драйвера с сигналами EN и DIR, загружаемыми последовательно в сдвиговые регистры.

Единственный дополнительный необходимый сигнал, который здесь не показан, это линия UART_TX, подключенная к каждому отдельному драйверу.

Для показа одной цифры на часах потребуется 7 двигателей, 7 драйверов и 2 сдвиговых регистра.

Сдвиговые регистры на макетной плате



Чтобы не захламлять пространство на макетке, я собрал на микросхемах NXP 74HC595 плату с последовательным подключением сдвиговых регистров. В этом мне помогла полезная библиотека ShiftRegister74HC595. А неплохой образец последовательного подключения нескольких 74HC95 можно посмотреть в статье Multiple Shift-out Registers on Arduino — part 1.

“Заключительное” тестирование макетной платы


Все драйверы (7) установлены для управления всеми 7 двигателями (показаны только 4). Слева та самая плата со сдвиговыми регистрами. Всем управляет Mega2560, показанный сверху слева. На каждый мотор я прикрепил скрепку, просто чтобы сделать вращательное движение более наглядным при тестировании

К сожалению, подключить коннектор 28BYJ-48 напрямую в плату мне не удалось, так как провода располагались крест-накрест. В качестве быстрого решения я просто прокинул от коннекторов дополнительные соединительные провода.


Оригинальная гифка (15 МБ).
Первое тестирование всех чисел. Простейшая конфигурация, в которой я использовал картон и клейкую смесь Blu Tack, позволила мне протестировать функциональность схемы и подстроить базовые компоненты ПО

Концепция -> Схема -> Макет



Обрадовавшись рабочей схеме на макетной плате, я открыл KiCAD и набросал схему для платы управления одной цифрой. Она включала все компоненты и микросхемы, необходимые для управления моторами одной цифры часов (пассивные компоненты, сдвиговые регистры, контактные разъёмы и входы питания). По сути, я заменил макетную плату.

Для цельного дисплея часов потребуется четыре таких платы.

Кастомные печатные платы


Закончив первую ревизию платы управления двигателем, я отправил её на JLCPBC.com для изготовления. Четыре двухслойных платы + одна резервная обошлись мне около $5. Это без учёта доставки из Китая в UK.


Чтобы решить некоторые проблемы с трассировкой, я решил установить драйверы на плате вверх ногами.


Я мог существенно уменьшить общую схему, если бы вместо использования модулей драйверов разместил все необходимые компоненты по отдельности. Но мне захотелось сделать как проще.

Спустя неделю ожидания, пришли превосходные платы. После базовой проверки соединений я вручную припаял все компоненты, монтируемые в отверстия.



Переделка


В изначальном дизайне был один серьёзный косяк. Я забыл подключить входной контакт 5В к шаговым моторам. В результате у каждой микросхемы отсутствовала связь с логикой управления от микроконтроллера. В первых тестах плата работала отлично, но я не был уверен в долгосрочности такой работы.

Ошибку я исправил в очередной ревизии без переделки самих плат, просто прокинув по нижней стороне провод 22AWG.


Проектирование дисплея



Стараясь сделать понятное ПО, я хотел, чтобы все моторы смотрели в одном направлении относительно своего положения ON/OFF. Такая направленность всех моторов позволила каждому из них передавать одинаковые позиционные параметры, то есть для всех моторов использовался общий код.

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

Конструктивные элементы



В Fusion 360 я спроектировал физические макеты всех отдельных компонентов, необходимых для сборки прототипа:

  • с нуля создал модель для моторов 28BYJ-48, используя цифровой штангенциркуль;
  • спроектировал несколько версий крепежа ротора, который можно было бы крепить к роторам двигателей без винтов (и печатать без суппорта);
  • спроектировал опоры для двигателей;
  • скомпоновал всё это вместе и создал маску, которую затем напечатал и использовал при сверлении отверстий под монтаж.

Вид модели из F360 с обратной стороны, показывающий идеальное расположение печатной платы и маски для сверления


Модель маски пришлось разделить надвое, иначе она не вмещалась на печатную площадку принтера. Для каркаса я использовал МДФ толщиной 6мм, так как 3мм мне показалось маловато.

Проблема в том, что при ручной обработке неизбежно возникают мелкие погрешности в позиционировании отверстий, что может сильно навредить общему дизайну. В идеале, эту деталь желательно изготавливать на станке с ЧПУ.


Крепёж двигателей



Вот список деталей, потребовавшихся для крепления всех 28 двигателей:

  • 56 опор, напечатанных на 3D-принтере (2 для каждого двигателя);
  • по 112 винтов, болтов и шайб M3 (7 двигателей * 4 отверстия * 4 цифры);
  • по 56 винтов и болтов M4 (7 двигателей * 2 отверстия * 4 цифры).

Тестирование одной цифры


Завершённый одноциферный дисплей. Можно считать его надёжной платформой для тестирования всех компонентов: кастомных плат, ПО, проводных соединений, режимов работы и так далее

Фото сделано до подключения всех компонентов

Тестирование базовой работоспособности



Оригинальная гифка (18 МБ).
Прогоняю все цифры по кругу. Знаменательный момент

На заднем плане видно приблизительные значения потребления тока от БП. В пике получается примерно 1.15А, поэтому я решил, что для уверенного запитывания всех 28 двигателей и прочего, нужно оценить общее потребление мощности.

Имейте в виду, что в этот момент при каждом движении питание подавалось на все двигатели. То есть даже неподвижные механизмы потребляли столько же, сколько движущиеся. В итоге я обновил программу, включив операцию исключающего НЕ-ИЛИ, сравнивающую текущее положение каждого мотора с его новым положением, чтобы контакт EN активировался и запитывался только у требующих движения механизмов.

Вычисление мощности



В пиковом состоянии — когда одновременно срабатывают все моторы — общая потребляемая мощность составила 43.2Вт. В реальности это может случиться только один или два раза при запуске. Тем не менее нужно гарантировать, что при необходимости мощности будет достаточно.

В худшем реалистичном случае максимальное потребление составит около 20Вт. При этом чаще всего — оно будет находиться в районе 10Вт.

Если предположить использование блока питания на 12В и 50Вт, то мощности хватит не только всем моторам и смежным компонентам, но и светодиодам.

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

Простая плата питания




Решив отказаться от использования настольного источника питания, я купил блок на 12В и 50Вт, для которого быстренько сварганил небольшую платку. Она получает 12В, преобразует их через конвертер DC/DC в 5В (для ввода-вывода шаговых моторов, микроконтроллера и светодиодов), а также запитывает небольшой пьезодинамик 12В. Красный светодиод подключён к 12В, а зелёный к 5В. Здесь ничего особенного, просто способ отказаться от использования настольного блока питания.

Кнопки управления




Для установки времени, таймера и использования прочих функций я собрал ещё одну небольшую плату, к которой подключил несколько кнопок. Некоторые из них я подключил напрямую к контактам прерывания на микроконтроллере, а другие использовал в процедурах прерывания для установки значений. Для всех кнопок в программе реализована функция антидребезга с использованием небольших задержек.





Отсчёт времени


Для отсчёта времени я купил на Amazon модуль DS3231, который подключается к контактам I2C микроконтроллера и оперативно работает со множеством открытых библиотек.

Если интересно, то в статье Interface DS3231 Precision RTC Module with Arduino сделан прекрасный обзор этого модуля. А вот ещё одно годное руководство: Arduino and DS3231 Real Time Clock Tutorial.



Финальная сборка



Подключение всех модулей и плат для одной цифры

Сборка дисплея




Порадовавшись успешной сборке комплекта для одной цифры, нужно было переходить к сборке всего этого снова, но уже в четырёхкратном масштабе. Это подразумевало пайку и тестирование оставшихся плат управления моторами, сверление и выпиливание новой МДФ-панели, а также крепление моторов. На всё про всё ушло примерно 7-8 часов.





Задняя часть панели после подключения всех четырёх плат управления двигателями и соединения всех компонентов. На этой стадии укладка кабелей ещё не делалась. Перекладина посередине просто удерживала конструкцию на столе в вертикальном положении

Тестирование всего дисплея



Оригинальная гифка (18 МБ).
Прогон базовых тестов на всём дисплее (анимация ускорена в четыре раза из практических соображений)

Все 28 моторов и драйверов управляются одновременно одним микроконтроллером Mega2560.
На этой стадии МДФ-панель ещё не покрашена, поэтому золотистые сегменты цифр не особо выделяются.

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

Эстетика


Этап покраски. Здесь я использовал баллончик WRX Spray Paint — Anthracite Grey 7016.




Подсветка


Ещё один эстетический нюанс — простая непрерывная светодиодная лента на 5В по периметру. При подвешивании дисплея к стене она должна усиливать эффект выделения. Я также добавил на плату МОП-транзистор, чтобы можно было управлять подсветкой через GPIO на микроконтроллере.


По примеру одного из сохранённых мной вариантов сборки в качестве возможного улучшения я рассматривал использование программируемых светодиодных лент, свечение которых различным образом реагирует на срабатывание таймера, нажатие кнопок и прочие действия. Хотя даже с помощью GPIO и МОП-транзистора можно реализовать некоторые простые вещи.

Конфигурация выводов



Здесь показано, что используется каждый цифровой контакт ввода-вывода Mega2560. Конечно, при необходимости можно использовать в качестве цифровых и аналоговые контакты, но пока они остаются невостребованными. Разве что A0 используется для реализации рандомности в режиме генерации слов.

Не показаны же здесь все соединения питания и заземления между платами.

Укладка проводов


Или её отсутствие…

В качестве быстрого и простого способа всё прибрать (хотя бы немного) я прикрепил часть проводов к задней стенке строительным степлером. Из-за моей ошибки, вследствие которой разъёмы моторов не совпадали с разводкой плат, здесь получилось на 50% больше проводов, чем предполагалось изначально. Боль. Можно было, конечно, исправить косяк переделкой печатных плат…

Кроме того, отказ делать собственные провода и/или спаивать компоненты вынудил меня полагаться на стоковые перемычки. В общем, будь у меня больше терпения, всё могло получиться куда опрятнее.

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

Подвешивание на стену


Я добавил по кругу небольшие панельки шириной около 4см в качестве импровизированного «корпуса», чтобы удобно разместить провода и прочее, а также повесить часы на стену. Кстати, повесил я их на крючках, закрепив верёвку узлами в краях верхней поперечной панели. Вес всей конструкции составил около 6кг — на гипсокартоне держится вполне уверенно.


Кнопки, приклеенные к нижней панели

Готово!



Освещение в комнате выключено


Оригинальная гифка (11 МБ).
Обычный режим времени


Оригинальная гифка (12 МБ).
Генератор случайных слов

Потенциальные доработки


  • Все фрезерные и сверлильные работы должны производиться на станке с ЧПУ. В ручном режиме сделать всё идеально ровно очень сложно.
  • Хотелось бы придумать новое крепление ротора/движущей рукояти, которое бы позволило слегка изменять положение сегментов цифр вручную для более точного выравнивания.
  • Я решил пока не добавлять двоеточие между часами и минутами, чтобы не громоздить лишнего — но его вполне можно туда вписать.
  • Изначальное более внимательное отношение к укладке проводов могло бы сильно облегчить процесс.
  • Основной кабель питания из эстетических соображений лучше бы разместить за стеной.

Комментарии (19)


  1. ASDF59
    18.03.2022 14:05
    +4

    Где-то на Ютубе видел похожий вариант часов. Там предлагалось ещё в качестве доработки добавление датчика присутствия, чтоб часы не переключались когда никого в комнате нет, а как только входят, сразу текущее время выставлялось.


    1. pfr46
      18.03.2022 15:56
      +4

  1. Iv38
    18.03.2022 14:27
    +10

    Как это люто! 28 шаговых двигателей, 28 весьма недешёвых драйверов для них, чтобы поворачивать сегменты только в два возможных положения. Интересно, какова итоговая стоимость таких часов.


    1. Tarson
      18.03.2022 14:53
      +2

      Это перевод.

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


      1. Iv38
        18.03.2022 15:27
        +3

        Я уже прикинул по алиэкспрессу, 28 таких двигателей с такими драйверами должны уложиться в 150 долларов. Не то что бы дёшево, но я думал, дороже будет.


    1. DimPal
      18.03.2022 16:00
      +1

      Если усложнить механику можно обойтись одним двигателем.


      1. unsignedchar
        19.03.2022 09:11

        Очень сильно усложнить. А вот привод из 1 двигателя на 1 цифру я уже где то в видел.


        1. DimPal
          19.03.2022 15:13
          +1

          Все относительно (ну как вариант: барабан с 7 дорожками, тросиковое соединение до сегментов, принцип механического счетчика для соединения барабанов типа "Geneva drive")


  1. developer7
    18.03.2022 15:32
    +3

    Как по мне лучше бы сделать стержень с 2 катушками — по краям. Подал ток на одну — стержень втянулся в одну строну. Подал на другую — в другую. Надёжность и простота на порядок выше чем у двигателей с кучей шестерней.

    Или просто 2 соленоида — конструктивно один открывал, другой закрывал бы сегмент.


    1. Iv38
      18.03.2022 15:41
      +3

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


      1. developer7
        18.03.2022 16:13

        Ну звук работающего двигателя да ещё и с редуктором — не думаю что он тихий. А соленоид вообще никаких звуков не издаёт. Ну да ладно.
        Есть ещё целое семейство индикаторов — блинкеры. Раньше стояли на всяких вокзалах на табло и автобусах. Это то что сделал автор. Сейчас из светодиоды заменили.


        1. sim2q
          18.03.2022 18:04

          А соленоид вообще никаких звуков не издаёт.

          Табло на вокзале немного щёлкает, когда происходит массовое обновление - напоминает звук чего-то осыпающегося...да и выглядит также...
          В статье конечно лютый оверкилл - но может в этом тоже свой прикол. Про быстродействие кстати не понял - зачем оно для часов?


        1. bschepan
          19.03.2022 10:51
          +1

          Тут использованы униполярные шаговики 28BYJ-48. Очень слабые и тихие. Редуктор там пластиковый, да еще и с нехилым люфтом. Услышать работу можно разве что приставив его к уху. Зачем при этом использовать дорогущие драйверы от TMC, я вообще не понял. Шаговик прекрасно рулится через uln2003 (сборку транзисторов Дарлингтона), разве что контактов требуется чуть больше, но это успешно решается сдвиговыми регистрами или i2c расширителем портов, и всяко дешевле драйверов...


      1. HectorPrima
        19.03.2022 14:03

        К соленоиду нужно гидравлический тормоз как на входных дверях только двухсторонний. Но тогда быстро не попереключаешь.


    1. sergej_pipets
      20.03.2022 12:03
      +1

      Это называется "бленкерный механизм". Тыщщу лет назад в каждом аэропорту или железнодорожном вокзале были информационные табло из них.


  1. serafims
    18.03.2022 17:12
    +2

    Интересно, что не так было с разъемом мотора, что он оказался не совместим с платой.. Ведь его можно перепиновать.


  1. tuxi
    19.03.2022 14:34

    Вах!!!! Классно получилось! Режим секундомера/таймера можно сделать еще.

    И натереть фосфором, чтобы ночью светилось само ))))


    1. sergej_pipets
      20.03.2022 12:04
      +2

      Светодиоды запаять в сегменты...


      1. tuxi
        21.03.2022 10:48

        Провода видны будут.