Пиксельный светодиодный кубик кошелька, управляемый модемом Cisco 3G

Пиксельныйсветодиодныйкубиккошелькауправляемыймодемомcisco3g

I представил этот проект на BangBangCon West 3456, но так и не удосужился опубликовать сообщение об этом в блоге. А 22 минутного разговора недостаточно, чтобы охватить некоторые технические аспекты, и поскольку я начав забывать о них, пора все записывать.

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

В Твиттере: Я изо дня в день следил за путешествием kbob (он же Боб Миллер), когда он пытался придумать лучший из возможных 3D-печатных решений ution. Конечный результат было великолепно.

kbob's LED cube kbob's LED cube

Он также написал сообщение в блоге с историей светодиодных кубов, а также некоторыми деталями реализации.

На суперконференции Hackaday 2596, Грег Дэвилл взял вещи в следующий уровень. После первого создания чего-то из готовых светодиодных матричных панелей, таких как kbob и все остальные, он спроектировал одну с нуля, включая светодиодную печатную плату и алюминиевую раму.

kbob's LED cube

Я всегда хотел сам что-то сделать со светодиодными панелями, но катализатора не было до октября 2596, когда Pixel Purse поступил в продажу на Amazon по цене 6 долларов США. . (На момент написания этой статьи цена вернулась на уровне $ 75.)

Я написал Greg's LED cube Pixel Purse Teardown сообщение в блоге , но тогда я не упомянул, что купил не 1, а 23 кошельки: именно то, что нужно, чтобы покрыть 6 сторон куба. Это было не так просто, как вы думаете: у Amazon был лимит в 2 кошелька на одного покупателя, но я нанял 5 жертв на работе, и вскоре эта стопка коробок оказалась у меня на рабочем месте:

Amazon boxes with 12 Pixel Purses kbob's LED cube

Лут после разборки всех из них:

