[Перевод] Модули MAX7219 бывают двух ширин: я развёл свои платы, чтобы собрать панель WOPR без щелей

Готовый проект с MakerWorld выглядел простым: напечатать корпус, вставить двенадцать светодиодных матриц 8×8 на MAX7219, прошить скетч. Напечатанные детали вышли отлично, но для трёх модулей оказались коротковаты: в корпусе остался зазор 12 мм. Дальше выяснилось, что «одинаковые» модули с AliExpress и Amazon бывают двух ширин, что в объявлениях часто указана не та ширина, а у узких модулей, которые нашёл автор, дисплеи впаяны без панелек, и плата не держится в пазах. Закончилось всё собственными платами 32×32 мм и микросхемами, выпаянными из дешёвых модулей.

Панель WOPR неплохо закрывает пустое место в довольно пыльной стойке с оборудованием.
Прим. пер.: WOPR — суперкомпьютер NORAD из фильма «Военные игры» (WarGames, 1983) с длинными рядами мигающих лампочек на передней панели. Самодельные «панели WOPR» ставят в домашние серверные стойки как декоративную заглушку.
Проект должен был быть простым. У меня уже лежали двенадцать светодиодных матриц 8×8, были программа и микроконтроллер. Оставалось напечатать файл .3mf, вставить модули в детали, затянуть пару винтов и прошить программу. Простым проект не вышел совсем. Ниже — что пошло не так и как я всё-таки довёл дело до конца.
Первые попытки

Страница проекта WOPR на MakerWorld от Bambu Lab.
Я наткнулся на проект светодиодной панели WOPR на MakerWorld и подумал: «У меня есть 3D-принтер! У меня есть куча модулей на MAX7219! Делаем!»

Стол со всеми деталями для печати в Bambu Studio.
Я скачал модель и открыл её в Bambu Studio. Печать несложная: много поддержек, весь стол печатается примерно за 3,5 часа. Главная трудность в том, что детали доходят почти до краёв области печати. Возле вентилятора с левой стороны Bambu X1C деталь может плохо держаться на столе, но если это мешает, можно поднять температуру стола и снизить обороты вентилятора.

Готовые напечатанные детали.
Детали на фото выше. Получились отлично!

Ой! Что-то здесь не так.
Детали получились отлично, но, когда я вставил в них три модуля MAX7219 по четыре матрицы 8×8, оказалось, что детали коротковаты. Зазор — 12 мм. Что пошло не так? (Самих дисплеев на фото нет: к моменту съёмки я уже снял их для финальной сборки.)

Сверху модуль шириной 128 мм, снизу — 132 мм. Обратите внимание на зазоры между дисплеями на нижнем модуле.
Из комментариев к исходному проекту на MakerWorld я узнал, что модули на MAX7219 бывают двух ширин: 128 и 132 мм. У модулей шириной 132 мм между дисплеями зазор по 1 мм. Зазор мне был не нужен, так что не беда, закажу несколько модулей на 128 мм. Но и это пошло не по плану.

Сверху модуль с дисплеями на панельках, снизу — без панелек. Пазы в напечатанной детали удерживают верхний модуль. Нижний просто лежит на детали и выпадет, если поставить её вертикально.
Первая проблема: во многих объявлениях на Amazon и AliExpress ширина модулей указана как 128 мм, а на деле они 132 мм. Вторая: у тех модулей, которые я нашёл и которые действительно были шириной 128 мм, дисплеи впаяны без панелек, и такие модули не входили в пазы для печатной платы в напечатанных деталях.
На фото выше печатная плата модуля шириной 132 мм с панельками (сверху) входит в пазы. У модуля шириной 128 мм без панелек (снизу) плата может лишь лежать над пазом и выпадет, стоит модуль сдвинуть. Правый паз на каждом обведён жёлтым.

Слева модуль 132 мм с панельками, справа модуль 128 мм без панелек. Зазор между платой и дисплеем, который даёт панелька, решает всё: только с ним модуль входит в паз и держится в нём.
Оказалось, что зазор между дисплеями и печатной платой необходим, чтобы модуль вошёл в паз напечатанной детали, а есть он только у модулей с панельками. На фото выше белые ножки дисплеев на правом модуле не пускают плату в пазы.

Мало того что между матрицами 8×8 зазоры, так они ещё и стоят неровно.
Раздосадованный, я отредактировал STL, раздвинул каждую сторону на 6 мм, чтобы влезли модули шириной 132 мм, и перепечатал детали. Это сработало, но зазор в 1 мм между матрицами быстро начал меня раздражать, и я решил, что могу сделать лучше. Или не могу?

Ой. По 20 долларов за штуку. Это Digikey, но у Mouser и остальных цены примерно такие же.
Я рассудил, что схема и разводка платы достаточно простые, и я просто сделаю свои модули: шириной 128 мм и без зазоров между дисплеями. Этот план прожил ровно до того момента, как я увидел цены на MAX7219 у надёжных дистрибьюторов. Эти микросхемы стоят почти 20 долларов за штуку! За меньшие деньги, чем одна новая микросхема у надёжного дистрибьютора, я могу купить на Amazon или AliExpress три платы с четырьмя такими микросхемами на каждой!
План
Я составил новый план:
сделать пробную плату 32×32 мм; четыре такие дают модуль шириной 128 мм;
ставить на свои платы панельки;
снять и дисплеи, и микросхемы MAX7219 с дешёвых модулей, заказанных на Amazon;
когда всё заработает, повторить разводку 32 мм четыре раза и получить модуль шириной 128 мм с четырьмя дисплеями и четырьмя MAX7219;
наконец, собрать три таких счетверённых модуля и получить бесшовный дисплей 8×96 шириной 384 мм, который встанет в исходные, неизменённые напечатанные детали.
Плата на один дисплей

Схема модуля 32×32 мм на одну матрицу 8×8.
Как нет единой спецификации на эти модули, так нет и единой схемы. Я нарисовал свою, она выше. Выводы сегментов MAX7219 подключены к анодам светодиодной матрицы, выводы разрядов — к катодам. Вопрос был только один: ставить SEG_DP слева от SEG_A или справа, после SEG_G. Я решил, что это неважно, потому что любую путаницу в порядке строк и столбцов можно потом исправить программно.

Разводка платы 32×32 мм на одну матрицу 8×8.
Разводка платы на картинке выше. Плата квадратная, 32 мм. По сравнению с готовыми платами я поменял порядок входных и выходных контактов, чтобы упростить разводку. А входной и выходной разъёмы поставил в 1,27 мм от краёв платы в надежде соединять платы цепочкой прямо через перемычки, без проводов.

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

