Сегментный дисплей что это
Существуют такие параметры, для которых было бы удобнее выдавать объективную информацию, чем просто индикацию. Например, температура воздуха на улице или время на будильнике. Да, все это можно было бы сделать на светящихся лампочках или светодиодах. Один градус — один горящий светодиод или лампочка и тд. Но считать эти светлячки — ну уж нет! Но, как говорится, самые простые решения — самые надежные. Поэтому, долго не думая, разработчики взяли простые светодиодные полосы и расставили их в нужном порядке.
Нюансы системы
Каждому TMC2208 нужно не менее четырёх сигналов: активация (EN), направление (DIR), STEP и UART. Чтобы избежать нехватки цифровых контактов ввода-вывода, я решил использовать для контактов активации и направления каждого драйвера сдвиговые регистры. Помимо этого, как я уже сказал, подключения UART могут быть общими для всех драйверов, задействуя всего один контакт микроконтроллера.
Простая плата питания
Решив отказаться от использования настольного источника питания, я купил блок на 12В и 50Вт, для которого быстренько сварганил небольшую платку. Она получает 12В, преобразует их через конвертер DC/DC в 5В (для ввода-вывода шаговых моторов, микроконтроллера и светодиодов), а также запитывает небольшой пьезодинамик 12В. Красный светодиод подключён к 12В, а зелёный к 5В. Здесь ничего особенного, просто способ отказаться от использования настольного блока питания.
Тестирование всего дисплея
Оригинальная гифка (18 МБ).
Прогон базовых тестов на всём дисплее (анимация ускорена в четыре раза из практических соображений)
Все 28 моторов и драйверов управляются одновременно одним микроконтроллером Mega2560.
На этой стадии МДФ-панель ещё не покрашена, поэтому золотистые сегменты цифр не особо выделяются.
А так я изначально планировал покрасить заднюю стенку, двигатели и обратную сторону каждого сегмента в один тёмный цвет, чтобы цифры смотрелись отчётливо.
Как проверить семисегментный индикатор
У нас имеются в наличии вот такие индикаторы:
Для того, чтобы проверить современный семисегментный индикатор, нам достаточно мультиметра с функцией прозвонки диодов. Для начала ищем общий вывод — это может быть или ОА или ОК. Здесь только методом тыка. Ну а далее проверяем работоспособность остальных сегментов индикатора по схемам выше.
Как вы видите ниже на фото, у нас загорелся проверяемый сегмент. Таким же образом проверяем и другие сегменты. Если все сегменты горят, то такой индикатор целый и его можно использовать в своих разработках.
Иногда напряжения на мультиметре не хватает для проверки сегмента. Поэтому, берем блок питания, и выставляем на нем 5 Вольт. Чтобы ограничить ток через сегмент, проверяем через резистор на 1-2 Килоома.
Таким же образом проверяем индикатор от китайского приемника
В схемах семисегментные индикаторы соединяются с резисторами на каждом выводе
В нашем современном мире семисегментные индикаторы заменяются жидко-кристаллическими индикаторами, которые могут высвечивать абсолютно любую информацию
но для того, чтобы их использовать, нужны определенные навыки в схемотехнике таких устройств. Поэтому, семисегментные индикаторы до сих пор находят применение, благодаря дешевизне и простоте использования.
Случилось так, что по наследству мне досталась целая коробка семисегментных индикаторов с гордой надписью «Комплект часы». Давно хотелось пустить её содержимое в дело, а когда дошли руки — оказалось, что внутри целый зоопарк разномастных индикаторов, разных размеров, цветов, с общим катодом и с общим анодом. По количеству штук так двадцать. И чтобы не пилить «очередные часы» пришла идея сделать, собственно, сабж — максимально универсальный семисегментный дисплей.
Что из этого получилось — под катом.
Конструктивные элементы
В Fusion 360 я спроектировал физические макеты всех отдельных компонентов, необходимых для сборки прототипа:
- с нуля создал модель для моторов 28BYJ-48, используя цифровой штангенциркуль;
- спроектировал несколько версий крепежа ротора, который можно было бы крепить к роторам двигателей без винтов (и печатать без суппорта);
- спроектировал опоры для двигателей;
- скомпоновал всё это вместе и создал маску, которую затем напечатал и использовал при сверлении отверстий под монтаж.
Вид модели из F360 с обратной стороны, показывающий идеальное расположение печатной платы и маски для сверления
Модель маски пришлось разделить надвое, иначе она не вмещалась на печатную площадку принтера. Для каркаса я использовал МДФ толщиной 6мм, так как 3мм мне показалось маловато.
Проблема в том, что при ручной обработке неизбежно возникают мелкие погрешности в позиционировании отверстий, что может сильно навредить общему дизайну. В идеале, эту деталь желательно изготавливать на станке с ЧПУ.
Вычисление мощности
В пиковом состоянии — когда одновременно срабатывают все моторы — общая потребляемая мощность составила 43.2Вт. В реальности это может случиться только один или два раза при запуске. Тем не менее нужно гарантировать, что при необходимости мощности будет достаточно.
В худшем реалистичном случае максимальное потребление составит около 20Вт. При этом чаще всего — оно будет находиться в районе 10Вт.
Если предположить использование блока питания на 12В и 50Вт, то мощности хватит не только всем моторам и смежным компонентам, но и светодиодам.
Более точные графики показывают максимальное потребление (для одной цифры / 7 моторов) в районе тех же 1.15А. Последующие изменения значений показывают гораздо меньшее потребление, поэтому после стартовой подачи питания или особых случаев максимальный ток для одной цифры будет составлять около 0.8А
Эстетика
Этап покраски. Здесь я использовал баллончик WRX Spray Paint — Anthracite Grey 7016.
Кнопки управления
Для установки времени, таймера и использования прочих функций я собрал ещё одну небольшую плату, к которой подключил несколько кнопок. Некоторые из них я подключил напрямую к контактам прерывания на микроконтроллере, а другие использовал в процедурах прерывания для установки значений. Для всех кнопок в программе реализована функция антидребезга с использованием небольших задержек.
Примеры решений
Вот пара ссылок, которые оказались полезны для понимания принципа действия шаговых двигателей:
Стартуем с NodeMCU
Мне несказанно «повезло» и все мои модули ESP-07 оказались с флешем 512кБ на борту. Хотя по документации, описанию на сайте продавца и фото в интернете должно быть 1Мб. В связи с чем я целый вечер искал причину, почему модуль или не шьется вовсе или шлёт мусор в СОМ-порт при включении неистово мигая синим светодиодом. Оказалось master branch NodeMCU требует от 1 Мб флеша. Для таких же счастливчиков, как я нужно поставить галочку на сайте рядом с branch-ем версии 1.5.4.1 — это финальная версия, которая работает с 512кБ.
Для часов нам потребуется минималистичный набор модулей:
wifi — окно во внешний мир
enduser_setup — удобный интерфейс для подключения к сети WiFi
file — проект будет состоять из разных файлов, нужно уметь с ними работать
gpio — дергать ножками
net — модуль сетевого клиента
rtctime — часы реального времени
sntp — синхронизация часов по сети, кнопок то нет
spi — интерфейс для MAX7219
tmr — таймеры
Отметили, нажали на большую синюю кнопку и ждем пару минут, пока на почту упадет ссылка на готовый бинарный образ для заливки в контроллер. Система просто отличная.
Для заливки образа, как и для сохранения lua-скриптов используется UART. Для подключения внешнего адаптера USB-to-UART (3.3V!) используется разъём J3 — UART. Как упоминалось в первой части, на плате присутствует посадочное место под преобразователь CH340. В случае его использования все общение с контроллером (и питание платы) будет производится через порт USB на плате. Удобно если проект требует частых изменений или длительного процесса разработки программы. Для переключения в режим записи во флеш нужно предварительно установить на плате перемычку J4. Скорость UART — 115200 бод, номер правильного СОМ порта оставляю на вас.
Для прошивки образа рекомендую утилиту NodeMCU-PyFlasher. Возможно, она покажется не такой простой как популярная NodeMCU-Flasher, но является более универсальной и помогает в ситуациях, когда NodeMCU-Flasher просто молча глохнет при попытках прошивки.
В некоторых непонятных ситуациях при смене обычной прошивки на NodeMCU модули на ESP8266 перестают правильно инициализироваться. Это лечится или предварительной зашивкой файла esp_init_data_default.bin по адресу 0x7C000 или установкой галочки Erase Chip в NodeMCU-PyFlasher.
Процесс успешной заливки образа должен выглядеть следующим образом:
Теперь перемычку J4 можно снять, перезапустить плату и начать писать скрипты в программе ESPlorer. Я не преследую цели написать курс по программированию на lua, эта тема хорошо освещена на многих ресурсах. Лично от себя могу дать рекомендацию на блог avislab — там понятным языком написана целая серия статей, в которых освещаются вопросы от азов до общения с облачными хранилищами.
Ниже приведу минимальный набор скриптов для реализации вполне себе функциональных (показывающих время!) часов, требующих только стартовой настройки — подключению к сети WiFi. Часики прошли уже проверку временем, все работает отлично, не сбоит, за более чем полугода работы зависли один раз, как я понял, через проблемы с интернетом, полечились простым перезапуском.
Во флеш контроллера также нужно залить страницу enduser_setup.html с интерфейсом подключения к сети WiFi.
Несмотря на такой компактный скрипт часы действительно получаются функционально законченными. Реализован следующий сценарий: при включении, на основе enduser_setup модуля создаётся открытая WiFi-точка с названием SetupGaget_xxx.
При подключении к которой и попытке перейти по какому-либо адресу (или просто по 192.168.4.1) открывается интерфейс подключения к доступным сетям.
После подключения к Интернету часы синхронизируются с сервером точного времени по протоколу SNTP и начинают тихо выполнять свою основную функцию — отображать время на дисплее, помигивая точкой второго разряда.
Буквально в несколько строчек можно добавить периодическую синхронизацию времени и изменение яркости в зависимости от времени суток. Если вы счастливый обладатель модулей с 512кБ памяти придется писать проверками, как в коде выше, если же есть возможность использовать master branch версию — рекомендую использовать модуль простого планировщика событий cron.
Аналогично и с функцией изменения яркости дисплея, которая выше также реализована на банальных проверках.
Сразу прошу прощения за фото, съемка ярких светодиодных индикаторов оказалась той еще задачей, даже при хорошем фронтальном освещении картинка выглядит не очень. В жизни часы выглядят яркими, равномерными и вокруг солнечный день.
Сборка дисплея
Порадовавшись успешной сборке комплекта для одной цифры, нужно было переходить к сборке всего этого снова, но уже в четырёхкратном масштабе. Это подразумевало пайку и тестирование оставшихся плат управления моторами, сверление и выпиливание новой МДФ-панели, а также крепление моторов. На всё про всё ушло примерно 7-8 часов.
Задняя часть панели после подключения всех четырёх плат управления двигателями и соединения всех компонентов. На этой стадии укладка кабелей ещё не делалась. Перекладина посередине просто удерживала конструкцию на столе в вертикальном положении
Финальная сборка
Подключение всех модулей и плат для одной цифры
Постановка задачи
Что я понимаю под максимальной универсальностью? Спроектировать модуль, с помощью которого или его комбинаций можно создать любой (или практически любой, в разумных пределах) дисплей для отображение информации с использованием этих самых семисегментных индикаторов. В голову приходит сразу с десяток применений — часы, конечно же, куда без них; туда же таймеры, счетчики чего угодно; термометры; табло для разных игр; дисплеи для отображения цифровой информации — курсов валют, индексов бирж и т.п. В общих чертах задача абсолютно тривиальная, но усложняется зоопарком типов индикаторов. В наличии одноразрядные китайские индикаторы с размером цифры 2.3 дюйма (тип FJ23101, четыре светодиода на сегмент) и 3 дюйма (тип CL-30011, пять светодиодов на сегмент), разных цветов и с различным типом подключения — с общим катодом и с общим анодом. Чтобы покрыть использование всех этих типов пришлось посидеть над схемой и разводкой, которая давала бы возможность без изменения топологии печатной платы управлять разными индикаторами. Поискав вечерок в интернете мне не удалось найти универсальных решений или схем, что и стало поводом для написания данной статьи.
По приведенным примерам использования становится понятно, что модуль должен поддерживать различную разрядность, от одной цифры для простых счетчиков событий, до шести для индексов некоторых финансовых бирж. Я решил ограничиться двумя цифрами для большего трехдюймового размера и тремя для меньшего, с возможностью подключения еще одного модуля в виде slave-а.
При выборе управляющей части долго думать не пришлось, выбор сразу пал на готовые модули ESP-07 на контроллере ESP8266 от Espressif. Дешевизна и простота использования этих модулей, возможность легкого подключения к Интернету, обширная комьюнити разработчиков и элементарность программирования этого контроллера отмели все другие варианты.
Системная архитектура для одного числа
Высокоуровневая схема подключения для одного 7-сегментного числа, использующая предыдущую схему. Линия STEP для каждого бесшумного шагового драйвера с сигналами EN и DIR, загружаемыми последовательно в сдвиговые регистры.
Единственный дополнительный необходимый сигнал, который здесь не показан, это линия UART_TX, подключенная к каждому отдельному драйверу.
Для показа одной цифры на часах потребуется 7 двигателей, 7 драйверов и 2 сдвиговых регистра.
Переделка
В изначальном дизайне был один серьёзный косяк. Я забыл подключить входной контакт 5В к шаговым моторам. В результате у каждой микросхемы отсутствовала связь с логикой управления от микроконтроллера. В первых тестах плата работала отлично, но я не был уверен в долгосрочности такой работы.
Ошибку я исправил в очередной ревизии без переделки самих плат, просто прокинув по нижней стороне провод 22AWG.
Disclaimer
Описанные ниже устройства являются довольно нишевыми, сделаны мною just for fun, но примененный подход может быть использован для решения аналогичной задачи универсализации там, где это потребуется. Текст разбавлю пояснениями для начинающих. Основная цель — спроектировать единую плату под все имеющиеся индикаторы и различные идеи их использования.
Статья получилась объемная, так что я разделил hardware и software части. К вашему вниманию часть первая — hardware.
Проектирование дисплея
Стараясь сделать понятное ПО, я хотел, чтобы все моторы смотрели в одном направлении относительно своего положения ON/OFF. Такая направленность всех моторов позволила каждому из них передавать одинаковые позиционные параметры, то есть для всех моторов использовался общий код.
Это был первый шаг по разработке дисплея, и на тот момент только для одного числа.
Приступим к деталям
Начнем с питания семисегментных индикаторов большого размера, где каждый сегмент представляет собой цепочку из нескольких последовательно включенных светодиодов. Такие дисплеи уже не получится зажечь «цифровыми» уровнями напряжения, так как падение на цепочке светодиодов больше этого значения. Конкретное значение указывается в даташите на дисплей, оно зависит от характеристик светодиодов, цвета и их количества и может варьироваться от 6 до 12 Вольт. Ток через каждый сегмент также превышает допустимые значения тока через отдельный пин для большинства контроллеров и составляет от 20 до 50 мА. Соответственно, нужно использовать напряжение 12 Вольт и коммутирующие ключи для управления сегментами и общими выводами. Также не стоит забывать о динамической индикации — последовательном переключении разрядов с частотой превышающей частоту восприятия глаза человека. Это позволяет значительно снизить энергопотребление практически без потери визуальной яркости дисплея.
Общее питание было решено брать от порта USB, как наиболее универсального стандарта на данный момент. После непродолжительного гугления я выбрал готовый модуль повышающего DC-DC преобразователя на МТ3608. Он компактный, дешевый (<0.5$), регулируемый, с достаточно высоким КПД — всё что нужно для наших целей. От резервного питания отказался, так как под рукой есть Интернет, где можно получить актуальную информацию в любой момент.
Питание цифровой части обеспечит линейный low-dropout стабилизатор LM1117-3.3, классическое решение для нетребовательных применений.
Теперь по транзисторным ключам.
Для управления индикатором с общим катодом на сегменты нужно подавать плюс питания, общий контакт, катод, подключить к земле. Для данных целей удобно использовать микросхемы источников тока (source drivers IC), как пример UDN2981. На картинке ниже подключение индикатора к драйверу и упрощенная схема одной ячейки для лучшего понимания пути прохождения тока. Стоит заметить, что в классической схеме должны быть токоограничивающие резисторы в цепи каждого сегмента, они упущены по причинам использования другого метода ограничения тока — МАХ7219 имеет изменять скважность управляющих импульсов, что в сумме с возможность регулировки напряжения питания индикаторов даст необходимый результат.
Для индикаторов с общим анодом — наоборот, общий контакт подключается к плюсу питания, а сегменты коммутируются на землю. В плане управления индикаторы с общим анодом более простые, так как не требуют коммутации высокого напряжения, по этой причине они более распространены. Для управления сегментами удобно использовать микросхему-массив составных транзисторов Дарлингтона (Darlington Transistor Arrays), например всеми любимую ULN2803.
Значительным преимуществом перед UDN2981 является стоимость, которая в разы меньше. На картинке ниже подключение индикатора к драйверу и упрощенная схема одной ячейки.
Можно заметить, что верхние части схем очень схожи. Пара драйверов UDN2981 и ULN2803 подобрана неспроста. Относительно ножек вход/выход они pin-to-pin совместимы. Это дает возможность сделать универсальное посадочное место на плате добавив всего несколько перемычек под запайку для ножек питания. Бинго!
Чтобы упростить задачу динамической индикации я решил не изобретать велосипед, не городить 595-е сдвиговые регистры, а взять надежное и проверенное решение — специализированный драйвер семисегментного дисплея MAX7219. Эта микросхема умеет хранить во внутренней памяти до восьми цифр и самостоятельно коммутировать разряды с заранее установленной яркостью. По этой причине и не нужны резисторы последовательно с каждым сегментом. Управляется драйвер по шине SPI. Как по мне, микросхема имеет всего один недостаток — высокую стоимость. Имела. Пришли китайцы и наклепали полный функциональный аналог со стоимостью в несколько центов. Название такое же, правда маркировка отличается, отсутствует оригинальный логотип Maxim. В работе отличий не замечено, временные диаграммы такие же, не греется, отказов пока не было. Но для ответственных применений все-таки рекомендую ставить дорогой оригинал.
Вот такой набор MAX7219-MATRIX-KIT можно купить на Ali и в локальных магазинах для ардуинщиков по цене в четыре раза ниже оригинального драйвера MAX7219. Да-да, вы меня правильно поняли, набор с матрицей, платой и рассыпухой. Дешевле. В четыре раза. Выбор очевиден же?
Пока всё звучит очень хорошо и просто, берём драйвер дисплея, который всё делает за нас, в зависимости от типа индикатора ставим нужные ключи и вуа-ля! Все почти так и есть, кроме одного «но». MAX7219 рассчитан на работу с дисплеями с общим катодом с напряжением сегмента до 5В и никак иначе. Что это дает в сухом остатке? Перебирая разряды индикаторов драйвер подключает их на землю, поддерживая высокий уровень на катодах остальных разрядов. А теперь вернемся к схемам выше и проанализируем, что будет в случае с индикатором с общим анодом.
Нетрудно понять, что мы получим инверсию — нужный разряд будет выключен, все остальные — активные. Вместо динамической индикации на дисплее будет сплошной засвет от соседних разрядов. Чтобы избежать такой ситуации между контроллером и драйвером нужно добавить микросхему инвертирующую логические уровни. Так как максимальное количество разрядов шесть, гуглим «hex inverter» и тут же находим 74hc04. Отлично, а для общего катода вместо микросхемы сделаем перемычки или можно использовать pin-to-pin совместимую микросхему-буфер 74als34/74as34 (hex noninverter, но обязательно с выходом push-pull, открытый коллектор/сток типа 74hc07/74als35 работать не будет из-за отсутствия подтяжки к питанию).
В итоге имеем финальные схемы подключения индикаторов. Для общего катода все просто — драйвер плюс ключи способные подавать на сегменты повышенное напряжение. В даташите на MAX7219 приводится схема подключения индикаторов размера 2.3 дюйма и все это запитано от 5 Вольт, но мои экземпляры наотрез отказались работать при таком низком напряжении, сегмент начинал слабо светиться при подаче 7.2В (1.8В на светодиод). Катоды подключены напрямую к MAX7219, контроллер может прокачивать через себя от 320мА на каждый канал (>45мА на сегмент), чего с головой достаточно для данных типоразмеров индикаторов.
Для общего анода все немного сложнее. Тут уже нужно использовать разнотипные ключи для верхнего и для нижнего плечей плюс инвертирующий буфер для управления разрядами. Инвертирование сигналов для сегментов получаем автоматически при использовании ULN2803.
Как видим, со стороны драйвера MAX7219 и управляющего всем этим ESP8266 нет никакой разницы какой именно тип индикатора установлен в модуле, модифицировать прошивку не требуется.
Замечу, что при использовании внешних драйверов встроенное в контроллер ограничение тока сегментов (которое задается резистором на входе Iset) корректно работать не будет, поэтому интенсивность будем регулировать напряжением питания при максимальной скважности от MAX7219. Драйвер позволяет устанавливать интенсивность скважностью встроенного ШИМ генератора от 1/32 до 31/32 с шагом 1/16.
Для управляющей части на ESP8266 ничего выдумывать не нужно, берем типовое включение модуля, заводим линии SPI на MAX7219, UART для прошивки на внешний разъем. Дополнительно решил добавить преобразователь протокола UART в virtual COM port через USB, его устанавливать необязательно, но места на плате предостаточно, пускай будет такая возможность. Как преобразователь я выбрал СН340, как максимально простое и бюджетное решение. В версии чипа СН340G преобразователь даже не требует частотозадающего кварца, он уже встроен в конвертер, а из обвеса всего пара конденсаторов, проще не бывает.
Полная схема в хорошем качестве тут.
Со схемой определились, теперь можно приступать к топологии печатной платы. Как я уже упоминал, все эти заморочки именно через плату. Хотелось заказать партию плат на нормальном производстве под все вышеперечисленные устройства и не дорабатывать их по месту напильником и скальпелем. После непродолжительных размышлений на плате вырисовались аж целых восемь посадочных мест под семисегментные индикаторы:
- По одному для 2.3" и 3" по центру платы — для дисплея с одной цифрой
- По два для 2.3" и 3" — для дисплея с двумя цифрами
- Три для 2.3" — соответственно, для дисплея с тремя цифрами
Такая комбинация позволяет расширить разрядность до шести цифр, а так же комбинируя расположение и размер индикаторов изготовить табло для различных, предположим, настольных игр и, конечно же, часы! На контакты продублированы сигналы управления всеми сегментами и выведены линии подключения 3 и 4 разряда для трехдюймовок, и 4, 5 и 6 разряд для двухдюймовок.
Дополнительно, два оставшихся свободных канала MAX7219 подключены к двум цепочкам дискретных светодиодов, расположенных над и под индикаторами. Их, например, можно будет использовать для фоновой подсветки, так сказать эффект ambilight.
Размер платы выбран таким образом, чтобы она не выходила за края индикаторов. В таком случае можно скомбинировать дисплей с одинаковыми расстояниями между цифрами для бо́льших и 6ти-разрядный для меньших индикаторов.
По углам платы расположены четыре отверстия под болт М3 для крепления модуля к несущей конструкции.
Микросхемы, если это было возможно, выбраны в выводных корпусах DIP, так как вопрос миниатюризации для данного устройства не актуален, а на плате они выглядят уже почти стимпанково, на фоне привычных BGA монстров. Это придает особого шарма, как у ламповых усилителей.
Посадочное место под модуль ESP-07 также pin-to-pin совместимо с модулями ESP-12S/E/F.
Плата проектировалась за два вечера, по этой причине использовался простой принцип разводки как у автороутеров — разделение горизонтальных и вертикальных линий на разные слои. В итоге плата получилась двухсторонняя, несложная и визуально красивая.
Плата была отправлена в производство как раз в канун китайского Весеннего Фестиваля и карантинных мер в КНР. Рассматривал три популярные площадки для изготовления мелкосерийных прототипов — PCBway, Seeed и JLCpcb. На последней стоимость получилась на 20 долларов дешевле (при партии в 20 шт) и значимым плюсом для меня было то, что фабрика не закрывалась на праздничную неделю. Суммарная стоимость составила 44 доллара, с учетом доставки 21$ и купона на скидку -5$. В пересчете на плату — чуть больше 2 долларов за штуку. Несмотря на разгар эпидемии коронавируса, от отправки gerber-ов на фабрику к моменту получения прошел 21 день. Качество плат на высоте.
За время пока в Китае изготавливались платы, в местном рекламном агентстве были заказаны основы из прозрачного акрила, куда можно закрепить платы и светорассеиватель. Теперь можно посмотреть, что получилось из задуманного.
Вот так выглядит вариант платы, запаянной под индикаторы с общим катодом. На фото указаны названия микросхем и обведены перемычки под запайку.
А вот так — под индикаторы с общим анодом.
На фото ниже различные комбинации индикаторов разных размеров. Как вы можете понять, их также можно удвоить, добавив slave-модуль.
Далее осталось только написать скрипт под конкретную реализацию, чем и займемся в следующей части.
Всем спасибо за внимание!
P.S.: Если кто-то заинтересовался проектом — пишите в личку, осталось еще с десяток плат или могу выслать gerber-файлы.
Любительский проект по сборке с нуля уникального настенного дисплея с функцией часов и возможностью дополнительного апгрейда. Вооружаемся шаговыми двигателями, МДФ, платами, кучей проводов и вперёд.
Цель проекта была двоякая: мне хотелось создать стильные часы, которые украсили бы собой голую стену, и одновременно обеспечить максимально тихую работу механизма. Вдохновили меня на эту затею другие впечатляющие проекты, которые я перечислил ниже, хотя во многих задействовались шумные сервоприводы. Взяв за основу собственную идею по модернизации тихих шаговых двигателей для 3D-принтеров, я с нуля собрал всю конструкцию, протестировал её и написал необходимый код, на что ушло где-то 2-3 месяца.
Все программные и аппаратные файлы доступны на GitHub
Способ отображения чисел на 7 сегментном индикаторе
Если мы хотим вывести число “0”, тогда мы должны засветить все светодиоды за исключением светодиода, который принадлежит линии “g” (см. схему выше распиновку 7-сегментного индикатора , поэтому имеет битовую структуру 11000000. Аналогично для отображения “1” мы должны засветить светодиоды b и c, так битовый шаблон для этой цифры будет 11111001. Таблица дана ниже для всех чисел, используя тип блока Общий анод 7-сегментного дисплея.
Тестирование базовой работоспособности
Оригинальная гифка (18 МБ).
Прогоняю все цифры по кругу. Знаменательный момент
На заднем плане видно приблизительные значения потребления тока от БП. В пике получается примерно 1.15А, поэтому я решил, что для уверенного запитывания всех 28 двигателей и прочего, нужно оценить общее потребление мощности.
Имейте в виду, что в этот момент при каждом движении питание подавалось на все двигатели. То есть даже неподвижные механизмы потребляли столько же, сколько движущиеся. В итоге я обновил программу, включив операцию исключающего НЕ-ИЛИ, сравнивающую текущее положение каждого мотора с его новым положением, чтобы контакт EN активировался и запитывался только у требующих движения механизмов.
Сдвиговые регистры на макетной плате
Чтобы не захламлять пространство на макетке, я собрал на микросхемах NXP 74HC595 плату с последовательным подключением сдвиговых регистров. В этом мне помогла полезная библиотека ShiftRegister74HC595. А неплохой образец последовательного подключения нескольких 74HC95 можно посмотреть в статье Multiple Shift-out Registers on Arduino — part 1.
Что еще.
Теперь пара слов о других идеях. С помощью универсального семисегментного дисплея и простого lua-скрипта под NodeMCU можно буквально за час сделать настольные/настенные счетчики событий (клиенты, коммиты, факапы) или отсчитыватели времени до чего-то, будь до дедлайн или отпуск. Или считать дни без падений сервера.
Возможно несколько вариантов решения. Самый простой — использовать все тот же модуль enduser_setup добавив на стартовую страницу необходимые параметры, например, инкрементировать или декрементировать число и с каким периодом.
Второй, более гибкий вариант — подвязать дисплей к какой-либо странице в Интернете, откуда он будет брать актуальные данные. Этот вариант подходит для отображения курсов валют, температуры воздуха на улице или количества выздоровевших от коронавируса и любых других часто обновляемых данных.
Возможен так же вариант прямого управления дисплеем с телефона используя любую из множества программ для прямой коммуникации с esp8266 по WiFi. Такое решение будет подходящим для отображения счета в настольных играх или на спортивных событиях, например, школьного масштаба.
И конечно же, никто не запрещает подключить всевозможные датчики к esp8266 и отображать температуру, влажность или давление. Хоть уровень углекислого раза в помещение.
Как простенький пример, и как раз по случаю грядущего праздника, я запилил счетчик дней до Нового Года.
Идей, как и вариантов их воплощения, великое множество. Наличие на борту контроллера с подключением к сети Интернет, модульная конструкция и возможность установки разного количества индикаторов разного размера и цветов открывает целое поле для полета фантазии. Вот такой вот универсальный индикатор получился.
Семи-сегментный дисплей (SSD) является широко используемым электронным устройством для отображения десятичных чисел от 0 до 9. Они наиболее широко используются в электронных устройствах, таких как цифровые часы, таймеры и калькуляторы для отображения числовой информации. Как указывает его название, он изготовлен из семи различных освещающих сегментов, которые расположены таким образом, что он может образовывать числа от 0-9, отображая различные комбинации сегментов. Он также способен образовывать некоторые буквы, таких как A, B, C, H, F, E и др.
7 сегментные индикаторы являются одними из простейших устройств для отображения чисел и символов. Как показано на изображении выше 7-сегментного дисплея, он состоит из 8 светодиодов, каждый светодиод используется, чтобы осветить один сегмент блока и 8 -й светодиод, используемый для освещения многоточия в 7-сегментный дисплей. Мы можем сослаться на каждый сегмент в виде линии, как мы видим есть 7 линий в блоке, которые используется для отображения чисел/символов. Мы можем использовать каждый сегмент «А,В,С,D,Е,F,G» и точки для использования времени «h». Состоит из 10 контактов, в котором 8 контактов используются для обозначения а,b,с,D,Е,F,G и два средних контакта имеют общий контакт анод/катод для всех светодиодов. Эти два общие контакты внутренне замкнуты, поэтому необходимо соединить только один общий контакт.
7-Сегментный Дисплей Распиновка
Существует два типа 7 сегментных индикаторов: Общий анод и общий катод:
Общий анод: здесь все отрицательные клеммы (катода) все 8 светодиодов соединены вместе (см. схему ниже). И все положительные клеммы остаются свободны.
Общим катодом: все положительные клеммы (аноды) всех 8 светодиодов соединены вместе. И все отрицательные клеммы остаются неподключены.
Укладка проводов
Или её отсутствие…
Кроме того, отказ делать собственные провода и/или спаивать компоненты вынудил меня полагаться на стоковые перемычки. В общем, будь у меня больше терпения, всё могло получиться куда опрятнее.
Заметьте, что микроконтроллер я не стал крепить посередине, чтобы можно было в дальнейшем добавить двоеточие между часами и минутами, если захочется. Там же на правой стороне организованы все дополнительные функции и питание.
Тестирование одной цифры
Завершённый одноциферный дисплей. Можно считать его надёжной платформой для тестирования всех компонентов: кастомных плат, ПО, проводных соединений, режимов работы и так далее
Фото сделано до подключения всех компонентов
“Заключительное” тестирование макетной платы
Все драйверы (7) установлены для управления всеми 7 двигателями (показаны только 4). Слева та самая плата со сдвиговыми регистрами. Всем управляет Mega2560, показанный сверху слева. На каждый мотор я прикрепил скрепку, просто чтобы сделать вращательное движение более наглядным при тестировании
К сожалению, подключить коннектор 28BYJ-48 напрямую в плату мне не удалось, так как провода располагались крест-накрест. В качестве быстрого решения я просто прокинул от коннекторов дополнительные соединительные провода.
Оригинальная гифка (15 МБ).
Первое тестирование всех чисел. Простейшая конфигурация, в которой я использовал картон и клейкую смесь Blu Tack, позволила мне протестировать функциональность схемы и подстроить базовые компоненты ПО
Подвешивание на стену
Я добавил по кругу небольшие панельки шириной около 4см в качестве импровизированного «корпуса», чтобы удобно разместить провода и прочее, а также повесить часы на стену. Кстати, повесил я их на крючках, закрепив верёвку узлами в краях верхней поперечной панели. Вес всей конструкции составил около 6кг — на гипсокартоне держится вполне уверенно.
В продолжение первой части о проектировании максимально универсального семисегментного дисплея сделаем на получившихся модулях первое, что приходит в голову — конечно же часы! Так что это очередная статья про очередные часы. Без кнопок, на ESP8266, на NodeMCU и Lua. Кому до сих пор интересно — прошу под кат.
Семисегментные индикаторы
С появлением светодиодов ситуация кардинально изменилась в лучшую сторону. Светодиоды сами по себе потребляют маленький ток. Если расставить их в нужном положении, то можно высвечивать абсолютно любую информацию. Для того, чтобы высветить все арабские цифры, достаточно всего семь светящихся светодиодных полос — сегментов, выставленных определенным образом:
Почти ко всем таким семисегментным индикаторам добавляют также и восьмой сегмент — точку, для того, чтобы можно было показать целое и дробное значение какого-либо параметра
По идее у нас получается восьми сегментный индикатор, но по-старинке его также называют семисегментным.
Что получается в итоге? Каждая полоска на семисегментном индикаторе засвечивается светодиодом или группой светодиодов. В результате, засветив определенные сегменты, мы можем вывести цифру от 0 и до 9, а также буквы и символы.
Кастомные печатные платы
Чтобы решить некоторые проблемы с трассировкой, я решил установить драйверы на плате вверх ногами.
Я мог существенно уменьшить общую схему, если бы вместо использования модулей драйверов разместил все необходимые компоненты по отдельности. Но мне захотелось сделать как проще.
Спустя неделю ожидания, пришли превосходные платы. После базовой проверки соединений я вручную припаял все компоненты, монтируемые в отверстия.
Предварительный тест драйвера шагового двигателя
В качестве первого основного теста я подключил моторчик 28YJ-48 к имевшейся под рукой плате Adafruit TB6612 (подключение 12В здесь не показано).
В начальном тесте использовался базовый образец программного обеспечения: Stepper: setSpeed(rpms)
В сравнении с любым серводвигателем уровень шума оказался намного ниже. Тем не менее из теста стало понятно, что «обычный» драйвер вроде TB6612 с понижением шума от мотора и шестернёй справляется слабо.
Конфигурация выводов
Здесь показано, что используется каждый цифровой контакт ввода-вывода Mega2560. Конечно, при необходимости можно использовать в качестве цифровых и аналоговые контакты, но пока они остаются невостребованными. Разве что A0 используется для реализации рандомности в режиме генерации слов.
Не показаны же здесь все соединения питания и заземления между платами.
Выбор двигателя
Чтобы добиться максимально тихой механической работы, я хотел полностью избежать использования серводвигателей (что исключило 5 из 6 имевшихся примеров решений). Серводвигатели изначально не задуманы для тихой работы. Даже ряд имеющихся у меня передовых решений от Robotis довольно сильно шумят.
Поэтому я выбрал один из самых популярных шаговых моторов, 28BYJ-48 (версию 12В). Хотя в связи с наличием в них внутренних шестернёй, у меня все равно оставались сомнения относительно их шумности.
Подсветка
Ещё один эстетический нюанс — простая непрерывная светодиодная лента на 5В по периметру. При подвешивании дисплея к стене она должна усиливать эффект выделения. Я также добавил на плату МОП-транзистор, чтобы можно было управлять подсветкой через GPIO на микроконтроллере.
По примеру одного из сохранённых мной вариантов сборки в качестве возможного улучшения я рассматривал использование программируемых светодиодных лент, свечение которых различным образом реагирует на срабатывание таймера, нажатие кнопок и прочие действия. Хотя даже с помощью GPIO и МОП-транзистора можно реализовать некоторые простые вещи.
Отсчёт времени
Для отсчёта времени я купил на Amazon модуль DS3231, который подключается к контактам I2C микроконтроллера и оперативно работает со множеством открытых библиотек.
Если интересно, то в статье Interface DS3231 Precision RTC Module with Arduino сделан прекрасный обзор этого модуля. А вот ещё одно годное руководство: Arduino and DS3231 Real Time Clock Tutorial.
Крепёж двигателей
Вот список деталей, потребовавшихся для крепления всех 28 двигателей:
- 56 опор, напечатанных на 3D-принтере (2 для каждого двигателя);
- по 112 винтов, болтов и шайб M3 (7 двигателей * 4 отверстия * 4 цифры);
- по 56 винтов и болтов M4 (7 двигателей * 2 отверстия * 4 цифры).
Концепция -> Схема -> Макет
Обрадовавшись рабочей схеме на макетной плате, я открыл KiCAD и набросал схему для платы управления одной цифрой. Она включала все компоненты и микросхемы, необходимые для управления моторами одной цифры часов (пассивные компоненты, сдвиговые регистры, контактные разъёмы и входы питания). По сути, я заменил макетную плату.
Для цельного дисплея часов потребуется четыре таких платы.
Использование тихих драйверов
Кусочек hardware
Для создания часов требуется четырехразрядный индикатор (или шести, если отображать еще и секунды). Так как часы планируются полностью автономными настенными я решил делать их из двух модулей по два трехдюймовых индикатора. В наличии такие были красные с общим анодом, так что устанавливаем элементы master-платы согласно первой части статьи, для slave-платы устанавливает только боковой разъём и индикаторы. Соединяем вместе и вперед программировать!
Виды семисегментных индикаторов и обозначение на схеме
Существуют одноразрядные, двухразрядные, трехразрядные и четырехразрядные семисегментные индикаторы. Более четырех разрядов я не встречал.
На схемах семисегментный индикатор выглядит примерно вот так:
В действительности же, помимо основных выводов, каждый семисегментный индикатор также имеет общий вывод с общим анодом (ОА) или общим катодом (ОК)
Внутренняя схема семисегментного индикатора с общим анодом будет выглядеть вот так:
а с общим катодом вот так:
Если семисегментный индикатор у нас с общим анодом (ОА), то в схеме мы должны на этот вывод подавать «плюс» питания, а если с общим катодом (ОК) — то «минус» или землю.
Читайте также: