Posts Tagged CNC

Kenmore 158: LED Strip Light Cable Clips

Commercial LED strip lights for sewing machines mount their cables with little stick-on anchors and cable ties. I wasn’t happy with the cable tie thing and finally figured this out:

Kenmore 158 - LED strip light cable clips

Kenmore 158 – LED strip light cable clips

The clips have that size & shape because they fit exactly atop some pre-cut foam squares from the Tape Lookaside Buffer:

LED strip light cable clips

LED strip light cable clips

You can see the shape better in the solid model:

LED Cable Clips

LED Cable Clips

The central bollard has a slight taper to retain the cable, the quarter-posts are straight, and they’re both twice the cable diameter tall. The clearance between the center and corner posts at the top matches the cable diameter, so there’s a bit of bending room at the bottom, and, with the cable bent around the center, it won’t fall out on its own.

The cute coaxial cable I’m misusing for the LED strips measures just shy of 2 mm, making these into little bitty things. The corner posts seem surprisingly strong, despite 3D printing’s reputation for crappy quality; I haven’t been able to break one off with more effort than seemed warranted.

The OpenSCAD source code:

// LED Cable Clips
// Ed Nisley - KE4ZNU - October 2014

//- Extrusion parameters must match reality!

ThreadThick = 0.20;
ThreadWidth = 0.40;

HoleWindage = 0.2;			// extra clearance

Protrusion = 0.1;			// make holes end cleanly

AlignPinOD = 1.70;			// assembly alignment pins: filament dia

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

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

Base = [12.0,12.0,IntegerMultiple(2.0,ThreadThick)];	// base over sticky square

CableOD = 2.0;

BendRadius = 3.0;

Bollard = [BendRadius,(sqrt(2)*Base[0]/2 - CableOD - BendRadius),2*CableOD];
B_BOT = 0;
B_TOP = 1;
B_LEN = 2;

NumSides = 5*4;

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

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) {

  RangeX = floor(100 / Space);
  RangeY = floor(125 / Space);

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

}

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

ShowPegGrid();

intersection() {
	translate([0,0,(Base[2] + Bollard[2])/2])			// overall XYZ outline
		cube(Base + [0,0,Bollard[2]],center=true);
	
	union() {
		translate([0,0,Base[2]/2])						// oversize mount base
			scale([2,2,1])
				cube(Base,center=true);
				
		for (i=[-1,1] , j=[-1,1]) {						// corner bollards
			translate([i*Base[0]/2,j*Base[1]/2,(Base[2] - Protrusion)])
				rotate(180/NumSides)
				cylinder(r=Bollard[B_BOT],h=(Bollard[B_LEN] + Protrusion),center=false,$fn=NumSides);

		translate([0,0,(Base[2] - Protrusion)])			// center tapered bollard
			cylinder(r1=Bollard[B_BOT],r2=Bollard[B_TOP],h=(Bollard[B_LEN] + Protrusion),center=false,$fn=NumSides);
		}
	}
}

Now that I think of it, maybe a round clip would look nicer. The central bollard would stay, but the circular outside rim could have three cutouts. When these fall off, I’ll give that a try.

They may be square and clunky, but they look much better than Gorilla Tape…

 

, , ,

3 Comments

Low Voltage Interface Adapter Plate

The Dell GX270 chassis has a small support plate under the CPU, evidently to support the heatsink and fan:

Optiplex GX270 CPU heatsink mount

Optiplex GX270 CPU heatsink mount

It slides neatly into those clips on the system board tray, but it’s not actually locked into position. I think that allows it to slide around a bit under the system board, providing vertical support without constraining the board’s horizontal position. Anyhow, it looked like the easiest way to support the prototyping board that will hold the low voltage interface circuitry.

By some mischance, I found a nice aluminum plate exactly the right width, so only one side needed a saw cut and squaring. Coordinate drilling four #6 clearance holes matched the support:

LV Interface Adapter Plate - drilling

LV Interface Adapter Plate – drilling

That corner of the tray had another system board retaining clip, but rather than bashing it flat, I just sawed a slit in the plate so it can slide right into position. Note the perfect alignment of that screw hole:

LV Interface Adapter Plate - retainer

LV Interface Adapter Plate – retainer

I love it when all my mistakes cancel out!

Four more holes matched the prototyping circuit board and, while I had some epoxy mixed up for another part, I fastened four standoffs over the holes. A washer under each original screw soaked up exactly enough space that the screws barely indented the case and, as if by magic, hold the support plate firmly in place:

LV Interface Adapter Plate - installed

LV Interface Adapter Plate – installed

Of course, that means I must remove the circuit board to get the tray out, but the AC interface board must also come out, so we’re not talking a spur-of-the-moment operation.

The switch in the lower left corner is the original Dell “intrusion monitoring” switch harvested from a complex metal stamping in the diagonally opposite corner of the case. It’s epoxied to the case wall, with the plunger contacting a shim epoxied to the top of the case, and will eventually disconnect the AC line power from the drive electronics: case open = switch closed = lethal power off.

, ,

Leave a comment

ET227 Transistor: Monster Heatsink Mounting

Back in the day, heatsinks like this sat atop Moah Powah Pentium CPUs:

ET227 transistor on heatsink

ET227 transistor on heatsink

I picked it because the hulking ET227 transistor fit neatly on its backside, it seemed capable of handling 30 to 50 W of power, and I have several of them in the Big Box o’ Heatsinks. No careful thermal analysis was involved…

Mounting it on the polycarbonate sheet inside the repurposed GX270 case involved drilling & tapping a pair of 6-32 holes in one side:

ET227 Heatsink - tapping

ET227 Heatsink – tapping

That’s not rigid tapping on a Sherline, it’s aligning a hand-turned tap in the spindle bore. Sorry.

And, yeah, you’re not supposed to leave the semiconductors mounted when you’re drilling the heatsink. I figure there’s nothing I can possibly do without using a hammer that will bother that transistor in the slightest. What, me worry?

The transistor collector runs at line voltage, which means the entire heatsink will pose a lethal shock hazard. I thought about isolating the collector and failed to come up with anything I’d trust to be both thermally conductive and electrically insulating over the long term; the screw heads must be isolated from the collector plate, too.

The screws stick out below the polycarbonate sheet, just above the grounded EMI shell lining the case, so I flattened them a bit:

ET227 Heatsink - mounting screws

ET227 Heatsink – mounting screws

The simple rectangular strip to the rear of the chassis mounting clips is just slightly thicker than the screw heads, so they can’t possibly contact the case:

Chassis Clips

Chassis Clips

It gets glued to the underside of the nearly invisible sheet:

ET227 heatsink - gluing screw shield

ET227 heatsink – gluing screw shield

With Kapton tape over the heads, Just In Case:

ET227 Heatsink - mounted

ET227 Heatsink – mounted

It makes a nice linear counterpoint to the jumble of AC interface wiring:

AC Interface Chassis

AC Interface Chassis

The insulating sheet on the case lid came from the bottom of the original GX270 system board, where I think it served much the same purpose. It’s surely not rated for AC line voltages, but the thought must count for something:

AC Interface Chassis

AC Interface Chassis

More of the parts are flying in formation…

, , ,

10 Comments

AC Interface Chassis Mounting Clips

The Dell GX270 system board mounts on a tray, latching into small tabs, with a single screw locking it in place. The tray then slides into the metal EMI shield / case, latching onto more tabs, with a spring-loaded pair of tabs snapping into a slot under the green latch:

Optiplex GX270 - system board tray

Optiplex GX270 – system board tray

All that is well and good for a mass-production PC system board, but poses a problem for mounting anything else: there’s no room for screw heads below the tray, adhesives really don’t bond to slightly flexible aluminum sheets, and I definitely can’t do large-scale precision metal bending.

So a cheat seems in order. The general idea is to support a 6 mm polycarbonate sheet on clips that slide under the small tabs along the front, support the sheet on the rear tabs, and secure it with the screw. That’s thick enough to allow tapping holes for mounting screws, so everything else can mount to the sheet.

The sheet fits around the power supply on the right, protrudes over the rear of the tray to the back of the case (with a recess around the green latch), and clears the hinge assembly on the left. There are no dimensions, as it’s all done by eye with the Joggy Thing.

AC Chassis Shaping

AC Chassis Shaping

A drive bay EMI plug from a long-discarded PC provided some nice springy steel strips that slide neatly under those tray tabs:

Drive EMI shield

Drive EMI shield

That actually took a bit of trial-and-error:

AC Chassis mounting brackets - practice makes perfect

AC Chassis mounting brackets – practice makes perfect

My first attempts used slightly thicker steel that didn’t fit nearly as well, plus I wasn’t quite sure how wide they should be.

As with nearly all plastic doodads around here, the white plastic mounting clips / brackets come from the M2:

Chassis Clips

Chassis Clips

The two brackets in the middle of the solid model slide around the tabs at the rear corners of the tray and capture the bent-over top section below the polycarbonate sheet.

The strip in the rear goes around the screws holding the heatsink to the sheet; more on that later.

The PLA brackets get themselves glued to the sheet with IPS #4 solvent adhesive, a hellish mixture of chlorinated hydrocarbons that attacks most plastics with gleeful enthusiasm. I positioned the brackets on the tray, slobbered adhesive on their tops, slapped the polycarbonate sheet in place, and applied clamps:

AC Chassis - gluing bracket blocks

AC Chassis – gluing bracket blocks

The final bonds weren’t as uniform as I’d like, but they seem rugged enough. The lip along the rear of the tray was slightly higher on the left edge, which may have interfered with the clamping pressure; it’s obviously not a controlled dimension.

The tapped holes in the sheet accommodate screws for various bits & pieces.

All in all, that worked out pretty well…

The OpenSCAD source code:

// AC Interface sheet mounting brackets
// Ed Nisley - KE4ZNU - August 2014

Layout = "Build";		// FrontClip RearClip HeatSink Build

Gap = 5.0;					// between Build objects

//- Extrusion parameters must match reality!

ThreadThick = 0.20;
ThreadWidth = 0.40;

HoleWindage = 0.2;			// extra clearance

Protrusion = 0.1;			// make holes end cleanly

AlignPinOD = 1.70;			// assembly alignment pins: filament dia

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

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

FC_Block = [45.0,30.0,IntegerMultiple(5.6,ThreadThick)];
FC_Retainer = [15.5,9.0,3.0,15.0];					// central section: L,W,H, inset from front

RC_Block = [30.0,25.0,IntegerMultiple(5.6,ThreadThick)];
RC_RecessOffset = [9.0,5.0,IntegerMultiple(4.8,ThreadThick)];	// X,Y,thickness
RC_SlotWidth = 2.5;

HS_Insulation = [80.0,16.0,2.5];
HS_Hole = [8.0,40.0];					// screw clearance dia,on-center

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

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) {

  RangeX = floor(100 / Space);
  RangeY = floor(125 / Space);

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

}

//----------------------
// Front clips

module FrontClip() {

	difference() {
		translate([0,0,FC_Block[2]/2])
			cube(FC_Block,center=true);

		translate([0,(FC_Retainer[3] - FC_Block[1]/2),(FC_Retainer[2] + FC_Block[2]/2)])
			cube([(FC_Block[0] - 12*ThreadWidth),FC_Retainer[1],FC_Block[2]],center=true);

		translate([0,FC_Retainer[3] - FC_Retainer[1]/2,FC_Block[2]/2])
			cube([FC_Retainer[0],FC_Block[1],2*FC_Block[2]],center=true);
	}

}

//----------------------
// Rear clips

module RearClip(Hand="Left") {

HandSign = (Hand == "Left") ? -1 : 1;

