Advertisements

Archive for December 13th, 2013

Browning Hi-Power Magazine Capacity Reduction Block

Based on tweaking the measurements from the nut trap block trial, this block attaches to the inner floor plate of the magazine and reduces the magazine’s capacity to 10 rounds:

Browning Hi-Power Magazine Block - solid model - whole

Browning Hi-Power Magazine Block – solid model – whole

The horn fits between the follower’s pegs, so that chopping the pegs off won’t increase the magazine’s capacity. Chopping the horn off without modifying the follower won’t make any difference, either. As nearly as I can tell, chopping the pegs off the follower will destabilize it enough that it’ll roll over atop the spring, but I admit to not actually trying that.

The yellow comb supports the overhang that captures the tab around the magazine spring and there’s a tiny support spider inside the lower nut clearance that holds the ceiling in place:

Browning Hi-Power Magazine Block - solid model - section

Browning Hi-Power Magazine Block – solid model – section

The inner nut trap probably droops a bit without any support, but there’s no way to tell when it’s printed as one solid piece. That trap will hold the blob of steel-filled epoxy that secures the screw and helps prevent the block from turning, so it’s not really a nut trap and doesn’t require a precision fit. The vent tube from the top of the screw shaft gives the air and any excess epoxy an exit path.

Here’s a bottom view of two blocks, showing the support structures and the results:

Browning Hi-Power magazine - block support detail

Browning Hi-Power magazine – block support detail

I poked the tips of a snap ring pliers into the spider and twisted it out. The comb snaps off with fingernail pressure.

You could also print it without support by laying it flat, then glue the halves together with alignment pins. This is a bottom view:

Browning Hi-Power Magazine Block - solid model - split bottom

Browning Hi-Power Magazine Block – solid model – split bottom

The OpenSCAD program has a handful of configuration settings that determine which of those blocks it produces, which components appear, and how it’s oriented.

Installed in a Browning magazine, the block looks like this:

Browning Hi-Power magazine - block in place

Browning Hi-Power magazine – block in place

A detail of the bottom shows the notch capturing the spring tab:

Browning Hi-Power magazine - block detail

Browning Hi-Power magazine – block detail

I think the top surface would benefit from a small bevel to ease the spring around the block, but that’s in the nature of fine tuning.

Not having heard back from my legislators yet, I still don’t know whether this counts as a readily reversible modification. I have my doubts, what with it being plastic and all, but we shall see.

The OpenSCAD source code:

// Browning Hi-Power Magazine Block
// Ed Nisley KE4ZNU December 2013

Layout = "Whole";			// Show Whole Split
							//  Show = section view for demo, not for building
							//  Whole = upright for steel or plastic
							//  Split = laid flat for plastic show-n-tell assembly

AlignPins = (Layout == "Split");					// pins only for plastic show-n-tell

Support = (Layout != "Split");						// no support for split

//- Extrusion parameters must match reality!
//  Print with 2 shells and 3 solid layers

ThreadThick = 0.15;
ThreadWidth = 0.40;

HoleWindage = 0.2;

Protrusion = 0.1;			// make holes end cleanly

//----------------------
// Dimensions

Angle = 12.5;				// from vertical

SpringID = 10.3;			// magazine spring curvature (measure with drill shank)
SpringRadius = SpringID / 2;

Length = 24.0;				// front-to-back perpendicular to magazine shaft
Height = 18.0;				// bottom-to-top, parallel to magazine shaft
							//  18 = 10 round capacity

RectLength = Length - SpringID;	// block length between end radii

HornBaseOD = 8.0;			// fits between follower pegs to prevent shortening
HornTipOD = 5.0;
HornAddTip = (HornTipOD/2)*tan(Angle);
HornAddBase = (HornBaseOD/2)*tan(Angle);
HornAddLength = HornAddTip + HornAddBase + 2*Protrusion;
HornLength = 12.0;			// should recompute ODs, but *eh*

TrimHeight = 2.5;			// vertical clearance for spring clip on base plate
							//   OEM = 2.5
							//   generic A = 2.5

TrimInset = 1.5;			// ... horizontal
							//	 OEM = 0.0
							//   generic A = 1.5

ScrewOD = 3.0 - 0.25;		// screw hole dia - minimal thread engagement
ScrewLength = 11.0;
ScrewOffset = -1.5;			//   ... from centerline
							//  OEM = 0.0
							//  generic A = -1.5

NutOD = 5.6;				// hex nut dia across flats
NutThick = 2.4;				//  ... then add 50% to trap for thread engagement & epoxy
NutOffset = 6.0;			//  ... base height from floor

VentDia = 2.0;				// air vent from back of screw recess

PinOD = 1.72;				// alignment pins
PinLength = 6.0;
PinInset = 0.6*SpringRadius;	// from outside edges
echo(str("Alignment pin length: ",PinLength));

NumSides = 8*4;				// default cylinder sides

Offset = 5.0/2;				// from centerline for build layout

//----------------------
// Useful routines

function Delta(a,l) = l*tan(a);				// incremental length due to angle

// Locating pin hole with glue recess
//  Default length is two pin diameters on each side of the split

module LocatingPin(Dia=PinOD,Len=0.0) {

	PinLen = (Len != 0.0) ? Len : (4*Dia);

	translate([0,0,-ThreadThick])
		PolyCyl((Dia + 2*ThreadWidth),2*ThreadThick,4);

