If anyone wants to print a weighted Tempest repro knob, here is some WIP OpenSCAD code for two test prints and a knob.
Flange Shaft Collar -
https://www.amazon.com/dp/B07Q39WZ5K (these are the good ones for a 5 weight setup -- see below)
M3-0.5 x 10mm set screw -
https://www.amazon.com/dp/B0DDPPSZM9?th=1 Tungsten weights -
https://www.amazon.com/dp/B0838Y7CQZThe linked set of weights will work for a knob with either 4 or 5 of the 1/2 ounce (0.44" high) weights.
- The current variable settings are for a 4 weight setup (3 of the 0.44" weights and 2 of the 0.22") with the weights held in by a flange shaft collar.
- It's a tight fit, but you can use a 5 weight setup if your flange shaft collar set screw is not several degrees off-square like some other ones were.

Change WeightNbr (line 79) to 5 and change FlangeShaftCollarSetscrewAngle (line 70) to 180.
An un-weighted knob weighs about 10g.
A knob with 4 weights (2 oz) weighs about 75g.
A knob with 5 weights (2.5 oz) weighs about 88g.
The prints came out fine on one printer, but the knob failed with my older printer.
- If this happens to you, you may need to add 0.8 or 1.6 to variable MainGripDia (line 29) so there is enough room for 1 or 2 more extruder passes between the weight chambers and the side if the knob.
- The weights can rattle just a bit, but some paper shims or a drop of hot glue should fix that.
To assemble the knob:
1. Fully thread the 10mm M3 setscrew into the flange shaft collar until it touches the other side.
2. Insert the weights into the knob.
3. Align the setscrew with the setscrew notch/hole and insert the flange collar into the knob.
4. Insert an allen wrench through the setscrew hole and turn the setscrew CCW to cut threads into the plastic until the setscrew is far enough out to clear the spinner shaft.
5. Check for rattle and fix as desired.
Flange shaft collar test print - print as oriented to test supports.
// Test - Flange Shaft Collar - Tempest knob.
// - Use this model to test variable values for customizing the Tempest Knob model.
// - When confirmed good, copy these variable values to lines 45 and 65 - 72 of the Tempest Knob model.
// NOTE: Inner diameter values may need to be *very slightly* larger to account for the 180-sided polygon used to render circles -- see "undersized holes" at https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#cylinder
/////////////////////////////
// Define the variables
/////////////////////////////
SpinnerShaftDia = 6.6; // Spinner shaft diameter
FlangeDiameter = 22.5; // Flange outer diameter
FlangeHeight = 2.1; // Flange height
FlangeShaftCollarOuterDia = 10.4; // Flange shaft collar outer diameter
FlangeShaftCollarHeight = 12.1; // Flange shaft collar total height
FlangeShaftCollarVertOffset = 8.0; // Vertical distance from the bottom of the knob to center of setscrew in flange shaft collar
FlangeShaftCollarSetscrewAngle = 180;// Setscrew angle for this option
FlangeShaftCollarSetscrewDia = 3.2; // Shaft collar setscrew diameter
FlangeShaftCollarSetscrewNotchDepth = 2.2;// Shaft collar setscrew notch depth
// Number of fragments (polygon sides) used to render a full circle.
$fn = 180; // Default = 180 Typical range = 6 - 360
// 6 will render a circular hole as a hexagon, 8 will render a circular hole as an octagon.
// Lower the number for faster rendering, raise the number for smoother rendering.
/////////////////////////////
// Make the part
/////////////////////////////
difference(){ // Test cylinder minus flange shaft collar holes and spinner shaft hole
translate([0, 0, 0.5 + FlangeShaftCollarHeight/2])
cylinder(FlangeShaftCollarHeight + 1, d=FlangeDiameter + 4, center=true); // Test cylinder
color("blue")
translate([0, 0, FlangeHeight/2])
cylinder(FlangeHeight + 0.01, d=FlangeDiameter, center=true); // Flange shaft collar base
color("purple")
translate([0, 0, FlangeShaftCollarHeight/2])
cylinder(FlangeShaftCollarHeight + 0.01, d=FlangeShaftCollarOuterDia, center=true); // Flange shaft collar body
color("red")
rotate([0,0,FlangeShaftCollarSetscrewAngle])
translate([0, 1 + FlangeDiameter/2, FlangeShaftCollarVertOffset])
rotate([-90,0,0])
cylinder(2 + FlangeDiameter, d=FlangeShaftCollarSetscrewDia, center=true);// Setscrew hole
color("white")
rotate([0,0,FlangeShaftCollarSetscrewAngle])
translate([0, FlangeShaftCollarOuterDia/2, FlangeShaftCollarHeight/2])
cube ([FlangeShaftCollarSetscrewDia + 0.4, FlangeShaftCollarSetscrewNotchDepth * 2, FlangeShaftCollarHeight], center=true);// Setscrew notch
// Spinner shaft
translate([0, 0, 1 + FlangeShaftCollarHeight/2])
cylinder(FlangeShaftCollarHeight + 2.01, d=SpinnerShaftDia, center=true); // Spinner shaft hole
} // End test cylinder minus flange shaft collar holes and spinner shaft hole
//
Test print for weights
// Test - Weights - Tempest knob.
// - Use this model to test variable values for weights the Tempest Knob model.
// - When confirmed good, copy these variable values to lines 79 and 80 of the Tempest Knob model.
// - If you plan on using the "embedded weights" option for your knob, add several print layer thicknesses to WeightHeight so you have some vertical wiggle room between the weights and the print nozzle when using a "pause at Z" plugin.
// NOTE: Inner diameter values may need to be *very slightly* larger to account for the 180-sided polygon used to render circles -- see "undersized holes" at https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#cylinder
/////////////////////////////
// Define the variables
/////////////////////////////
WeightHeight = 12.4; // Height of weights
WeightDia = 10.3; // Diameter of weights
// Number of fragments (polygon sides) used to render a full circle.
$fn = 180; // Default = 180 Typical range = 6 - 360
// 6 will render a circular hole as a hexagon, 8 will render a circular hole as an octagon.
// Lower the number for faster rendering, raise the number for smoother rendering.
/////////////////////////////
// Make the part
/////////////////////////////
difference(){ // Test cylinder minus weight hole
translate([0, 0, 0.6 + WeightHeight/2])
cylinder(WeightHeight + 1.2, d=WeightDia + 4, center=true); // Test cylinder
translate([0, 0, 1.2 + WeightHeight/2])
cylinder(WeightHeight + 0.01, d=WeightDia, center=true); // Weight hole
} // End test cylinder minus weight hole
//
Tempest knob (FlangeShaftCollar and FlangeShaftCollarWeight options enabled) - print with supports touching build plate
// Tempest knob. (customizable)
/*
This model is parametric so you can adjust variables to customize the knob -- almost no programming skills needed.
You can enable/disable these five options by setting these variables to "1" (enabled) or "0" (disabled)
1. SetScrewOnly (line 50) - Use for a simple knob with a setscrew **or** use with the Weight option and a "Pause at Z" slicer plugin to insert weights while the print is paused. Ensure SetScrewOnlyAngle variable is set to avoid the weights.
2. ShaftCollar (line 56) - Use for a knob with a shaft collar and setscrew. The shaft collar allows you to apply more tension to the setscrew without stripping out the plastic hole. To keep the knob and shaft collar together, use a 3/8" or 5/16" long setscrew that engages the knob without sticking out.
3. FlangeShaftCollar (line 64) - Use with or without option #4. Print with supports. Ensure FlangeShaftCollarSetscrewAngle variable is set to avoid the weights.
4. FlangeShaftCollarWeight (line 76) - Use 2-5 round 3/8" x 0.44" tungsten pinewood derby weights to increase the mass of the knob. Use with option FlangeShaftCollar to bottom load the weights after printing. Print with supports. Ensure FlangeShaftCollarSetscrewAngle variable is set to avoid the weights.
5. EmbeddedWeight (line 77) - Use 2-5 round 3/8" x 0.44" tungsten pinewood derby weights to increase the mass of the knob. Use with option SetScrewOnly and a "Pause at Z" slicer plugin to insert weights while the print is paused. There isn't enough room in a standard size Tempest knob for weights with the ShaftCollar option.
NOTE: Inner diameter values may need to be *very slightly* larger to account for the 180-sided polygon used to render circles -- see "undersized holes" at https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#cylinder
*/
/////////////////////////////
// Define the variables
/////////////////////////////
TopBevelDia = 30.6; // Top bevel diameter
TopBevelHeight = 1.4; // Top bevel height
MainGripDia = 32.0; // Main grip diameter
MainGripHeight = 13.7; // Main grip height
UpperSkirtDia = 43.8; // Upper skirt bottom diameter
UpperSkirtHeight = 2.8; // Upper skirt height
LowerSkirtDia = 44.6; // Lower skirt bottom diameter
LowerSkirtHeight = 0.8; // Lower skirt height
TopIndentDia = 28; // Top indent diameter
TopIndentDepth = 1.25; // Top indent depth
GrooveNbr = 40; // Number of grip grooves
GrooveDia = 1.5; // Grip groove diameter
GrooveOffset = 0.65; // Grip groove offset distance from outer edge of knob
SpinnerShaftDia = 6.6; // Spinner shaft diameter
SpinnerShaftLength = 15; // Spinner shaft length
//////// Setscrew only option variables ////////
SetScrewOnly = 0; // If set to 1, the OnlySetscrew module will make the necessary hole for just the setscrew. If set to 0, it will not make that hole.
SetScrewOnlyAngle = 180; // Setscrew angle for this option
SetScrewOnlyDia = 4; //** Setscrew diameter for this option
//////// Shaft collar option variables ////////
ShaftCollar = 0; // If set to 1, the shaft collar module will make the necessary holes to use a shaft collar. If set to 0, it will not make those holes.
ShaftCollarOuterDia = 12.9; // Shaft collar outer diameter
ShaftCollarHeight = 8; // Shaft collar height
ShaftCollarSetscrewDia = 4; //** Shaft collar setscrew diameter
ShaftCollarVertOffset = 8; // Vertical distance from the bottom of the knob to center of setscrew in shaft collar
////// Flange shaft collar option variables //////
FlangeShaftCollar = 1; // If set to 1, the flange shaft collar module will make the necessary holes to use a flange shaft collar. If set to 0, it will not make those holes.
FlangeDiameter = 22.5; // Flange outer diameter
FlangeHeight = 2.1; // Flange height
FlangeShaftCollarOuterDia = 10.4; // Flange shaft collar outer diameter
FlangeShaftCollarHeight = 12.1; // Flange shaft collar total height
FlangeShaftCollarVertOffset = 8.0; // Vertical distance from the bottom of the knob to center of setscrew in flange shaft collar
FlangeShaftCollarSetscrewAngle = 45; // Setscrew angle for this option
FlangeShaftCollarSetscrewDia = 3.2; // Shaft collar setscrew diameter
FlangeShaftCollarSetscrewNotchDepth = 2.2;// Shaft collar setscrew notch depth
FlangeShaftCollarSetscrewNotchWidth = 3.3;// Shaft collar setscrew notch depth
////// Weight option variables //////
FlangeShaftCollarWeight = 1;// If set to 1, the FlangeShaftCollarWeights module will make the necessary holes to use weights with a flange shaft collar. If set to 0, it will not make those holes.
EmbeddedWeight = 0; // If set to 1, the EmbeddedWeights module will make the necessary holes for embedded weights. If set to 0, it will not make those holes.
WeightNbr = 4; // Number of weights
WeightHeight = 11.9; // Height of weights
WeightDia = 10.3; // Diameter of weights
WeightHOffset = 10.00; // Weight horizontal offset distance from center of spinner
WeightVOffset = 7; // Weight vertical offset distance from bottom of spinner
// Number of fragments (polygon sides) used to render a full circle.
$fn = 180; // Default = 180 Typical range = 6 - 360
// 6 will render a circular hole as a hexagon, 8 will render a circular hole as an octagon.
// Lower the number for faster rendering, raise the number for smoother rendering.
/////////////////////////////
// Define the modules
/////////////////////////////
module OnlySetscrew(){
rotate([0,0,SetScrewOnlyAngle])
translate([0, MainGripDia/2, LowerSkirtHeight + UpperSkirtHeight + MainGripHeight/2])
rotate([-90,0,0])
cylinder(MainGripDia, d=SetScrewOnlyDia, center=true);
} // End OnlySetscrew module
//
module ShaftCollars(){
translate([0, 0, (ShaftCollarVertOffset +ShaftCollarHeight/2)/2])
cylinder(ShaftCollarVertOffset + ShaftCollarHeight/2 + 0.01, d=ShaftCollarOuterDia, center=true); // Shaft collar hole
translate([0, MainGripDia/2, ShaftCollarVertOffset])
rotate([-90,0,0])
cylinder(MainGripDia, d=ShaftCollarSetscrewDia, center=true);// Setscrew hole
translate([0, ShaftCollarOuterDia/2, (ShaftCollarVertOffset + ShaftCollarHeight/2)/2])
cube ([ShaftCollarSetscrewDia + 0.4, 1, ShaftCollarVertOffset + ShaftCollarHeight/2 + 0.01], center=true);// Setscrew notch
} // End ShaftCollars module
//
module FlangeShaftCollars(){
color("blue")
translate([0, 0, FlangeHeight/2])
cylinder(FlangeHeight + 0.01, d=FlangeDiameter, center=true); // Flange shaft collar base
color("purple")
translate([0, 0, FlangeShaftCollarHeight/2])
cylinder(FlangeShaftCollarHeight + 0.01, d=FlangeShaftCollarOuterDia, center=true); // Flange shaft collar body
color("red")
rotate([0,0,FlangeShaftCollarSetscrewAngle])
translate([0, MainGripDia/2, FlangeShaftCollarVertOffset])
rotate([-90,0,0])
cylinder(MainGripDia, d=FlangeShaftCollarSetscrewDia, center=true);// Setscrew hole
color("white")
rotate([0,0,FlangeShaftCollarSetscrewAngle])
translate([0, FlangeShaftCollarOuterDia/2, FlangeShaftCollarHeight/2])
cube ([FlangeShaftCollarSetscrewNotchWidth, FlangeShaftCollarSetscrewNotchDepth * 2, FlangeShaftCollarHeight], center=true);// Setscrew notch
} // End FlangeShaftCollars module
//
module FlangeShaftCollarWeights(){ // Weight holes for bottom-loading 3/8" tungsten weights with a flange shaft collar
for(Y = [0:WeightNbr]){ // Weight loop
rotate([0, 0, Y*(360/WeightNbr)])
translate([0, WeightHOffset, (FlangeHeight + WeightHeight)/2])
cylinder(FlangeHeight + WeightHeight + 0.1, d=WeightDia, center=true); // Weight hole
} // End weight loop
//
// End weight holes
} // End EmbeddedWeights module
//
module EmbeddedWeights(){ // Weight holes for embedded 3/8" tungsten weights
for(Y = [0:WeightNbr]){ // Weight loop
rotate([0, 0, Y*(360/WeightNbr)])
translate([0, WeightHOffset, WeightVOffset])
cylinder(WeightHeight, d=WeightDia, center=true); // Weight hole
} // End weight loop
//
// End weight holes
} // End EmbeddedWeights module
//
/////////////////////////////
// Make the part
/////////////////////////////
difference(){ // Knob body minus top indent, grip grooves, spinner shaft, set screw hole, weight holes and shaft collar holes
union(){ // Knob body
translate([0, 0, LowerSkirtHeight + UpperSkirtHeight + MainGripHeight + TopBevelHeight/2])
cylinder(TopBevelHeight, d1=MainGripDia, d2=TopBevelDia, center=true); // Top bevel
translate([0, 0, LowerSkirtHeight + UpperSkirtHeight + MainGripHeight/2])
cylinder(MainGripHeight, d=MainGripDia, center=true); // Main grip
translate([0, 0, LowerSkirtHeight + UpperSkirtHeight/2])
cylinder(UpperSkirtHeight, d1=UpperSkirtDia, d2=MainGripDia, center=true); // Upper skirt
translate([0, 0, LowerSkirtHeight/2])
cylinder(LowerSkirtHeight, d1=LowerSkirtDia, d2=UpperSkirtDia, center=true); // Lower skirt
}// End knob body
//
// Top indent
translate([0, 0, LowerSkirtHeight + UpperSkirtHeight + MainGripHeight + TopBevelHeight - TopIndentDepth/2])
cylinder(TopIndentDepth + 0.01, d=TopIndentDia, , center=true);
// Grip grooves
for(X = [0:GrooveNbr]){ // Grip grooves loop
rotate([0, 0, X*(360/GrooveNbr)])
translate([0, MainGripDia/2 + GrooveOffset, LowerSkirtHeight + UpperSkirtHeight + MainGripHeight/2])
cylinder(MainGripHeight, d=GrooveDia, center=true); // Grip groove
} // End grip grooves loop
//
// Spinner shaft
translate([0, 0, SpinnerShaftLength/2])
cylinder(SpinnerShaftLength + 0.01, d=SpinnerShaftDia, center=true); // Spinner shaft hole
translate([0, 0, 0.5])
cylinder(1 + 0.01, d1=SpinnerShaftDia + 2, d2=SpinnerShaftDia, center=true); // Spinner shaft flare at base for easier insertion
// Only setscrew option
if (SetScrewOnly == 1){ // Make setscrew hole if SetScrewOnly variable value = 1
OnlySetscrew(); // OnlySetScrew module call
} //
//
// Shaft collar option
if (ShaftCollar == 1){ // Make ShaftCollar holes if ShaftCollar variable value = 1
ShaftCollars(); // Shaft collar module call
} //
//
// Flange shaft collar option
if (FlangeShaftCollar == 1){ // Make flange shaft collar holes if ShaftCollar variable value = 1
FlangeShaftCollars(); // Flange shaft collar module call
} //
//
// FlangeShaftCollarWeights option
if (FlangeShaftCollarWeight == 1){ // Make weight holes if Weight variable value = 1
FlangeShaftCollarWeights(); // FlangeShaftCollarWeights module call
} //
//
// EmbeddedWeights option
if (EmbeddedWeight == 1){ // Make weight holes if Weight variable value = 1
EmbeddedWeights(); // EmbeddedWeights module call
} //
//
} // End knob body minus top indent, grip grooves, set screw hole, weight holes and shaft collar holes
//
Scott
EDIT: Added a .zip file containing the three .scad files and an .stl file.