Workload Sim:
| Pod | Assigned Metric | Current Val | Range | Status | Stepper Angle |
|---|
Housing Envelope & Desk Clearance Analysis
The r/battlestations discussion debated between a tall triangular cluster vs. a low-profile 3-pod horizontal bar. Horizontal layout delivers full 3-gauge telemetry while fitting beneath monitors hovering only 3 to 4 inches off the desk.
188 mm
Enclosure Width
64 mm
Enclosure Height
52 mm
Enclosure Depth
52 mm
Dial Pod Bore Ø
15°
Ergonomic Up-Tilt
24.9 mm
Vertical Headroom
Dimensional Cross-Section Blueprint
Physical Maker Bill of Materials (BOM)
Standard off-the-shelf automotive instrument stepper motors and microcontroller components for reliable silent needle response.
| Item | Component | Qty | Specs / Function | Est. Unit Cost |
|---|---|---|---|---|
| Micro Steppers | Switec X27.168 / VID29-05 | 3 | Quad-pulse 1/3° step resolution, internal stop, silent automotive needle movement | $3.80 |
| Driver IC | AX1201728SG / A4988 Quad | 1 | 4-channel micro-stepper motor driver board with SPI or parallel pulse control | $4.50 |
| MCU Board | Arduino Pro Micro (ATmega32U4) | 1 | Native USB HID & high-speed Serial COM telemetry communication | $4.20 |
| Gauge Dials | Laser Cut Acrylic Faceplates (52mm) | 3 | UV printed matte black / carbon with translucent tick marks for backlighting | $2.00 |
| Backlight LEDs | WS2812B 2020 Addressable LEDs | 6 | Dual RGB LEDs per pod for dial face backlight & flashing redline warning | $0.40 |
| Enclosure | PETG / PLA 3D Printed Chassis | 1 | Low-profile 15° angled tilt housing designed for under-monitor placement | $3.50 |
Arduino Serial Telemetry Firmware (Switec X27 Driver)
// Desk Gauge Cluster Firmware v1.2
// Micro-stepper controller for Switec X27.168 / VID29
#include <SwitecX27.h>
// Configured for 3-Pod Cluster: 315 degrees of total sweep (945 microsteps)
SwitecX27 gauge1(945, 4, 5, 6, 7);
SwitecX27 gauge2(945, 8, 9, 10, 16);
SwitecX27 gauge3(945, 14, 15, A0, A1);
void setup() {
Serial.begin(115200);
// Zero homing routine against internal mechanical stop
gauge1.zero();
gauge2.zero();
gauge3.zero();
}
void loop() {
if (Serial.available()) {
String packet = Serial.readStringUntil('\n');
// Expected incoming frame: "G1:68,G2:74,G3:94"
int v1, v2, v3;
if (sscanf(packet.c_str(), "G1:%d,G2:%d,G3:%d", &v1, &v2, &v3) == 3) {
gauge1.setPosition(map(constrain(v1, 0, 100), 0, 100, 0, 945));
gauge2.setPosition(map(constrain(v2, 0, 100), 0, 100, 0, 945));
gauge3.setPosition(map(constrain(v3, 0, 100), 0, 100, 0, 945));
}
}
gauge1.update();
gauge2.update();
gauge3.update();
}