Houses Are Trouble: Terwilliger House Windows

Imagine “updating” these windows with modern high-efficiency glass:

Terwilliger House - parallelogram windows

Terwilliger House – parallelogram windows

That’s the end wall of the 1738 Terwilliger House on the Locust Lawn site. I’m sure the woodwork doesn’t date back that far, but the glazier demonstrated genius-level mastery.

We were on a fascinating behind-the-scenes tour, marred by a visitor who knew the rules about not touching the exhibits didn’t apply to her. My parents ran a restaurant / gift shop and, to this day, my hands automatically find their way into my pockets when I enter a store, let alone a museum.

Leave a comment

Making the Asterisk Visible

Spotted a new sign at the Van Wyck Road entrance to the Dutchess Rail Trail:

DCRT at Van Wyck Rd - ATV Patrol sign

DCRT at Van Wyck Rd – ATV Patrol sign

The tiny print on the top sign still reads No Motorized Vehicles, but the bottom sign makes it explicit that that particular prohibition applies only to ordinary citizens.

Which matches up with the Sheriff’s ATVs I spotted a weeks earlier:

DCRT - Sheriff ATV Patrol - Page Park

DCRT – Sheriff ATV Patrol – Page Park

As of late May, the No All Terrain Vehicles signs were still up. Maybe they still are.

According to the New York Times style guide and other reasonably erudite sources, the plural of ATV should be ATVS (or, if you have the luxury of mixed case, ATVs), not ATV’S.

,

3 Comments

Victoreen 710-104 Ionization Chamber: Hex Circuit Board

Just to have something to work with, I cut a hex from a sheet of double-sided PCB stock and bonded the edges with copper foil:

Victoreen 710-104 - Hex PCB - top

Victoreen 710-104 – Hex PCB – top

Slightly wider tape on three edges will clear the board supports:

Victoreen 710-104 - Hex PCB - bottom

Victoreen 710-104 – Hex PCB – bottom

For unknown reasons, the PCB has arrays of plated-through holes firmly bonding the top and bottom copper, so that’s pretty much solid copper with a glass-epoxy core. I think somebody (else) harvested it from a locally important company many, many decades ago, but it arrived with no provenance.

The first pass at the electrometer circuitry will be air-wired for low leakage, which is pretty much the only way I have to actually get low leakage; the holes should help glue the parts to that copper plane.

I’m not at all convinced the big hole in the middle is strictly necessary. The chamber has 10 pF from pin to can that should swamp any stray capacitance unless I do something really stupid.

The copper foil stockpile remains hidden, so maybe I’ll build a shield from adhesive copper tape along the lines of the WWVB receiver shield in the Totally Featureless Clock:

Completed shield enclosure

Completed shield enclosure

Given my weak origami-fu and the need for hexagonality, I should print a 3D template.

It’s worth remembering that both the hex and the shield will be at the can’s +24 V potential, not “ground”. That makes no difference to the external circuitry, but will certainly cause me to blow a few junctions along the way.

2 Comments

Victoreen 710-104 Ionization Chamber: Circuit Fixture

The general idea is to put the electrometer circuitry directly atop the Victoreen 710-104 ionization chamber, so as to minimize the distance from the center collector electrode to the electrometer input. After a few false starts, this looked promising:

Victoreen 710-104 Ionization Chamber Fittings - Show layout

Victoreen 710-104 Ionization Chamber Fittings – Show layout

The hexagonal circuit board fits the can so nicely that I’ll run with it, despite the over-the-top twee factor. Because it’s so hard to freehand a hex, I printed the green object as a tracing template, despite having the Slic3r preview show the parts just barely fitting on the M2 platform:

Victoreen 710-104 Ionization Chamber Fittings - Build layout

Victoreen 710-104 Ionization Chamber Fittings – Build layout

Fortunately, my configuration hand is strong:

Victoreen 710-104 Fittings - on M2 platform

Victoreen 710-104 Fittings – on M2 platform

The skirt measures 0.25±0.05 around the entire perimeter, with a slight positive bias (platform too low) along the left side and a corresponding negative bias on the right. Both sides look just fine to me.

A pair of alignment pegs hold each board support in place while gluing:

Victoreen 710-104 Fittings - clamping

Victoreen 710-104 Fittings – clamping

Next time around, I’ll glue the supports with the circuit board template laid in place to ensure the edges have the proper orientation, but they came out surprisingly close just by matching the outer perimeters. Of course, I probably bandsawed / belt sanded the carefully traced hex just slightly off-kilter.

The outer perimeter has 48 sides. Making it a multiple of three means each board support has the same pattern of sides and all will be interchangeable. Making it a multiple of four means each quadrant has the same pattern of sides and the ring looks pleasingly symmetrical. The factor-of-three is most important: you want interchangeable supports. Trust me on this.

The bottom ring keeps the solder dimple that seals the can base off the desk, but I also stuck a quartet of rubber feet on the can for better traction.

Here’s what it looks like with the two A23 12 V bias batteries in their holders, affixed to the can with foam tape:

Victoreen 710-104 Fittings - assembled

Victoreen 710-104 Fittings – assembled

The OpenSCAD source code includes a few more tweaks:

// Victoreen 710-104 Ionization Chamber Fittings
// Ed Nisley KE4ZNU July 2015

Layout = "Show";
					// Show - assembled parts
					// Build - print them out!
					// CanCap - PCB insulator for 6-32 mounting studs
					// CanBase - surrounding foot for ionization chamber
					// CanLid - generic surround for either end of chamber
					// PCB - template for cutting PCB sheet
					// PCBBase - holder for PCB atop CanCap

BuildTemplate = false;			// true to build PCB template along with everything else

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

ThreadThick = 0.25;
ThreadWidth = 0.40;

HoleWindage = 0.2;

Protrusion = 0.1;			// make holes end cleanly

AlignPinOD = 1.75;			// assembly alignment pins = filament dia

inch = 25.4;

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

//- Screw sizes

Tap4_40 = 0.089 * inch;
Clear4_40 = 0.110 * inch;
Head4_40 = 0.211 * inch;
Head4_40Thick = 0.065 * inch;
Nut4_40Dia = 0.228 * inch;
Nut4_40Thick = 0.086 * inch;
Washer4_40OD = 0.270 * inch;
Washer4_40ID = 0.123 * inch;


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

OD = 0;											// name the subscripts
LENGTH = 1;

Chamber = [91.0 + HoleWindage,38];				// Victoreen ionization chamber dimensions

Stud = [										// stud welded to ionization chamber lid
	[6.5,IntegerMultiple(0.8,ThreadThick)],		// flat head -- generous clearance
	[4.0,9.5],									// 6-32 screw -- ditto
];
NumStuds = 3;
StudSides = 6;									// for hole around stud

BCD = 2.75 * inch;								// mounting stud bolt circle diameter

PlateThick = 3.0;								// layer atop and below chamber ends
RimHeight = 4.0;								// extending up along chamber perimeter
WallHeight = RimHeight + PlateThick;
WallThick = 5.0;								// thick enough to be sturdy & printable
CapSides = 8*6;									// must be multiple of 4 & 3 to make symmetries work out right

PCBFlatsOD = 85.0 + 2*ThreadWidth;				// hex dia across flats + clearance
PCBThick = 1.1;
PCB = [PCBFlatsOD / cos(30),PCBThick - ThreadThick];		// OD = tip-to-tip dia

echo(str("Actual PCB across flats: ",PCBFlatsOD - 2*ThreadWidth));
echo(str(" ... tip-to-tip dia: ",(PCBFlatsOD - 2*ThreadWidth)/cos(30)));
echo(str(" ... thickness: ",PCBThick));

HolderHeight = 11.0 + PCB[LENGTH];				// thick enough for PCB to clear studs
HolderShelf = 2.0;								// shelf under PCB edge

echo(str("PCB holder height: ",HolderHeight));
echo(str(" ... across flats: ",PCBFlatsOD));

//----------------------
// 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);
}

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

module LocatingPin(Dia=AlignPinOD,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])
		PolyCyl(Dia,Len,4);

}

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);
}

//-----

module CanLid() {
	
	difference() {
		cylinder(d=Chamber[OD] + 2*WallThick,h=WallHeight,$fn=CapSides);
		translate([0,0,PlateThick])
			PolyCyl(Chamber[OD],Chamber[1],CapSides);
	}
	
}

module CanCap() {

	difference() {
		CanLid();
		
		translate([0,0,-Protrusion])											// central cutout
//			cylinder(d=(BCD - 2*5.0),h=Chamber[LENGTH],$fn=CapSides);
			rotate(180/6)
				cylinder(d=BCD,h=Chamber[LENGTH],$fn=6);
			
		for (i=[0:(NumStuds - 1)])												// stud clearance holes
			rotate(i*360/NumStuds)
				translate([BCD/2,0,0])
					rotate(180/StudSides) {
						translate([0,0,(PlateThick - (Stud[0][LENGTH] + 2*ThreadThick))])
							PolyCyl(Stud[0][OD],2*Stud[0][LENGTH],StudSides);
						translate([0,0,-Protrusion])
							PolyCyl(Stud[1][OD],2*Stud[1][LENGTH],StudSides);
					}
					
		for (i=[0:(NumStuds - 1)], j=[-1,1])									// PCB holder alignment pins
			rotate(i*360/NumStuds + j*15 + 60)
				translate([Chamber[OD]/2,0,0])
					rotate(180/4)
						LocatingPin(Len=2*PlateThick - 2*ThreadThick);
	}

}

module CanBase() {
	
	difference() {
		CanLid();
		translate([0,0,-Protrusion])
			PolyCyl(Chamber[OD] - 2*5.0,Chamber[1],CapSides);
	}
}

module PCBTemplate() {
	
	difference() {
		cylinder(d=((PCBFlatsOD - 2*ThreadWidth)/cos(30)),h=max(PCB[LENGTH],3.0),$fn=6);		// actual PCB size, overly thick
		translate([0,0,-Protrusion])
			cylinder(d=10,h=10*PCB[LENGTH],$fn=12);
	}
}

module PCBBase() {

	difference() {
		cylinder(d=Chamber[OD] + 2*WallThick,h=HolderHeight,$fn=CapSides);
		
		rotate(30) {
			translate([0,0,-Protrusion])										// central hex
				cylinder(d=(PCBFlatsOD - 2*HolderShelf)/cos(30),h=2*HolderHeight,$fn=6);	
				
			translate([0,0,HolderHeight - PCB[LENGTH]])							// hex PCB recess
				cylinder(d=PCB[OD],h=HolderHeight,$fn=6);
				
			for (i=[0:NumStuds - 1])											// PCB retaining screws
				rotate(i*120 + 30)
					translate([(PCBFlatsOD/2 + Clear4_40/2 + ThreadWidth),0,-Protrusion])
						rotate(180/6)
							PolyCyl(Tap4_40,2*HolderHeight,6);
							
			for (i=[0:(NumStuds - 1)], j=[-1,1])								// PCB holder alignment pins
				rotate(i*360/NumStuds + j*15 + 30)
					translate([Chamber[OD]/2,0,0])
						rotate(180/4)
							LocatingPin(Len=PlateThick);
		}
		
		for (i=[0:NumStuds - 1])												// segment isolation
			rotate(i*120 - 30)
				translate([0,0,-Protrusion]) {
					linear_extrude(height=2*HolderHeight)
						polygon([[0,0],[Chamber[OD],0],[Chamber[OD]*cos(60),Chamber[OD]*sin(60)]]);
				}
	}
	

}


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

ShowPegGrid();

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

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

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

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

if (Layout == "PCB") {
	PCBTemplate();
}

if (Layout == "Show") {
	CanBase();
	color("Orange",0.5)
		translate([0,0,PlateThick + Protrusion])
			cylinder(d=Chamber[OD],h=Chamber[LENGTH],$fn=CapSides);
	translate([0,0,(2*PlateThick + Chamber[LENGTH] + 2*Protrusion)])
		rotate([180,0,0])
			CanCap();
	translate([0,0,(2*PlateThick + Chamber[LENGTH] + 5.0)])
		PCBBase();
	color("Green",0.5)
		translate([0,0,(2*PlateThick + Chamber[LENGTH] + 7.0 + HolderHeight)])
			rotate(30)
				PCBTemplate();
}

if (Layout == "Build") {
	
	if (BuildTemplate) {
		translate([-0.50*Chamber[OD],-0.60*Chamber[OD],0])
			CanCap();
			
		translate([0.55*Chamber[OD],-0.60*Chamber[OD],0])
			rotate(30)
				PCBTemplate();
	}
	else {
		translate([-0.25*Chamber[OD],-0.60*Chamber[OD],0])
			CanCap();
	}
		
	translate([-0.25*Chamber[OD],0.60*Chamber[OD],0])
		CanBase();
	translate([0.25*Chamber[OD],0.60*Chamber[OD],0])
		PCBBase();
}

Leave a comment

Monthly Science: Mystery Chip

Dragorn of Kismet gave me a handful of identical mystery chips that might date back to the 1980s. They’re surprisingly large and covered with contacts:

Mystery IC - overview

Mystery IC – overview

There are no logos or identification anywhere on the chip. The back side is blank silicon.

The visible patterns don’t suggest anything obvious:

Mystery IC - detail 1

Mystery IC – detail 1

The metallization layers aren’t particularly intricate:

Mystery IC - detail 2

Mystery IC – detail 2

Surely there’s something tucked under the top metallization; I have neither the materials nor inclination to dissolve the thing one layer at a time.

I gave a sampling to our Larval Engineer, who says she may turn them into fancy jewelry. I’m sure the solder bumps contain lead, but …

4 Comments

Road Conditions: Spackenkill Rd – Eastbound Shoulder – Croft to Hagan

According to the map on page 116 of the “Walk Bike Dutchess” Planning Document, Spackenkill Road has a “Paved Shoulder Width” that’s “Greater than four feet”, but with an asterisk: “Paved width based on available data. May not reflect usable width.” Here’s what “usable width” looks like in actual practice.

I’m riding eastbound on Spackenkill Road, just past the signal at Croft Road. The shoulder has actually been at least 4 ft wide up to this point, but after Flower Hill Rd the paved surface narrows dramatically:

