Tailor’s Clapper: CNC Pocketing

Separating the interior contour of the finger grip from its overall shape let me reduce the woodworking to a simple pocketing operation:

Ironing Weight Finger Grip
Ironing Weight Finger Grip

Start by aligning the finished block to put the joint between the pieces parallel to the X axis, then touch off at the center:

Ironing Weight - alignment
Ironing Weight – alignment

A pair of clamps screwed to the tooling plate act as fixtures to align the block when it’s flipped over to mill the other pocket.

Just to see how it worked, I set up a GCMC program to produce a trochoidal milling pattern using the sample program:

Tailors Clapper - Pocket Milling Path
Tailors Clapper – Pocket Milling Path

Now, most folks would say the Sherline lacks enough speed and stiffness for trochoidal milling:

Ironing weight - trochoidal milling
Ironing weight – trochoidal milling

Aaaand I would agree with them: chugging along at 24 in/min = 600 mm/min doesn’t put the 10 k RPM spindle speed to good use. Fortunately, oak doesn’t require much in the way of machine stiffness and the trochoid path does ensure good chip clearance, so there’s that.

If I had to do a lot of trochoid milling, I’d tweak the GCMC sample code to short-cut the return path across the circle diameter, rather than air-cut the last half of every circumference.

The code starts by emptying a circular pocket so the trochoid path begins in clear air, rather than trenching into solid wood.

Eventually it finishes the pocket:

Ironing weight - grip pocket
Ironing weight – grip pocket

After the trochoid finishes, one climb-milling pass around the perimeter clears the little ripple between each trochoid orbit.

Flip it over, clamp it down, touch off the middle, and do it all again.

The next step is filling those pockets with a pair of comfy grips.

The GCMC source code as a GitHub Gist:

// Ironing weight pocketing
// Ed Nisley KE4ZNU - 2023-01
//-----
// Library routines
include("/opt/gcmc/example/cc_hole.inc.gcmc");
include("varcs.inc.gcmc");
include("tracepath_comp.inc.gcmc");
include("trochoidal.inc.gcmc");
/*
include("tracepath.inc.gcmc");
include("engrave.inc.gcmc");
*/
//-----
// Useful constants
SafeZ = 10.0mm; // above all obstructions
TravelZ = 2.0mm; // within engraving / milling area
BlockHome = [0.0mm,0.0mm,TravelZ]; // Origin on surface at center of pocket
FALSE = 0;
TRUE = !FALSE;
//-----
// Overall values
Socket = [160.0mm,25.0mm,7.0mm]; // raw grip recess into block
RoundEnds = TRUE; // TRUE for smooth rounded endcaps
SocketRadius = RoundEnds ? Socket.y/2 : 10.0mm;
comment("SocketRadius: ",SocketRadius);
CutterDia = 6.32mm - 0.15; // actual cutter diameter - windage
MillStep = 0.25 * CutterDia; // stepover in XY plane
comment("CutterDia: ",CutterDia," MillStep: ",MillStep);
MillClean = MillStep/2;
PlungeSpeed = 150.0mm; // cutter Z plunge into work
MillSpeed = 600.0mm; // XY speed
if (CutterDia > SocketRadius) {
error("Cutter too large for corner radius");
}
CornerOC = head(Socket,2) - 2*[SocketRadius,SocketRadius];
comment("CornerOC: ",CornerOC);
Corners = RoundEnds ? // rear left CCW around slot
{-CornerOC/2, CornerOC/2} :
{[-CornerOC.x,CornerOC.y]/2, [-CornerOC.x,-CornerOC.y]/2, [CornerOC.x,-CornerOC.y]/2, CornerOC/2};
comment("Corners: ", Corners);
if (RoundEnds) {
SlotPerimeter = {[0.0mm,Socket.y/2,-Socket.z]}; // entry point at center rear
SlotPerimeter += {Corners[0] + [0.0mm,SocketRadius]};
SlotPerimeter += varc_ccw([-SocketRadius,-SocketRadius],SocketRadius) + SlotPerimeter[-1];
SlotPerimeter += varc_ccw([+SocketRadius,-SocketRadius],SocketRadius) + (Corners[0] + [-SocketRadius,0.0mm]);
SlotPerimeter += {Corners[1] + [0.0mm,-SocketRadius]}; // across front
SlotPerimeter += varc_ccw([+SocketRadius,+SocketRadius],SocketRadius) + SlotPerimeter[-1];
SlotPerimeter += varc_ccw([-SocketRadius,+SocketRadius],SocketRadius) + (Corners[1] + [+SocketRadius,0.0mm]);
}
else {
SlotPerimeter = {[0.0mm,Socket.y/2,-Socket.z]}; // entry point at center rear
SlotPerimeter += {Corners[0] + [0.0mm,SocketRadius]};
SlotPerimeter += varc_ccw([-SocketRadius,-SocketRadius],SocketRadius) + SlotPerimeter[-1];
SlotPerimeter += {Corners[1] + [-SocketRadius,0.0mm]};
SlotPerimeter += varc_ccw([+SocketRadius,-SocketRadius],SocketRadius) + SlotPerimeter[-1];
SlotPerimeter += {Corners[2] + [0.0mm,-SocketRadius]}; // across front
SlotPerimeter += varc_ccw([SocketRadius,SocketRadius],SocketRadius) + SlotPerimeter[-1];
SlotPerimeter += {Corners[3] + [SocketRadius,0.0mm]};
SlotPerimeter += varc_ccw([-SocketRadius,SocketRadius],SocketRadius) + SlotPerimeter[-1];
}
//--- Begin cutting
goto([-,-,TravelZ]);
goto(BlockHome);
if (!RoundEnds) { // clear corners outward of main pocket
foreach(Corners; xy) {
comment("Plunge corner at: ",xy);
feedrate(PlungeSpeed);
goto(xy);
move([-,-,-Socket.z]);
comment(" pocket");
feedrate(MillSpeed);
cc_hole(xy,(SocketRadius - MillClean),CutterDia/2,MillStep,-Socket.z);
goto([-,-,TravelZ]);
comment(" done!");
}
}
comment("Open slot");
TrochRadius = (Socket.y - CutterDia)/2 - MillClean;
TrochPath = {[-(Socket.x/2 - TrochRadius - CutterDia/2 - MillStep),TrochRadius],
[ (Socket.x/2 - TrochRadius - CutterDia/2 - MillStep),TrochRadius]};
comment(" clear landing zone");
xy = [TrochPath[0].x,0.0mm];
feedrate(PlungeSpeed);
goto(xy);
move([-,-,-Socket.z]);
feedrate(MillSpeed);
cc_hole(xy,Socket.y/2 - MillClean,CutterDia/2,MillStep,-Socket.z);
goto([-,-,TravelZ]);
comment(" trochoid pocket milling");
feedrate(MillSpeed);
trochoid_move(TrochPath[0],TrochPath[1],
-Socket.z, TrochRadius, MillStep);
goto([-,-,TravelZ]);
comment("Clean slot perimeter");
feedrate(MillSpeed);
goto([-,-,-Socket.z]);
tracepath_comp(SlotPerimeter,CutterDia/2,TPC_CLOSED + TPC_LEFT + TPC_ARCIN + TPC_ARCOUT);
goto([-,-,TravelZ]);
goto(BlockHome);
#!/bin/bash
# Ironing weight finger grip pocketing
# Ed Nisley KE4ZNU - 2023-01
Flags='-P 4 --pedantic' # quote to avoid leading hyphen gotcha
# Set these to match your file layout
LibPath='/opt/gcmc/library'
Prolog='prolog.gcmc'
Epilog='epilog.gcmc'
#-----
gcmc $Flags \
--include "$LibPath" --prologue "$Prolog" --epilogue "$Epilog" \
"Ironing weight grip pocket.gcmc" > "Grip pocket.ngc"
view raw pocket.sh hosted with ❤ by GitHub

3 thoughts on “Tailor’s Clapper: CNC Pocketing

Spam comments get trashed, so don't bother. Comment moderation may cause a delay.

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s