Initial commit: plasma DMD driver project

- Design docs: 12 V DC power supply, safety and bring-up, ESP32 interface, BOM
- PSU schematic (schemdraw) and KiCad 10 carrier-board project with HV net classes
- ESP32 PlatformIO firmware skeleton with HV watchdog toggle
- Reference schematic of the Stern 520-5138-00 display PSU

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-10-24 02:31:50 +02:00
commit dbc1f0041f
21 files changed
+13853

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
[env:wemos_d1_mini32]
platform = espressif32
board = wemos_d1_mini32
framework = arduino
monitor_speed = 115200
+77
View File
@@ -0,0 +1,77 @@
// Plasma DMD driver skeleton for Wemos D1 mini ESP32.
// Scans a 128x32 plasma panel continuously and toggles the HV watchdog once per row.
// Signal polarities (enable, latch, row data) are NOT yet verified against the panel.
#include <Arduino.h>
#include <SPI.h>
// Pins, see docs/esp32-interface.md
constexpr int PIN_DOT_CLK = 18; // VSPI SCK
constexpr int PIN_DOT_DATA = 23; // VSPI MOSI
constexpr int PIN_COL_LATCH = 17;
constexpr int PIN_ROW_DATA = 16;
constexpr int PIN_ROW_CLK = 26;
constexpr int PIN_ENABLE = 22;
constexpr int PIN_HV_WDOG = 21; // charge pump -> HV relay
constexpr int WIDTH = 128;
constexpr int HEIGHT = 32;
constexpr int ROW_BYTES = WIDTH / 8;
// TODO: verify polarities on the real panel
constexpr int ENABLE_ON = HIGH;
constexpr int ENABLE_OFF = !ENABLE_ON;
uint8_t frame[HEIGHT][ROW_BYTES];
static void makeTestPattern() {
for (int y = 0; y < HEIGHT; y++)
for (int b = 0; b < ROW_BYTES; b++)
frame[y][b] = ((y / 4 + b) & 1) ? 0xFF : 0x00; // checkerboard
}
static void pulse(int pin) {
digitalWrite(pin, HIGH);
delayMicroseconds(1);
digitalWrite(pin, LOW);
}
static void scanFrame() {
for (int y = 0; y < HEIGHT; y++) {
SPI.writeBytes(frame[y], ROW_BYTES);
digitalWrite(PIN_ENABLE, ENABLE_OFF); // blank while switching rows
pulse(PIN_COL_LATCH);
digitalWrite(PIN_ROW_DATA, y == 0 ? HIGH : LOW);
pulse(PIN_ROW_CLK);
digitalWrite(PIN_ENABLE, ENABLE_ON);
delayMicroseconds(200); // row on-time, ~120 Hz frame rate incl. overhead
// Toggle per row (~2 kHz) to keep the charge pump charged. If scanning stops, HV drops.
digitalWrite(PIN_HV_WDOG, !digitalRead(PIN_HV_WDOG));
}
digitalWrite(PIN_ENABLE, ENABLE_OFF);
}
void setup() {
// Safe state first: display disabled, watchdog idle (HV stays off).
pinMode(PIN_ENABLE, OUTPUT);
digitalWrite(PIN_ENABLE, ENABLE_OFF);
pinMode(PIN_HV_WDOG, OUTPUT);
digitalWrite(PIN_HV_WDOG, LOW);
pinMode(PIN_COL_LATCH, OUTPUT);
pinMode(PIN_ROW_DATA, OUTPUT);
pinMode(PIN_ROW_CLK, OUTPUT);
Serial.begin(115200);
SPI.begin(PIN_DOT_CLK, -1, PIN_DOT_DATA, -1);
SPI.setFrequency(4000000);
SPI.setDataMode(SPI_MODE0);
makeTestPattern();
}
void loop() {
scanFrame();
}