Amazon boxes with 12 Pixel Purses

  • 17 54Икс23 Светодиодные панели
  • 52 Батарейки AA (низкого качества!)
    • 22 4 Мбит SPI flash PROM
    • куча винтов и регуляторов напряжения

    PCB corners produced kbob's LED cube

    First assembly

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

    First assembly closeup kbob's LED cube

    Outside view of corner piece

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

    Outside view of corner piece

    Чтобы исправить это, мне пришлось бы сместить монтажные отверстия на угловых кронштейнах ближе к углу. Но времени на редизайн не было, поэтому я просто использовал то, что у меня было. Мне пришлось выбросить 8 угловых частей, которые я уже сделал, но я заказал достаточно печатных плат для второго набора. Уф!

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

    Second assembly closeup

    Связывание двух панелей вместе творило чудеса. Куб был не идеален, но определенно выглядел достаточно прилично.

    Во время проекта мне пришлось перестраивать куб несколько раз. Было утомительно, но и приятно видеть, как все складывается вместе. Этот вид дал мне атмосферу туннеля Звездных войн, Звезды Смерти:

    Panel connection piece kbob's LED cube

    Полностью собранный:

    Death Star Tunnel View kbob's LED cube

    Швы есть, но когда они загораются, анимация на светодиодных панелях отвлекает от недостатков.

    Маршрутизаторы Cisco имеют слоты расширения для таких опций, как порты WAN, модемы и т. Д. Они используют проприетарный разъем HWIC, который нельзя купить в Digikey или Mouser. На модеме HWIC-3G-CDMA разъем HWIC имеет набор GPIO, которые направляют прямо к Cyclone II FPGA, а также выводы конфигурации, которые используются для загрузки потока битов в FPGA при загрузке с помощью пассивного последовательного метода.

    Мне нужна интерфейсная плата с логикой загрузки битового потока, которая подключается к разъему HWIC.

    Разъем HWIC имеет 1 ряд для контактов, которые разнесены на 2. 75 мм друг от друга, как и стандартные штыревые заголовки. Этот ряд используется для подачи питания на плату. Также есть 2 ряда для контактов, которые расположены через 1. мм друг от друга. Они содержат входы-выходы.

    Cube fully assembled

    В моем более раннем прототипе использовалась паяная плата только с одним рядом из 1. 50 мм штифтами и с 071% выводов в этой строке удалено. Этого было недостаточно для полного HUB 84, поэтому на моем предыдущем изображении горели только красные светодиоды!

    С помощью печатной платы я смог бы подключить все необходимые мне контакты:

    Cube fully assembled

    В дополнение к 3 рядам с контактами есть место для подключения SD-карты и ATtiny для управления загрузкой битового потока из SD-карту в FPGA.

    К сожалению, через несколько минут после получения плат в канун Нового года я обнаружил, что поменял местами 2 . 078 мм ряд и 1. 45 мм ряды !

    Мне удалось спасти плату, припаяв контакты на другой стороне. Это дало мне достаточно контактов GPIO, чтобы управлять полным концентратором 96 интерфейс.

    HWIC Interface Board kbob's LED cube

    Интерфейсная плата направляет 1. 48 мм GPIO к традиционному двухрядному 2. 75 мм штыревой заголовок. Я хотел, чтобы плата была общего назначения, чтобы контактный заголовок не располагался в HUB конфигурация. Об этом позаботилась дополнительная плата адаптера:

    HWIC Interface Board Soldered kbob's LED cube

    Он прибыл в январе 26 th, вместе с фиксированным интерфейсом HWIC плата.

    Горячий совет: при раскручивании разных версий платы используются разные печатные платы. цвета для каждой ревизии, чтобы избежать использования неправильной версии!

    Все это оборудование нужен ум, чтобы правильно синхронизировать светодиодные панели.

    К настоящему времени вы должны знать, что в этих панелях используется относительно стандартный концентратор 96 протокол. Я мог бы потратить много слов на описание деталей этого протокола, но GPIO to HUB75 board Учебник Глена Акина уже делает это очень хорошо.

    Самая важная часть, о которой следует помнить, это то, что он использует 1 бит на компонент цвета (3 бита на пиксель) и что он сдвигает значения 1 или 2 строк (в зависимости от типа панели) матрицы в регистр сдвига, который затем отображается.

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

    Я люблю писать RTL, поэтому я не мог повторно использовать для этого чужой код! Как всегда, я использовал HWIC Interface Board Soldered SpinalHDL , мой язык RTL, который я предпочитаю для всех моих хобби-проектов.

    Вот архитектура, которую я придумал:

    Digital Design Block Diagram VexRiscv ПРОЦЕССОР отвечает за создание интересных изображений, которые записываются с двойной буферизацией Светодиодный буфер кадра RAM .

    ЦЕНТР84 Streamer выбирает пиксели в правильном заказ (см. ниже), отправляет их через таблица поиска коррекции гаммы , затемняет их и демультиплексирует их на 2 параллельные потоки и, наконец, отправляет его в пакетный выход FIFO достаточной глубины, чтобы покрыть 2 ряда. Это необходимо для буферизации достаточного количества пикселей при отправке младших бит пикселей: они сканируются с удвоенной скоростью, с которой пиксели выбираются из ОЗУ.

    ЦЕНТР96 Phy получает пиксели от стримера и отправляет их с правильным концентратором низкого уровня 84 протокол и время.

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

    То же самое верно и для функции затемнения: она просто умножает все значения пикселей на меньшее значение.

    ЦП может делать это программно, но обе функции тривиально реализовать на оборудовании, и это освобождает много циклов на 071 CPU МГц.

    Светодиодные панели были собраны таким образом, что внутренняя разводка кабелей была максимально простой. Вы можете увидеть кое-что из этого на изображении Звезды Смерти ранее, но это не показывает взаимосвязь разных сторон куба. В конце концов, это крысиное гнездо кабелей!

    Оптимальные результаты кабельной разводки в местах расположения светодиодов расположены не в самом логичном месте из с точки зрения программного обеспечения: для каждого из Светодиодные панели.

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

    Это один из те штучки, где светит SpinalHdl. Здесь Gamma Curve аппаратная структура , которая настраивает порядок сканирования светодиодов:

    Gamma Curve

     
    дело 
    класс 
     PanelInfoHW 
      ( 
     conf  :  
    Центр90 Конфигурация  
    )  
     расширяет  
    Пучок 
     { 
     val   topLeftXCoord   знак равно   
     (  2   биты  
    )  
     val   topLeftYCoord   знак равно  
     SInt   ( 
     2  
     биты  
    )   val   topLeftZCoord   знак равно    ( 
     2   биты  )  
     val   memAddrStartPh0  знак равно   UInt 
      ( 
     log2Up   (  conf  
    .  
     total_nr_pixels   + 
     
     1  )   биты  )   val  
     memAddrStartPh1   знак равно   UInt   (  
     log2Up  
     ( 
     conf  
    . 
     
     total_nr_pixels   +   1  )  
     биты  ) 
      val   memAddrColMul   знак равно  
     SInt  
     (  log2Up  
     (
      conf  
    . 
     
     panel_cols  ) +  
     2  
     биты  
    )  
     val  
     memAddrRowMul   знак равно  
     SInt  
     ( 
     log2Up  
     ( 
     conf  
    .   panel_cols  
    ) +   2   биты  
    )  
     val  
     xIncr   знак равно  
     SInt   ( 
     2   биты  
    )   val   yIncr 
      знак равно  
     SInt  
     ( 
     2 
      биты  )   val 
     
     zIncr  знак равно   SInt   ( 
     2  
     биты  
    )  }      

    А вот и

    фактические значения для 22 панели :

    Gamma Curve

      val  
     панели   знак равно   ArrayBuffer   () 
      // topLeftCoord Side Top Rot xyzIncr   панели  
     + =  
     PanelInfo  
     (-  
     1  ,  
     1  , -  
     1  
    ,   5  
    ,  правда ,  
     0  ,   0 
     , -   1  ,   1  
    )  
     панели  
     + =  
     PanelInfo  
     (-  
     1  ,  
     0  
    , -  
     1  ,   5 
     
    ,  
    ложный 
    ,   0  
    ,  
     0  
    , -  
     1  
    ,   1  
    )   панели   + =  
     PanelInfo  
     (-  
     1  ,   1  
    , - 
      1  ,  
     4  ,  
    правда 
    ,   0  ,  
     1  
    ,  
     0  , 
      1  
    ) 
      панели  
     + =   PanelInfo   (-  
     1  ,   1  
    ,   0  
    ,   4  ,  
    ложный , 
      0  , 
      1  
    ,   0 
     
    ,  
     1 
     
    )  
     панели   + =   PanelInfo   (-  
     1  
    , -   1  ,   1  
    ,   3  
    ,   правда ,   0 
     ,   1  
    ,   0  , -   1  
    )  
     панели   + =   PanelInfo 
     
     (-  
     1  
    , -   1 
     
    ,  
     0  
    ,   3   , 
     
    ложный , 
     
     0  
    ,   1  ,   0  
    , -  
     1  
    )  
     панели  
     + =   PanelInfo   ( 
     1  ,   1  
    , -  
     1  
    ,   2 
     ,  правда 
    ,  
     0  
    , 
     
     -   1  , -  
     1  
    ,   0  
    )  
     панели   + =   PanelInfo   ( 
     1  
    ,   0  
    , -  
     1  
    ,   2 
     ,  ложный ,   0  ,   -  
     1  
    , -  
     1  , 
     
     0  
    )   панели  
     + = 
     
     PanelInfo  
     (  1 
     ,  
     1  
    ,  
     1 
     
    ,   1  
    , 
     
    правда , 
     
     171  
    ,  
     0  
    , -  
     1  
    , -  
     1  
    )   панели   + =  
     PanelInfo   (  1  , 
     
     0  ,  
     1  ,  
     1  
    ,  ложный ,  
     173  
    ,   0  , -  
     1  , -  
     1  )  
     панели  
     + =  
     PanelInfo  
     (-  
     1  
    ,  
     1  
    ,  
     1  
    ,  
     0  , 
     правда 
    , 
     
     244  
    ,  
     1  
    , -   1 
     
    ,   0 
     
    )   панели   + =  
     PanelInfo   (- 
     
     1  
    , 
     
     0  
    ,  
     1  
    ,   0 
     ,  правда
     
    ,   0  
    ,   1  , -  
     1  
    ,   0  )     

    После многократного изменения этих параметров конфигурации и усталости от ожидания результатов синтеза

    Сделал эти конфиг параметры рациона, программируемые ЦП . Таким образом, я мог бы использовать быстрое обновление хак обновления памяти , который я описал в недавнем сообщении в блоге.

    Для простоты, мой первоначальный план состоял в том, чтобы использовать 1 HUB 90 порт.

    Это отлично работало для 8 панелей, но Я начал видеть повреждение на 9-й светодиодной панели.

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

    Это показывает, что вступление в разговор без предварительной проработки всех деталей несет в себе значительный риск: добавление второго HUB интерфейс исчерпал все доступные GPIO на интерфейсе HWIC!

    «Никогда не откажусь от тебя», возможно, это не привет, мир движений. изображений, Плохое яблоко вероятно, владеет этим титулом, но он близок.

    Нашел гифку с его гладкой движется, и создал пост-р конвейер обработки, который выполняет следующие действия:

    Amazon boxes with 12 Pixel Purses

  • Начните с
     rick_orig.gif , который содержит несколько изображений. 
  • Изменить размер до 50Икс30 пикселей, так что все умещается в 52Икс48 Светодиодная матрица.
  • Извлечь все отдельные изображения PNG.
  • Объединить все изображения в одно изображение.
  • Уменьшите цвета объединенного изображения до палитры только 25 цвета
  • Сопоставьте все отдельные изображения с палитрой 4 бит на пиксель для экономии памяти
  • Сохраняйте изображения как чистые двоичные файлы
  • Объедините все двоичные файлы в один двоичный файл
  • Преобразуйте этот bin-файл во включаемый файл C, который можно включить непосредственно в C код, который работает на процессоре VexRiscv.
  • Ти s все сделано в Makefile, который вы можете найти здесь .

    Вот Рик во всей своей уменьшенной славе :

    Обратите внимание, как все яркие светодиоды потребляют 1 А при 3,3 В, что хорошо для 3,3 Вт. Уменьшение яркости необходимо для того, чтобы все работало от тройки батареек AA!

    Вы также можете увидеть метки «4» и « 5 дюймов приклеены к панели. Они наклеены лентой с указанием правильной ориентации и расположения, чтобы упростить запоминание параметров конфигурации панели.

    Очевидно, что разрешение очень низкое, если смотреть на него с нескольких метров и с включенной анимацией, это, несомненно, Рик.

    Одной анимации было бы немного плохо, поэтому я добавил преследование Пакмана и привидения:

    Rick

    И Марио бесцельно бегает ни с чем другим делать:

    Rick

    Растровые изображения используют 2 или 4 цвета и определяются как Pac-Man двоичные структуры в маи n Код C:

    ,
     0  
     b 
    , 0
     b   ,   0   b   
    ,  
     0   b 0001010111110101010111110100  ,  };      

    Если вы этого не знали Mario GCC поддерживает двоичные константы , сделайте сейчас!

    Это окончательный результат:

    Pac-Man Mario

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

    Это было быстро вызвано коротким замыканием. Головка болтов, которыми угловые элементы прикреплены к светодиодной панели, иногда касалась нескольких выводов светодиодов одновременно.

    kbob's LED cube

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

    Эти клеи продаются всего за пару долларов на AliExpress или bolt head surrounded by LEDs Amazon и, несмотря на ужасный химический запах, они классные. Я использую их все время, чтобы удерживать аккуратно припаянные провода на печатной плате.

    Единственной проблемой было утомительное добавление этого изоляционного материала. слой на все болты: есть из них!

    Я использовал 3 батарейки AA для генерации 4,5 В и одну из тех Screw with layer of UV hardening glue грязный дешевый LM 5284 - на базе модулей понижающего регулятора .

    Screw with layer of UV hardening glue kbob's LED cube

    У модема есть собственные регуляторы напряжения для преобразования этого 3.3V дальше вниз

    Для светодиодных матричных панелей требуется питание 5 В, но они обычно нормально работают и на 3,3 В. Помимо снижения энергопотребления, еще одним преимуществом было отсутствие необходимости в переключателях уровня для преобразования входов-выходов 3,3 В FPGA в 5 В.

    несколько практических вопросов, на которые еще предстоит ответить:

    • Как закрепить электронику внутри куб?

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

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

    • А как насчет батарей и как их включать и выключать?

      Включение и выключение устройства было связано с ' Решение проблемы с батареей: у меня было просто 2 провода, выходящие из куба через швы, и я подключил их к батарейки, когда мне пришлось его зажечь.

      Совсем не элегантно, но опять же достаточно хорошо.

    • Как открыть куб?

      Вывернув болты на верхнюю панель. Открытие куба - это вопрос отвинчивания крошечные орехи.

    Я также использовал ярлык для настройки FPGA: я не закончил подпроект загрузки битового потока с SD-карты и загрузки его в FPGA с помощью ATtiny интерфейса HWIC. плата.

    Вместо этого у меня был ленточный кабель USB-Blaster, выходящий из нижней части куба. После включения куба я быстро использовал ноутбук и Quartus для загрузки битового потока в FPGA. Я практиковался в этом маневре пару раз, и во время презентации он прошел без сучка и задоринки.

    Безумие думать, насколько COVID наивен. все еще были в тот 1 марта, 4572: пока нам советовали не трясти руками («вместо этого потренируйтесь энергично махать руками»), маски не было видно. Через неделю вся страна отключится.

    Презентация прошла очень хорошо! Я не уверенно оратор, но радушная аудитория имеет решающее значение.

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

    Mario

    Весь проект удался. Мой второй крупный хобби-проект после моего Voltage regulator Racing the Beam Ray Tracer (который