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

lnoloka_o2dww3aa0mts9pp8v9m.jpeg


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

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

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

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


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


kpmqzasvjrye3c6exulpqmcczgq.png


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

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


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

zahc4huyar56adgnbbx3or1f2gu.png


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

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


qpzgsuxikjf0hrbqe-2ei9leevu.jpeg


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

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

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

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


nosqsfirxd2stzuyhdgwe7ugb5m.jpeg


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

fiorbw6ur1ledhje3h3znvkxin8.png


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


pf0pwcdpcja-kfpfz6pf51vvmzw.png


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

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

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


4vw1asm0luidvjgcg7sz9ehd8oo.png


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

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

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

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


m-20hn3-4cmerilsxjh42ygv8rc.png


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

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


zn52slo4i1-hkejropk9skwzduy.jpeg

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

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

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

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


9h888vaqlhxaw86qizdwdeza_ne.jpeg


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

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

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


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

rg6g6i5y5hllaio0yoj8ldpg2p4.jpeg


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

arjvz-suz4ta5gq9ehstnmahr2e.jpeg


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

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

-klp5bwjkz5-zz5tfsv90gel5_u.jpeg


snzptu7oqzl_rolwdiflelje0yq.jpeg


Переделка


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

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

ddhhwykwtlyl8km7yfv-9o2lqb0.jpeg


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


uz5xyai3z3lxcpueelefvr9oddq.jpeg


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

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

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


g0xaj9mtzazpswhwfwsudvy7pke.png


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

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


irmbm13_juslnckfq9yabnx60z4.png

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

beqojio2ibhu3ts7jlgzvzc1x4g.jpeg


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

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

n5-w4ijnifmvdwcn9sdtu77oyb4.jpeg


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


ztc4fsqd17yorbruupom6b-izdu.jpeg


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

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


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


3kkb2jte6jrrgnmuanan2gkdejw.jpeg

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

dtvxgby4qj5-mjul6drgwjhk_ts.jpeg

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

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


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

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

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

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


aubkntiw7jk3ef1ar3nrz5rlhwm.png


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

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

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

cla-co-egodsd8f7j9k-5nbw8ma.png

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

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


zcvxkolfwymjhfivixwvayievwy.jpeg

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

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


4sxyhmjebadsbe9pkwpann-l4wm.jpeg

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

jbfjbqlqo1vzcg9rpxdacbrwhyi.jpeg

uqh7utkphfhd4vqtmz_n5n9kpl4.jpeg

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


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

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

ovjamq5hs_w8jgx08srrz3rt44m.jpeg

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


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

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


shnneavc8sloyjep7crjekrftvo.jpeg

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

pf1v_23_vcf62qxshjmjhbe2du0.jpeg

tjugxdl2bh22cn_jncghqpgjcwo.jpeg

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

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


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

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

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

Эстетика


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

e1p6anllofdi8fnvzsd6fepn8iu.jpeg


lsozxcjkaiqv9cyosz_6-dkhyrs.jpeg


-hmei9gb_onfkyjj5oal98e1xoa.jpeg


Подсветка


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

xnvghemw5zxs0t-nb-flu-vnk4s.jpeg


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

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


jynnpzpayyx_97u6afgbis9qwgc.png


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

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

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


1yokkq-w6b-goy7id9rlxjihnti.jpeg

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

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

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

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

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


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

pa7hz2swe0gb3wsfxjrv5n7a8f0.jpeg


snrfkqrqt7fgyf7pzprsym6bnzc.jpeg

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

Готово!


fj1vkkztjq--h0idr4z_ahsvxmy.jpeg


jflknpfy_cfi_wf5jec9fjbra3s.jpeg

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

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

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

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


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


oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru