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:
commit
dbc1f0041f
21 files changed
+13853
No files matched your search
@@ -0,0 +1,5 @@
|
||||
[env:wemos_d1_mini32]
|
||||
platform = espressif32
|
||||
board = wemos_d1_mini32
|
||||
framework = arduino
|
||||
monitor_speed = 115200
|
||||
@@ -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();
|
||||
}
|
||||
Reference in new issue
Block a user