Запускаю ESP32-S3 и примеры MD_MAX72xx на модулях с одним дисплеем.
Программа для проекта написана в среде Arduino и требует библиотеку MD_MAX72xx. Большинство примеров, как и исходный скетч WOPR, работают на моих дисплеях с минимальными изменениями.
Первое изменение — тип оборудования. В исходном скетче WOPR по умолчанию стоит MD_MAX72XX::FC16_HW; для моих модулей его пришлось поменять на MD_MAX72XX::DR1CR1RR1_HW.
Второе — число устройств. Дисплеев двенадцать, поэтому MAX_DEVICES нужно было поменять с 5 на 12.
Последнее — свои выводы на моей плате контроллера. Я добавил несколько определений с именами выводов и их номерами GPIO:
#define CLK_PIN 1
#define DATA_PIN 2
#define CS_PIN 3
Затем поменял глобальное объявление экземпляра MD_MAX72XX: вместо простого конструктора, которому нужен только вывод выбора микросхемы, взял конструктор со всеми выводами:
MD_MAX72XX mx(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
С этими изменениями на моих модулях должны работать любые примеры библиотеки и скетч WOPR. Полный скетч WOPR со всеми правками под мои модули можно скачать здесь.
Повторить разводку

Разводка платы 32×128 мм на четыре матрицы, 8×32 пикселя.
Платы на один дисплей заработали и, что важнее, заработали цепочкой друг за другом. Пора было делать версию на четыре дисплея. Я думал нарисовать схему из четырёх копий схемы одиночного модуля, но в Eagle PCB нельзя перенести разводку одной группы компонентов на другую группу, так что минимум три экземпляра дисплея пришлось бы разводить заново вручную.
Самый простой (единственный?) способ размножить работающую разводку в Eagle — закрыть схему, скопировать и вставить разводку, а потом поправить переименованные цепи, которые должны быть общими: питание и землю, а в этом случае ещё тактовый сигнал и выбор микросхемы. Получилась разводка с картинки выше. Разумеется, теперь у неё нет соответствующей схемы, а построить схему по плате Eagle не умеет.

Запускаю свой счетверённый модуль.
Когда платы пришли с производства, я снял дисплеи и микросхемы MAX7219 с пачки дешёвых модулей, купленных на Amazon. Микросхемы выпаивал паяльником и легкоплавким сплавом ChipQuik для демонтажа SMD. Потом очистил их флюсом и оплёткой и припаял к своим платам.
Я впаял микросхемы и новые панельки, вставил в них дисплеи и постарался выставить их как можно ровнее. Собрав одну плату, проверил её: подключил к ESP32-S3 и добился, чтобы дисплеи заработали. Когда одна плата заработала, доделал оставшиеся две.
Готовые панели

Готовые панели для стойки. Сверху вариант без зазоров на платах 128 мм, снизу — с зазорами на платах 132 мм.
На фото выше панель на моих платах шириной 128 мм (сверху) и панель на готовых платах шириной 132 мм (снизу). Без зазоров между матрицами 8×8 выглядит намного лучше!
Бонус: дом для модуля ESP32-S3

Схема платы контроллера.
У модуля Seeed Studio XIAO ESP32-S3 нет крепёжных отверстий, поэтому я сделал маленькую плату с отверстиями, которая держит XIAO и выводит контакты SPI. XIAO припаивается прямо к ней. Схема платы контроллера выше.

Разводка платы контроллера.
Разводка платы контроллера на картинке выше.

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

Плата контроллера на задней детали готовой панели.
Теперь плата контроллера закреплена на самой панели и больше не болтается сзади.

Готовая панель сзади.
Аккуратно, опрятно, всё в одном корпусе!

Панель-заглушка WOPR для стойки светится!
Файлы проекта
Прим. пер.: список покупок со ссылками на Amazon (партнёрскими, о чём автор честно предупреждает) в перевод не вошёл, он есть в оригинале.
Расходники для демонтажа микросхем (ссылки не партнёрские):
Модуль на один дисплей:
Модуль на четыре дисплея:
Плата контроллера:
Остальное:
Исходные файлы:
Позднее дополнение: WOPR-младший

Готовый WOPR-младший!
Ещё один проект на тему WOPR на MakerWorld, который мне приглянулся, — версия под 10-дюймовую стойку от другого автора. Это отличная интерпретация компьютера WOPR из фильма. В ней те же модули, которые я разработал для большой 19-дюймовой панели, но формат — популярная 10-дюймовая мини-стойка для домашней лаборатории.

Здесь снова пригодились платы шириной 32 и 128 мм и плата контроллера.
Этой версии нужны пять светодиодных модулей общей шириной 160 мм. Я собрал их из одной платы на один дисплей шириной 32 мм и одной платы на четыре дисплея шириной 128 мм. Они вставляются в нишу на задней стороне корпуса и держатся двумя планками, которые проходят сквозь модули и крепятся четырьмя винтами M4.

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

Плата контроллера подключается к первой плате дисплея через гнездо на обратной стороне платы контроллера.
На одиночном модуле стоит прямой штыревой разъём. Он входит в гнездо на обратной стороне платы контроллера. Я взял гнездо с длинными выводами: вдруг когда-нибудь захочу подключить к этому же контроллеру вторую или другую светодиодную плату.
Файлы WOPR-младшего:
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.