OpenSCAD → headless slicer → gcode that gets interrogated before it prints → white PLA → filament pins → my face

Swedish autumn is coming, and with it the usual deal: you wake up in the dark, you work through the dim hours, and somewhere in November your brain quietly files for divorce. The standard fix is a 10 000-lux lamp you sit in front of for half an hour every morning — which works, but chains you to a chair. The commercial alternative is the Luminette, a clever light visor you wear like glasses. I wanted the visor, but I wanted to build it: my geometry, my spectrum experiments, my repair path. So: Circadius, a 3D-printed morning-light visor you can make breakfast in.

Den svenska hösten är på väg, och med den det vanliga upplägget: du vaknar i mörker, jobbar genom skymningstimmarna, och någonstans i november lämnar hjärnan tyst in skilsmässopapperen. Standardlösningen är en 10 000 lux-lampa man sitter framför en halvtimme varje morgon — funkar, men kedjar fast en vid en stol. Det kommersiella alternativet är Luminette, ett fiffigt ljusvisir man bär som glasögon. Jag ville ha visiret, men jag ville bygga det: min geometri, mina spektrum-experiment, min väg att laga det. Alltså: Circadius, ett 3D-printat morgonljusvisir man kan laga frukost i.

Karl wearing the first Circadius prototype: a white 3D-printed visor across the forehead, glowing softly, held together with blue filament pins
First light. White PLA, a COB LED strip, and those blue dots are 1.75 mm filament offcuts doing the job of screws. The t-shirt was not staged.
Första ljuset. Vit PLA, en COB-ledremsa, och de blå prickarna är 1,75 mm filamentbitar som gör skruvarnas jobb. T-shirten var inte arrangerad.

The optics trick: LEDs you cannot see

Optiktricket: lysdioder du inte kan se

Rule number one for anything that shines near your eyes: you should never see the emitter itself. A bare COB strip is a line of tiny suns; what you want is a big, soft, boring glow. My first sketch had the strip on a horizontal shelf shining down through a diffuser — until physics pointed out that a COB strip only bends flatwise. You cannot curve it edgewise around a forehead. That single constraint redesigned the whole thing, for the better.

Regel nummer ett för allt som lyser nära ögonen: du ska aldrig se själva ljuskällan. En naken COB-remsa är en rad små solar; det man vill ha är ett stort, mjukt, tråkigt sken. Min första skiss hade remsan på en vågrät hylla som lyste nedåt genom en diffusor — tills fysiken påpekade att en COB-remsa bara böjer sig på flatsidan. Den går inte att kröka på högkant runt en panna. Den enda begränsningen ritade om hela konstruktionen, till det bättre.

So the strip sits on a curved vertical wall above the brow, facing away from you. From any eye position you are behind its emitting plane — the LEDs are invisible not because of a well-placed baffle but because of geometry itself. The light fires forward into an angled white blade, bounces diffusely, and comes back down to the eyes as a broad 170 × 20 mm glowing surface sitting just above your sight line. Full central vision stays free. That's the entire point: coffee, dishes, getting dressed — while the photons do their circadian paperwork.

Så remsan sitter på en krökt lodrät vägg ovanför ögonbrynen, riktad bort från dig. Från varje ögonposition befinner du dig bakom dess emissionsplan — dioderna är osynliga inte tack vare en välplacerad skärm utan tack vare geometrin själv. Ljuset skjuter framåt mot ett vinklat vitt blad, studsar diffust och kommer ner till ögonen som en bred lysande yta på 170 × 20 mm strax ovanför synlinjen. Hela det centrala synfältet är fritt. Det är hela poängen: kaffe, disk, påklädning — medan fotonerna sköter sitt cirkadiska pappersarbete.

Cutaway render of the Circadius visor showing the LED strip on its vertical fascia, the angled reflector blade, and the eye reference position
Cutaway: strip on the vertical fascia (pale), 45° roof closing the top, cone-section blade redirecting the light down toward the eye reference (sphere). Nothing between the blade's lower edge and the world.
Genomskärning: remsan på den lodräta fascian (ljus), 45°-taket som stänger uppåt, konsektionsbladet som riktar ljuset ner mot ögonreferensen (sfären). Ingenting mellan bladets underkant och världen.

The blade taught me something too. Version one hinged it for adjustability — and the collision check caught that rotating an arc-shaped blade about its chord lifts the arc's ends about half a millimetre per degree straight into the housing, while the local tilt varies along the arc. A hinged arc is geometrically wrong, not just fiddly. The fix: bake the angle into the print as a cone section — same tilt everywhere — and make the blade swappable instead. Three blades, 10°/20°/30°, about 25 minutes each. Changing the optics means pulling three pins.

Bladet lärde mig också något. Version ett hade gångjärn för justerbarhet — och kollisionskollen fångade att när man roterar ett bågformat blad kring sin korda lyfter bågens ändar ungefär en halv millimeter per grad rakt in i höljet, samtidigt som den lokala lutningen varierar längs bågen. Ett gångjärnsblad är geometriskt fel, inte bara pilligt. Lösningen: baka in vinkeln i printen som en konsektion — samma lutning överallt — och gör bladet utbytbart i stället. Tre blad, 10°/20°/30°, cirka 25 minuter styck. Att ändra optiken betyder att dra tre pinnar.

Front render of the Circadius visor with the engraved circadius wordmark
The wordmark is Fraunces, engraved letter by letter around the visor slope with real kerning — advances measured once, then baked into the OpenSCAD.
Ordmärket är Fraunces, graverat bokstav för bokstav runt visirslänten med riktig kerning — teckenbredderna mätta en gång, sedan inbakade i OpenSCAD-koden.
Three-quarter render of the full Circadius assembly: headband, visor carrier and reflector blade
The whole machine: headband, carrier with the 45° roof, blade. Every part prints flat or on edge, no supports anywhere.
Hela maskinen: pannband, bärare med 45°-tak, blad. Varje del printas platt eller på högkant, helt utan stödmaterial.

Zero screws

Noll skruvar

There is not a single piece of purchased hardware in this build. Every joint — height adjustment, blade mount, the lux-measurement jig — runs on short offcuts of 1.75 mm filament pushed through matched holes and mushroomed with a soldering iron. Height adjusts in 4 mm steps across five hole rows; the settings are numbered, so every configuration is reproducible. This is a house style by now: printers make terrible bolts but excellent holes, and the spool is already sitting right there.

Det finns inte en enda köpt fästdetalj i det här bygget. Varje förband — höjdjusteringen, bladfästet, mätjiggen — går på korta bitar 1,75 mm filament genom matchade hål, svampade med lödkolv. Höjden justeras i 4 mm-steg över fem hålrader; lägena är numrerade, så varje konfiguration går att återskapa. Det här är husstil vid det här laget: skrivare gör usla skruvar men utmärkta hål, och rullen ligger ju redan där.

Matched holes, though, need matched sizes, and printed holes shrink — badly at small diameters, and differently per material. The hole model I use adds 0.199 + 0.707/d to every drawn diameter, calibrated on this printer in PETG. First PLA print: too loose. So the test coupon grew a pin ladder — five holes from 2.35 to 2.95 mm, a dot marking the small end. Push filament into each, pick the snug one, feed the number back into the model. Ten minutes of printing beats an evening of guessing.

Men matchade hål kräver matchade mått, och printade hål krymper — illa vid små diametrar, och olika per material. Hålmodellen jag använder lägger 0,199 + 0,707/d på varje ritad diameter, kalibrerad på den här skrivaren i PETG. Första PLA-printen: för löst. Så provkupongen fick en pinnstege — fem hål från 2,35 till 2,95 mm, en prick som markerar den lilla änden. Tryck i filament i varje, välj det som sitter snyggt, mata tillbaka siffran i modellen. Tio minuters print slår en kvälls gissande.

What broke, and what it taught the pipeline

Vad som gick sönder, och vad det lärde kedjan

Two prints spaghettied before anything worked. Both times the cause was the same and it wasn't the printer's fault: my test coupons were thin 28 mm slices of tall parts — a 2.4 mm wall standing on a short foot, with a 45° roof cantilevering sideways. The full parts are wide, stable arcs; the coupons were tipping hazards I had designed myself. The gate now prints truncated, footed, untippable coupons, and the tall parts get 0.6 mm peel-off flanges. A third failure — a part knocked loose halfway through a three-part plate — converted me to one-part plates for anything precious.

Två printar blev spagetti innan något funkade. Båda gångerna var orsaken densamma och det var inte skrivarens fel: mina provkuponger var tunna 28 mm-skivor av höga delar — en 2,4 mm-vägg på en kort fot, med ett 45°-tak som kragade ut åt sidan. De fullstora delarna är breda, stabila bågar; kupongerna var vältrisker jag själv ritat. Gaten printar nu kapade, fotade, ovältbara kuponger, och de höga delarna får 0,6 mm fotflänsar som rivs av. Ett tredje haveri — en del knuffades loss halvvägs genom en platta med tre delar — omvände mig till en-dels-plattor för allt dyrbart.

The deeper lesson is about verification. Everything here slices headless, and every gcode gets interrogated before it may print: are the emitted temperatures right, is there an actual brim extrusion (not just a brim setting — those lie), does the bed cool down at the end, is the part where it's supposed to be on the plate? Each check exists because its absence once cost a real print. A slicer's settings echo is a claim; the gcode is the truth.

Den djupare lärdomen handlar om verifiering. Allt här slicas headless, och varje gcode förhörs innan den får printas: är de emitterade temperaturerna rätt, finns det en faktisk brim-extrudering (inte bara en brim-inställning — sådana ljuger), svalnar bädden på slutet, ligger delen där den ska på plattan? Varje kontroll finns för att dess frånvaro någon gång kostat en riktig print. En slicers inställnings-eko är ett påstående; gcoden är sanningen.

Test before you cut

Testa innan du klipper

The LED channel is open at both ends on purpose: you thread the uncut two-metre strip through, park the tail on the head strap, light it up, measure — and only then commit scissors to copper. The measurement side is its own little tool: a jig that hooks inside the headband and holds a shelf at exactly the eye position, sized so a phone lying on it puts its ambient-light sensor in the eye plane. Grooves run past the phone's edges so you can align the sensor over the reference point. Blade angle × height × brightness, logged as lux per combination, every setting a numbered pin position. Aim: roughly 800–1000 lux at the eye, sessions around half an hour.

Ledkanalen är öppen i båda ändar med flit: man trär den oklippta tvåmetersremsan igenom, parkerar svansen på huvudremmen, tänder, mäter — och först därefter får saxen möta kopparn. Mätsidan är ett eget litet verktyg: en jigg som hakar i pannbandet och håller en hylla exakt vid ögonpositionen, dimensionerad så att en mobil som ligger på den får sin ljussensor i ögonplanet. Spår löper förbi mobilens kanter så att sensorn kan riktas in över referenspunkten. Bladvinkel × höjd × ljusstyrka, loggat som lux per kombination, varje läge en numrerad pinnposition. Mål: ungefär 800–1000 lux vid ögat, sessioner runt en halvtimme.

The prototype's job is not to be pretty. It's to make every optical variable adjustable until the numbers say freeze.
Prototypens jobb är inte att vara vacker. Det är att göra varje optisk variabel justerbar tills siffrorna säger frys.

Next

Nästa steg

  • Cable-free: a rear battery pod — USB-C powerbank board plus a LiPo cell, doubling as the counterweight the front-heavy visor wants anyway. Total electronics budget: about 75 kr.
  • Kabelfritt: en batteripodd bak — USB-C-powerbankkort plus en LiPo-cell, som samtidigt blir den motvikt det framtunga visiret ändå vill ha. Total elektronikbudget: cirka 75 kr.
  • Comfort in transparent TPU: printed serpentine head strap and a soft forehead pad, already sliced.
  • Komfort i transparent TPU: printad serpentinrem och en mjuk pannkudde, redan slicade.
  • A real dimmer: an ATtiny85 from the drawer plus one MOSFET — flicker-free PWM, brightness steps, soft ramp-up and a 30-minute auto-off, all in a ten-krona chip.
  • En riktig dimmer: en ATtiny85 ur lådan plus en MOSFET — flimmerfri PWM, ljusnivåer, mjuk uppramp och 30-minuters auto-av, allt i en tiokronorskrets.
  • V2: once the lux sweep freezes the geometry — merge the shell, hide the pins, keep the swappable blade.
  • V2: när lux-svepet fryst geometrin — slå ihop skalet, göm pinnarna, behåll det utbytbara bladet.
Honest status. This is a one-evening-old prototype and an n=1 experiment on my own face — not a medical device, not medical advice. Bright-light therapy has real contraindications; if that's relevant to you, talk to someone with a licence rather than a 3D printer. The lux numbers here are targets, not yet measurements. Ärlig status. Det här är en prototyp som är en kväll gammal och ett n=1-experiment på mitt eget ansikte — ingen medicinteknisk produkt, inga medicinska råd. Ljusterapi har verkliga kontraindikationer; om det är relevant för dig, prata med någon med legitimation snarare än med en 3D-skrivare. Luxtalen här är mål, inte mätvärden än.

Everything is parametric OpenSCAD — head radius, eye spacing, blade angle, strip length, hole compensation — so when your forehead disagrees with mine, you change a number, not a design. Files land in the public repo once V2 stabilises. Meanwhile: the sun rises just before six now, and each day is five minutes shorter than the last. Tick tock.

Allt är parametrisk OpenSCAD — huvudradie, ögonavstånd, bladvinkel, remslängd, hålkompensering — så när din panna inte håller med min ändrar du en siffra, inte en design. Filerna hamnar i det publika repot när V2 stabiliserat sig. Under tiden: solen går upp strax före sex nu, och varje dag är fem minuter kortare än den förra. Tick tack.