GRID — a lamp you sculpt
A lamp you sculpt by touch: sixteen motorized cylinders, one number each driving height, brightness and warmth. Running here as a full working sim while the hardware build is in progress.
- ROLE
- Design, simulation & hardware plan, solo
- YEAR
- 2026
- STACK
- Vanilla JS + Three.js sim · 28BYJ-48 steppers + tunable-white LEDs (planned)
- CONTEXT
- Personal project
GRID is a lamp: sixteen frosted cylinders in a 4×4 bed, each on its own lead screw with its own tunable-white LEDs. Hold a cylinder and it rises; hold it again quickly and it lowers. Each cylinder is one number: height, brightness and color temperature all come from it. Low cylinders glow like an 1800 K ember; the light only cools toward the slider ceiling as they rise.
There are static set-points (Full, Night, Off, plus anything you sculpt and save) and four motion patterns: wave, ripple, fireplace, noise. The motors are simulated too, 28BYJ-48 steppers with trapezoidal ramps, so everything on screen moves at the speed the real lamp would.
Both views below run off the same state. Change something in the app and the lamp follows. Works the other way too.
16 PTS · Ø50MM COLUMNS · 60MM PITCH · TRAVEL 60/110MM · 1800–6500K
- TAP a pad and its cylinder steps 10 mm · HOLD and it travels until you release
- RE-HOLD quickly to reverse and lower
- FULL / NIGHT / OFF are set-points · sculpt something and SAVE it as P1–P3
- MOTION runs patterns (the grid becomes read-only) · TEMP sets the white-point ceiling · RANGE clamps travel
- DRAG to orbit · SCROLL to zoom · DOUBLE-CLICK returns to the hero cam
- TAP / HOLD a cylinder in the scene for the same steps and jogs as the app
- HERO / TOP / LOW camera presets · AUTO-ORBIT spins the scene slowly
- 60 / 110 MM switches the build-plan travel · stroke time updates live
Why the controls work this way
Jog, not slider. Hold means keep moving; release means stop. And the app draws where each cylinder actually is, not where you told it to go: anything still traveling gets a pulsing rim. I did not want a screen showing a lamp that does not exist yet.
One number per cylinder. Height, brightness and color are locked together on purpose. Dim light is always warm; there is no way to build a low, cold scene, and I consider that a feature. Night mode caps the ceiling at 2700 K, and the cap eases in rather than snapping, the way firmware would fade it.
The motors set the rules. Range clamps travel for everything: set-points, patterns, your fingers. And the patterns run through the same motor model as manual holds, so a fireplace flicker can only ever move as fast as a lead screw turns.
Right now the lamp is a working simulation, on purpose. The sim is where the hardware decisions get made cheaply: jog feel, 60 versus 110 mm of travel, the shape of the warm-to-cool ramp, whether the patterns still read at real motor speed. All of it gets decided on screen before I commit to parts.
It started as an experiment in the lab on this site. Once the sim had two live views, one shared state and real motor physics, it had outgrown the lab, so it moved up here.
How loud are sixteen steppers in a quiet room? Does real frosted plastic scatter anything like the shader? How low can the LEDs dim before the ember falls apart? Those questions are waiting on hardware, and build photos land here as it comes together.
▸ NEXT · BUILD PHOTOS LAND IN grid_photo AS THE HARDWARE COMES TOGETHER