Часы из часов: цифры из стрелочных «пикселей» на Arduino

Часы из часов: цифры из стрелочных «пикселей» на Arduino

Цифровые часы, каждая цифра которых сложена из шести стрелочных механизмов на двухосных шаговых двигателях под управлением Arduino Nano.

Механический пиксель

Идея известна: большое цифровое табло складывается из множества маленьких стрелочных циферблатов, стрелки которых поворачиваются так, чтобы вместе образовать цифры. Самый крупный образец такого рода, панно из 288 часов, показывали на выставке дизайна в Дубае в 2013 году. Строго говоря, отдельные элементы часами не являются: обе стрелки у них одинаковые, и точнее называть их механическими пикселями.

В описываемом проекте масштаб скромнее. Минимум, при котором цифры уверенно читаются, — шесть пикселей на разряд, так что на четыре разряда приходится 24 пикселя.

Комплектующие

Ключевая деталь — привод с двумя соосными валами. Обычные моторы, сервоприводы и стандартные шаговики потребовали бы редукторов, рычагов и датчиков, поэтому взят готовый двухосный шаговый двигатель размером около 6х3 см. Он маломощный, и это ограничивает длину стрелок, но для проекта его возможностей достаточно. Остальной набор:

  • Arduino Nano в роли контроллера;
  • модуль часов реального времени на DS3231 с батарейкой — хранит и отсчитывает время независимо от питания;
  • индикатор на TM1637 — «вторичные часы», которые видит только настройщик при установке времени и регулировках;
  • две кнопки, блок питания, корпус;
  • сдвиговые регистры 74HC595 — по одному на каждый пиксель.

Как управлять двухосным шаговиком

В одном корпусе находятся два независимых шаговых двигателя, развёрнутых друг относительно друга на 180 градусов. У каждого по две катушки; один вращает длинный внутренний вал, другой — короткий внешний. Направление вращения задаётся последовательностью и полярностью напряжения на катушках, скорость — интервалом между переключениями. По даташиту максимальная частота составляет 500 Гц, то есть пауза между шагами должна быть не короче 2 мс. Один импульс поворачивает вал на 0,33 градуса, что в теории даёт до 165 градусов в секунду.

Диаграмма сигналов из даташита делится на минимальные, «атомарные» шаги (Partial Step). Три таких шага составляют полный шаг (Full Step), шесть — цикл (One Cycle), после которого катушки возвращаются в исходное состояние. Цикл поворачивает вал на 2 градуса; прогон в обратном порядке, от шестого шага к первому, вращает вал в другую сторону. Точности в 2 градуса для часов хватает.

Катушка UL подключена к контактам 1 и 2, катушка UR — к контактам 4 и 3. На первом шаге +5 В подаётся на контакты 1 и 4, а 2 и 3 соединяются с землёй. На втором оба контакта UL переводятся в ноль, UR не меняется. На третьем обнуляется UR, а на UL подаётся напряжение обратной полярности. Оставшиеся три шага строятся по той же логике.

Тестовый драйвер на одной плате

Двигатель потребляет всего 20 мА на контакт, поэтому для проверки его подключают прямо к выводам Arduino: пины 2–5 к контактам первого мотора, пины 6–9 — второго. Тестовая программа хранит таблицы сигналов для шести шагов цикла и набор заданий — углов и направлений для каждой стрелки. Драйвер выдаёт шаги с паузой 5 мс и, когда обе стрелки достигли цели, переходит к следующему заданию. Стрелки при этом движутся плавно и тихо, со скоростью примерно 64 градуса в секунду; скорость определяется длиной паузы.

Двухосный шаговый двигатель со стрелками во время теста

Выравнивание и сдвиговые регистры

Датчика положения у стрелок нет, а программа отсчитывает углы от того места, где они стояли при включении. Выставлять стрелки вручную ненадёжно: возможны сбои питания, случайные импульсы при включении, зацепы. Поэтому при старте стрелки вращаются в заданную сторону, пока гарантированно не упрутся в ограничители, которые в этих двигателях уже предусмотрены. Эта процедура названа выравниванием. Левые пиксели при этом уводят стрелки влево, правые — вправо: ограничители расположены вне рабочего поля.

На один пиксель нужно восемь управляющих линий, на 24 пикселя — 192, чего у Nano нет и близко. Число выводов наращивают регистрами 74HC595: три пина контроллера управляют цепочкой практически любой длины, а восемь выходов одного регистра как раз соответствуют восьми контактам одного двигателя. Для пикселя разработана собственная печатная плата, а драйвер переписан так, чтобы отправлять комбинации сигналов в регистры; скорость вращения при этом подняли примерно вдвое.

Пиксель с платой сдвигового регистра в работе

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

Проблемные цифры 1, 4 и 7

Цифры 0, 2, 3, 5, 6, 8 и 9 складываются из шести пикселей без труда. А вот у 4, 7 и особенно 1 остаются лишние стрелки, которые ломают симметрию и ухудшают читаемость. Решение нашлось в тех же ограничителях: раз они находятся вне рабочего поля, эти места можно закрыть крышками в цвет фона и прятать под ними ненужные стрелки. Короткие «хвостики» у осей всё равно видны, но цифры становятся заметно ровнее. В итоге крышки сделаны горизонтальными и объединены с ограничителями. Для левых и правых пикселей они разные, так что механизмы делятся на две группы, что немного усложняет изготовление и монтаж.

Управление готовыми часами

Полная прошивка использует библиотеки TM1637Display, Wire и ds3231, а пиксели разбиты на две цепочки регистров по 12 штук. Управление двумя кнопками, согласно комментариям в скетче, таково: удержание первой дольше секунды паркует стрелки, дольше пяти секунд — запускает выравнивание; удержание второй дольше секунды включает установку времени, где первая кнопка меняет цифру, а вторая подтверждает её, и после последней цифры время записывается с нулём секунд.

← Все статьи