Skip to content

Instantly share code, notes, and snippets.

@ednisley
Created February 16, 2025 16:57
Show Gist options
  • Save ednisley/5c0db067a2bfc3f259443c5e7159fd7b to your computer and use it in GitHub Desktop.
Save ednisley/5c0db067a2bfc3f259443c5e7159fd7b to your computer and use it in GitHub Desktop.
OpenSCAD source code: Track locking block for HQ Sixteeen
// HQ Sixteen - wheel track lock block
// Ed Nisley - KE4ZNU
// 2025-02-14
include <BOSL2/std.scad>
Layout = "Show"; // [Show,Build,Glue,Track,Block,Wheel]
/* [Hidden] */
ID = 0;
OD = 1;
LENGTH = 2;
Protrusion = 0.1;
Windage = 0.1;
WallThick = 5.0; // minimum wall thickness
RailOD = 5.5; // rounded top of rail
RailHeight = RailOD; // … flange to top
RailBase = [100,2*15.7 + RailOD,3]; // … Y = flange width, arbitrary X & Z
WheelOD = 38.0; // rail roller
WheelMinor = 6.2; // … rail recess
WheelWidth = 8.3 + 2*Windage; // … outer sides
WheelZ = RailHeight + (WheelOD - WheelMinor)/2; // axle centerline wrt rail flange
LockOC = 2.0*INCH; // engagement to lock recess
GripLength = 20.0;
BlockOA = [GripLength + WheelOD/2 + LockOC,WheelWidth + 2*WallThick,2*RailHeight];
BlockRadius = 2.0;
$fn = 12*3*4; // smooth outer perimeters
//----------
// Construct the pieces
module Track(Len = 2*BlockOA.x) {
zrot(90) back(Len/2) down(RailBase.z) xrot(90)
linear_extrude(height=Len,convexity=5)
rect([RailBase.y,RailBase.z],anchor=FRONT)
attach(BACK,FRONT) rect([RailOD,RailHeight - RailOD/2])
attach(BACK) circle(d=RailOD);
}
module Wheel(Len = WheelWidth) {
xrot(90)
difference() {
cylinder(d=WheelOD,h=Len,center=true);
torus(r_maj=WheelOD/2,d_min=WheelMinor);
}
}
module Block() {
difference() {
left(GripLength + WheelOD/2)
cuboid(BlockOA,anchor=LEFT + BOTTOM,rounding=BlockRadius,except=BOTTOM);
Track();
up(WheelZ) xrot(90)
cylinder(d=WheelOD,h=WheelWidth,center=true);
right(LockOC)
up(WheelZ - WheelOD/2) yrot(atan((RailHeight - WheelMinor/2)/LockOC))
cuboid([LockOC,WheelWidth,BlockOA.z],anchor=RIGHT+BOTTOM);
}
}
//----------
// Show & build the results
if (Layout == "Block" || Layout == "Build")
Block();
if (Layout == "Track")
Track();
if (Layout == "Wheel")
Wheel();
if (Layout == "Glue")
projection(cut=true)
Block();
if (Layout == "Show") {
color("SteelBlue")
Block();
for (i=[0,1])
right(i*LockOC)
color("Silver",0.7)
up(WheelZ) Wheel();
color("White",0.5)
Track();
}
@ednisley
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment