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 1515 times)

0 Members and 3 Guests are viewing this topic.

PL1

  • Global Moderator
  • Trade Count: (+1)
  • Full Member
  • *****
  • Offline Offline
  • Posts: 9685
  • Last login:Today at 04:03:19 pm
  • 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
  • *****
  • Offline Offline
  • Posts: 9685
  • Last login:Today at 04:03:19 pm
  • 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
  • *****
  • Offline Offline
  • Posts: 9685
  • Last login:Today at 04:03:19 pm
  • 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