Матрицы — это не только математика или искусственный интеллект. Ещё это — интересные арт-проекты для души, причиной рождения которых могут послужить самые неожиданные вещи или события. Об одном из таких проектов рассказываем в эту пятницу, пока у нас начинается флагманский курс Data Science.
Основная проблема при изготовлении светодиодного куба меньшего размера, на мой взгляд, — светодиодные панели. Коммерчески доступные панели предназначены для видеостен и обычно имеют минимальный размер 64x64 пикселя. Это кажется хорошим компромиссом между стоимостью, сложностью и светоотдачей. В моём предыдущем проекте я преодолел одно из главных препятствий на пути к кубу меньшего размера: разработал и изготовил собственные светодиодные панели высокой плотности, то есть менее 2,5 мм на шаг пикселя.
И что дальше? Я мог бы сделать его меньше, улучшить контроллер, прошивку. А как насчёт новых сторон? Вдохновение пришло от сложенной мной фигурки оригами, которая уже много лет стоит на моей полке. Никогда не видел светодиодный икосаэдр…
Проблемы
Я обдумал основные аспекты проекта:
Что мне известно?
Что мне нужно с точки зрения дизайна?
Над чем мне ещё предстояло поработать?
Инженерные проекты всегда связаны с решением проблем, поэтому важно иметь чёткое представление о стоящих перед вами проблемах.
Панели
Мне нужно было разработать светодиодную панель, компактную, но вмещающую всю электронику.
Эта панель должна иметь форму равностороннего треугольника, а также должен быть способ легко соединить её с другими панелями.
Как расположить светодиоды на поверхности каждой панели, чтобы облегчить прокладку? Зная, что панели расположены под разными углами, я хотел бы, чтобы они выравнивались независимо от ориентации при установке. Симметрия — 120 градусов.
Корпус
Как панели будут держаться в столь маленьких гнёздах?
У корпуса много странных углов, поэтому очевидный ответ — 3D-печать.
Это могут быть напечатанные пластмасса или нейлон.
Пластмасса, по моему опыту, не подойдёт: она хрупкая и со временем обесцвечивается.
Хочется чёрный материал, чтобы держатель не был заметен.
Размер? Теннисный мяч или кубик Рубика.
Контроллер
Можно использовать дизайн контроллера для куба, но его нужно будет перепроектировать, чтобы вписать в форму меньших размеров.
Питание
Как запитать фигурку? 18650. Элементы LiPo?
Но хочется брать его с собой в самолёт, для этого нужно что-то дружелюбнее.
Проект и время
Очень поздно пишу этот пост: я начал думать об этом проекте в сентябре 2019 года и хотел, чтобы он был готов к суперкону 2019 года. Чтобы всё успеть, у меня было меньше 2 месяцев.
Проектирование
У меня в голове возник образ устройства, но не возникло твёрдых цифр. Сначала нужно определить размеры каждой панели. Это я сделал в моей любимой 3D САПР — Fusion 360. Я нашёл туториал по моделированию икосаэдра, который оказался сложнее, чем вы можете себе представить. Уменьшил фигуру до размеров теннисного мяча — получилась треугольная поверхность со стороной 42 мм. Проделал небольшую вставку, чтобы оставить место для панелей, которые будут утоплены в корпус.
Для куба я использовал светодиоды 2x2 мм и знал, что они выпускаются в варианте 1,5x1,5 мм. Такой размер был бы идеальным. Их чёрный корпус помогает выделить круглую линзу в верхней части. Это особенно важно, потому что при перемещении некоторые панели светодиодов могут быть повёрнуты. Но, пока круглое отверстие находится в том же месте, вы, скорее всего, не заметите этого.
Можно купить светодиоды меньше, но они создают дополнительные трудности. Нужна возможность легко прокладывать маршруты на этой плате, не хотелось задействовать возможности HDI — это приведёт к загубленным, слепым маршрутам. То есть необходимо проложить трассу через середину светодиодных площадок, что невозможно при работе со светодиодами — 1x1 или 0,7x0,7 мм. Чёрного корпуса у них нет, и я беспокоился, что световые прорехи между пикселями будут плохо выглядеть.
По опыту работы с кубом я знал, что смогу создать матричное расположение светодиодов и использовать 16-битные драйверы светодиодов с постоянным током + драйверы источников 595/PMOS.
Плавающие драйверы TLC59025 настроены на один ток для всех 16 бит, поэтому необходимо использовать 3 драйвера — по одному для каналов R, G и B. Это связано с тем, что для каждого цвета требуется немного разный ток, чтобы получить красивый белый цвет. Вы можете найти драйверы, совместимые с несколькими контактами.
Компания LCSC продаёт несколько приборов с техническими описаниями только на китайском языке, но это не проблема, потому что они разработаны как взаимозаменяемые. С их помощью можно хорошо сэкономить, особенно учитывая, что проекту нужно 60 штук.
Эти драйверы только включают/выключают свет, но не управляют шкалой серого, поэтому нужно подключить оба сигнала — LATCH и BLANK. Это позволит вводить новые данные во время отображения текущих данных, а также контролировать точный интервал отображения. Вместе с некоторой логикой FPGA это позволяет управлять серой шкалой с высокой частотой обновления.
Есть несколько интересных наблюдений.
Я поместил всё в одну последовательную строку. Это 64 бита от входа до выхода, в первую очередь, чтобы уменьшить количество контактов на разъемах, а значит, и внутреннюю разводку.
Платы r0.1 не имели буферов, но я заметил, что после 3 панелей появились сбои, поэтому добавил буферы.
Я включил в проект достаточно электроники, чтобы управлять всей матрицей 16x16, но заполнил только её треугольную часть, что очень помогает при прокладке сигнала. Я уже на 4L для маршрутизации питания/сигналов на внутренних слоях, но пробовал маршрутизировать их с помощью только одного 8-битного драйвера источника и потерпел неудачу.
Выбор пал на 6-контактные плоские и гибкие кабели с шагом 0,5 мм. На самом деле найти их было довольно сложно, в итоге мы купили разные длины у продавца на Aliexpress.
На этом пространстве я могу разместить треугольный массив светодиодов с 15 пикселями по основанию и 15 пикселями в высоту, получается 120 светодиодов на сторону. При 20 сторонах получается 2400 светодиодов. Это интересно сделать вручную! Я даже оставлю это на усмотрение Грега из будущего.
Панель R0.1
Эти панели для изготовления я отправил в JLC PCB (https://jlcpcb.com/), которые оказались достаточно любезны, чтобы предоставить бесплатные печатные платы и трафареты.
Этот заказ я разместил 12 сентября.
Платы доставили примерно спустя неделю, внешне они выглядели хорошо. Я собрал одну, а при попытке определить ориентацию светодиодов обнаружил фатальный недостаток: я повернул схему на 90 градусов.
Попытался собрать плату, расположив светодиоды под углом 90 градусов, но это не удалось, площадки выглядят достаточно симметрично, но это не совсем так. Поэтому при размещении светодиодов под углом 90 градусов не возникает большого поверхностного натяжения, чтобы они встали по местам.
Да, это выравнивание выглядит довольно уродливо. У меня не было кабелей FFC или разъёмов, и я не написал код управления дисплеем и даже не пытался включить его. Возможно, вы чувствуете в этом какое-то предзнаменование.
Панели: дубль два
Казалось, что всё остальное в панелях в порядке, поэтому я быстро отрегулировал площадь основания, снял верхний слой и проложил заново. На этом этапе у меня оставалось немного творческой энергии/мотивации, поэтому я добавил в конструкцию 2 маленьких двойных входных буфера, что помогло изолировать панели друг от друга.
В частности, шина синхронизации импульсов устраняет некоторые глюки, которые я наблюдал в дизайне куба. После завершения маршрутизации я снова разместил заказ в JLC, но на этот раз я просто купил платы сам, потому что теперь у меня были сжатые сроки и я не хотел просить больше бесплатного из-за глупой ошибки с моей стороны.
Я разместил этот заказ 10 октября.
Корпус
По готовности дизайна панелей я могу экспортировать 3d модель из KiCad и смотреть, как они будут интегрироваться в корпус. Пришлось смоделировать индивидуальный светодиод. И это было полезно, чтобы увидеть подгонку.
Панели отлично подошли, а ободки выглядели достаточно толстыми, чтобы их можно было изготовить, теперь оставалось только пройтись по корпусу и отрезать как можно больше. Цены на нейлоновые MJF зависят от их общего размера и от того, сколько материала попадает в схему.
Что касается питания устройства, то мне удалось установить в корпус аккумулятор от беззеркальной камеры Sony, и, что ещё удивительнее, я нашёл совместимую 3-контактную клемму, которая подходит к аккумулятору! С батареями такого типа это — одна из трудностей.
Мне нужен был способ ставить и извлекать батарею. Я решил, что проще всего извлечь секцию икосаэдра с 5 панелями в ней, эти 5 панелей будут иметь один ленточный кабель, проходящий между ними и основанием. Секции будут иметь асимметричные замки и магниты, чтобы их можно было надёжно закрепить и снять.
Я даже попытался проявить смекалку и добавить в 3D-печать блокирующие элементы для удержания печатной платы контроллера. Опция Fusions «look-at» [face] и секционный анализ для разработки этого проекта были жизненно важны.
Когда две половинки были разработаны и проверены несколько раз, я был готов заказать их. Я не знаю слишком много вариантов, чтобы быстро сделать прототип детали из нейлона MJF, поэтому я просто обратился в Shapeways.
Из их услуг я выбрал повышенную детализацию с возможностью экспресс-обработки. Общая сумма заказа составила 167,68 долларов США. Я надеялся, что в конструкции нет никаких проблем, которые я упустил из виду, особенно учитывая, что это был мой первый опыт проектирования детали из нейлона MJF.
Заказ я разместил 12 октября.
Контроллер
Я перепроектировал контроллер, по сути, точную копию того, что использовался в кубе, но с выведенными на дисплеи 4x 6-контактными FFC. Контроллер и корпус разработаны в тандеме, так что пришлось немного походить туда-сюда, чтобы всё правильно подогнать. К счастью, это довольно просто при импорте dxf в KiCad и выводе 3D STEP.
Контроллер основан на быстро программируемом ядре SAMD51, это ядро M4, которое может работать на частоте до 120 МГц. Кроме того, поскольку проект был недостаточно сложным, я решил, что для управления системой хочу использовать Rust: в Rust есть поддерживающие samd51 крейты.
Кнопка и USB-соединение даёт простой способ обновления прошивки устройства: добраться до JTAG после сборки будет труднее.
FPGA ice40 разгружает всё мультиплексирование дисплея в реальном времени, параллельно выводит пиксели на 4 панели и обеспечивает частоту обновления ~100 Гц из буфера кадров, одновременно выводя гамма-корректированную 10-битную двоичную кодированную модуляцию для управления шкалой серого на каждом пикселе.
Что касается блока питания, было бы неплохо иметь зарядное устройство, но эти батареи Sony имеют номинальное напряжение 7,4 В, что делает зарядку немного сложнее, чем просто установка одночипового решения. Я все же хотел, чтобы устройство питалось через USB при программировании/отладке, поэтому добавил идеальный диодный контроллер, эффективно объединяющий два входных источника питания. Я также добавил базовый монитор пониженного напряжения на батарею, чтобы убедиться, что не переразряжаю элементы LiPo (хотя я обнаружил, что они могут быть встроенными).
Это модель, которую я создал для контроллера. Модель создаётся прямо из KiCad, она была необходима для хорошей механической совместимости PCBA и корпуса. Заказал я их 10 октября.
Сборка
Платы прибыли в пятницу, 18 октября.
Времени оставалось всё меньше, и я понял, что хочу собрать контроллер, чтобы начать работать с прошивкой, а ещё собрать несколько светодиодных панелей, чтобы сделать пробный монтаж на корпусе, который появится на следующей неделе. Я вошёл в ритм и закончил сборку контроллера на всех светодиодных панелях.
Пайка прошла отлично. Я использую бессвинцовую пасту SAC305 и трафареты из нержавеющей стали, которые JLC предоставила вместе с печатными платами.
Когда сторона контроллера была готова, я установил приспособление для выравнивания трафарета на верхнем слое и нанёс паяльную пасту. Я решил сделать светодиодную часть в последнюю очередь, чтобы светодиоды прошли только один цикл перепайки. Сделал приспособление из старых печатных плат, чтобы держать панели за направляющие в паяльной печи и чтобы нижние компоненты ни к чему не прикасались. Поверхностное натяжение должно удерживать их на месте, но, если приложить силу, пока припой расплавлен, возможно, они сдвинутся.
Нанеся припой на печатную плату, я разместил детали с помощью шприца с тупой/согнутой дозирующей иглой. Шприц подключён к небольшому вакуумному насосу постоянного тока. Это создаёт достаточное давление для захвата деталей с ленты, а затем, когда они помещаются на паяльную пасту, дополнительного усилия пасты достаточно, чтобы оторвать их от шприца.
Я установил деревянную плату на столе и с помощью двустороннего скотча наклеил на неё полоски светодиодной ленты, все в одной и той же ориентации. Печатная плата расположена таким образом, что светодиоды нужно просто перемещать, а не поворачивать.
Я собрал печатную плату контроллера. Также используются паяльная паста и паяльная печь. И прибыл корпус!
Тест вместимости
Корпус выглядел великолепно! Текстура MJF идеально сочетается с внешним видом печатной платы и светодиодов. Допуск между деталями я оценил идеально. Магниты поместились в обе части (одна проблема была: я не мог вытащить магниты). Плата контроллера и аккумулятор отлично помещаются в корпусе. А теперь погрузимся в прошивку — заставим светодиодные дисплеи работать.
Ошибки прошивки
Я откладывал этот шаг: чтобы управлять новым типом панели, нужно было изменить ПО FPGA из куба. Данные строк и столбцов необходимо было закодировать в 64-битный шаблон, а затем отправить на каждый дисплей в строке.
Я закодировал это изменение в симуляторе и увидел, что получаю правильные сигналы. Поэтому я подключил его к icebreaker (это плата разработки ice40) и запустил ПО FPGA… И ничего. Ничего не произошло.
Честно говоря, это неудивительно. Много чего нужно установить правильно, чтобы код, который выглядит правильно в симуляторе verilog, работал правильно и на оборудовании. Я включил оптический прицел и стал прощупывать ситуацию.
Сигналы FPGA: OK.
Сигналы, появляющиеся на входах сдвигового регистра: OK.
Переключение холостого сигнала: OK.
Сигнал фиксации: OK
Выходные данные сдвиговых регистров: OK
Напряжение: OK.
Светодиоды включены: NAK.
В конце концов я проверил значение в PMOS-переключателях — и это было странно. Как и ожидалось, появился сигнал, но источник не менялся. Не ошибся ли я со схемой?
На одной из плат я снял все PMOS драйверы высокой стороны и соединил мостом затвор со стоком. Таким образом, в 74-й серии 595-е напрямую управляли высокой стороной LED светодиода.
Уф…
Текущая дата — 20 октября.
Я использовал неправильную схему на обеих платах r0.1, которые имели неправильную схему для светодиодов, а затем снова на этих! И не замечал этого до сих пор. У меня, возможно, было достаточно времени, чтобы заказать новые платы с исправленной ошибкой. Но тогда все 20 разработанных плат превратились бы в металлолом.
Моменты ремонта
Временное исправление, которое я поставил на первой плате, не собирались работать. 595-е не имеют достаточного потенциала, чтобы соответствовать плавающему драйверу. Поэтому, когда более 3–4 светодиодов стоят в один ряд, яркость размывается, что даёт очень нежелательные эффекты в смысле способа подключения дисплея.
Mosfets в SOT-883, того же размера, что 0402. Внизу у них есть три прокладки, как показано на этой странице данных об эквивалентной части.
Примечание: я попытался найти часть с разной распиновкой, которая будет соответствовать моей печатной плате. К сожалению для меня производители часто тяготеют к отраслевым стандартным распиновкам, поэтому части могут быть полноценной заменой конкурентов. Смысла выпустить MOSFET с уникальной схемой на самом деле нет.
Моя проблема заключалась в том, что я поменял G/S, две самые маленькие колодки. Мой план переделать это подразумевал поворот детали, так что колодки G/S были ориентированы правильно. Затем соединить небольшим кусочком магнитной ленты, переместить и поместить обратно на плату. И вот что я сделал с каждым PMOS на каждой панели LED.
Вот почему я проговариваю: «В этом проекте три сотни заплаток». Я не знаю точно, сколько времени у меня ушло на всю переделку, но на той неделе я успел прослушать аудиокнигу на 60 часов.
Я попытался немного развлечься и заснять часть работ под тепловизором. Это Boson 640, работающий на частоте 30 Гц с самым широким объективом. Вы видите небольшой эффект искажения от объектива.
Итоги
Я работал над каждой панелью по очереди, и мне удалось всё завершить (и заставить работать) перед отъездом в США 2 ноября. И я действительно получил несколько интересных вопросов от дружелюбных людей из службы безопасности. Думаю, в целом я описал бы это как электронный арт-проект. Вот сжатая разборка устройства:
Вот как выглядит одна из базовых анимаций. В целом я очень доволен тем, что получилось, и получил много положительных отзывов о проекте на суперкон.
Планы
Контроллер — важная часть, и её можно сделать лучше. Беспроводная связь была бы замечательной, чтобы синхронизировать узоры и анимации с другим устройством. Панели работают отлично, а в версии r0.3 они уже не требуют крепления.
Я думаю, что новая плата контроллера может включать чип ESP32 или ESP32-S2 вместе с FPGA. Это даст возможность добавить дополнительные возможности, не беспокоясь о жёстких сроках на стороне дисплея.
Очень полезным было бы отображение пикселей в координатное пространство. Я думаю, что на самом деле это не так уж сложно, просто нужно уложить в голове матричные умножения для перемещения сетки пикселей на каждой грани из двухмерной плоскости в положение в трёхмерном пространстве вокруг икосаэдра, затем местоположение каждого пикселя может быть записано и использовано как таблица поиска для создания интересных анимаций и эффектов.
Умножение матриц, о котором говорит автор проекта — это, конечно же, лишь малая часть наших курсов:
Также вы можете перейти на страницы курсов из каталога, чтобы увидеть, как мы готовим специалистов в других направлениях.
Профессии и курсы
Data Science и Machine Learning
Python, веб-разработка
Мобильная разработка
Java и C#
От основ — в глубину
А также: