I redesigned those fins to fit 16 gram threaded CO2 cartridges in PLA on the M2:

The original intent was to have both the square box and the internal X struts be exactly two threads wide, but the two fins on the sides show slic3r had some trouble doing that. I finally made them wide enough for a little fill, which produced the rather chunky version attached to the capsule.
A closer look while printing shows the fin width:

It was actually a present to go along with a box of the capsules, so I printed just one in a bit of a hurry. He probably couldn’t get them back across the border, but it’s the thought that counts, right?
The slic3r header:
; generated by Slic3r 0.9.8 on 2013-04-04 at 20:53:07 ; layer_height = 0.25 ; perimeters = 1 ; top_solid_layers = 3 ; bottom_solid_layers = 3 ; fill_density = 0.10 ; perimeter_speed = 100 ; infill_speed = 200 ; travel_speed = 500 ; scale = 1 ; nozzle_diameter = 0.35 ; filament_diameter = 1.70 ; extrusion_multiplier = 0.9 ; perimeters extrusion width = 0.40mm ; infill extrusion width = 0.40mm ; first layer extrusion width = 0.39mm
The OpenSCAD source has dimensions for various capsules as commented-out cruft, so your mileage may vary:
// CO2 capsule tail fins
// Ed Nisley KE4ZNU - Apr 2013
Layout = "Build"; // Show Build FinBlock Cartridge Fit
//-------
//- Extrusion parameters must match reality!
// Print with +0 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 0.40;
HoleWindage = 0.2;
Protrusion = 0.1; // make holes end cleanly
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
//-------
// Capsule dimensions
//- 12 gram capsule
/*
BodyDia = 18.70;
BodyRad = BodyDia/2;
BodyLength = 53.0; // between hemispherical endcap centers
BodyBaseLength = 21; // tip to endcap center
TipDia = 7.40;
TipRad = TipDia/2;
TipLength = IntegerMultiple(4.0,ThreadThick);
FilletLength = 5.0; // fillet between tip and cone
FilletTop = TipLength + FilletLength;
FilletBaseDia = 8.60;
FilletBaseRad= FilletBaseDia/2;
FilletTopDia = 9.5;
FilletTopRad = FilletTopDia/2;
ConeTop = 16.0; // tip to tangent with endcap
ConeLength = ConeTop - FilletTop;
*/
//- 16 gram capsule
/*-- unthreaded
BodyDia = 22.0;
BodyRad = BodyDia/2;
BodyLength = 53.0; // between hemispherical endcap centers
BodyBaseLength = 27; // tip to endcap center
TipDia = 8.30;
TipRad = TipDia/2;
TipLength = IntegerMultiple(7.4,ThreadThick);
FilletLength = 8.3; // fillet between tip and cone
FilletTop = TipLength + FilletLength;
FilletBaseDia = 8.6;
FilletBaseRad= FilletBaseDia/2;
FilletTopDia = 18.1;
FilletTopRad = FilletTopDia/2;
ConeTop = 23.0; // tip to tangent with endcap
ConeLength = ConeTop - FilletTop;
*/
/*-- threaded */
BodyDia = 22.0;
BodyRad = BodyDia/2;
BodyLength = 53.0; // between hemispherical endcap centers
BodyBaseLength = 27; // tip to endcap center
TipDia = 9.4;
TipRad = TipDia/2;
TipLength = IntegerMultiple(12.0,ThreadThick);
FilletLength = 5.0; // fillet between tip and cone
FilletTop = TipLength + FilletLength;
FilletBaseDia = TipDia;
FilletBaseRad= FilletBaseDia/2;
FilletTopDia = 15.1;
FilletTopRad = FilletTopDia/2;
ConeTop = 23.0; // tip to tangent with endcap
ConeLength = ConeTop - FilletTop;
echo(str("Cone Length: ",ConeLength));
IntersectZ = ConeTop; // coordinates of intersect tangent
IntersectX = sqrt(pow(BodyRad,2) - pow(BodyBaseLength - ConeTop,2));
echo(str("IntersectZ: ",IntersectZ));
echo(str("IntersectX: ",IntersectX," dia: ",2*IntersectX));
/* */
//-------
// Fin dimensions
FinThick = 2*ThreadWidth; // outer square
StrutThick = 3*ThreadWidth; // diagonal struts
FinSquare = 1.25*BodyDia;
FinTaperLength = sqrt(2)*FinSquare/2 - sqrt(2)*FinThick - ThreadWidth;
FinBaseLength = 1.5*TipLength;
FinFlatTop = ConeTop;
//-------
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);
}
//-------
// CO2 cartridge outline
module Cartridge() {
$fn = 48;
union() {
translate([0,0,BodyBaseLength]) {
cylinder(r=BodyDia/2,h=BodyLength);
translate([0,0,BodyLength])
sphere(r=BodyRad);
}
intersection() {
translate([0,0,BodyBaseLength])
sphere(r=BodyRad);
union() {
translate([0,0,(TipLength + FilletLength+ConeLength)])
cylinder(r=BodyRad,h=(BodyBaseLength - ConeLength));
translate([0,0,(TipLength + FilletLength)])
cylinder(r1=FilletTopRad,r2=IntersectX,h=(ConeLength + Protrusion));
translate([0,0,TipLength])
cylinder(r1=FilletBaseRad,r2=FilletTopRad,h=(FilletLength + Protrusion));
}
}
translate([0,0,FilletTop])
cylinder(r1=FilletTopRad,r2=IntersectX,h=ConeLength);
translate([0,0,TipLength])
cylinder(r1=FilletBaseRad,r2=FilletTopRad,h=(FilletLength + Protrusion));
translate([0,0,-Protrusion])
PolyCyl(TipDia,(TipLength + 2*Protrusion));
}
}
//-------
// Diagonal fin strut
module FinStrut() {
intersection() {
rotate([90,0,45])
translate([0,0,-StrutThick/2])
linear_extrude(height=StrutThick)
polygon(points=[
[0,0],
[FinTaperLength,0],
[FinTaperLength,FinBaseLength],
[0,(FinBaseLength + FinTaperLength)]
]);
translate([0,0,FinFlatTop/2])
cube([2*FinSquare,2*FinSquare,FinFlatTop], center=true);
}
}
//-------
// Fin outline
module FinBlock() {
$fn=12;
union() {
translate([0,0,FinBaseLength/2])
difference() {
intersection() {
minkowski() {
cube([FinSquare - 2*ThreadWidth,
FinSquare - 2*ThreadWidth,
FinBaseLength],center=true);
cylinder(r=FinThick,h=Protrusion,$fn=8);
}
cube([2*FinSquare,2*FinSquare,FinBaseLength],center=true);
}
difference() {
cube([(FinSquare - 2*FinThick),
(FinSquare - 2*FinThick),
(FinBaseLength + 2*Protrusion)],center=true);
for (Index = [0:3])
rotate(Index*90)
translate([(FinSquare/2 - FinThick),(FinSquare/2 - FinThick),0])
cylinder(r=2*StrutThick,h=(FinBaseLength + 2*Protrusion),center=true,$fn=16);
}
}
for (Index = [0:3])
rotate(Index*90)
FinStrut();
cylinder(r=IntegerMultiple(TipDia/2 + 4*ThreadWidth,ThreadWidth),h=TipLength);
}
}
//-------
// Fins
module FinAssembly() {
difference() {
FinBlock();
translate([0,0,2*ThreadThick]) // add two layers to close base cylinder
Cartridge();
}
}
module FinFit() {
translate([0,0.75*BodyBaseLength,2*ThreadThick])
rotate([90,0,0])
difference() {
translate([-FinSquare/2,-2*ThreadThick,0])
cube([IntegerMultiple(FinSquare,ThreadWidth),
4*ThreadThick,
1.5*BodyBaseLength]);
translate([0,0,5*ThreadWidth])
Cartridge();
}
}
//-------
// Build it!
ShowPegGrid();
if (Layout == "FinStrut")
FinStrut();
if (Layout == "FinBlock")
FinBlock();
if (Layout == "Cartridge")
Cartridge();
if (Layout == "Show") {
FinAssembly();
color("LightYellow") Cartridge();
}
if (Layout == "Fit")
FinFit();
if (Layout == "Build")
FinAssembly()














