Как стать автором
Обновить
2678.77
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Электромеханический 7-сегментный дисплей своими руками

Время на прочтение 9 мин
Количество просмотров 13K
Автор оригинала: David McDaid

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

Цель проекта была двоякая: мне хотелось создать стильные часы, которые украсили бы собой голую стену, и одновременно обеспечить максимально тихую работу механизма. Вдохновили меня на эту затею другие впечатляющие проекты, которые я перечислил ниже, хотя во многих задействовались шумные сервоприводы. Взяв за основу собственную идею по модернизации тихих шаговых двигателей для 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 МБ).
Генератор случайных слов

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


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

Теги:
Хабы:
+45
Комментарии 28
Комментарии Комментарии 28

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds