Build Your Own Arcade Controls Forum
Main => Project Announcements => Topic started by: PL1 on August 17, 2025, 02:34:42 pm
-
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.
// 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.
(https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397958;image)
Download link for OpenSCAD and .STL files:
Countersunk v1.0 - https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397959 (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 (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.
-
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 (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:
// 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):
// 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:
(https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397963;image)
25 degree test print currently in progress.
Scott
-
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.
(https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=397965;image)
Scott
-
Yoke and 25 degree test print mounted on scrap 1/2" plywood using 1/4"-20 x 1-1/2" carriage bolts.
(https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=398010;image)
(https://forum.arcadecontrols.com/index.php?action=dlattach;topic=164992.0;attach=398011;image)
Scott