Main Restorations Software Audio/Jukebox/MP3 Everything Else Buy/Sell/Trade
Project Announcements Monitor/Video GroovyMAME Merit/JVL Touchscreen Meet Up Retail Vendors
Driving & Racing Woodworking Software Support Forums Consoles Project Arcade Reviews
Automated Projects Artwork Frontend Support Forums Pinball Forum Discussion Old Boards
Raspberry Pi & Dev Board controls.dat Linux Miscellaneous Arcade Wiki Discussion Old Archives
Lightguns Arcade1Up Try the site in https mode Site News

Unread posts | New Replies | Recent posts | Rules | Chatroom | Wiki | File Repository | RSS | Submit news

  

Author Topic: 3d Printed Star Wars Yoke Mounts -- Countersunk and Standalone  (Read 4079 times)

0 Members and 3 Guests are viewing this topic.

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Online Online
  • Posts: 9707
  • Last login:Today at 04:30:02 am
  • Designated spam hunter
Here's a v1.0 OpenSCAD model for a panel mount countersunk SW yoke mount with a drill/cutout template.
- The base is 180mm wide x 200mm deep and the mount is 115mm tall.
- The mount is high enough that when the front housing of the yoke is turned 45 degrees, it will still clear the control panel.
- The gears only stick out about 1.5" below the mount.
- This version is a fixed 45 degree angle.  I could remix it into a variable angle version if there's any interest.
- Use 1/4"-20 x 1-1/2" carriage bolts for mounting hardware.

Code: [Select]
// SW Yoke Countersunk Mount for Alan-1 yoke v1.0.

/////////////////////////////
//  Define the variables
/////////////////////////////

    // Housing variables
RoundoverDia = 10; // Edge roundover diameter

SideThick = 3.2; // Side thickness

VertZ = 15; // Vertical front/back panel height
HousingX = 140; // Housing width
HousingY = 200; // Housing depth
HousingZ = VertZ + (HousingY/2); // Overall housing height

MountOffsetY = 70; // Mount distance from front edge

BaseX = 180;  // Overall base width
BaseY = 200;  // Overall base depth
BaseZ = 6;    // Overall base height
BaseBolt = 7; // Base carriage bolt hole size
BaseBoltInset = 10; // Base carriage bolt hole inset distance


// 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 modules

module FlangeHoles(){ //

    translate([BaseBoltInset, BaseBoltInset, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front left flange carriage bolt hole

    translate([BaseX - BaseBoltInset, BaseBoltInset, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front right flange carriage bolt hole

    translate([BaseX - BaseBoltInset, BaseY - BaseBoltInset, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back right flange carriage bolt hole

    translate([BaseBoltInset, BaseY - BaseBoltInset, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back left flange carriage bolt hole

} //
//


module YokeMount(){ //Yoke mount module -- 76x90 main hole, 90x90 8mm screw holes

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([45, 0, 0])
    translate([0, MountOffsetY, 0])
    cube ([76, 90, SideThick*4], center=true);// 76x90 main hole

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([45, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 1

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([45, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 2

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([45, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 3

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([45, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 4

} // End YokeMount module
//

module DrillTemplate(){ // Drill template module

    difference(){ // Drill plate minus carriage bolt holes and yoke mechanism hole

        hull (){ // Drill plate hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front left base

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front right base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back right base

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back left base

        } // End Drill plate hull
//

        FlangeHoles(); // Carriage bolt holes

        translate([BaseX/2 + 14.5, RoundoverDia/2, VertZ])
        rotate([45, 0, 0])
        translate([0, MountOffsetY, -70])
        cube ([105, 70, 150], center=true); // Yoke mechanism hole

        translate([BaseX/2, 20, 1])
        Label("Player");  // Call the label module for Player

    } // End drill plate minus carriage bolt holes and yoke mechanism hole
//

} // End Drill Template module
//

module Label(letter, size=12) {
        rotate ([0, 0, 0]) {
            color("black")
            linear_extrude(height=1 + 0.01, convexity=4)
                text(letter,
                     size=size*22/30,
                     font="Bitstream Vera Sans",
                     halign="center",
                     valign="center");
        }
} // End Label module
  //


/////////////////////////////
//  Make the part
/////////////////////////////

translate([-BaseX - 30, 0, 0])
DrillTemplate(); // Make drill template

difference (){ // Difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes


    union (){ // Union base flange and housing outer hull


        hull (){ // Base flange hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front left base

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front right base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back right base

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back left base

            translate([BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
        // Front left middle

            translate([BaseX - BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
        // Front right middle

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
        // Back right middle

            translate([BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
        // Back left middle

        } // End base flange hull
//


        hull (){ // Housing outer hull

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
        // Front left base

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
        // Front right base

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
        // Back right base

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
        // Back left base

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
        // Front left middle

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
        // Front right middle

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
        // Back right middle

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
        // Back left middle

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY/2, HousingZ - RoundoverDia/2])
            sphere (d=RoundoverDia);
        // Top left

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY/2, HousingZ - RoundoverDia/2])
            sphere (d=RoundoverDia);
        // Top right

        } // End housing outer hull
//


    } // End union base flange and housing outer hull
//


    hull (){ // Housing inner hull

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front left base

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front right base

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back right base

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back left base

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front left middle

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front right middle

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back right middle

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back left middle

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY/2, HousingZ - RoundoverDia/2])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top left

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY/2, HousingZ - RoundoverDia/2])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top right

    } // End housing inner hull
//

    YokeMount(); // Yoke mount

    FlangeHoles(); // Base flange carriage bolt holes

} // End difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes
//


// Test cube yoke mechanism 76x90x150
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([45, 0, 0])
translate([0, MountOffsetY, -70])
color("red")
*cube ([76, 90, 151], center=true);

// Test cube mount plate footprint
Clearance = 0; // Offset to check clearance for yoke front housing rotation. 0 = yoke centered.  30 = yoke turned 45 degrees)
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([45, 0, 0])
translate([0, MountOffsetY - Clearance, RoundoverDia/2-0.2])
color("blue")
*cube ([120, 120, 02.01], center=true);

// Test carriage bolt cylinder
translate([BaseBoltInset, BaseBoltInset, BaseZ/2])
color("white")
*cylinder (BaseZ + 4, d = (14.4), center=true);

When assembling the mount, connect the yoke to the mount then connect the mount to the panel.



Download link for OpenSCAD and .STL files:
Countersunk v1.0 - https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397959
Countersunk v1.1 - https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397964


The standalone version is almost done.  Will post it after doing a test print.


Scott
EDIT: Updated D/L link.
« Last Edit: August 20, 2025, 05:27:18 pm by PL1 »

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Online Online
  • Posts: 9707
  • Last login:Today at 04:30:02 am
  • Designated spam hunter
Re: 3d Printed Star Wars Yoke Mounts -- Countersunk and Standalone
« Reply #1 on: August 20, 2025, 05:23:22 pm »
Updated Countersunk Mount to v1.1 -- The .zip file contains the OpenSCAD files for 45 and 25 degree mounts/drill templates and .STL files.
https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397964.
- Fixed several minor code errors.
- Added variable "BaseBoltInsetY" to move the carriage bolt holes closer to the center of the mount's Y-axis.
- Added variable "MountAngle" for the yoke mount.  Default is 45 degrees minus the angle of the control panel.
- Made a 25 degree version for Telengard since he has a steep 20 degree pitch on his control panel. (45-20=25)

Countersunk Mount v 1.1:
Code: [Select]
// SW Yoke Countersunk Mount for Star Wars or Alan-1 yoke v1.1.

// Use the template to drill holes one at a time.  Put a 1/4"-20 carriage bolt into each hole after you drill it to ensure proper alignment.  After all four holes are drilled, cut the hole for the yoke mechanism.

// Attach the yoke to the mount then use 1/4"-20 x 1-1/2" carriage bolts to attach the mount to the control panel.

/////////////////////////////
//  Define the variables
/////////////////////////////

    // Housing variables
RoundoverDia = 10;  // Edge roundover diameter

SideThick = 3.2;    // Side thickness

VertZ = 15;         // Vertical front/back panel height
HousingX = 140;     // Housing width
HousingY = 200;     // Housing depth

MountAngle = 45;    // Angle of the face where the yoke is attached -- usually 45 minus the angle of the control panel
MountOffsetY = 70;  // Mount distance from front edge

BaseX = 180;        // Overall base width
BaseZ = 4;          // Base flange thickness
BaseBolt = 7;       // Base carriage bolt hole size
BaseBoltInset = 10; // Base carriage bolt hole inset distance from corner
BaseBoltInsetY = 0; // Base carriage bolt hole additional Y-axis inset distance (moves holes closer to center)


// 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 modules

module FlangeHoles(){ //

    translate([BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front left flange carriage bolt hole

    translate([BaseX - BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front right flange carriage bolt hole

    translate([BaseX - BaseBoltInset, HousingY - BaseBoltInset - BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back right flange carriage bolt hole

    translate([BaseBoltInset, HousingY - BaseBoltInset - BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back left flange carriage bolt hole

} //
//


module YokeMount(){ //Yoke mount module -- 76x90 main hole, 90x90 8mm screw holes

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 0])
    cube ([76, 90, SideThick*4], center=true);// 76x90 main hole

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 1

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 2

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 3

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 4

} // End YokeMount module
//

module DrillTemplate(){ // Drill template module

    difference(){ // Drill plate minus carriage bolt holes, yoke mechanism hole, and player label

        hull (){ // Drill plate hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front left drill plate corner

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front right drill plate corner

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back right drill plate corner

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back left drill plate corner

        } // End drill plate hull
//

        FlangeHoles(); // Drill plate carriage bolt holes

        translate([BaseX/2 + 14.5, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, MountOffsetY, -70])
        cube ([105, 70, 150], center=true); // Drill plate yoke mechanism hole

        translate([BaseX/2, 20, 1])
        Label("Player");  // Call the label module for Player on the drill plate

    } // End drill plate minus carriage bolt holes, yoke mechanism hole, and player label
//

} // End Drill Template module
//

module Label(letter, size=12) {
        rotate ([0, 0, 0]) {
            color("black")
            linear_extrude(height=1 + 0.01, convexity=4)
                text(letter,
                     size=size*22/30,
                     font="Bitstream Vera Sans",
                     halign="center",
                     valign="center");
        }
} // End Label module
  //


/////////////////////////////
//  Make the part
/////////////////////////////

translate([-BaseX - 30, 0, 0])
DrillTemplate(); // Make drill template

difference (){ // Difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes

    union (){ // Union base flange and housing outer hull

        hull (){ // Base flange hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Front left base

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Front right base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Back right base

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Back left base

            translate([BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Front left middle base

            translate([BaseX - BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Front right middle base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Back right middle base

            translate([BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Back left middle base

        } // End base flange hull
//

        hull (){ // Housing outer hull

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Front left base outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Front right base outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Back right base outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Back left base outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Front left middle outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Front right middle outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Back right middle outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Back left middle outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
            rotate([MountAngle, 0, 0])
            translate([0, 135, 0])
            sphere (d=RoundoverDia);
            // Top left outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
            rotate([MountAngle, 0, 0])
            translate([0, 135, 0])
            sphere (d=RoundoverDia);
            // Top right outer

        } // End housing outer hull
//

    } // End union base flange and housing outer hull
//

    hull (){ // Housing inner hull

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front left base inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front right base inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back right base inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back left base inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front left middle inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front right middle inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back right middle inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back left middle inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, 135, 0])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top left inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, 135, 0])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top right inner

    } // End housing inner hull
//

    YokeMount(); // Yoke mount

    FlangeHoles(); // Base flange carriage bolt holes

} // End difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes
//


// Test cube yoke mechanism 76x90x150
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([MountAngle, 0, 0])
translate([0, MountOffsetY, -70])
color("red")
*cube ([76, 90, 151], center=true);

// Test cube mount plate footprint
Clearance = 0; // Offset to check clearance for yoke front housing rotation. 0 = yoke centered.  30 = yoke turned 45 degrees)
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([MountAngle, 0, 0])
translate([0, MountOffsetY - Clearance, RoundoverDia/2-0.2])
color("blue")
*cube ([120, 120, 2.01], center=true);

// Test carriage bolt cylinder
translate([BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ])
color("white")
*cylinder (6, d = (14.4), center=true);

Telengard 25 degree version with shorter Y-axis (200==>165mm) and closer carriage bolts (180==>115mm center-to-center):
Code: [Select]
// SW Yoke Countersunk Mount for Star Wars or Alan-1 yoke v1.1.

// Use the template to drill holes one at a time.  Put a 1/4"-20 carriage bolt into each hole after you drill it to ensure proper alignment.  After all four holes are drilled, cut the hole for the yoke mechanism.

// Attach the yoke to the mount then use 1/4"-20 x 1-1/2" carriage bolts to attach the mount to the control panel.

/////////////////////////////
//  Define the variables
/////////////////////////////

    // Housing variables
RoundoverDia = 10;  // Edge roundover diameter

SideThick = 3.2;    // Side thickness

VertZ = 15;         // Vertical front/back panel height
HousingX = 140;     // Housing width
HousingY = 165;     // Housing depth

MountAngle = 25;    // Angle of the face where the yoke is attached -- usually 45 minus the angle of the control panel
MountOffsetY = 70;  // Mount distance from front edge

BaseX = 180;        // Overall base width
BaseZ = 4;          // Base flange thickness
BaseBolt = 7;       // Base carriage bolt hole size
BaseBoltInset = 10; // Base carriage bolt hole inset distance from corner
BaseBoltInsetY = 15; // Base carriage bolt hole additional Y-axis inset distance (moves holes closer to center)


// 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 modules

module FlangeHoles(){ //

    translate([BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front left flange carriage bolt hole

    translate([BaseX - BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Front right flange carriage bolt hole

    translate([BaseX - BaseBoltInset, HousingY - BaseBoltInset - BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back right flange carriage bolt hole

    translate([BaseBoltInset, HousingY - BaseBoltInset - BaseBoltInsetY, BaseZ/2])
    cube ([BaseBolt, BaseBolt, BaseZ + 0.1], center=true); // Back left flange carriage bolt hole

} //
//


module YokeMount(){ //Yoke mount module -- 76x90 main hole, 90x90 8mm screw holes

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 0])
    cube ([76, 90, SideThick*4], center=true);// 76x90 main hole

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 1

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, 45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 2

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 3

    translate([BaseX/2, RoundoverDia/2, VertZ])
    rotate([MountAngle, 0, 0])
    translate([0, MountOffsetY, 1])
    translate([-45, -45, 0])
    cylinder (SideThick*4, d = 8, center=true); // Yoke screw hole 4

} // End YokeMount module
//

module DrillTemplate(){ // Drill template module

    difference(){ // Drill plate minus carriage bolt holes, yoke mechanism hole, and player label

        hull (){ // Drill plate hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front left drill plate corner

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Front right drill plate corner

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back right drill plate corner

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
        // Back left drill plate corner

        } // End drill plate hull
//

        FlangeHoles(); // Drill plate carriage bolt holes

        translate([BaseX/2 + 14.5, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, MountOffsetY, -70])
        cube ([105, 70, 150], center=true); // Drill plate yoke mechanism hole

        translate([BaseX/2, 20, 1])
        Label("Player");  // Call the label module for Player on the drill plate

    } // End drill plate minus carriage bolt holes, yoke mechanism hole, and player label
//

} // End Drill Template module
//

module Label(letter, size=12) {
        rotate ([0, 0, 0]) {
            color("black")
            linear_extrude(height=1 + 0.01, convexity=4)
                text(letter,
                     size=size*22/30,
                     font="Bitstream Vera Sans",
                     halign="center",
                     valign="center");
        }
} // End Label module
  //


/////////////////////////////
//  Make the part
/////////////////////////////

translate([-BaseX - 30, 0, 0])
DrillTemplate(); // Make drill template

difference (){ // Difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes

    union (){ // Union base flange and housing outer hull

        hull (){ // Base flange hull

            translate([BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Front left base

            translate([BaseX - BaseZ/2, BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Front right base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Back right base

            translate([BaseZ/2, HousingY - BaseZ/2, 1])
            cylinder (2, d = BaseZ, center=true);
            // Back left base

            translate([BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Front left middle base

            translate([BaseX - BaseZ/2, BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Front right middle base

            translate([BaseX - BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Back right middle base

            translate([BaseZ/2, HousingY - BaseZ/2, BaseZ/2])
            sphere (d=BaseZ);
            // Back left middle base

        } // End base flange hull
//

        hull (){ // Housing outer hull

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Front left base outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Front right base outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Back right base outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 1])
            cylinder (2, d = RoundoverDia, center=true);
            // Back left base outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Front left middle outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Front right middle outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Back right middle outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
            sphere (d=RoundoverDia);
            // Back left middle outer

            translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
            rotate([MountAngle, 0, 0])
            translate([0, 135, 0])
            sphere (d=RoundoverDia);
            // Top left outer

            translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
            rotate([MountAngle, 0, 0])
            translate([0, 135, 0])
            sphere (d=RoundoverDia);
            // Top right outer

        } // End housing outer hull
//

    } // End union base flange and housing outer hull
//

    hull (){ // Housing inner hull

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front left base inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Front right base inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back right base inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, 0.9])
        cylinder (2, d = RoundoverDia - (SideThick * 2), center=true);
        // Back left base inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front left middle inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Front right middle inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back right middle inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, HousingY - RoundoverDia/2, VertZ])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Back left middle inner

        translate([BaseX/2 - HousingX/2 + RoundoverDia/2, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, 135, 0])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top left inner

        translate([BaseX/2 + HousingX/2 - RoundoverDia/2, RoundoverDia/2, VertZ])
        rotate([MountAngle, 0, 0])
        translate([0, 135, 0])
        sphere (d=RoundoverDia - (SideThick * 2));
        // Top right inner

    } // End housing inner hull
//

    YokeMount(); // Yoke mount

    FlangeHoles(); // Base flange carriage bolt holes

} // End difference of union of base flange and housing outer hull minus housing inner hull, yoke mount, and carriage bolt holes
//


// Test cube yoke mechanism 76x90x150
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([MountAngle, 0, 0])
translate([0, MountOffsetY, -70])
color("red")
*cube ([76, 90, 151], center=true);

// Test cube mount plate footprint
Clearance = 0; // Offset to check clearance for yoke front housing rotation. 0 = yoke centered.  30 = yoke turned 45 degrees)
translate([BaseX/2, RoundoverDia/2, VertZ])
rotate([MountAngle, 0, 0])
translate([0, MountOffsetY - Clearance, RoundoverDia/2-0.2])
color("blue")
*cube ([120, 120, 2.01], center=true);

// Test carriage bolt cylinder
translate([BaseBoltInset, BaseBoltInset + BaseBoltInsetY, BaseZ])
color("white")
*cylinder (6, d = (14.4), center=true);

25 degree mount:



25 degree test print currently in progress.


Scott

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Online Online
  • Posts: 9707
  • Last login:Today at 04:30:02 am
  • Designated spam hunter
Re: 3d Printed Star Wars Yoke Mounts -- Countersunk and Standalone
« Reply #2 on: August 22, 2025, 01:47:41 am »
25 degree test print worked great.
- Perfect fit.
- Gears/wiring only sticks out about 3.5" below the mount.

A question came up via PM about calculating the mount angle on a tilted control panel.
- Red plus yellow equals orange.
- Yellow is the variable "MountAngle" in the OpenSCAD code.




Scott

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Online Online
  • Posts: 9707
  • Last login:Today at 04:30:02 am
  • Designated spam hunter
Re: 3d Printed Star Wars Yoke Mounts -- Countersunk and Standalone
« Reply #3 on: August 24, 2025, 11:59:26 pm »
Yoke and 25 degree test print mounted on scrap 1/2" plywood using 1/4"-20 x 1-1/2" carriage bolts.






Scott

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Online Online
  • Posts: 9707
  • Last login:Today at 04:30:02 am
  • Designated spam hunter
Re: 3d Printed Star Wars Yoke Mounts -- Countersunk and Standalone
« Reply #4 on: Yesterday at 05:22:55 pm »
Telengard used the countersunk mount on his cab with swappable panels.

He says that the template makes the jigsaw cuts easy and the mount works great.

Pic posted with his permission.




Scott