	difference() {
		translate([0,0,RC_Block[2]/2])
			cube(RC_Block,center=true);

		translate([0,RC_RecessOffset[1],RC_RecessOffset[2] + RC_Block[2]/2])
			cube([RC_Block[0] - 2*RC_RecessOffset[0],
				  RC_Block[1],
				  RC_Block[2]],center=true);

		translate([HandSign*(RC_Block[0]/2 - RC_RecessOffset[0]),
				   RC_RecessOffset[1],
				   0])
			cube([RC_SlotWidth,RC_Block[1],3*RC_Block[2]],center=true);

	}

}

//----------------------
// Heatsink bumper

module HeatSink() {

	difference() {
		translate([0,0,HS_Insulation[2]/2])
			cube(HS_Insulation,center=true);

	for (x=[-1,1])
		translate([x*HS_Hole[1]/2,0,-HS_Insulation[2]])
			PolyCyl(HS_Hole[0],3*HS_Insulation[2],8);
	}

}

ShowPegGrid();

if (Layout == "FrontClip") {
	FrontClip();
}

if (Layout == "RearClip") {
	RearClip("Left");
}

if (Layout == "HeatSink") {
	HeatSink();
}

if (Layout == "Build") {
	for (x=[-1,1]) {
		translate([x*(Gap + FC_Block[0])/2,(Gap + FC_Block[1])/2,0])
			FrontClip();
		translate([x*(Gap + RC_Block[0])/2,-(Gap + RC_Block[1])/2,0])
			RearClip((x == -1) ? "Left" : "Right");
	}
	translate([0,-(RC_Block[1] + HS_Insulation[1]/2 + 3*Gap/2),0])
		HeatSink();
}

, , ,

2 Comments

Tour Easy Kickstand Adapter Plate

The venerable Greenfield kickstand on my Tour Easy doesn’t quite match the mounting plate under the frame, with the result that it can pivot just enough to make the bike tippy with a moderate load in the rear panniers. I’ve carried a small block to compensate for sloping ground, but I finally got around to fixing the real problem.

The solution turned out to be a spacer plate that fills the gap between the back of the kickstand casting and the transverse block brazed to the mounting plate:

Tour Easy kickstand adapter plate

Tour Easy kickstand adapter plate

That little lip is 2 mm wide, so it’s not off by much.

The aluminum came from a Z-shaped post that contributed its legs to a previous project. I flycut the stub of one leg flush with the surface, then flycut a slot 2 mm from the edge:

Tour Easy kickstand adapter - flycutting recess

Tour Easy kickstand adapter – flycutting recess

For no reason whatsoever, the width of that slot turned out exactly right.

Bandsaw along the left edge of the slot, bandsaw the plate to length, square the sides, break the edges, mark the actual location of the mounting plate hole, drill, and it’s done!

An identical Greenfield kickstand on Mary’s identical (albeit smaller) Tour Easy (the bikes have consecutive serial numbers) fits perfectly, so I think this is a classic case of tolerance mismatch.

, ,

Leave a comment

M2 Platform Leveling

This doesn’t happen very often, but, after a few road trips and some jostling around, the M2’s platform was definitely out of alignment: the first layer came out generally too thin, with the X-Y+ quadrant very much too thin.

I tried a quick and dirty adjustment that didn’t produce meaningful results, then broke out the Starrett Taper Gauge and did it right.

The relocated platform height switch is about 4.5 mm higher than the nozzle, so:

  • Jog the nozzle off the platform to the right
  • Home the Z axis
  • Define that position as Z=-6: G92 Z-6
  • Move to Z=0: G0 Z0
  • Jog around measuring the height of the nozzle above the platform
  • Adjust screws to reduce variation
  • Change Z offset in startup G-Code
  • Run off a few test patterns to get the platform heated
  • Measure actual thickness
  • Change Z offset to get the right answer
  • Done!

