A conical (a.k.a. bullnose) center in the tailstock simplifies supporting cylindrical objects:

The spring-loaded tailstock bearing has a 5 mm bore. The bullnose rests against a small spacer on its 5 mm shaft to hold it away from the bearing’s mounting screws with some bearing spring compression. I turned the spacer from aluminum rod because lathe work is satisfying, but a printed spacer would work fine.
The bullnose is a cone with steps encouraging the cylinder to sit properly:

With both ends centered, the cylinder sits concentric with the chuck axis:

The chuck grabs the OD and the bullnose supports the ID, so removing crud from both ends is in order.
The bullnose won’t work for a solid rod, so a negative cone = cup center may come in handy:

Stipulated: A CO₂ laser will bounce right off a solid aluminum rod. Imagine I chucked up a wood dowel, OK?
A cup center is what remains afteryoinking a bullnose out of a cylinder:

Looks like I did exactly that:

Somewhat surprisingly, the two parts nest perfectly:

That’s without the shaft installed on the cup, so they won’t sit quite so neatly on the shelf.
Aligning the rotary axis along the laser’s X axis and setting the focus requires attention to detail, but a decent tailstock center makes that effort meaningful.
The OpenSCAD code as a GitHub Gist:
| // Ortur Rotary Conical centers | |
| // Ed Nisley – KE4ZNU | |
| // 2025-12-27 | |
| include <BOSL2/std.scad> | |
| Style = "Bullnose"; // [Build,Cone,Bullnose,Cup,Cone] | |
| MinDia = 10.0; | |
| MaxDia = 50.0; | |
| /* [Hidden] */ | |
| LayerThick = 0.2; // should match slicer thickness | |
| Ramp = 1.0; | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; | |
| NumSides = 8*3*4; | |
| $fn=NumSides; | |
| Gap = 5.0; | |
| WallThick = 2.0; | |
| TailBearing = [5.0,7.0,10.0]; // tailstock shaft, LENGTH = insert depth | |
| StepHeight = 2*LayerThick; | |
| NumSteps = (((MaxDia – MinDia)/2) / Ramp); | |
| ConeOAH = NumSteps * (Ramp + StepHeight); | |
| //—– | |
| // Bullnose shape | |
| module Bullnose() { | |
| difference() { | |
| union() | |
| for (i = [0:NumSteps – 1]) | |
| up(i*(Ramp + StepHeight)) hull() | |
| cyl(StepHeight + Protrusion,r=(MaxDia/2 – i*Ramp),anchor=BOTTOM) position(TOP) | |
| cyl(Ramp,r1=(MaxDia/2 – i*Ramp),r2=(MaxDia/2 – (i+1)*Ramp),anchor=BOTTOM); | |
| } | |
| } | |
| module Cone() { | |
| difference() { | |
| Bullnose(); | |
| down(Protrusion) | |
| cyl(TailBearing[LENGTH] + Protrusion,d=TailBearing[ID],circum=true,anchor=BOTTOM); | |
| } | |
| } | |
| module Cup() { | |
| difference() { | |
| cyl(ConeOAH + TailBearing[LENGTH],d=MaxDia + 2*WallThick,anchor=BOTTOM); | |
| up(ConeOAH + TailBearing[LENGTH] + Protrusion) | |
| yrot(180) | |
| Bullnose(); | |
| down(Protrusion) | |
| cyl(TailBearing[LENGTH] + 2*Protrusion,d=TailBearing[ID],circum=true,anchor=BOTTOM); | |
| } | |
| } | |
| //—– | |
| // Build things | |
| if (Style == "Bullnose") | |
| Bullnose(); | |
| if (Style == "Cone") | |
| Cone(); | |
| if (Style == "Cup") | |
| Cup(); | |
| if (Style == "Build") { | |
| right(MaxDia/2 + Gap) | |
| Cone(); | |
| left(MaxDia/2 + WallThick + Gap) | |
| Cup(); | |
| } |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.