RGB LED матрица 64х32 обзор

The Matrix

На моей матрице имеется следующее обозначение: P4-256*128-2121-A2

  • P4 — Расстояние между светодиодами
  • 256*128 — Физический размер в миллиметрах
    • 256 mm ÷ 4 mm = 64 pixels
    • 128 mm ÷ 4 mm = 32 pixels
  • 2121 — Используемые светодиоды
  • A2 — ???

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


На матрице располагаются 2 разъема. Вход и выход

Такая распиновка разъема на моей матрице которая описана тут. adafruit’s 32×16 and 32×32 RGB LED Matrix стандарт еще развивается и распиновка на вашей может быть другой.


Такая матрица как у меня распространена на алиекспрессе и использует китайские запчасти, даташиты на которые найти не просто

Основой являются эти компоненты (datasheets тут):

  • 74HC245 — an octal 3-state bus tranceiver
    • Can be configured in either direction or disabled (Hi-Z) — but hard wired to one direction
    • There are two of these that buffer the 13× incoming signals
  • TC7258EN — a 4-to-16 line decoder
    • The Row[2:0] inputs are decoded into 8× independant current sources (only one sources current / is high at a time)
    • Up to 3A can be sourced per pin (from minimal translation of a datasheet)
    • Pins don’t sink, they go high-impedance (Hi-Z)
    • There are four of these that split the matrix into 4 row groups, of 8 rows each
    • Row[3] is fed into either ENH or ENL giving control over row group that is activated
  • DP5020B — a 16-channel LED driver
    • Appears to be a clone of TI’s TLC5926
    • Should be able to sink ~32 mA per channel (~2 A per 64 pixel row)
    • There is an external resistor to allow a configurable current limit
      • If the silk / refdes, datasheet and my interpretation of the graph are to be believed:
        • Red → ~1 kΩ → ~15 mA
        • Green → ~1.6 kΩ → ~8 mA
        • Blue → ~2.35 kΩ → ~6 mA
    • Data is shifted in and through a chain of 4× drivers (totalling 64× LEDs)
      • All parts share common Clock#Output_Enable and Latch
      • 1 will enable the current sink
      • Each chain gets one of the colors, e.g:
        • «Input Connector» → UB1.SDI
        • UB1.SDO → UB5.SDI
        • UB5.SDO → UB9.SDI
        • UB9.SDO → UB13.SDI
        • UB13.SDO → «Output Connector«

Матрица состоит из 2 матриц 64х16 каждая из которых стостоит из следующих компонентов:

  • 4× DP5020B для красного цвета, всего 64 пикселя в ширину (64-bits)
  • 4× DP5020B для зеленого цвета
  • 4× DP5020B для голубого
  • 1× TC7258EN with Vcc → ENH, and Row[3] → ENL (activates only when Row[3] is Low)
  • 1× TC7258EN with Row[3] → ENH, and GND → ENL (activates only when Row[3] is High)

Как работает

Примерная схема модуля

Как формируется одна строка

  1. Clock in a row’s worth of pixels — data is sampled on the clock’s rising edge
  2. Assert the latch — shift register is clocked into the output on the latch’s rising edge
  3. Address a row (0 — 15)
  4. Enable the output

This will let you display 6 colors on a single row of the matrix (well… two rows, due to the two stacked sub-modules)

NOTE: I’ve found that if you don’t keep the average current down, then you might see a very bright flash, followed by a dark matrix. I’m not 100% sure, but I suspect that this is related to the «Integrated anti-burnout power tube with overcurrent and short circuit protection.» (thanks Google Translate). I’ve had no problems if you keep scanning the matrix, or PWM the output enable.

Вся матрица

To drive the whole matrix, you’ll need to clock out a row, one-by-one. In this simple form, you’ll get 3-bit color (i.e: Black, Red, Green, Blue, Yellow, Cyan, Magenta, White).

As shown below, you must be careful of a few transitions:

  • Only assert the latch when the output is off (or you’re happy for the update to be presented «now«)
  • Only change the Row[3:0] signals when the output is off (otherwise you’ll get «glitches«, as demonstrated here)
  • It’s fine to clock new data in while the output is still active

Регулировка яркости

Посколько мы не можем обращаться к светодиодам напрямую, а драйверы не обеспечивают регулировку яркости (только вкл. \ выкл.) мы должны сами контролировать яркость

Лучший способ сделать это-отображать один бит яркости субпикселя за один раз.

  • I’m aiming at RGB565, therefore I need 6-bit brightness control
  • Vary the #Output_Enable width
  • Use a rolling single-bit mask, and multiple row shifts to use the correct brightness

The width of #Output_Enable needs to be related to the current bit’s value… An ideal mask to «on» time is shown below:

  • 6'b000001 → 1×
  • 6'b000010 → 2×
  • 6'b000100 → 4×
  • 6'b001000 → 8×
  • 6'b010000 → 16×
  • 6'b100000 → 32×

The apparent brightness of LEDs does not correlate linearly with average current (i.e: on-time). For low values the brightness rapidly increases, while for high values the brightness appears to barely change. To address this, we can apply Gamma correction. I’m wondering if we can do something about that here, with the variable width control of #Output_Enable… but brief attempts and mental reasoning are hinting at «no«… any thoughts? :-)

To reduce off-time (i.e: make the display brighter), you can start clocking the next bit out during the on-time of the previous bit.

Добавить комментарий