Now I'm going to put some bolt detail on the Nike aft shroud. There's a ring of six bolts at the forward edge of the shroud, and a bolt next to each fin mounting post. Fortunately, I've got a very good picture of these bolts:
The first thing I'm going to do is take the booster shroud dimensions from the
Nike-Ajax fin shroud.scad file and move them into the
Nike-Ajax common.scad file. This will make these dimensions available globally, which I want because I believe they will be used later in some other modules. Note that I've also added the variable
Shroud_Bolt_Sta to this list of variables.
Code:
// Booster_Fin_Shroud dimensions
Root_Chord = 37.125; //
Boost_Shroud_Diameter = 16.67; // Bennett
Boost_Shroud_Length = 28.125; // Bennett
Boost_Shroud_Thickness = 0.085; // Alway
Fin_Spacing = 0.05; // spacing between fin root and shroud
Shroud_Bolt_Sta = 364.5; // TLAR from photo
Next, I'll add a new module to the
Nike-Ajax common.scad file. This module will be used to create bolt heads, and since I'll be placing different sized bolts in several different places, it will be handy to have it available as a common module. This will be much like the
module rivet () that is also in the common file, but with one interesting difference.
Code:
module bolt_head (diameter, height, random = true) { // single bolt head
// diameter is flat-to-flat on bolt head; 1.155* converts this to a circle with same size inscribed hex
if (random == true ) {
rnd_rot = rands(-15, 15, 1);
rotate (a = [0, 0, rnd_rot[0]]) cylinder (h = height, d = 1.155*diameter, $fn = 6);
} else {
cylinder (h = height, d = 1.155*diameter, $fn = 6);
} // end if
} //end module bolt_head
Like the
rivet module, this is also called with the variables
diameter and
height. But there is an additional variable
random. The structure
random = true gives it the default value of
true, if the code that calls this module doesn't specify a value. So what does random do? I hate it when bolt heads are all lined up like soldiers on parade. It's just not that way in real life. The bolt heads should show some variation in their rotation. There's an
if statement there, and if
random == true, then it executes the next two lines, else if it's not
true, it skips those lines and executes the line following the
} else {.
If random is true, the first line executed is the command
rands (-15, 15, 1) , which is an OpenSCAD command to generate a single random number between -15 and 15. In the next line, that number is used to rotate the bolt head. So each call to
module bolt_head () will give a bolt head with a slightly different rotation, and no unrealistic alignment of the heads. However, if I do want a specific non-rotated bolt head, I set
random = false in the calling code, and it executes the line following the
else, and no rotation is performed.
The bolt head is just drawn as a '
cylinder' with
$fn=6. The
$fn, that I've mentioned before as defining the 'smoothness' of the cylinder, is actually just setting the number of sides. So
$fn=6 draws a hexagon. You'll also note that the diameter is multiplied by the factor
1.155. This is because I want to define the bolt head 'diameter' as the flat-to-flat distance, which is what you use to measure a bolt head. But the
cylinder command draws a hexagon inscribed within the given diameter, which is too small. Multiplying by 1.155 gives the flat-to-flat diameter that we want.
So now, we have to go back to the file
Nike-Ajax booster fin shroud.scad and look at the code that places the bolts using the
bolt_head module. It turns out that most of the module has changed, so I've shown the whole thing.
Code:
include <Nike-Ajax common.scad>;
module Booster_Fin_Shroud () {
// Global Root_Chord = 37.125; //
// Global Boost_Shroud_Diameter = 16.67; // Bennett
// Global Boost_Shroud_Length = 28.125; // Bennett
// Global Boost_Shroud_Thickness = 0.085; // Alway
// Global Fin_Spacing = 0.05; // spacing between fin root and shroud
// This is just the simple sheet metal shroud covering the Nike M5 nozzle, but it's included
// here because it will have some bolt detail added
// bottom of shroud is at [0, 0, 0]
difference() {
cylinder (h = Boost_Shroud_Length, d = Boost_Shroud_Diameter, $fn = smooth);
cylinder (h = 3 * Boost_Shroud_Length, d = Boost_Shroud_Diameter - 2 * Boost_Shroud_Thickness,
center = true, $fn = smooth);
// hole in shroud for fin bolt
for (bolt_pos = [120-bolt_offset, 240-bolt_offset, 360-bolt_offset]) {
rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
rotate (a = [0, 90, -20]) cylinder (h = 2, d = 1, center = true, $fn = 20);
} // end for
} // end difference
// shroud bolt detail
for (bolt_pos = [30, 90, 150, 210, 270, 330]) {
rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Bottom_Nike_Sta - Shroud_Bolt_Sta])
rotate (a = [0, 90, 0]) bolt_head (0.625, 0.375);
} // end for
// fin secure bolt detail
bolt_offset = 16;
for (bolt_pos = [120-bolt_offset, 240-bolt_offset, 360-bolt_offset]) {
rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
rotate (a = [0, 90, -20]) bolt_head (0.625, 0.6, random = false);
rotate (a = [0, 0, bolt_pos]) translate ([Boost_Shroud_Diameter/2, 0, Root_Chord/2])
rotate (a = [0, 90, -20 - 180]) cylinder (h = 2, d = 0.5, $fn = 20);
} // end for
} // end module Booster_Fin_Shroud
The section
// shroud bolt detail places the six bolts at the forward edge of the shroud, two between each fin. The
for loop runs six times, and the code within it rotates and translates the bolts into position. Notice that the actual call to the bolt module,
bolt_head (0.625, 0.375); does not specify a value for
random, so the
bolt_head module assumes the default
random = true.
The section
// fin secure bolt detail places the bolt that is next to the mounting post of each fin. This bolt secures the fin in place. It's angled inwards so that it intersects the fin mounting post. Here I've used a
for loop to place a bolt at each fin, and the code within the loop rotates and translates the bolt_head. For illustration here, I have specified
random = false, which overrides the default
true setting in the
bolt_head module. All of these bolts are now at a fixed rotation. The additional code in this section, which is also within the
for loop, adds a cylindrical section to represent the threaded part of the bolt, which is visible through the hole in the shroud that the bolt passes through.
The last new bit of code is the
for loop that follows
// hole in shroud for fin bolt. It places three cylinders that are positioned the same way as the fin bolts, but since this is within the
difference statement, these cylinders are subtracted from the shroud, creating the shroud holes for the bolts. Since the shroud is only a thin-walled tube, the fin bolts are just 'floating' at the moment. To make a printable model I'll have to go back later and put some structure in there.
The final result looks pretty darn close to the original picture.