This progression of cold measurements, read top-to-bottom, left column first, shows the observed nozzle height above the platform around the edges and at the center:

M2 Platform Leveling Progression - 2014-06-30

M2 Platform Leveling Progression – 2014-06-30

The final measurements seem to indicate the glass plate is 0.2 mm convex in the center, but I wouldn’t trust the measurements to that level of accuracy. It’s probably bowed upward, but it’s certainly close enough.

The cold measurements suggest that the Z offset should be -4.80 mm, but the measurements on the hot platform with actual extrusion threads showed that -4.50 mm produced the correct thicknesses.

It’s not clear automating the movements would produce better or faster results than just manually jogging the nozzle around the platform, particularly since it happens only every few months.

This would be easier with the Z offset stored in the EEPROM and some modified startup G-Code to retrieve it.

, ,

Leave a comment

Kenmore 158: Stepper Motor Max Speeds

Having a NEMA 23 stepper fit almost exactly into the spot vacated by the sewing machine’s AC motor was too good to pass up:

Kenmore 158 - NEMA 23 stepper - on adapter

Kenmore 158 – NEMA 23 stepper – on adapter

So I wired a power supply to an M542 stepper driver brick, connected the pulse output of a function generator to the brick’s STEP inputs, swapped motor leads until it turned the proper direction (CCW as seen from the shaft end), and turned the function generator knob:

Kenmore 158 - NEMA 23 stepper test

Kenmore 158 – NEMA 23 stepper test

The object was to find the step frequency where the motor stalls, for various winding currents and supply voltages. The motor won’t have enough torque to actually stitch anything near the dropout speed, but this will give an indication of what’s possible.

With a 24 V DC supply and 1/8 microstepping (40 k step/s = 1470 RPM):

  • 1.00 A = 11 k step/s
  • 1.91 A = 44 k/s
  • 2.37 A = 66 k/s
  • 3.31 A = 15 k/s

With a 36 V DC supply and 1/8 microstepping:

  • 1.91 A = 70 k/s
  • 3.31 A = 90 k/s

With a 36 V DC supply and 1/4 microstepping (40 k step/s = 2900 RPM):

  • 1.91 A = 34 k/s
  • 2.37 A = 47 k/s
  • 2.84 A = 47 k/s
  • 3.31 A = 48 k/s

The motor runs faster with a higher voltage supply, which is no surprise: V = L di/dt. A higher voltage across the winding drives a faster current change, so each step can be faster.

The top speed is about 3500 RPM; just under that speed, the motor stalls at the slightest touch. That’s less than half the AC motor’s top speed under a similarly light load and the AC motor still has plenty of torque to spare.

90 k step/s at 1/8 microstepping = 11 k full step/s = crazy fast. Crosscheck: 48 k step/s at 1/4 microstepping = 12 k full step/s. The usual dropout speed for NEMA 23 steppers seems to be well under 10 k full step/s, but I don’t have a datasheet for these motors and, in any event, the sewing machine shaft provides enough momentum to keep the motor cruising along.

One thing I didn’t expect: the stepper excites howling mechanical resonances throughout its entire speed range, because the adapter plate mounts firmly to the cast aluminum frame with absolutely no damping anywhere. Mary ventured into the Basement Laboratory to find out what I was doing, having heard the howls upstairs across the house.

She can also hear near-ultrasonic stepper current chopper subharmonics that lie far above my audible range, so even if the stepper could handle the speed and I could damp the mechanics, it’s a non-starter for this task.

Given that the AC motor runs on DC, perhaps a brute-force MOSFET “resistive” control would suffice as a replacement for the carbon disk rheostat in the foot pedal. It’d take some serious heatsinking, but 100 V (or less?) at something under 1 A and intermittent duty doesn’t pose much of a problem for even cheap surplus MOSFETs these days.

That would avoid all the electrical and acoustic noise associated with PWM speed control, which counts as a major win in this situation. Wrapping a speed control feedback loop around the motor should stiffen up its low end torque.

,

10 Comments