	translate([0,0,-2*ThreadThick])
		PolyCyl((Dia + 1*ThreadWidth),4*ThreadThick,4);

	translate([0,0,-(Len/2 + ThreadThick)])
		PolyCyl(Dia,(Len + 2*ThreadThick),4);

}

module PolyCyl(Dia,Height,ForceSides=0) {			// based on nophead's polyholes

  Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);

  FixDia = Dia / cos(180/Sides);

  cylinder(r=(FixDia + HoleWindage)/2,
           h=Height,
	   $fn=Sides);
}

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])
		translate([x*Space,y*Space,Size/2])
		  %cube(Size,center=true);

}

//----------------------
// The magazine block

module Block(SectionSelect = 0) {

CropHeight = Height*cos(Angle);				// block height perpendicular to base
echo(str("Perpendicular height: ",CropHeight));

	difference() {
		union() {
			intersection() {
				rotate([Angle,0,0])
					hull() {
						for (i=[-1,1])
							translate([0,i*RectLength/2,-((Length/2)*sin(Angle) + Protrusion)])						cylinder(r=SpringRadius,
										h=(Height + 2*(Length/2)*sin(Angle) + 2*Protrusion),
										$fn=NumSides);
					}
				translate([0,0,CropHeight/2])
					cube([2*SpringID,3*Length,CropHeight],center=true);
			}
			translate([0,-Height*sin(Angle),Height*cos(Angle)])
				resize([SpringID,0,0])
					intersection() {
						rotate([Angle,0,0])
							translate([0,0,-(HornAddBase + Protrusion)])
								cylinder(r1=HornBaseOD/2,
										r2=HornTipOD/2,
										h=(HornLength + HornAddLength + Protrusion),
										$fn=NumSides);
					cube([2*SpringID,Length,2*(HornLength*cos(Angle) + Protrusion)],center=true);
				}
		}

		translate([0,ScrewOffset,-Protrusion])		// screw
			rotate(180/6)
				PolyCyl(ScrewOD,(ScrewLength + Protrusion),6);

		translate([0,ScrewOffset,NutOffset])		// nut trap in center
			rotate(180/6)
				PolyCyl(NutOD,1.5*NutThick,6);

		translate([0,ScrewOffset,-Protrusion])		// nut clearance at base
			rotate(180/6)
				PolyCyl(NutOD,(1.1*NutThick + Protrusion),6);

		translate([SpringID/2,-((Length/2)/cos(Angle) - TrimInset),-Protrusion])
			rotate(180)
				cube([SpringID,2*TrimInset,(TrimHeight + Protrusion)],center=false);

		if (AlignPins)								// alignment pins
			for (i=[-1,1])
				rotate([Angle,0,0])
				translate([0,
							(i*((Length/2)*cos(Angle) - PinInset)),
							(CropHeight/2 - i*2*PinInset)])
					rotate([0,90,0]) rotate(45 - Angle)
						LocatingPin(PinOD,PinLength);

		translate([0,(ScrewOffset - NutOD),-Protrusion])	// air vent
			rotate(180/8)
				PolyCyl(VentDia,(ScrewLength + Protrusion),8);
		translate([0,(ScrewOffset + VentDia/2),ScrewLength])
			rotate([90,0,0]) rotate(180/8)
				PolyCyl(VentDia,(NutOD + VentDia),8);

		if (SectionSelect == 1)
			translate([0*SpringID,-2*Length,-Protrusion])
				cube([2*SpringID,4*Length,(Height + HornLength + 2*Protrusion)],center=false);
		else if (SectionSelect == -1)
			translate([-2*SpringID,-2*Length,-Protrusion])
				cube([2*SpringID,4*Length,(Height + HornLength + 2*Protrusion)],center=false);

	}

	NumBars = floor((SpringID/2)/(5*ThreadWidth));

	if (Support) {									// add support structures
		for (i = [-NumBars:NumBars])
			translate([i*5*ThreadWidth,
					   -((Length/2)/cos(Angle) + TrimInset/2 + ThreadWidth),
					   (TrimHeight - ThreadThick)/2])
				color("Yellow")
				cube([(2*ThreadWidth),(3*TrimInset),(TrimHeight - ThreadThick)],center=true);

		translate([-SpringID/2,-((Length/2)/cos(Angle) + 2*TrimInset + ThreadWidth),0])
			color("Yellow")
			cube([SpringID,(2*ThreadWidth),(TrimHeight - ThreadThick)],center=false);

		translate([0,ScrewOffset,0])
			for (j=[0:5]) {
			rotate(30 + 360*j/6)
				translate([(NutOD/2 - ThreadWidth)/2,0,(1.1*NutThick - ThreadThick)/2])
					color("Yellow")
					cube([(NutOD/2 - ThreadWidth),
						  (2*ThreadWidth),
						  (1.1*NutThick - ThreadThick)],
						  center=true);
        }
	}

}

//-------------------
// Build it...

ShowPegGrid();

if (Layout == "Show")
	Block(1);

if (Layout == "Whole")
	Block(0);

if (Layout ==  "Split") {
	translate([(Offset + Length/2),Height/2,0])
		rotate(90) rotate([0,-90,-Angle])
			Block(-1);
	translate([-(Offset + Length/2),Height/2,0])
		rotate(-90) rotate([0,90,Angle])
			Block(1);
}
Advertisements

,

6 Comments