Оглавление:

Светодиодная матрица RGB: 5 шагов
Светодиодная матрица RGB: 5 шагов

Видео: Светодиодная матрица RGB: 5 шагов

Видео: Светодиодная матрица RGB: 5 шагов
Видео: RGB светодиодный дисплей 64x32 P2.5/P3 в связке с Arduino 2024, Июль
Anonim
Image
Image
Аппаратный дизайн
Аппаратный дизайн

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

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

Я выбрал Arduino в качестве платформы для драйверов, потому что она широко доступна и имеет множество ссылок в Интернете. Хотя карьерный опыт позволил мне получить рабочую версию драйвера более гладко, чем мои аппаратные усилия, было еще много итераций, пока я оптимизировал производительность драйвера для микроконтроллера ATMega и разработал программный API, который мне понравился.

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

Шаг 1. Проектирование оборудования

Основной целью моего проектирования оборудования было создание массива светодиодов RGB, которые я мог бы программировать, но я также не хотел тратить много денег. Подход, который я выбрал, заключался в использовании регистров сдвига 74HC595 для управления светодиодами. Чтобы свести к минимуму количество необходимых регистров сдвига, я расположил светодиоды RGB в виде матрицы, в которой общие аноды были связаны вместе в ряды, а красный, зеленый и синий катодные выводы были связаны в столбцы. Для матрицы 4х4 принципиальная схема выглядела как прилагаемая принципиальная схема.

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

Поскольку я использую обычные анодные светодиоды, это означает, что строки обеспечивают положительную мощность, а столбцы опускаются на землю. Хорошая новость заключается в том, что регистры сдвига 74HC595 могут как источник, так и потреблять энергию, но плохая новость заключается в том, что у них есть ограничение на то, сколько энергии они могут отдавать или потреблять. Максимальный ток потребления отдельных контактов 74HC595 составляет 70 мА, но лучше не превышать 20 мА. Каждый отдельный цвет в наших светодиодах RGB потребляет около 20 мА. Это означает, что 74HC595 не может напрямую запитать целый ряд светодиодов, если я захочу включить их все.

Таким образом, вместо непосредственного питания строки 74HC595 будет управлять транзистором для каждой строки, и транзистор будет включать или выключать ток, питающий строку. Поскольку в конструкции используются светодиоды с общим анодом, переключающий транзистор будет PNP. Если бы мы использовали светодиод с обычным катодом, переключающий транзистор был бы NPN. Обратите внимание, что с использованием транзистора PNP для управления строкой, настройка регистра сдвига для его включения теперь становится низкой, поскольку транзистору PNP требуется отрицательное напряжение между эмиттером и базой для включения, что позволит положительному току течь в ряд.

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

Наконец, мне нужно было определить, какие резисторы я бы использовал для каждого из светодиодов в светодиоде RGB. Хотя вы можете использовать стандартную формулу, которая объединяет прямое напряжение и желаемый ток для расчета необходимого резистора, я обнаружил, что установка тока каждого светодиода на 20 миллиампер привела к не совсем белому цвету, когда все красные, зеленые и синие светодиоды были включены.. Так что я начал приглядываться. Слишком много красного в белом означало увеличение сопротивления резистора красного светодиода для уменьшения тока. Я повторял замену резисторов с разным сопротивлением, пока не нашел комбинацию, которая давала белый цвет, который я считал правильным. Окончательная комбинация составила 180 Ом для красного светодиода, 220 Ом для зеленого светодиода и 100 Ом для синего светодиода.

Шаг 2: Конструкция оборудования - Макетная плата

Конструкция оборудования - Макетная плата
Конструкция оборудования - Макетная плата
Конструкция оборудования - Макетная плата
Конструкция оборудования - Макетная плата

Первым этапом конструктора метизов стал макет. Здесь я сделал матрицу 4х4 со светодиодами RGB. Для этой матрицы потребуется 16 бит для управления, 12 для столбцов RGB и 4 для каждой строки. Два регистра сдвига 74HC595 справятся со всем этим. Сначала я исследовал и спроектировал схему, которая, как я думал, будет работать, а затем построил ее на макете.

Вероятно, самой большой проблемой при сборке макета было управление всеми проводами. Я взял готовый комплект проводов для макетов, но тогда он был немного громоздким. Уловка, которая мне показалась полезной, заключалась в создании «порта» для подключения к плате Arduino. То есть, вместо того, чтобы подключать контакты Arduino напрямую к различным контактам IC на макетной плате, выделите несколько строк на макетной плате в качестве точки подключения для Arduino, а затем подключите соответствующие контакты ID к этим строкам. Для этого проекта вам нужно всего пять подключений к Arduino: +5 В, земля, данные, часы и защелка.

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

Шаг 3: Разработка программного обеспечения драйвера

Image
Image

Учитывая мой собственный карьерный опыт в разработке программного обеспечения, это была часть проекта, по которой я, вероятно, лучше всего понимал, какой путь выбрать. Я изучил многие другие драйверы светодиодных матриц на базе Arduino. Конечно, существуют хорошие драйверы, но ни один из них не имеет того дизайна, который мне нужен. Моими целями при разработке драйвера были:

  • Предоставьте высокоуровневый API, чтобы иметь возможность программно создавать изображения и анимацию. Большинство водителей, которые я видел, были больше ориентированы на жестко запрограммированные изображения. Кроме того, поскольку я по профессии программист на C ++, я хотел использовать хороший объектно-ориентированный дизайн для реализации и управления действиями по рисованию на светодиодной матрице.
  • Используйте подход с двойной буферизацией для управления изображением на экране. Один буфер - это то, что втягивается программно, а другой представляет состояние пикселей матрицы в любой данный момент. Преимущество этого подхода состоит в том, что вам не требуется полностью отображать обновление следующего кадра для экрана между циклами обновления мультиплексирования.
  • Используйте PWM, чтобы разрешить более семи примитивных цветов, которые RGB может отображать с помощью простых комбинаций красного, зеленого и синего элементов.
  • Напишите драйвер так, чтобы он «просто работал» с матрицами RGB-светодиодов разного размера, что соответствует моему общему подходу к проектированию матриц. Обратите внимание, что, хотя моя конструкция оборудования использует регистры сдвига 74HC595, я ожидаю, что мой драйвер будет работать с любым механизмом включения / выключения стиля регистра сдвига, который построен с использованием аналогичной битовой схемы, что и моя конструкция оборудования. Например, я ожидал, что мой драйвер будет работать с аппаратной схемой, в которой используются микросхемы DM13A для управления столбцами и микросхема 74HC595 для управления строками.

Если вы хотите сразу перейти к просмотру кода драйвера, вы можете найти его на GitHub здесь.

Первая итерация моего драйвера была немного кривой для изучения возможностей платформы Arduino. Наиболее очевидным ограничением является оперативная память, которая составляет 2 Кбайта для Arduino Uno и Nano. Использование объектов C ++ в таком сценарии часто не рекомендуется из-за накладных расходов на память объектов. Однако я чувствовал, что, если все сделано правильно, преимущества объектов в C ++ перевешивают их стоимость (в оперативной памяти).

Второй важной задачей было выяснить, как реализовать широтно-импульсную модуляцию через регистры сдвига, чтобы я мог генерировать более семи примитивных цветов светодиода RGB. Я много лет программировал на платформах Linux и привык использовать такие конструкции, как потоки, для управления процессами, требующими согласованного времени. Время операции обновления регистра сдвига оказывается весьма критичным при создании драйвера для светодиодной матрицы, использующего мультиплексирование. Причина в том, что даже несмотря на то, что мультиплексирование происходит так быстро, что ваши глаза не могут видеть, как отдельные светодиоды мигают, ваши глаза могут уловить различия в общем совокупном времени, в течение которого любой из светодиодов включен. Если один ряд светодиодов постоянно горит в течение более длительного периода времени, чем другие, он будет выглядеть ярче во время мультиплексирования. Это может привести к неравномерной яркости в матрице или периодическому стробированию матрицы в целом (это происходит, когда один цикл обновления занимает больше времени, чем другие).

Поскольку мне нужен был согласованный механизм синхронизации, чтобы обновления регистра сдвига были согласованы, но Arduino формально не поддерживает потоки, мне пришлось создать свой собственный механизм, подобный потокам. Моя первая итерация заключалась в том, чтобы просто создать таймер цикла, который зависел от функции Arduino loop () и запускал действие, когда прошло определенное количество времени с момента последнего запуска действия. Это форма «совместной многозадачности». Звучит хорошо, но на практике это оказалось непоследовательным, когда скорость стрельбы измерялась в микросекундах. Причина этого в том, что если бы у меня работали два из этих таймеров цикла, одно из их действий часто занимало достаточно времени, чтобы вызвать второе действие позже, чем хотелось бы.

Я обнаружил, что решение этой проблемы - использовать собственный механизм прерывания часов Arduino. Этот механизм позволяет запускать небольшой фрагмент кода с очень согласованными интервалами. Поэтому я разработал код драйвера вокруг элемента дизайна, использующего прерывание часов для запуска кода для отправки регистров сдвига матрицы при следующем обновлении в цикле мультиплексирования. Чтобы сделать это и позволить обновлениям изображения на экране, чтобы они не мешали активному дампу регистров сдвига (что мы назвали бы «условием гонки»), я использовал подход, состоящий из двойных буферов для битов регистра сдвига, один для письма и один для чтения. Когда пользователь обновляет изображение матрицы, эти операции выполняются в буфере записи. Когда эти операции завершены, прерывания временно приостанавливаются (это означает, что прерывание тактовой частоты не может сработать), и буфер записи заменяется предыдущим буфером чтения, и он не является новым буфером чтения, а затем снова включаются интерпретации. Затем, когда срабатывает прерывание часов, указывающее, что пора отправить следующую битовую конфигурацию в регистры сдвига, эта информация считывается из текущего буфера чтения. Таким образом, запись в буфер, который в данный момент может считываться во время прерывания синхронизации, никогда не происходит, что может привести к повреждению информации, отправляемой в регистры сдвига.

