Nike Ajax CAD Model Build

The Rocketry Forum

Help Support The Rocketry Forum:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.
Here's a quick little bit that illustrates an important aspect of OpenSCAD. I'm going to add a simple nozzle to the tail cone of the Ajax. In the file Nike-Ajax body.scad add the following dimension lines to the beginning of the file, with the other dimensions:
Code:
// Ajax nozzle dimensions - estimated
nozzle_depth = 8;
nozzle_diameter = 6;
throat_diameter = 2;

Then change the //tail cone lines to this:
Code:
    // tail cone with nozzle
    difference() {
        cylinder (h = Tail_Cone_Length, d1 = Tail_Diameter, d2 = Body_Diameter, $fn = smooth);
        translate ([0, 0, -0.000]) cylinder (h = nozzle_depth, d1 = nozzle_diameter, d2 = throat_diameter, $fn = smooth);
    } // end difference

This just takes the previous tail cone and uses the difference command to subtract a smaller cone to represent the nozzle.

I'll explain the translate ([0, 0, -0.000]) in a moment. Take a look at the result:

closed ajax nozzle.JPG

The nozzle doesn't really look like the 'open' nozzle aperture that we expected. That's because the bottom of the tail cone and the bottom of the subtracted nozzle cone are laying in exactly the same plane. OpenScad doesn't quite know what to do - which cone takes precedence? That's where that extra translate command comes in. Change
translate ([0, 0, -0.000]) to
translate ([0, 0, -0.002])
This drops the nozzle cone slightly below the bottom of the tail cone, and now there is no question that the nozzle is subtracted from the bottom of the tail cone. You'll often see a small factor like this, often predefined as 'epsilon' in OpenSCAD code to prevent coincident indeterminate surfaces. So now the nozzle looks like this:

ajax nozzle.JPG
Much better.
 
What the heck, I'm up, and it looks too incomplete right now without the nose cone. Easy to add, but I am not going into the nose cone code - it's a horrible, horrible left-over hack that I just had handy and was easy to fit in here. There are much better ways to do a nose cone. So I'm just going to include the file Nike-Ajax nose cone.scad file and urge you not to look in it. To use it we'll need to make the following changes to the file Nike-Ajax.scad.

First, remove the comment to activate the line include <Nike-Ajax nose cone.scad>;
Next, add the dimension line NC_Sta = 14; under // main component locations

And finally, replace the line // TODO nose cone with the lines:
// Nose Cone
color ("White") translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - NC_Sta]) Ajax_NC ();

Ajax with nc.JPG

Pointy. Doesn't look much like an Ajax without the tunnels and forward fins but it'll get there.
 

Attachments

  • Nike-Ajax nose cone.txt
    2.4 KB · Views: 52
Last edited:
Just a quick little update that shows some more OpenSCAD fun.

The last code line of the Nike-Ajax.scad file is currently:

rotate (a = [0, 0, 60]) Nike_M5_motor ();

This is the line that calls the Nike_M5_motor module contained in the Nike_M5_Motor.scad file, which then displays the Nike Booster as part of the full Nike-Ajax model.

I've mentioned before that there are some options in that motor file that don't quite fit the Nike-Ajax. There are multiple options in that motor file but going into the file to make the changes just so it's specific to the Nike-Ajax is clumsy. I'd have to make a special motor file every time I used it for a different rocket. (And there are a lot of them that use the M5 motor!) So I've modified the motor file to make the options selectable as variables in the call to the module. The line above in the Nike-Ajax.scad file should be replaced with this:

Code:
rotate (a = [0, 0, 60])
    Nike_M5_motor (noz_shroud=false, connector=false, noz_closure=false, upper_curv_flange=true, lower_const_flange=true);

I've modified the Nike_M5_Motor.scad file to accept these 'switches' as inputs to the module. The switches mean the following:
  1. noz_shroud - this determines if the module adds a shroud to the Nike nozzle. We don't want that here because the Nike-Ajax model will have its own shroud.
  2. connector - the Nike-Hercules has a large circular barrel connector at the ignitor, the Nike-Ajax doesn't, so we don't want to see that connector here.
  3. noz-closure - this determines if the nozzle shipping closure is included on the model. I could leave it in or take it out - but having taken it out I notice that I need to add some more interior detail to the nozzle.
  4. upper_curv_flange - the M5 documents describe two different shapes of upper flange on the motor. In all of the NA pictures, I've only ever seen the curved flange used.
  5. lower_const_flange - the M5 documents describe two different shapes of lower flange on the motor. The NA uses only the constant diameter flange.
I can see that I'm eventually going to have to add a couple more switches to take care of the different hole patterns in the flange, and maybe some other things.

no connector.JPG
Connector is gone. Oh, in that view you can see the holes in the upper edge of the flange that the interstage assembly will bolt to. The holes in the outer rim are the ones that need another switch to make them go away (tho I think some stay for the launch lugs).

So make the above one-line change to the Nike-Ajax.scad file, and download this new Nike_M5_Motor.scad file. (Rename the .txt file to .scad)


 

Attachments

  • Nike_M5_Motor.txt
    19.8 KB · Views: 44
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:
fin shroud bolts real.JPG

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.
fin shroud bolts real.JPG fin shroud bolts cad.JPG
 
Last edited:
Radar Fins - there's only one new OpenSCAD command for these, and a lot of it is like the other fins, so I'll just post the code and go through most of it quickly.
Radar Fins.JPG
Bennett - Radar Fin.JPG
This is the contents of the new file Nike-Ajax radar fin.scad that will be attached (as a .txt file).
Code:
// Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
// https://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.

include <Nike-Ajax common.scad>;


module Radar_Fin () {

//Global Radar_Fin_Sta = 74.675;    // Bennett/Alway
edge_diameter = 0.2;                 // TLAR
TE_root_height = 0.5;                 // Bennett
root_length = 10;                     // Bennett
TE_length = 2.188;                    // Bennett
horn_root_position = 3.445;         // TLAR
horn_diameter = 1.0;                // Bennett
horn_angle = 45;                    // Bennett
horn_ID = 0.7;                        // TLAR
mount_plate_dia = 3.0;                // TLAR
cone_angle = 3;                        // half-angle of forward body cone
mount_plate_location = 10 - 6.75;     // Bennett

    rotate (a = [0, -90, 0]) {  // need to rotate 'cause I should have built it this way
        difference() { // for subtracting the interior of the radar horn and its root
            hull () { // hull together all the elements to form the fin
                // aft root
                translate ([edge_diameter/2, 0, TE_root_height]) sphere (d = edge_diameter, $fn = 20);
                // fore root
                translate ([root_length - edge_diameter/2, 0, 0]) sphere (d = edge_diameter, $fn = 20);
                // aft tip
                translate ([edge_diameter/2, 0, TE_length + TE_root_height]) sphere (d = edge_diameter, $fn = 20);
                // radar horn
                translate ([horn_root_position, 0, 0]) rotate (a = [0, -horn_angle, 0])
                    cylinder (h = 4.35, d = horn_diameter, $fn = 30);    
            } // end hull
            // cube to clip off root end of horn, positioned as required
            translate ([20, 0, -2.6]) rotate (a = [0, 3, 0]) cube (size = [60, 5, 4], center = true);
            // horn interior, positioned as required
            translate ([horn_root_position, 0, 0]) rotate (a = [0, -horn_angle, 0]) cylinder (h = 6, d = horn_ID, $fn = 30);
        } // end difference
         
        // mounting plate
        intersection () {
            //
            translate ([mount_plate_location, 0, 0.0]) rotate (a = [0, cone_angle, 0])
                cylinder (h = .4, d = mount_plate_dia, $fn = 60);
            translate ([0, 0, -4.48]) rotate (a = [0, 90+cone_angle, 0]) cylinder (h = 8, d = 10, $fn = smooth);
        } // end intersection
     
        // TODO: mounting plate screws
    } // end rotate
} // end module Radar_Fin

// Radar_Fin ();

In the above code, the line: Radar_Fin_Sta = 74.675; // Bennett/Alway is a global dimension that must be added into the Nike-Ajax common.scad file. I've left the rest of the dimensions local to this module.

