2026-10-05 21:00:42 +02:00
|
|
|
|
# Planar EL512.256-H on ESP32
|
|
|
|
|
|
|
|
|
|
|
|
Drive a Planar EL512.256-H (512 × 256, monochrome electroluminescent) panel from an
|
|
|
|
|
|
ESP-WROOM-32 (classic ESP32), with an [Adafruit GFX](https://github.com/adafruit/Adafruit-GFX-Library)
|
|
|
|
|
|
compatible driver so the usual drawing, text and font APIs work.
|
|
|
|
|
|
|
|
|
|
|
|
The panel has no frame memory and needs a continuous video stream. The ESP32's I2S0
|
|
|
|
|
|
peripheral in 8-bit parallel (LCD) mode streams a precomputed frame from DMA, so the
|
|
|
|
|
|
CPU is free while the panel refreshes.
|
|
|
|
|
|
|
2026-10-05 21:08:36 +02:00
|
|
|
|
**Status:** framebuffer, GFX layer, row encoder and I2S/DMA refresh are implemented and
|
|
|
|
|
|
build cleanly; the signal timing has not yet been checked on hardware. Updates are not
|
|
|
|
|
|
yet tear-free.
|
2026-10-05 21:00:42 +02:00
|
|
|
|
|
|
|
|
|
|
## Hardware
|
|
|
|
|
|
|
|
|
|
|
|
- ESP-WROOM-32 dev board (`esp32dev`)
|
2026-10-05 21:13:36 +02:00
|
|
|
|
- Planar EL512.256-H, configured for **two-bit parallel mode**: jumper 2 (DCONFIG) of pin
|
|
|
|
|
|
strip PS1 removed, jumper 1 (SELFTST) fitted (datasheet Table 3)
|
2026-10-05 21:00:42 +02:00
|
|
|
|
- Datasheet: [docs/datasheet/EL512.256-H3 FRB.pdf](docs/datasheet/EL512.256-H3%20FRB.pdf)
|
|
|
|
|
|
- Check the panel's logic-level and supply requirements in the datasheet before wiring.
|
|
|
|
|
|
|
|
|
|
|
|
## Wiring
|
|
|
|
|
|
|
2026-10-05 21:17:29 +02:00
|
|
|
|
| Panel signal | Panel pin (Table 1) | Function | ESP32 GPIO | DMA byte bit |
|
|
|
|
|
|
|--------------|---------------------|----------------------------------------------|-----------:|-------------:|
|
|
|
|
|
|
| VCLK | J1-13 | Video clock, data latched on rising edge | 18 | I2S0 BCK |
|
|
|
|
|
|
| VID | J1-15 | Pixel data, even columns (x = 1, 3, …) | 19 | 0 |
|
|
|
|
|
|
| TVID | J1-7 | Pixel data, odd columns (x = 0, 2, …) | 21 | 1 |
|
|
|
|
|
|
| HS | J1-11 | Horizontal sync | 22 | 2 |
|
|
|
|
|
|
| VS | J1-9 | Vertical sync (rising edge used) | 23 | 3 |
|
|
|
|
|
|
| ENABLE | J2-6 | Display enable, low = off | 25 | — |
|
|
|
|
|
|
| _LOWPWR | J2-5 | Low-power mode, low = on | 26 | — |
|
|
|
|
|
|
| GND | J1-6, 8, 10, 12, 14, 16 | Signal return | GND | — |
|
|
|
|
|
|
|
|
|
|
|
|
The datasheet numbers columns 1 to 512 from the left; x in the code is 0-based, so
|
|
|
|
|
|
x = 0 is column 1 (odd, TVID).
|
|
|
|
|
|
|
|
|
|
|
|
Power (Table 1, Table 4): Vcc1 +5 V logic on J1-3, 4 (4.75–5.25 V, 0.2 A max);
|
|
|
|
|
|
Vcc2 +11…+30 V on J1-1, 2 (0.9 A max at 12 V). J1-5 is reserved: do not connect.
|
|
|
|
|
|
|
|
|
|
|
|
The panel inputs are HCT compatible with internal pull-ups of unstated voltage, and the
|
|
|
|
|
|
ESP32 is not 5 V tolerant, so drive them through a 74HCT245 or 74AHCT541 powered from
|
|
|
|
|
|
5 V (see the plan). ENABLE is pulled high inside the panel, so the panel scans while
|
|
|
|
|
|
the ESP32 is still booting and VCLK is not running yet; add a pull-down (for example
|
|
|
|
|
|
10 kΩ) on the buffer's ENABLE input so the panel stays off until `begin()` starts the
|
|
|
|
|
|
stream. Keep the cable under 300 mm, or add 47 Ω series resistors for up to 2 m.
|
2026-10-05 21:00:42 +02:00
|
|
|
|
|
|
|
|
|
|
The pin map lives in [include/pins.h](include/pins.h).
|
|
|
|
|
|
|
|
|
|
|
|
## Timing
|
|
|
|
|
|
|
2026-10-05 21:13:36 +02:00
|
|
|
|
| Parameter | Value | Datasheet limit (Tables 5, 6) |
|
|
|
|
|
|
|----------------------|-----------------------------------------|---------------------------------|
|
|
|
|
|
|
| Pixel clock (VCLK) | 5 MHz, 2 pixels per clock | 30 MHz max, keep running |
|
|
|
|
|
|
| HS high (T7) | 256 clocks | 256 in two-bit mode, even |
|
|
|
|
|
|
| HS low (T6) | 16 clocks | 4 clocks min |
|
|
|
|
|
|
| HS period (T8) | 272 clocks = 54.4 µs | 50 µs min |
|
|
|
|
|
|
| Lines per frame | 261 (256 visible + 5 blanking) | 256 rows + T1 |
|
|
|
|
|
|
| Front porch (T1) | 220.8 µs (last row end to VS rise) | 100 µs min |
|
|
|
|
|
|
| Refresh | 5 MHz / (272 × 261) ≈ 70.4 Hz | 70 Hz typ, 75 Hz max |
|
|
|
|
|
|
|
|
|
|
|
|
The datasheet ([docs/datasheet/](docs/datasheet/EL512.256-H3%20FRB.pdf)) is the source of
|
|
|
|
|
|
truth; if anything here disagrees with it, the datasheet wins.
|
2026-10-05 21:00:42 +02:00
|
|
|
|
|
|
|
|
|
|
## Layout
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
platformio.ini build config (esp32dev, Arduino, Adafruit GFX)
|
|
|
|
|
|
include/pins.h pin map
|
|
|
|
|
|
src/main.cpp test sketch: test pattern + text
|
|
|
|
|
|
lib/EL512/ local library
|
2026-10-05 21:08:36 +02:00
|
|
|
|
src/EL512Panel.* framebuffer, row encoder, I2S DMA refresh
|
2026-10-05 21:00:42 +02:00
|
|
|
|
src/EL512_GFX.* Adafruit_GFX subclass
|
|
|
|
|
|
test/ unit tests (placeholder)
|
|
|
|
|
|
docs/ datasheet and notes
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Build and flash
|
|
|
|
|
|
|
|
|
|
|
|
Requires [PlatformIO](https://platformio.org/) (CLI or the VS Code extension).
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pio run
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pio run -t upload
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pio device monitor
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Using the driver
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
#include <EL512.h>
|
|
|
|
|
|
#include "pins.h"
|
|
|
|
|
|
|
|
|
|
|
|
EL512Panel panel({el512pins::VCLK, el512pins::VID, el512pins::TVID, el512pins::HS,
|
|
|
|
|
|
el512pins::VS, el512pins::ENABLE, el512pins::LOWPWR_N});
|
|
|
|
|
|
EL512_GFX display(panel);
|
|
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
|
|
display.begin();
|
|
|
|
|
|
display.setTextColor(1);
|
|
|
|
|
|
display.print("Hello");
|
|
|
|
|
|
display.display(); // push the drawing buffer to the refresh stream
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
See [docs/README.md](docs/README.md) for design notes and the plan.
|