Разработка остальной части драйвера была относительно простым случаем объектно-ориентированного проектирования. Например, я создал объект для управления битовым изображением регистра сдвига для любого заданного состояния экрана. Инкапсулируя код, относящийся к управлению битовыми изображениями, создание вышеупомянутого подхода с двумя буферами само по себе было несложным упражнением. Но я писал это руководство не для того, чтобы превозносить достоинства объектно-ориентированного дизайна. Другой элемент дизайна включает концепцию глифа и изображения RGB. Глиф - это базовая конструкция изображения, не имеющая врожденной информации о цвете. Вы можете думать об этом как о черно-белом изображении. Когда Глиф рисуется на светодиодном экране, предоставляется информация о цвете, чтобы указать, как должны быть окрашены «белые» пиксели. Изображение RGB - это изображение, в котором каждый пиксель имеет собственную цветовую информацию.

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

Шаг 4: светодиодные ореолы

Светодиодный ореол
Светодиодный ореол
Светодиодный ореол
Светодиодный ореол

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

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

Чтобы решить проблему насыщения транзистора, к транзистору между базой и коллектором можно добавить диод Шоттки, чтобы вызвать небольшой обратный ток на базу, когда транзистор включен, предотвращая насыщение транзистора. Это, в свою очередь, приведет к более быстрому отключению транзистора при снятии тока с базы. См. Эту статью для подробного объяснения этого эффекта. Как видно из рисунка в этом разделе, без диода ореолы довольно заметны, но добавление диода в схему для каждой строки значительно устраняет ореолы.

Светодиоды RGB подвержены другому явлению, называемому паразитной емкостью. Основная причина этого заключается в том, что каждый из трех цветных светодиодов в модуле светодиодов RGB имеет разное прямое напряжение. Эта разница в прямом напряжении может вызвать эффект электрической емкости между каждым из отдельных цветов светодиода. Поскольку при включении питания в светодиодном блоке накапливается электрический заряд, при отключении питания необходимо разрядить паразитную емкость. Если этот столбец светодиодов в противном случае включен для питания другой строки, паразитный заряд разрядится через светодиод этого столбца и заставит его ненадолго загореться. Этот эффект хорошо объясняется в этой статье. Решение состоит в том, чтобы добавить путь разряда для этого паразитного заряда, отличный от самого светодиода, а затем дать светодиоду время для разряда, прежде чем на колонку снова будет подано питание. В моем дизайне оборудования это достигается путем добавления резистора к линии электропередачи каждого ряда, который соединяет источник питания с землей. Это приведет к тому, что при подаче питания на ряд будет потребляться больший ток, но будет обеспечен путь разряда для паразитной емкости, когда строка не будет запитана.

Однако стоит отметить, что на практике я считаю, что эффект паразитной емкости едва заметен (если вы его поищете, вы можете его найти), поэтому я считаю, что добавление этого дополнительного резистора является необязательным. Эффект замедления времени для насыщенных транзисторов намного сильнее и заметен. Тем не менее, если вы изучите три фотографии, представленные в этом разделе, вы увидите, что резисторы полностью устраняют любые ореолы, которые все еще возникают за пределами времени медленного отключения транзистора.

Шаг 5: Окончательное производство и следующие шаги

Image
Image

Заключительным этапом этого проекта было создание печатной платы (PCB). Я использовал программу с открытым исходным кодом Fritzing для разработки своей печатной платы. Несмотря на то, что нужно было выполнить множество повторяющихся задач по размещению 100 светодиодов на плате 10x10, я на самом деле нашел этот этап проекта странно удовлетворительным. Выяснение того, как будет проложен каждый электрический путь, было похоже на головоломку, и решение этой головоломки создало чувство выполненного долга. Поскольку я не занимаюсь производством печатных плат, я воспользовался одним из многих онлайн-ресурсов, которые занимаются небольшими тиражами нестандартных печатных плат. Паять детали вместе было довольно просто, поскольку в моей конструкции использовались все детали со сквозными отверстиями.

На момент написания этого руководства у меня были следующие планы относительно моих проектов RGB LED Matrix:

  1. Продолжайте улучшать драйвер на уровне API, чтобы предоставить программисту более высокоуровневые функции, в первую очередь прокрутку текста.
  2. Создавайте более крупные матричные конструкции, например 16x16 или даже 16x32.
  3. Изучите использование полевых МОП-транзисторов вместо BJT для переключения мощности ряда
  4. Попробуйте использовать драйверы постоянного тока DM13As вместо 74HC595 для переключения колонок
  5. Создайте драйверы для других платформ микроуправления, таких как Teensy, ODROID C2 или Raspberry Pi.

Обратите внимание, что конструкция оборудования и драйвер были выпущены под лицензией GPL v3 с открытым исходным кодом в этом репозитории GitHub. Более того, хотя производители печатных плат делают «небольшие тиражи» моей конструкции печатной платы, я все равно получаю гораздо больше, чем мне лично нужно. Поэтому я продаю полные комплекты для своих различных конструкций светодиодных матриц RGB (печатная плата и все детали в комплекте) со своего веб-сайта здесь.

Рекомендуемые: