[{"data":1,"prerenderedAt":145},["ShallowReactive",2],{"blog-en-the-light-installation-i-never-finished":3},{"id":4,"title":5,"body":6,"cover":127,"date":128,"description":129,"draft":130,"extension":131,"locale":132,"meta":133,"navigation":134,"path":135,"seo":136,"stem":137,"tags":138,"__hash__":144},"blog\u002Fblog\u002Fen\u002Fthe-light-installation-i-never-finished.md","The light installation I never finished",{"type":7,"value":8,"toc":115},"minimark",[9,13,16,21,24,27,31,34,37,40,44,47,50,56,60,63,66,69,73,76,79,82,86,89,92,96,99,102,106,109,112],[10,11,12],"p",{},"There's a plastic crate in my storage room with ten pinspot fixtures, two aluminium mirror mounts, a tangle of motor wiring, and an ESP32 dev board still seated in a breadboard that hasn't been powered on in over a year. That crate is the closest thing I have to a graveyard. Most of what I build ships, eventually. This one didn't, and I've made enough peace with that to write it down properly.",[10,14,15],{},"The idea was simple to describe and brutal to execute: take ten PAR36 pinspots, point all of them at two mirrors mounted on motors, and let an ESP32 sweep those mirrors so the beams paint moving light across a room in time with music. A homemade lighting instrument. Not a product, not a client job, just the thing I wanted to exist and couldn't buy.",[17,18,20],"h2",{"id":19},"where-it-came-from","Where it came from",[10,22,23],{},"It started, like most of these, on a mood board. I'd been collecting footage of beam shows for months: tight white pencils of light cutting through haze, fanning open and snapping shut, the kind of thing you see at a proper club and never on a hobby budget. The commercial fixtures that do this — moving heads, beam movers — cost more than my car and weigh as much as a person. I didn't want to own one. I wanted to understand why they felt the way they felt, and the only way I know how to understand something is to try to build a worse version of it myself.",[10,25,26],{},"The insight I latched onto was that you don't need a moving light. You need a still light and a moving mirror. A motor turning a mirror can be smaller, cheaper, and faster than a motor turning a two-kilo fixture, because a mirror weighs almost nothing. Bounce a fixed beam off a tilting mirror and the beam moves at twice the mirror's angle, for free. That doubling felt like cheating, in the good way.",[17,28,30],{"id":29},"why-par36-pinspots","Why PAR36 pinspots",[10,32,33],{},"The PAR36 pinspot is an unfashionable little fixture and I love it for exactly that. It's a sealed-beam lamp, the 4515 type, six volts and thirty watts, with a reflector built into the glass that throws a beam only a few degrees wide. No lens to align, no optics to fuss over. You give it power and it produces a hard, narrow shaft of warm white light that looks fantastic in haze.",[10,35,36],{},"Ten of them was a deliberate number. One beam is a laser pointer. Ten beams, fanned at slightly different angles and all hitting the same pair of mirrors, become a moving comb of light, a fan that sweeps as one object. I bought them used, in pairs, off classifieds over a couple of months, until I had a matched set and a quiet electricity bill I didn't want to examine too closely.",[10,38,39],{},"The unglamorous truth about pinspots is that they're incandescent. They run hot, they're dimmed by varying the voltage rather than by any digital signal, and thirty watts each means three hundred watts of lamps before you've turned a single motor. That number comes back to bite me later. Hold onto it.",[17,41,43],{"id":42},"the-two-mirrors-and-the-geometry","The two mirrors and the geometry",[10,45,46],{},"The plan used two mirrors on purpose. One mirror gives you a single axis of movement — the beam sweeps along a line. To paint anywhere in a room you want two axes, the way a moving head pans and tilts. So: first mirror handles the horizontal sweep, second mirror catches that and adds the vertical. Pan and tilt, split across two surfaces, each driven by its own motor.",[10,48,49],{},"Getting the optical path right on paper was satisfying. Getting it right in aluminium was where the project started teaching me things I hadn't asked to learn. A mirror at forty-five degrees, glued to a bracket, glued to a motor shaft, is a tuning fork waiting for an excuse. The motor's own steps were the excuse. Every time it moved, the mirror rang, and the beam on the far wall didn't land on a point, it landed on a nervous little smear that buzzed.",[51,52,53],"blockquote",{},[10,54,55],{},"A beam can't lie. Every micrometre of slop in the mount becomes a visible wobble on a wall ten metres away, and the room is a merciless magnifying glass.",[17,57,59],{"id":58},"the-esp32-doing-the-thinking","The ESP32 doing the thinking",[10,61,62],{},"The brain was an ESP32, and that part I'd still defend today. It has two cores, which mapped cleanly onto the two halves of the problem. One core ran the motion: stepping the motors, smoothing the moves, holding the choreography. The other core listened.",[10,64,65],{},"I fed it audio from a small electret mic through the ADC, ran a windowed FFT, and pulled out a few bands — a kick-drum estimate from the low end, overall energy, a rough sense of the high frizz on top. That gave me numbers that moved with the music, and the motion core turned those numbers into angles. A kick would snap the fan to a new position. A long build would ramp the sweep speed until the drop, then throw it wide. None of it was clever signal processing. It was just enough to make the light feel like it was listening, which is the whole illusion you're selling.",[10,67,68],{},"FreeRTOS made the split easy: a high-priority task pinned to one core generated step pulses on a timer, and a lower-priority task on the other core did the audio and updated a shared set of target angles behind a mutex. When it worked, watching the serial plotter scroll a kick detection while the mirror snapped in sync was one of the better evenings I've had at a desk.",[17,70,72],{"id":71},"the-motors-and-the-war-with-backlash","The motors, and the war with backlash",[10,74,75],{},"I started with hobby servos because they're cheap and they take a simple signal. They were a mistake. Servos are built for \"go roughly here,\" not for the silky continuous sweep a beam needs, and the gear noise was audible across the room. Worse, they have a dead zone where small commands do nothing, so slow moves came out as a series of tiny lurches. A beam doing tiny lurches looks broken, not intentional.",[10,77,78],{},"So I moved to stepper motors with proper drivers. I tried A4988s first, then switched to TMC2209s for the quiet microstepping, because a stepper at full step buzzes like an angry insect and that buzz goes straight into the mirror. Microstepping smoothed the sound and the motion both. With sixteen microsteps and a careful acceleration ramp, I finally got a sweep that looked like a sweep instead of a stutter.",[10,80,81],{},"Then backlash showed up. Any play between the motor shaft and the mirror means that when the sweep reverses direction, the mirror hangs for a fraction of a degree before it follows. On the wall, that fraction of a degree is a visible hesitation every time the beam changes direction, which with audio-reactive movement is constantly. I fought it with stiffer couplings and by mounting the mirror as directly to the shaft as I could, and I got it down, but I never got it gone. The good fixtures solve this with precision gearboxes and absolute encoders. I was solving it with a hex key and stubbornness.",[17,83,85],{"id":84},"power-and-heat-the-part-nobody-mood-boards","Power and heat, the part nobody mood-boards",[10,87,88],{},"Remember the three hundred watts. The motors wanted their own clean supply, separate from anything touching the ESP32, because stepper drivers dump electrical noise back up the line and a noisy rail makes a microcontroller do interesting and unrepeatable things. The pinspots wanted six volts at serious current, through transformers that themselves got warm. And all of it generated heat in a wooden frame I'd built in an afternoon without thinking hard about ventilation.",[10,90,91],{},"The first time I ran the full rig for twenty minutes, the inside of the frame got hot enough that I stopped trusting it. Three hundred watts of incandescent lamps is, functionally, a small heater, and I'd boxed it in next to electronics and a couple of small motors that did not enjoy the warmth. The honest fix was a complete rethink of the enclosure: real airflow, the lamps thermally separated from the brains, fans, the works. That's a weekend of careful work, and it's the least fun weekend in any hardware project, the one where you're not adding magic, just keeping the magic from setting fire to itself.",[17,93,95],{"id":94},"the-night-it-half-worked","The night it half worked",[10,97,98],{},"For one evening, it worked. I had haze in the room, the lamps lit, both mirrors tracking, the FFT feeding the motion. I put on a track I knew well and watched ten beams fan across my ceiling and snap to the kick, and for about ninety seconds it was exactly the thing on the mood board. It was genuinely beautiful, and it was mine, down to the buzzing mounts and the backlash hesitation I could see if I looked for it.",[10,100,101],{},"Then a coupling worked loose, one mirror drifted out of alignment mid-sweep, and the fan split into two arguing halves. I tightened it, it held for a few minutes, it drifted again. That ninety seconds is the whole reason I don't regret the crate. I saw the finished thing, briefly, even if I never made it repeatable.",[17,103,105],{"id":104},"why-it-stalled","Why it stalled",[10,107,108],{},"No single thing killed it. It was the sum of three: the mechanical work to kill the wobble and backlash properly was real machining I wasn't equipped for, the thermal redesign was a chore I kept not starting, and paying client work arrived and quietly ate the evenings I'd have spent on it. Side projects don't usually die in a dramatic failure. They die in a slow reprioritisation you only notice in hindsight, when you realise the breadboard has had a year of dust on it.",[10,110,111],{},"I also think I learned the thing I actually wanted from it, which was why the expensive fixtures cost what they cost. You're not paying for the light. You're paying for the absence of wobble, the dead-still beam, the gearbox with no play and the enclosure that never overheats. The light is the easy part. Everything around the light is the product.",[10,113,114],{},"The crate is still there. The ESP32 still has the firmware on it. Some quiet winter, when the client work thins out and I get annoyed enough at that ninety-second memory, I'll machine the mounts properly, build a frame that breathes, and find out whether the second attempt holds for longer than a song. Until then it's my favourite failure, which is a category I've decided every builder should keep one of.",{"title":116,"searchDepth":117,"depth":117,"links":118},"",2,[119,120,121,122,123,124,125,126],{"id":19,"depth":117,"text":20},{"id":29,"depth":117,"text":30},{"id":42,"depth":117,"text":43},{"id":58,"depth":117,"text":59},{"id":71,"depth":117,"text":72},{"id":84,"depth":117,"text":85},{"id":94,"depth":117,"text":95},{"id":104,"depth":117,"text":105},null,"2026-06-22","A long, honest post-mortem of the project that beat me — two motor-driven mirrors meant to bounce ten PAR36 pinspots around a room, an ESP32 doing the thinking, and all the ways physics, heat and my own deadlines got in the way.",false,"md","en",{},true,"\u002Fblog\u002Fen\u002Fthe-light-installation-i-never-finished",{"title":5,"description":129},"blog\u002Fen\u002Fthe-light-installation-i-never-finished",[139,140,141,142,143],"Hardware","ESP32","Light","Side Projects","Post-mortem","myVz8uzglm6H4ICBz_TEUrn7-3tHgjbMzpLRBQeSd0E",1787633289366]