Within the hull command are the three spheres and the cylinder that form the general shape of the fin. The cylinder is the radar horn that the fin is there to support.
radar fin 1.JPG
When these are hulled, we get the general shape of the fin. The difference command that encloses the hull, subtracts two objects from the hulled shape. One is a cylinder that cores out the horn to make it a tube, and the other is a cube that is angled to flatten off the root edge of the fin. These two objects are shown highlighted (the '#' prefix on a line highlights a negative shape).
radar fin 2.JPG
The lines within the intersection () { block form the fin mounting plate. Below, the first cylinder is shown, before the intersection is performed.
radar fin 3.JPG
The beginning of the plate above is just a flat cylinder, but this plate should be curved to match the body of the missile at this point. The intersection command takes two (or more) objects, and leaves only the area where the objects intersect. So I'm going to take a cylinder that matches the diameter and angle of the body, and intersect it with that flat plate. I've highlighted that intersecting cylinder.
radar fin 4.JPG
The top of the mounting plate is now curved. The remaining cylindrical section of the plate will be embedded in the missile body.
radar fin 5.JPG
The fin shape is not perfect - it should be 'pinched-in' a bit below the radar horn, but it's pretty close. I'll come back and address that sometime later. It also needs some mounting screws in the plate that I'll do later too.

The only thing left is to add the fin into the main Nike-Ajax.scad file. it's added within the same for loop that places the main fins (and will later also place the guide fins). The line
include <Nike-Ajax radar fin.scad>; has to be uncommented as well.
Code:
    // fins
    color ("White") for ( rot = [45, 135, 225, 315]) {
        rotate (a = [0, 0, rot])
            translate ([Body_Diameter/2, 0, Bottom_Ajax_Tail_Cone_Sta - Main_Fin_Sta]) Main_Fin ();
        //rotate (a = [0, 0, rot]) translate ([-3.8, 0, Bottom_Ajax_Tail_Cone_Sta - 48.826]) Guide_Fin ();
        // radar fin - 5.48 to position fin root flush with forward body cone
        rotate (a = [0, 0, rot]) translate ([-5.48, 0, Bottom_Ajax_Tail_Cone_Sta - Radar_Fin_Sta]) Radar_Fin ();      
    } // end for

radar fin 6.JPG
 

Attachments

  • Nike-Ajax common.txt
    1.8 KB · Views: 45
  • Nike-Ajax radar fin.txt
    2.1 KB · Views: 35
Last edited:
Oopsie, file limit. You also need the main Nike-Ajax file. And it looks like I didn't attach the new booster fin shroud file either, so I'll add that here too.
 

Attachments

  • Nike-Ajax.txt
    2.8 KB · Views: 41
  • Nike-Ajax booster fin shroud.txt
    2 KB · Views: 37
The shape of the Nike-Ajax guide fins are the most complex on the missile, but there are very few drawing dimensions for this fin.

Bennett - Guide Fin.JPG
Guide Fin.JPG

So to get something that looks like that, we have to resort to a lot of That Looks About Right. So here I do a lot of placing spheres, hulling them, and walking them around until TLAR.
This is the Nike-Ajax guide fin.scad file.
Code:
// Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
// https://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.

include <Nike-Ajax common.scad>;

module Guide_Fin () {
    // Global Guide_Hub_Diameter = 2.25; // Bennett
    // Global Guide_Hub_Offset = 9;      // Bennett
    Guide_Edge_Diameter = 0.2;     // TLAR
    Guide_Fin_Span = 7.576;     // Bennett
    Guide_Fin_Root = 20.307;     // Bennett
    screw_hole_dia = 0.5;        // TLAR
    screw_hole_xspacing = 0.30; // TLAR
    screw_hole_yspacing = 0.55;    // TLAR
    screw_hole_depth = 0.5;     // TLAR
    root_center_thickness = 0.4;    // Bennett
    rise_fin_aft_root_tip = 1.044;     // Bennett
   
    rotate (a = [0, -90, 0]) { // rotate all because I should have built it this way
    difference() {
        union () { // join the root wedge, hub, and fin so the screw holes hit everything
            // root hub
            intersection () { // root hub intersected with cylinder for curved top
                translate ([9, 0, .2]) rotate (a = [0, cone_angle, 0]) cylinder (h = 0.4, d = Guide_Hub_Diameter, $fn = 60);
                translate ([8, 0, -2.31]) rotate (a = [0, 90+cone_angle, 0]) cylinder (h = 6, d = 6, center = true, $fn = smooth);
            } // end intersection

            difference() {
                hull () { // root wedge
                    translate ([Guide_Hub_Offset - 0.5, 0, 1.15]) sphere (d = 0.6, $fn = 20); // aft max wedge upper hub
                    translate ([Guide_Hub_Offset + 0.5, 0, 1.1]) sphere (d = 0.6, $fn = 20); // fore max wedge upper hub
                   
                    translate ([Guide_Hub_Offset - 0.5, 0.8, 0.45]) sphere (d = 0.4, $fn = 20); // aft wedge base hub left
                    translate ([Guide_Hub_Offset + 0.5, 0.8, 0.45]) sphere (d = 0.4, $fn = 20); // fore wedge base hub left
                    translate ([Guide_Hub_Offset - 0.5, -0.8, 0.45]) sphere (d = 0.4, $fn = 20); // aft wedge base hub right
                    translate ([Guide_Hub_Offset + 0.5, -0.8, 0.45]) sphere (d = 0.4, $fn = 20); // fore wedge base hub right      
                   
                    translate ([1.0, 0, 1.1]) sphere (d = Guide_Edge_Diameter, $fn = 20); // aft wedge tip
                    translate ([Guide_Fin_Root - 1, 0, 0.15]) sphere (d = Guide_Edge_Diameter, $fn = 20); // fore wedge tip  
                } // end hull
            // slice off the root edge of the wedge
            translate ([Guide_Hub_Offset, 0, 0.0]) rotate (a = [0, cone_angle, 0]) cube (size = [30, 5, 1], center = true);
            } // end difference
           
            // fin
            hull () {
                // root
                translate ([Guide_Edge_Diameter/2, 0, 1.044 + Guide_Edge_Diameter/2])
                    sphere (d = Guide_Edge_Diameter, $fn = 20); // aft root tip
                translate ([Guide_Edge_Diameter/2, 0, Guide_Fin_Span + rise_fin_aft_root_tip - Guide_Edge_Diameter/2])
                    sphere (d = Guide_Edge_Diameter, $fn = 20); // aft tip
                translate ([Guide_Fin_Root-Guide_Edge_Diameter/2, 0, Guide_Edge_Diameter/2])
                    sphere (d = Guide_Edge_Diameter, $fn = 20); // forward tip
                translate ([Guide_Hub_Offset-1, 0, 1.2]) sphere (d = root_center_thickness, $fn = 20); // root center width
            } // end hull

        } // end union

        // mounting screw holes
        translate ([Guide_Hub_Offset + screw_hole_xspacing, screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
            cylinder (h = 2, d = screw_hole_dia, $fn = 20);
        translate ([Guide_Hub_Offset - screw_hole_xspacing, screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
            cylinder (h = 2, d = screw_hole_dia, $fn = 20);
        translate ([Guide_Hub_Offset + screw_hole_xspacing, -screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
            cylinder (h = 2, d = screw_hole_dia, $fn = 20);
        translate ([Guide_Hub_Offset - screw_hole_xspacing, -screw_hole_yspacing, screw_hole_depth]) rotate (a = [0, cone_angle, 0])
            cylinder (h = 2, d = screw_hole_dia, $fn = 20);
   
    } // end difference
    } // end rotate
} // end module Guide_Fin

Guide_Fin ();
First, note that two dimensions have been moved to the Nike-Ajax common.scad file, so that they will be global.

Next, in the intersection block, we make a hub with a curved surface just like that in the radar fin.

In the first hull block, I'll place a set of spheres that will form the root wedge structure when hulled. I'll also have a difference command around this hull so that I can use a cube placed to slice off the root edge flat.
wedge spheres.JPG

After hulling and slicing off the root, we have the root wedge. The block that slices the root flat is highlighted.
wedge hull.JPG

After placing a set of spheres for the fin, they are also hulled to form the fin. The hub is also shown here.
wedge fin.JPG

There's been nothing new up to this point, but here I have to introduce a new OpenSCAD command, the union () { I want to use a difference to make cutouts for the mounting screw holes with some cylinders, but the structure that these cylinders must be subtracted from is made up of the hub, root wedge, and fin. The difference command takes the first item following the command and subtracts every other item that follows. So to get a difference from multiple objects, we first have to merge them together with the union. Everything within the union () {...} curly brackets is treated as one object. Now the first item following the difference is the union, and the four cylinders for the mounting screw holes are subtracted from that. That leaves one last question - you may have noted that we've subtracted items from multiple objects that have been hulled; we did it just above with the root slice. Well, that's because a hull does an implied union on all of the hulled objects, so the hull is treated as a single object.
wedge holes.JPG

Like on the radar fin, I've also got to rotate the whole fin, and add it into the Nike-Ajax.scad file. The final result is excellent. Compare to the photo up top.
finished guide fin.JPG


The three changed .scad files are attached as .txt
 

Attachments

  • Nike-Ajax common.txt
    2.2 KB · Views: 36
  • Nike-Ajax guide fin.txt
    3.8 KB · Views: 37
  • Nike-Ajax.txt
    2.9 KB · Views: 40
The only major things left to do are the tunnels and the interstage. This whole exercise of explaining things has made my code dramatically more clear and modular. (To me, anyway, even if it's still mud to everyone else.)

Nike Ajax2.JPG
 
You know, I was never satisfied with the trailing edge shape of the radar fin. Laying in bed the other night I finally figured out what to do about it.

sculpt radar fin.JPG

I just placed four spheres, sized and walked them around 'til they intersected the trailing edge the way I wanted, then hulled them and subtracted the hull. Mirrored same for the other side, shown above highlighted. The code below is added within the difference statement in the module Radar_Fin () {...}.
Code:
            // sculpt the trailing edge
            hull () {   
                translate ([-0.2, 0.5, 2.48]) sphere (d = 0.9, $fn =60); // top TE sphere
                translate ([-0.2, 0.82, 2.95]) sphere (d = 0.9, $fn =60); // tpp trim sphere         
                translate ([2.95, 2.3, -1]) sphere (d = 4, $fn =60); // bottom forward sphere
                translate ([-0.2, .45, 0]) sphere (d = 0.8, $fn =60); // bottom TE sphere
            } // end hull
            mirror ([0, 1, 0]) hull () {   
                translate ([-0.2, 0.5, 2.48]) sphere (d = 0.9, $fn =60); // top TE sphere
                translate ([-0.2, 0.82, 2.95]) sphere (d = 0.9, $fn =60); // tpp trim sphere         
                translate ([2.95, 2.3, -1]) sphere (d = 4, $fn =60); // bottom forward sphere
                translate ([-0.2, .45, 0]) sphere (d = 0.8, $fn =60); // bottom TE sphere
            } // end hull

I guess I should explain what I mean by 'walking', It's what I do when I don't have exact dimensions and going for a TLAR. I first place an object at a best guess near where I think it should be. Then I just incrementally change values, usually one at a time, to translate (or rotate, or resize) the object into place, hitting 'preview' between each change. With some practice, it doesn't take long to get something placed exactly how you want it.

TODO: still need the mounting plate screws
 
Fun with tunnels.

tunnel dimensions.JPG

The Bennett drawing has a nice detail on the tunnel profile at stations along the body. The interesting thing is that there are two different tunnel shapes. I like the way Bennett has organized the data, but I wish he would have stuck with decimal measurements and either full width or half width measures.

The tunnels are probably the most involved part of the model, so this will have to be brief - it would take forever to go into detail. The tunnels will be added in the Nike-Ajax body.scad file. Add the following line at the beginning to include the tunnel file code: include <Nike-Ajax body tunnels.scad>;

And at the bottom of that file, within the Main_Body module, add the following lines:
Code:
    // body tunnels  
    // Tunnel #1  top side - side opposite launcher and in line with nike fin, and #3 launcher side
    for (rot = [0, 180]) {
        rotate (a = [0, 0, rot]) Tunnel_1_3 ();
    } // end for
   
    // Tunnel #2 & #4
    for (rot = [90, 270]) {
        rotate (a = [0, 0, rot]) Tunnel_2_4 ();
    } // end for
This places a tunnel at each of the four rotations between the fins. It calls two modules in the new Nike-Ajax body tunnels.scad file. Each Tunnel module is for a different tunnel shape. This is the beginning of that file:
Code:
// Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
// https://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.

include <Nike-Ajax common.scad>;  
   
   
module Tunnel_1_3 () {
    Tunnel_all_forward ();
    hull () {
        //Tunnels_all_sta26p000 ();
        Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.2);  // all tunnels sta 26.000
        //Tunnels_1_3_sta75p781 ();
        Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.2);  // tunnels 1&3 sta 75.781
    }
    hull () {
        //Tunnels_1_3_sta75p781 ();
        Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.2);  // tunnels 1&3 sta 75.781  
        //Tunnels_all_sta108p656 ();
        Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.2);  // all tunnels sta 108.656
    }
    hull () {
        //Tunnels_all_sta108p656 ();
        Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.2);  // all tunnels sta 108.656  
        //Tunnels_1_3_sta198p625 ();
        Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
    } // end hull
    Tunnel_Rear_1_3 ();
} // end module Tunnel_1_3

module Tunnel_2_4 () {
    Tunnel_all_forward ();
    hull () {
        //Tunnels_all_sta26p000 ();
        Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000
        //Tunnels_2_4_sta75p781 ();
        Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
        //Tunnels_all_sta108p656 ();
    }
    hull () {
        Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
        //Tunnels_all_sta108p656 ();  
        Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656
        //Tunnels_2_4_sta198p625 ();
    }
    hull () {
        Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656
        //Tunnels_2_4_sta198p625 ();  
        Tunnel_Profile (214, 0.59375, 1.8125, 1.25, 5.6, 0.1);  // tunnels 2&4 sta 198.625
    } // end hull
    Tunnel_Rear_2_4 ();
} // end module Tunnel_2_4
These are the tunnel modules called from the Nike-Ajax body.scad file. Each of these modules calls three types of modules. The Tunnel_all_forward () module creates the shape of the forward ends of the tunnels. They are all the same so both top modules call this same module. Likewise they each call a Tunnel_Rear_n_n () module, but these are different because the tunnel aft ends are different.

In between the front and rear, there are hulls of a bunch of Tunnel_Profile () modules. Here is the Tunnel_Profile () and a data set for it:
Code:
// all tunnels sta 26.000
    //    sta = 75.781  // Bennett
    //    half_top_width = 0.2969; // Bennett 19/32" /2      
    //    half_bottom_width = 0.9531; // Bennett 1"29/32 /2    
    //  exposed_height = 0.78125 // Bennett 25/32"
    //    depth = 3.35;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000
   
module Tunnel_Profile (sta, half_top_width, half_bottom_width, exposed_height, depth, spheredia) {  
// general tunnel profile module
    translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - sta]) rotate (a = [0, -90, 0]) {
        translate ([0, half_top_width - spheredia/2, depth + exposed_height - spheredia/2])
            sphere (d = spheredia, $fn = 20);
        translate ([0, -half_top_width + spheredia/2, depth + exposed_height - spheredia/2])
            sphere (d = spheredia, $fn = 20);
        translate ([0, half_bottom_width - spheredia/2, depth]) sphere (d = spheredia, $fn = 20);
        translate ([0, -half_bottom_width + spheredia/2, depth]) sphere (d = spheredia, $fn = 20);          
    } // end translate-rotate
} // end module Tunnel Profile
If you look at the Bennet drawing above, you'll see that he presents the data as a series of trapezoids sitting on the surface of the body. The module above creates exactly the same thing. Using spheres (as I have done before) at the corners of the trapezoid. Since there are a half-dozen different sizes of trapezoids this module takes a data set for each, and rotates and positions it in place on the body. The modules calling this one, hull together pairs of trapezoids, forming the tunnel along the body. The full set of trapezoid data sets are here:
Code:
// Tunnel Data
// tunnels 1&3 sta 198.625
    //    sta = 214?  // Bennett 186.25  why is this different?
    //    half_top_width = 0.53125; // Bennett 1"1/16 /2      
    //    half_bottom_width = 1.8125; // Bennett 1"13/16  
    //  exposed_height = 1.25 // Bennett
    //    depth = 5.6;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.1);  // tunnels 1&3 sta 198.625

// tunnels 2&4 sta 198.625
    //    sta = 214?  // Bennett 186.25  why is this different?
    //    half_top_width = 0.59375; // Bennett 19/32"      
    //    half_bottom_width = 1.8125; // Bennett 1"13/16  
    //  exposed_height = 1.25 // Bennett
    //    depth = 5.6;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (214, 0.59375, 1.8125, 1.25, 5.6, 0.1);  // tunnels 2&4 sta 198.625
   
// all tunnels sta 108.656
    //    sta = 108.656  // Bennett
    //    half_top_width = 0.53125; // Bennett 1"1/16 /2      
    //    half_bottom_width = 1.8125; // Bennett 1"13/16  
    //  exposed_height = 1.25 // Bennett
    //    depth = 5.6;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (108.656, 0.53125, 1.8125, 1.25, 5.6, 0.1);  // all tunnels sta 108.656  
   
// tunnels 1&3 sta 75.781
    //    sta = 75.781  // Bennett
    //    half_top_width = 0.40625; // Bennett 13/16" /2      
    //    half_bottom_width = 1.375; // Bennett 1"3/8  
    //  exposed_height = 1.0625 // Bennett 1"1/16
    //    depth = 5.9;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (75.781, 0.40625, 1.375, 1.0625, 5.9, 0.1);  // tunnels 1&3 sta 75.781      
   
// tunnels 2&4 sta 75.781
    //    sta = 75.781  // Bennett
    //    half_top_width = 0.46875; // Bennett 15/32"        
    //    half_bottom_width = 1.375; // Bennett 1"3/8  
    //  exposed_height = 1.0625 // Bennett 1"1/16
    //    depth = 5.83;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (75.781, 0.46875, 1.375, 1.0625, 5.83, 0.1);  // tunnels 2&4 sta 75.781
   
// all tunnels sta 26.000
    //    sta = 75.781  // Bennett
    //    half_top_width = 0.2969; // Bennett 19/32" /2      
    //    half_bottom_width = 0.9531; // Bennett 1"29/32 /2    
    //  exposed_height = 0.78125 // Bennett 25/32"
    //    depth = 3.35;    // TLAR
    //  spheredia = 0.1; // TLAR
    //  Tunnel_Profile (26.000, 0.2969, 0.9531, 0.78125, 3.35, 0.1);  // all tunnels sta 26.000

.... continued

Attached are all of the new and changed files:
 

Attachments

  • fore tunnel1.JPG
    fore tunnel1.JPG
    15.8 KB · Views: 42
  • fore tunnel2.JPG
    fore tunnel2.JPG
    18.2 KB · Views: 45
  • aft tunnels.JPG
    aft tunnels.JPG
    39.7 KB · Views: 40
  • Nike-Ajax body tunnels.txt
    7.8 KB · Views: 29
  • Nike-Ajax body.txt
    4.7 KB · Views: 30
  • Nike-Ajax interstage.txt
    3.6 KB · Views: 31
  • Nike-Ajax.txt
    3 KB · Views: 32
  • Nike-Ajax radar fin.txt
    2.6 KB · Views: 32
Last edited:
The forward shape of the tunnels is handled here:
Code:
module Tunnel_all_forward () {
    hull () {
        difference() { // top curve of forward tunnel
            translate ([19.82, 0, Bottom_Ajax_Tail_Cone_Sta - 27.5]) rotate (a = [90, 0, 0])
                cylinder (h = 0.55, d = 48, center = true, $fn = 240);
            translate ([25, 0, Bottom_Ajax_Tail_Cone_Sta - 30.875]) cube (size = [50, 50, 70], center = true);
        } // end difference
        Side_Curve_Tunnel_All_Forward ();
        mirror ([0, 1, 0]) Side_Curve_Tunnel_All_Forward ();
    } // end hull
} // end module Tunnel_all_forward

module Side_Curve_Tunnel_All_Forward () {
    difference() { // side curve of forward tunnel
        translate ([-3.15, -23.03, Bottom_Ajax_Tail_Cone_Sta - 27.0]) rotate (a = [0, 91.5, 0])
            cylinder (h = 0.5, d = 48, center = true, $fn = 240);
        translate ([0, -25, Bottom_Ajax_Tail_Cone_Sta - 30.875]) cube (size = [50, 50, 70], center = true);
        translate ([0, 0, 265.2 ]) cube (size = [50, 50, 70], center = true);
    } // end difference
} // end module Side_Curve_Tunnel_All_Forward
This is going to be difficult to explain. The section labeled as // top curve of forward tunnel creates the top curve using the edge of a short cylinder that can be seen highlighted here. A difference statement cuts away the unwanted portions of the cylinder.

fore tunnel1.JPG

The module Side_Curve_Tunnel_All_Forward () does the same thing, placing the edge of a flat disk against the body where the tunnel contacts it, again with a difference statement to cut away the unwanted part. The module is mirrored for the other side. Then it's just a matter of hulling together the three curved sections:

fore tunnel2.JPG

The aft ends of the tunnels are done much the same way, except that there are two different shapes:
Code:
module Tunnel_Rear_1_3 () {
    intersection () {
        translate ([125.653, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
            cylinder (h = 6, d = 265, center = true, $fn = 360);

        hull () {
            Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
            Tunnel_Profile (232.625 - 1.875, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 
        } // end hull
    } // end intersection
} // end module Tunnel_Rear_1_3


module Tunnel_Rear_2_4 () {
    hull () {
        difference() { // top curve of rear tunnel
            // top ridge of tunnel
            translate ([198.15, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
                cylinder (h = 1.15, d = 410, center = true, $fn = 360);
            translate ([245, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) cube (size = [500, 500, 500], center = true);
            // slice off aft tip
            translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - Top_Ajax_Tail_Cone_Sta - 10])
                cube (size = [20, 20, 20], center = true);
        } // end difference
        Side_Curve_Rear_Tunnel_2_4 ();
        mirror ([0, 1, 0]) Side_Curve_Rear_Tunnel_2_4 ();
    } // end hull
} // end module Tunnel_Rear_2_4

module Side_Curve_Rear_Tunnel_2_4 () {
    difference() { // side curve of rear tunnel
        translate ([-5.56, -158.34, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [0, 90, 0])
            cylinder (h = 0.5, d = 320, center = true, $fn = 360);   
        translate ([0, -250, Bottom_Ajax_Tail_Cone_Sta - 214]) cube (size = [500, 500, 700], center = true);
        translate ([0, 0, -329.5 ]) cube (size = [500, 500, 700], center = true);
    } // end difference
} // end module Side_Curve_Rear_Tunnel_2_4

The result is shown here with the two distinct tunnel shapes (shown with the as yet incomplete interstage). Note that this difference is not noted in either the Bennett or Alway drawings, but it is clear from photographs.

aft tunnels.JPG
 
Last edited:
The last major component is the interstage:

interstage OD.JPG

The interstage is a single cast unit. Although I have a picture of one that is welded, it's the only one I've seen like that, and I suspect it was uniquely constructed for that display because they didn't have a real one. I've very pleased with the way my OpenSCAD interstage came out.

interstage2.JPG
interstage3.JPG

The code structure for this is just a flat rounded disk, on top of a pair of cones. The strut is a separate module that is called three times in a loop in the same way that fins are applied. Then a cone matching the Ajax tailcone is subtracted from the top center.

I'll attach the code, but I'm not going to list it here. It's mostly more of the same stuff; lots of hulled spheres, assorted differences and intersections. However, there is one new command I've used that I will explain. That flat top ring would be pretty difficult to construct with only what I've used so far. The rotate_extrude command solves that, but it's a bit awkward to explain. This command takes a 2D object drawn in the xy plane, rotates it around the x-axis so that it lies in the yz plane, then rotates and extrudes it around the z-axis.

So the code here first draws a circle that is the thickness of the ring. I guess circle is a new command too. OpenSCAD can draw 2D primitives like square, circle, and polygon. That circle is then translated on the x-axis by the radius of the ring. The rotate_extrude then creates a torus. The surrounding hull makes the torus into a flat disk.
Code:
            // top ring
            hull () {
                rotate_extrude (convexity = 10, $fn = smooth)
                    translate ([ring_diameter/2 - ring_thickness/2 , 0, 0])
                        circle (d = ring_thickness, $fn = 60);
            } // end hull
The rotate_extrude is usually used for more complex objects created from polygons.

Still need to do the launch lugs and a few details.
 

Attachments

  • Nike-Ajax interstage.txt
    6.5 KB · Views: 34
Launch Lugs.

Simple rotations and differences of common shapes, so I won't detail the code. The only different thing here is that I've allowed the color of each component to be specified separately. From photographs, it looks like the lugs are sometimes installed after the motor body is painted, so they can be different colors. So the bolts are sometimes unpainted as well. Same deal for the retention plate, that is installed after the missile is placed on the rail.

Nike-Ajax Launch Lug.scad file:
Code:
// Use of this file is licensed under the Creative Commons - Attribution - Non-Commercial license.
// https://creativecommons.org/licenses/by-nc/3.0/  by Gary A. Crowell Sr.

include <Nike_M5_Motor.scad>
include <Nike-Ajax common.scad>;

//M5_MotorTubeDiameter = 16.466;  from Nike_M5_Motor.scad
//M5_UpperFlangeDiameter = 17.572;

// Launch Lug Dimensions

InnerBoltRadialPosition = 24; // degrees
OuterBoltRadialPosition = 38; // degrees
LugInnerSurfaceFromBodyCenter = 8.8;
LugCavityHeight = 9.37; // from body center
LugCapPlateThickness = 9.75 - 9.37;
LugLength = 1.25; // from MD drawings
MainBoltHeadDiameter = 5/8; // estimated from drawings
CapBoltHeadDiameter = 3/8; // estimated from photographs
LugMainFlangeThickness = 0.65; // estimated from drawings
SpanOfLugFull = 11.85;
SpanOfLugCavity = 10.1;
SpanOfCapPlateInnerEdge = 8.85;
SpanOfCapPlateBolts = 11;

// Lug Longitudinal Positions - From MD drawings
UpperLugCenterDownFromTopOfFlange = 0.6;
BottomLugCenterUpFromM5Nozzle = 27.59;
UpperLugCenterUpFromM5Nozzle = 106.7;

tablength = 0.8;
tabdepth = 2;

//Launch Lug
module LaunchLug (BodyDiameter,
    // since the lugs may be attached after painting the Nike body, its color and the
    // color of its components can be assigned independently
    LugColor = "White",         // color of lug
    BoltColor = "White",         // color of lug attachment bolts // Steel
    PlateColor = "White",         // color of attachment plate - could be unpainted Iron
    PlateBoltColor = "White") {    // color of plate attachment bolts // Steel
       
    translate ([0, 0, -LugLength/2]) {
        // Main flange of Lug
        color (LugColor) difference() {
            cylinder (h = LugLength, d = BodyDiameter + LugMainFlangeThickness, $fn = 180);
            translate ([0, 0, -1]) cylinder (h = 4, d = BodyDiameter, $fn = 180);
            rotate (a = [0, 0, 318.5]) translate ([0, -15, -1]) cube (size = [30, 30, 4]);
            rotate (a = [0, 0, 69.5]) translate ([-15, 0, -1]) cube (size = [30, 30, 4]);    
        } // end difference
       
        // Main flange bolts
        color (BoltColor) {
            rotate (a = [0, 0, -24]) translate ([0, BodyDiameter/2 + LugMainFlangeThickness, LugLength/2])
                rotate (a = [90, 0, 0]) bolt_head (MainBoltHeadDiameter, 0.375, random = true);
            rotate (a = [0, 0, -38]) translate ([0, BodyDiameter/2 + LugMainFlangeThickness, LugLength/2])
                rotate (a = [90, 0, 0]) bolt_head (MainBoltHeadDiameter, 0.375, random = true);  
        }
       
        // Lug vertical angle
        color (LugColor) difference() {
            translate ([-SpanOfLugFull/2, 0, 0]) cube (size = [SpanOfLugFull, LugCavityHeight, LugLength]);
            translate ([0, 0, -1]) cylinder (h = 4, d = BodyDiameter, $fn = 180);  
            rotate (a = [0, 0, 323]) translate ([-0.3, -15, -1]) cube (size = [30, 30, 4]);
            rotate (a = [0, 0, 323]) translate ([-31.6, -15, -1]) cube (size = [30, 30, 4]);    
            translate ([-SpanOfLugCavity/2, LugInnerSurfaceFromBodyCenter, -1])
                cube (size = [SpanOfLugCavity, LugCavityHeight - LugInnerSurfaceFromBodyCenter, 4]);
        } // end difference
           
        // Lug Plate
        color (PlateColor)
            translate ([SpanOfLugFull/2 - (SpanOfLugFull - SpanOfCapPlateInnerEdge)/2, LugCavityHeight , 0])
            cube (size = [(SpanOfLugFull - SpanOfCapPlateInnerEdge)/2, LugCapPlateThickness, LugLength]);
        //color (PlateBoltColor) {
            translate ([SpanOfCapPlateBolts/2, LugCavityHeight + LugCapPlateThickness, LugLength * 3/4])
                rotate (a = [-90, 0, 0]) bolt_head (CapBoltHeadDiameter, 0.2, random = true);
            translate ([SpanOfCapPlateBolts/2, LugCavityHeight + LugCapPlateThickness, LugLength * 1/4])
                rotate (a = [-90, 0, 0]) bolt_head (CapBoltHeadDiameter, 0.2, random = true);  
        //} // end color
    } // end translate
} // module launch lug


The above module is called four times, twice for the upper lugs, and twice for the lower lugs. In each pair, the second lug is a mirror of the first. The following code is added to the Nike_Ajax_Booster module in the Nike-Ajax.scad file.
Code:
    // Upper Launch Lug
    rotate (a = [0, 0, 90]) {
        translate ([0, 0, 134.55]) {
            LaunchLug (M5_UpperFlangeDiameter,
            // since the lugs may be attached after painting the Nike body, its color and the
            // color of its components can be assigned independently
                "White",     // color of lug
                Steel,         // color of lug attachment bolts // Steel
                Iron,         // color of attachment plate - could be unpainted Iron
                Steel         // color of plate attachment bolts // Steel
                );
            mirror ([1, 0, 0]) LaunchLug (M5_UpperFlangeDiameter,
                "White",     // color of lug
                Steel,         // color of lug attachment bolts // Steel
                Iron,         // color of attachment plate - could be unpainted Iron
                Steel         // color of plate attachment bolts // Steel
                );
        } // end translate
    // Lower Launch Lug
        translate ([0, 0, BottomLugCenterUpFromM5Nozzle]) {
            LaunchLug (Boost_Shroud_Diameter,
                "White",     // color of lug
                Steel,         // color of lug attachment bolts // Steel
                Iron,         // color of attachment plate - could be unpainted Iron
                Steel         // color of plate attachment bolts // Steel
                );
            mirror ([1, 0, 0]) LaunchLug (Boost_Shroud_Diameter,
                "White",     // color of lug
                Steel,         // color of lug attachment bolts // Steel
                Iron,         // color of attachment plate - could be unpainted Iron
                Steel         // color of plate attachment bolts // Steel
                );
        } // end translate
    } // end rotate

launch lugs.JPG
 

Attachments

  • Nike-Ajax Launch Lug.txt
    4.4 KB · Views: 29
I was never truly happy with the aft end of the shorter tunnels - the end is 'scalloped', which is not at all like the real tunnel.tunnel scallop.JPG

It took a bit of thought, but adding the following code to the module Tunnel_Rear_1_3 in the file Nike-Ajax body tunnels.scad fixes it right up.
Code:
module Tunnel_Rear_1_3 () {
    hull () {
        difference() { // hulling the 'pie' shape to the tunnel flattend the end,
                       // removing the 'scallop'
            translate ([0, 0, Bottom_Ajax_Tail_Cone_Sta - 230.85 ])
                cylinder (h = 0.01, d = 12, $fn = 120);
            rotate (a = [0, 0, 16]) translate ([0, -7.5, Bottom_Ajax_Tail_Cone_Sta - 230])
                cube (size = [15, 15, 10], center = true);
            rotate (a = [0, 0, 164]) translate ([0, -7.5, Bottom_Ajax_Tail_Cone_Sta - 230])
                cube (size = [15, 15, 10], center = true);
        }   
        intersection () {
            // the edge of this disk is the top ridge of the tunnel
            translate ([125.653, 0, Bottom_Ajax_Tail_Cone_Sta - 214]) rotate (a = [90, 0, 0])
                cylinder (h = 6, d = 265, center = true, $fn = 360);           
            hull () {
                Tunnel_Profile (214, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3 sta 198.625
                Tunnel_Profile (232.625 - 1.875, 0.53125, 1.8125 ,1.25, 5.6, 0.2);  // tunnels 1&3
            } // end hull
        } // end intersection
    } // end hull 
} // end module Tunnel_Rear_1_3
tunnel flat.JPG

Much better.
 
Did I mention that the interstage looks totally printable in Simplify3D?
interstage in simplify.JPG
I might see if my printer still works.

Nutz, the latest upgrade to Simplify blew away all my settings.
 
Last edited:
First thing I've printed in about nine months. Came out pretty nice with the default settings; the only ratty part was the support separation, easy enough to fix. 1/10 scale. The color match was pretty good, will only need slight adjustment*. I cannot break the legs by hand, so it should be strong enough for most stuff

20190610_200453_HDR.jpg

*Naw, it was pure coinkydink, just what was left over in the printer.
 
I'm ready to take all the punishment that is required to make you happy :D
 
All that OpenSCAD code is useless unless you can print it...

Nike Ajax interstage print.jpg
Starting with the first print of the interstage only, printed inverted. It came out well with only a little clean-up needed where supports came off. But I wanted to print the interstage and forward Nike flange as a single print. The next attempt, with the flange, was stopped just above the Nike ignitor dome, to see how the interstage supports there would separate - it was ugly. The next one was stopped because I'd forgotten to put the supports under the launch lugs, but I got a look at how new supports were working on the ignitor dome - better but still needing tweaks. The fourth print was just up to a programmed stop, where I was again testing supports and different processes. The first full print was very good, but I wasn't happy with the supports needed for the top ring of the interstage. So, I sliced off the top ring and printed it separately. The final print, with a separately printed top ring... is fabulous. Practically zero cleanup required.

This is how I've used Simplify3D processes to change the printing parameters at each level:
interstage print processes.JPG

The blue level is the shoulder, layer height 0.20 mm, infill 12%.
Turquoise is the start of the upper Nike flange, starting just below the upper weld line; layer height 0.15, infill 12%, reduced speed outer layer (on all layers on up).
The green layer contains the launch lug detail and the start of the ignitor dome surface, so layer height 0.10, infill 45%.
Yellow still has detail, and the upper surface of the dome. Layer height still at 0.10, infill to 100% to ensure a good backing for the curved dome surface.
Red is the remainder, layer height 0.15, infill 100%. The infill doesn't matter much here since it would be nearly solid anyway, with three wall layers. There's no fine detail here, so the change to 0.15 was to reduce print time.
The upper ring of the interstage (not shown) was printed separately, at 0.10 layer height.
Total print time for both parts, about six hours. I don't rush the print speed, and long prints don't bother me.

Except for under the launch lugs, you'll notice that I haven't used S3D supports. The supports for the rim of the shoulder, and between the ignitor dome and base of the interstage, are programmed supports (i.e., in the OpenSCAD code). The shoulder rim support is a style I've used many times, and it gives a nice sharp edge to the shoulder and peels off cleanly. The cylinder between the dome and interstage is spaced perfectly so that I can just grab it with needle-nose pliers, crush it, and yank it out cleanly. I am utterly satisfied with the result.

Note that this print is intended for a display model only, but changes for a flying model wouldn't be difficult. I was expecting to need to beef up the struts for a flying model, but they seem surprisingly strong.
 
Bit of a hiatus on this project - I just found out I have to move. I'm hoping I can find all the bits again when I get settled.
 
Ok, move is done, except for finding places to put just about everything. Plus three trips in the last three weeks to Seattle for family matters. Still have to plug in a printer and see if it works after the move. Catching up on where I was, and it looks like I was pretty much finished with the interstage (though I haven't yet found the parts I printed) and was starting to work on a printable booster fin can. I should be able to come up with some results on that in the next few days, if I can figure out my own code.
 
Looks like I was pretty close when I had to take a break. Just fixed a few bugs and there's a nice isolated fin can. I'm ending the can just above the aft motor weld, so the non-printed body tube of the booster motor will extend just between the aft and forward weld locations. It'll still take a few tweaks to make it printable though.
boost fin can2.JPG
 
Last edited:
When I moved, my old XYZ printer was just stretch-wrapped and stuck on the truck by the movers. I wasn't too excited about the prospects of getting it running again. But it's a champ. Plugged in and is doing good prints with zero adjustments. First shot at the fin can came out reasonably well, second with minor revisions is printing now.

Hmmm, except for the reel that was with the printer, I think the rest of my filament is still stuck in the back of a temporary storage unit that I haven't emptied yet. Might be easier/quicker to just order more.
 
Hmmm, can't seem to upload photos at the moment. Anyway, I've done three prototypes of the booster fin can, learning more with each iteration about the processes and supports that work. Very pleased with the result. I've gone with separate plug-in fins, because they will be so much easier to sand and prepare the surface, and since they are often a different color than the body (often white on OD green), that would eliminate masking. Very happy with the plug-in fit; perfect alignment and a close fit such that only a slight trim is required to get a fit that could probably fly without glue. I also like the idea of being able to replace a broken fin without trashing the whole can.

As with the interstage, I've currently got the scale launch lugs as an integral part of the fin can. While they are recognizable, they're really at the limit of FDM detail printing. I'm thinking about taking them off and printing them separately via the SLA printer at the local library. Might even try that today if I get the chance.

Did find my reel of white ABS, so my next series of prints will look much better than the ugly red (that I was happy to use up on the prototype prints).

While the fin cans were printing I added the mounting screw detail to the radar fin (pics if I could get the upload to work).

I also started sectioning the Ajax body and I'm doing the first trial print of the tail cone/lower body right now. I've agonized over the decision to use a paper body tube (as I did with the Nike booster) for the straight body section of the Ajax, or else to print the whole thing. At the moment I'm trying the wholly printed route. The body tunnels would be such a pain to apply separately to a tube and, they work to strengthen a printed body. We'll see how that works out. On a flight model, I'd probably add an internal paper tube.

I know I'm a bit silly on the level of detail - much of it can't be seen or won't print at the current 1/10 scale that I'm printing. But, when/if I want to print a larger scale, they'll be there. I usually try to put switches in the OpenSCAD code to turn the details on/off when appropriate. The other thing my CDO* complains about though is seeing prints of presumably 'scale' models that don't get the basic shapes of the subject model correct. If it's going to take many hours to print, and you're going to print it (or expect others to print it) many times, isn't it worth just a few extra hours of CAD work to get the basic shape right? I can understand compromising on the dimensions when necessary, but getting the basic shape correct should be fundamental. Just me, I suppose. /mini-rant

* OCD in alphabetical order.

Fat-fingered upload attempt fixed:

Boost Fin Can protos.jpg
There's been no attempt to clean up those prints, just basically picked off the supports.


radar fin 7.JPG Ajax body1.JPG
 
Picture is consistent with my usual crummy photo efforts, but the part is nice!

Ajax body1 proto.jpg
 
Yes, this is still happening, albeit slowly.

For assembly of a practical model, I added an attachment tab to the Ajax Main Fin module, and I did it in a way that appears to work pretty neat. I added the following code to the end of the module Main_Fin () in the file Nike-Ajax main fin.scad

Code:
        Main_Fin_Tab (0);
        
    } // end rotate
} // end module Main Fin

// scaled for printing
//scale (v = [scale_factor, scale_factor, scale_factor]) Main_Fin ();


module Main_Fin_Tab (enlargement_delta = 0) {
    hull () {
        translate ([30, 0, 0]) cube (size = [20 + enlargement_delta, 1.0 + enlargement_delta, 3.0 + enlargement_delta], center = true);
        translate ([33, 0, 0]) cube (size = [55 + enlargement_delta, 0.5 + enlargement_delta, 2.0 + enlargement_delta], center = true);
    }   
}

module Main_Fin_Slot (enlargement_delta = 0.2) {
    // enlargement_delta = 0.2; mounting tab enlarged for slot in body
    rotate (a = [0, -90, 180]){ // normalize fin position
        Main_Fin_Tab (enlargement_delta);
    
    // needs the aileron actuator arm cutout too
        // needs the aileron actuator arm cutout too
        Main_Fin_Edge_Diameter = 0.679; // Bennett
        translate ([-Main_Fin_Edge_Diameter/2 + 0.2, 0, 0]) 
            cylinder (h = 0.5 + 0.4, d = Main_Fin_Edge_Diameter, center = true, $fn = 30);
    }   
}

The two lines commented out above (// scaled for printing... ) are what would be used if just the fin were being printed. But since this is now used in an upper level module, we don't want the Main_Fin module called here.

Within and at the end of the Main_Fin module, a call to Main_Fin_Tab () is added. Outside the Main_Fin module, but within this same .scad file, I've added the new module Main_Fin_Tab (). This module defines the tab as a hull of two cubes, creating a nice tapered tab that matches the fin thickness. Since this module is called from Main_Fin, that calling module does the job of rotating and scaling the tab properly. The Main_Fin_Tab module also has a parameter, enlargement_delta, that is normally set to zero. If used, this parameter simply bumps up all of the tab dimensions.

The last module is Main_Fin_Slot (). If I'm creating the Ajax body to be printed, I want it to have a slot where the fin goes, and that slot has to be sized and positioned perfectly to match the fin tab. So this module calls Main_Fin_Tab, with a 'bump' parameter to enlarge the slot slightly to fit the fin tab. By using only one definition for the tab, and thus the slot, I'm sure they're always in sync if I make any changes. And there is only one parameter to change to get the fit right. The last bit of this module is duplicating the lines from the Main_Fin module that describe the elevon actuator - it enters the body, so it needs a cutout hole too.

When creating the body section to be printed, Main_Fin_Slot is called as a difference subtraction from the body (instead of calling Main_Fin to display the fin). It's called and placed just as the fin would be, but it creates a perfectly sized and positioned slot.

Main Fin slot.JPG

The booster fin slots and tabs came out nicely, but I really need to go back and do them this way in the code.

Main fins are looking pretty good after several test prints:
main fin print test.jpg
 

Attachments

  • Bennett - Main Fin.JPG
    Bennett - Main Fin.JPG
    45.7 KB · Views: 36
  • Alway - main fin.JPG
    Alway - main fin.JPG
    37.1 KB · Views: 32
Back
Top