Spackenkill Rd EB - Croft to Hagan - 1

Spackenkill Rd EB – Croft to Hagan – 1

The right half of the shoulder is a drainage swale that wasn’t repaved along with the rest of the surface; the drain grates just add to the hazard.

This grate features a “bike safe” hex grid. What you can’t see is how far it’s recessed into the asphalt.

Spackenkill Rd EB - Croft to Hagan - 2

Spackenkill Rd EB – Croft to Hagan – 2

Did you notice the manhole cover dead ahead, extending from the fog line across the entire paved part? I did, which is why I’m moving into the travel lane: it’s recessed a few inches into the pavement.

The swale deepens and becomes a patch palimpsest closer to the signal at Wilbur Blvd:

Spackenkill Rd EB - Croft to Hagan - 3

Spackenkill Rd EB – Croft to Hagan – 3

Another manhole cover, recessed on the left and protruding on the right, with a rubble-filled swale requiring riders to move into the traffic lane:

Spackenkill Rd EB - Croft to Hagan - 4

Spackenkill Rd EB – Croft to Hagan – 4

The residual paint on the cover suggests the fog line moved a foot leftward, so the shoulder is slightly wider than it was before the repaving. At this point, the shoulder is a bit over a foot wide, if you ignore the manhole cover and don’t mind riding right up to the edge of the dropoff into the swale.

Just as an aside, why is it when motorists blow a red light, it’s perfectly normal, but when bicyclists do the same thing, they’re maniacs deserving instant death?

Spackenkill Rd EB - Croft to Hagan - 5

Spackenkill Rd EB – Croft to Hagan – 5

That’s why I stop at traffic signals and wait a few seconds before starting.

The shoulder gets wider toward Van Duzier, again if you ignore a recessed grate that’s so deep vehicles scratch the far side as they bottom out:

Spackenkill Rd EB - Croft to Hagan - 6

Spackenkill Rd EB – Croft to Hagan – 6

In Dutchess County, you get used to bicycling on whatever pavement you get. I can reliably ride a ledge half a foot wide, but we don’t expect drivers to navigate tiny slices of pavement.

Closing in on Hagan Drive, there’s a slightly concave wheel-trapping grate turned at a jaunty angle, smack in the middle of what surely counts as “more than four feet” of shoulder:

Spackenkill Rd EB - Croft to Hagan - 7

Spackenkill Rd EB – Croft to Hagan – 7

That one’s easy, although if you didn’t like riding close to traffic, you’d be in that gravel patch.

Back in the day, I commuted by bike to IBM along Spackenkill Road. It was in much worse condition with terrible shoulders, so the recent repaving isn’t all that bad. Oddly, back then it was an Official Bike Route with Official Signs; now that it’s improved, it’s no longer marked. Perhaps when NYSDOT gained control of the road, they decided it didn’t meet contemporary bike route standards?

On the whole, Spackenkill is much better than the usual Dutchess County fare.

Should you think that shoulder width isn’t a problem, then you should also have no problem with this deal: send me your paychecks and I will write you checks for anywhere from -25% to +150% of the nominal amount, randomly weighted by the sampled deviation of the shoulder width from four feet along both sides of Spackenkill Road. What say?

It’s not as though a cop will ask you about your average speed when you’re pulled over for speeding: it’s your maximum speed that matters. For bicyclists, it’s the minimum shoulder width and minimum paving standard.

A map with the route (clicky for more dots):

Spackenkill Rd EB - Croft to Hagan - map

Spackenkill Rd EB – Croft to Hagan – map

There’s a movie showing the complete ride from IBM Road to Red Oaks Mill.

10 Comments

Presentation Video: Bring Enough Adapters

I plugged my trusty Dell Latitude E6410 into the VGA cable connected to a Viewsonic projector at TechShop Detroit to give the OpenSCAD Modeling presentation, but the display showed a surprising amount of ghosting; whether that was due to a bad cable or the usual presentation gremlins, I cannot say. Fortunately, although I didn’t have a VGA cable, I did have a fair assortment of adapters for the laptop’s DisplayPort output…

On the laptop end, DisplayPort to a DVI-D cable:

Latitude vs Viewsonic - DisplayPort to DVI-D

Latitude vs Viewsonic – DisplayPort to DVI-D

On the Viewsonic end, DVI-D to HDMI:

Latitude vs Viewsonic - DVI-D to HDMI

Latitude vs Viewsonic – DVI-D to HDMI

Worked like a champ!

The projector in the room for the Arduino Survival Guide presentation had a VGA cable, but had been losing sync and turning itself off, so I unplugged that, rebuilt the DisplayPort adapter string, and continued the mission.

I must add a known-good VGA cable and corresponding adapters to the assortment…

Leave a comment