ESP32-S3 + Futaba / IBM 20x2 VFD Customer Display + MAX3232 + Mini 560 Pro + Button + Piezo Speaker
This project turns an IBM / Futaba POS customer VFD display into a standalone ESP32-S3 powered cyber-style terminal.
The default build matches the current wiring diagram and includes only:
- Futaba / IBM 20x2 VFD display
- ESP32-S3 Dev Board
- MAX3232 RS232 ↔ TTL module
- Mini 560 Pro DC/DC converter, 12V → 5V
- Momentary button
- Piezo speaker
- 12V DC input
Alternative firmware documentation:
docs/matrix.md— Cyber Matrix Quest firmwaredocs/bar.md— NALIVATOR-3000 / Russian Bar Edition firmware
Default firmware path:
This README documents only the default hardware build and the default firmware template.
.
├── README.md
├── examples
│ ├── default
│ │ └── default.ino
│ ├── matrix
│ │ └── matrix.ino
│ └── bar
│ └── bar.ino
├── docs
│ ├── matrix.md
│ └── bar.md
└── images
├── wiring-diagram.png
└── preview.gif
Known-good configuration:
MCU: ESP32-S3
Display: Futaba / IBM SurePOS 20x2 VFD
Display FRU: IBM FRU 41D0161 or compatible
Interface: RS232 through MAX3232
UART: 9600 8N1
Inversion: OFF
Power input: 12V DC
ESP32 power: 5V from Mini 560 Pro DC/DC converter
Button: GPIO5 to GND, INPUT_PULLUP
Piezo: GPIO6 to piezo speaker
| Component | Qty | Purpose |
|---|---|---|
| Futaba / IBM 20x2 VFD Customer Display | 1 | Main VFD display |
| ESP32-S3 Dev Board | 1 | Main controller |
| MAX3232 RS232 ↔ TTL module | 1 | ESP32 UART to RS232 level conversion |
| Mini 560 Pro DC/DC converter | 1 | 12V → 5V power conversion |
| 12V DC power supply | 1 | Main power input |
| Momentary push button | 1 | User input |
| Piezo speaker | 1 | Simple sound output |
| Wires / connectors | — | Wiring and soldering |
No RGB LED module, external audio amplifier, relay module, sensor module, SD module, or other extra components are part of the default build.
The 12V input is split into two branches:
12V Input + ──→ VFD +12V
12V Input - ──→ VFD GND
12V Input + ──→ Mini 560 Pro IN+
12V Input - ──→ Mini 560 Pro IN-
The Mini 560 Pro powers the ESP32-S3:
Mini 560 Pro OUT+ / 5V ──→ ESP32-S3 5V
Mini 560 Pro OUT- / GND ──→ ESP32-S3 GND
All grounds must be common:
12V Input GND
VFD GND
Mini 560 Pro IN-
Mini 560 Pro OUT-
ESP32-S3 GND
MAX3232 GND
Button GND
Piezo GND
The MAX3232 module is used between the ESP32-S3 UART pin and the RS232 input of the VFD.
This side goes to the VFD.
MAX3232 RS232 Output GND ──→ Common GND / VFD GND
MAX3232 RS232 Output ← ──→ VFD DATA
The other RS232-side pins are not used in the default wiring.
This side goes to the ESP32-S3.
MAX3232 TTL Input 3V3 ──→ ESP32-S3 3.3V
MAX3232 TTL Input GND ──→ ESP32-S3 GND
MAX3232 TTL Input ← ──→ ESP32-S3 GPIO4
The opposite TTL data pin is not used.
Important: do not enable UART inversion in firmware when using MAX3232.
VFD DATA ──→ MAX3232 RS232 data output
VFD GND ──→ Common GND
VFD +12V ──→ 12V Input +
UART settings:
Baud rate: 9600
Data bits: 8
Parity: None
Stop bits: 1
Mode: 8N1
Inversion: OFF
| ESP32-S3 Pin | Function |
|---|---|
| 5V | Power from Mini 560 Pro OUT+ |
| GND | Common ground |
| 3.3V | MAX3232 3V3 |
| GPIO4 | UART TX to MAX3232 |
| GPIO5 | Button signal |
| GPIO6 | Piezo speaker signal |
The button is wired between GPIO5 and GND.
ESP32-S3 GPIO5 ──→ Button signal contact
Button GND contact ──→ Common GND
The firmware uses the internal pull-up resistor:
pinMode(BUTTON_PIN, INPUT_PULLUP);Button logic:
Released → HIGH
Pressed → LOW
The default diagram uses a piezo speaker, not an 8Ω dynamic speaker.
ESP32-S3 GPIO6 ──→ Piezo +
Piezo - ──→ Common GND
A piezo speaker is suitable for simple beeps and 8-bit style tones from tone().
Do not replace the piezo with an 8Ω dynamic speaker directly on GPIO6. If using an 8Ω speaker, add a transistor driver or a small amplifier.
Default firmware path:
examples/default/default.ino
Controls:
| Action | Function |
|---|---|
| 1 click | Next visual mode |
| 2 clicks | Change brightness |
| 3 clicks | Sound ON/OFF |
| Hold | Display ON/OFF |
| Mode | Description |
|---|---|
| 0 | Home screen |
| 1 | Status / diagnostics |
| 2 | Matrix-like symbols + cyber melody |
| 3 | Wake-up style messages |
| 4 | Access Granted / Access Denied |
| 5 | Cyber scanner |
| 6 | Glitch terminal |
| 7 | Trace route / loading |
| 8 | Ticker mode |
The VFD supports four brightness levels:
0x20 — minimum
0x40 — medium
0x60 — high
0xFF — maximum
-
Install Arduino IDE.
-
Install the ESP32 board package.
-
Select your ESP32-S3 board.
-
Open:
examples/default/default.ino -
Verify pin constants:
VFD_TX_PIN = 4 BUTTON_PIN = 5 SPEAKER_PIN = 6
-
Upload the sketch.
A minimal platformio.ini example:
[env:esp32-s3-devkitc-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200Change the board name if your ESP32-S3 board uses a different definition.
Before powering the project:
- Verify 12V input polarity.
- Adjust Mini 560 Pro output to 5V before connecting the ESP32-S3.
- Verify MAX3232 is powered from ESP32-S3 3.3V.
- Verify all grounds are common.
- Verify VFD DATA goes through MAX3232.
- Verify GPIO4, GPIO5, and GPIO6 are not swapped.
- Verify the piezo speaker is connected to GPIO6 and GND.
Expected default startup screen:
VFD CYBER KIT
BTN:1/2/3/LONG
Then the default firmware switches to its home/demo mode.
Check:
- 12V input polarity
- 12V reaching the VFD +12V pin
- VFD GND connected to common GND
- input protection diode / fuse on the VFD board
- Mini 560 Pro does not replace direct 12V power for the VFD
Check:
- Mini 560 Pro IN+ and IN- receive 12V and GND
- Mini 560 Pro OUT+ is adjusted to 5V
- Mini 560 Pro OUT- is connected to ESP32-S3 GND
- ESP32-S3 5V pin receives 5V
Check:
- ESP32-S3 GPIO4 goes to the MAX3232 TTL data input
- MAX3232 RS232 data output goes to VFD DATA
- MAX3232 3V3 is connected to ESP32-S3 3.3V
- MAX3232 GND is connected to common GND
- UART is 9600 8N1
- UART inversion is OFF
Common causes:
- MAX3232 not used or wired incorrectly
- wrong MAX3232 side used
- UART inversion accidentally enabled
- missing common ground
- wrong baud rate
Check:
GPIO5 → button → GND
INPUT_PULLUP enabled in firmware
Check:
- GPIO6 is connected to piezo +
- piezo - is connected to GND
soundEnabledis true in firmware- the firmware uses
tone()onSPEAKER_PIN
The repository also includes optional firmware personalities:
examples/matrix/matrix.ino— Cyber Matrix Questexamples/bar/bar.ino— NALIVATOR-3000 / Russian Bar Edition
Documentation:
- Do not power ESP32-S3 directly from 12V.
- Do not connect the VFD RS232 data line directly to ESP32 GPIO.
- Do not enable UART inversion when MAX3232 is used.
- Always check Mini 560 Pro output voltage before connecting ESP32-S3.
- A piezo speaker can be used directly for simple tones. An 8Ω dynamic speaker requires a transistor driver or amplifier.
This project is based on practical reverse-engineering and testing of an IBM/Futaba 20x2 VFD customer display with ESP32-S3 and MAX3232.

