The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Category: Science

If you measure something often enough, it becomes science

  • Victoreen 710-104 Ionization Chamber

    Using radiation to generate random numbers reminded me of some Victoreen 710-104 ionization chambers that have been in the pile basically forever:

    Victoreen 710-104 Ionization Chamber
    Victoreen 710-104 Ionization Chamber

    The central contact seems to be double-insulated from the chamber with glass (?) seals in a soldered-in-place assembly:

    Victoreen 710-104 Ionization Chamber - terminal detail
    Victoreen 710-104 Ionization Chamber – terminal detail

    That might be rosin left over from soldering, but you’d think they would have rinsed it off to reduce the leakage. Some cleaning will be in order.

    A picture in The Fine Manual for the CD-V-710 Model 5 Radiation Survey Meter showed that the circuit board used point-to-point wiring, with the range switch soldered directly to that bent metal contact:

    Victoreen CD-V-710 Model 5 Manual - Page 10 - circuit layout
    Victoreen CD-V-710 Model 5 Manual – Page 10 – circuit layout

    Another page gave some useful values and a simplified schematic:

    Victoreen CD-V-710 Model 5 Manual - Page 5
    Victoreen CD-V-710 Model 5 Manual – Page 5

    Never fear, the manual also has the full schematic; they don’t write manuals like that any more.

    The chamber bias voltage was +22.5, from one carbon-zinc battery available back in the 1950s. You can still get 22.5 V batteries at about ten bucks a pop, but 24 V from a pair of cheap & readily available 12 V A23 alkaline batteries should be close enough. There’s no current drain, so the batteries should last their entire shelf life.

    The “HI-MEG” resistor represents a trio of glass-body resistors selected by the range switch:

    • R5 = 100 GΩ → 0.5 R/h
    • R6 = 10 GΩ→ 5 R/h
    • R7 = 1 GΩ→ 50 R/h

    As the saying goes, if you must select R7 in an actual emergency, you should sit down, put your head between your legs, and kiss your ass goodbye.

    The steel-wall chamber responds only to gamma radiation, with a nominal current of 5 pA at 0.5 R/h. However, given an op amp like the LMC6081 with 10 fA bias current, maybe building an electrometer-style amplifier that can respond to background gamma radiation or maybe secondary gamma rays from cosmic ray air showers would be feasible; I haven’t done anything like that in a while and even a faceplant would be interesting.

    Alas, radium-226 and its progeny, including radon-222 decay through alpha and beta emission that’s specifically excluded by the can.

    This is not a new idea, by any means, as shown by some extensive discussion and well-done circuitry. Any amplifier that works with the Victoreen can will certainly work with a homebrew ionization chamber.

  • Fly6 Video Compression: Blur to Sharpen?

    So I stuck a snippet of ordinary “transparent” (it’s actually translucent) adhesive tape across the top of the Cycliq Fly6 camera lens:

    Cycliq Fly6 Camera - blur tape
    Cycliq Fly6 Camera – blur tape

    That smoothly blurs the top third of the frame:

    Fly6 - Tape-blurred frame
    Fly6 – Tape-blurred frame

    The motivation for using translucent tape: it should maintain roughly the same brightness and color balance across the whole image. Opaque tape would burn out the remaining image as the camera desperately tries to maintain an average gray level.

    Fast-forwarding VLC with the video stopped forces it to display the inter-frame compression blocks spanning several seconds of video:

    Fly6 - Forced compression artifacts
    Fly6 – Forced compression artifacts

    The upper third of the frame has big, simple blocks that pegged the files at a uniform 475 MB per ten minute file, somewhat lower than the un-blurred 500 to 700 MB. So the compression definitely isn’t working nearly as hard.

    I hoped that simplifying the uninteresting part of the image would leave more bits for license plates and other interesting details, which might be the case. New York has two main licence plate color schemes (the obsolete high-contrast blue-on-white and the current low-contrast blue-on-orange “Empire Gold”) and both the Fly6 and the Sony AS30V cameras do much better with white plates in full sun.

    Some samples at full size:

    Fly6 - License Plates
    Fly6 – License Plates

    Those were chosen based on:

    • Similar range / angle: just over the center line
    • Same-size crop box: 350 x 197
    • Sun vs. shade

    I think those are somewhat sharper than the plates from un-blurred frames, but it’s not like the camera suddenly woke up smarter and started paying attention to the important stuff.

    Time for more riding, minus the tape…

  • Monthly Science: Well Pit Temperature

    With more data, those February lows really stand out:

    Well Pit Air Temperature - 2014-10 to 2015-05-31
    Well Pit Air Temperature – 2014-10 to 2015-05-31

    The February daily record shows more detail:

    Well Pit - 2015-02-25
    Well Pit – 2015-02-25

    I’d say the air temperature in the pit got close to freezing, but surely a stream of cold air falling through the vent hole would wash over the logger and depress the results.

    Should I get powerfully motivated, I’ll strap the logger onto one of the pipes, wrap insulation around it, and have it take data from early December through late March in one session; lifting the concrete slab requires enough effort that I’m not going to do it, ah, lightly during the snow season.

     

  • Squirrel Pup Rescue

    We recently watched a gray squirrel drag a completely limp and unresponsive companion across the driveway, stopping every few yards to rest. We often see pairs of squirrels frisking / chasing / tussling in the yard, but this was something new.

    After 100 feet of dragging, with pauses every few yards, the squirrel had hauled her companion to the fence at the far side of the yard. I leaped to the conclusion that the limp squirrel was dead:

    Mother squirrel and pup - 1
    Mother squirrel and pup – 1

    But, after perhaps a minute, the “dead” squirrel gradually awoke and both critters slowly clambered up the fence. The squirrel on the right had been doing the dragging and is unquestionably female, the one on the left is much smaller and likely a new pup:

    Mother squirrel and pup - 2
    Mother squirrel and pup – 2

    So apparently the mother squirrel had hauled one of her pups away from something. Perhaps it was stunned after falling out of a tree or the sole survivor of a hawk attack? We’ll never know The Rest of The Story.

    Forgive the anthropomorphism, but if this isn’t motherly love & comfort, then give me another word for it:

    Mother squirrel and pup - 3
    Mother squirrel and pup – 3

    Taken through two layers of wavy 1955 window glass with the Sony DSC-H5.

  • Tour Easy: Cracked Fork Autopsy

    A look inside the cracked fork lug from my Tour Easy shows that it really did fracture at the top of the fork blade:

    Tour Easy - cracked fork - interior flash
    Tour Easy – cracked fork – interior flash

    Minus the flash, plus contrast enhancement:

    Tour Easy - cracked fork - interior
    Tour Easy – cracked fork – interior

    Looks rather grotendous in there, doesn’t it? Yeah, show me the interior of your fork…

    The front is at the top, blade on the left and crown on the right. The little shiny rectangle at 1 o’clock on the crown was probably the last fragment holding the blade in place.

    Finished!

  • Random LED Dots: Startup Lamp Test

    I should mention the lamp test in case it comes in useful later on…

    	digitalWrite(PIN_HEARTBEAT,LOW);	// turn off while panel blinks
    	
    	analogWrite(PIN_DIMMING,LEDS_ON);	// enable LED array
    
    	for (byte i=0; i<NUMROWS; i++) {
    		for (byte j=0; j<NUMCOLS; j++) {
    			LEDs[i].ColR = LEDs[i].ColG = LEDs[i].ColB = 0x80 >> j;
    			for (byte k=0; k<NUMROWS; k++) {
    				UpdateLEDs(k);
    				delay(25);
    				if (GeigerTicked) {
    					GeigerTicked = false;
    					TogglePin(PIN_HEARTBEAT);
    				}
    			}
    		LEDs[i].ColR = LEDs[i].ColG = LEDs[i].ColB = 0;
    		}
    	}
    	UpdateLEDs(NUMROWS-1);			// clear the last LED
    

    Updating / multiplexing all the rows inside the inner loop with a 25 ms pause produces distinct flashes and demonstrates that each LED operates separately from all the others:

    Lamp Test
    Lamp Test

    The lamp test ends with all the LEDs turned off, but having the array gradually fill with light looked odd.

    After some tinkering, I added the GeigerTicked conditional to handshake with the Geiger pulse interrupt handler, thus producing a nice random time at the end of the loop. Feed that mostly random time into the hash function, use the hash as the random number seed, then set all the LEDs using random(2) function calls:

    	randomSeed(jenkins_one_at_a_time_hash((char *)GeigerTime,4));
    	
    	for (byte Row=0; Row<NUMROWS; Row++) {
    		for (byte Col=0; Col<NUMCOLS; Col++) {		// Col runs backwards, but we don't care
    			LEDs[Row].ColR |= random(2) << Col;
    			LEDs[Row].ColG |= random(2) << Col;
    			LEDs[Row].ColB |= random(2) << Col;
    		}
    		UpdateLEDs(Row);
    	}
    	
    	GeigerTicks = 0;				// reset counter
    	GeigerTicked = false;			// resume capture
    

    Which produced a more-or-less random fill that looked better:

    Random Preload - bright
    Random Preload – bright

    Underexposed to reduce the burnout (after a few Geiger events):

    Random Preload - dim
    Random Preload – dim

    There should be about eight of each color and, hey, it’s close enough.

    After the preload, it ticks along like it should…

  • Random LED Dots: Radioactive Noise

    In need of a quick-and-easy way to generate interesting data that would make an LED array do something and, what with radioactivity being the canonical source for random numbers, an ancient Aware Electronics RM-60 (*) emerged from the heap. The manual will get you up to speed on radiation detection, if you can read past the DOS-era program description.

    It produces a 100 µs (-ish) pulse for each detection:

    Aware RM-60 Geiger Pulse
    Aware RM-60 Geiger Pulse

    The minimum period seems to be around 500 µs, but I lack a sufficiently fierce radioactive source to verify that in any finite amount of time.

    Seeing as how all we need is a little randomness, measuring the time when a pulse occurs will suffice; we’re not talking hardcore crypto.

    With the pulse arriving on the Arduino D2 input, define an interrupt handler that sets a flag, bumps a counter, and records the current time in microseconds:

    void GeigerHandler(void) {
    	if (!GeigerTicked) {				// stop recording until loop() extracts the data
    		GeigerTicked = true;
    		GeigerTicks++;
    		GeigerTime = micros();
    	}
    }	
    

    Define D2 as an input, turn on the pullup, and trigger that handler on the falling edge of the pulse:

    pinMode(PIN_GEIGER,INPUT_PULLUP);	// RM-60 has its own pullup, but add this one, too
    
    attachInterrupt((PIN_GEIGER - 2),GeigerHandler,FALLING);	
    

    Because an absolute timestamp of each event will produce an obviously non-random sequence of monotonically increasing numbers, I ran each four byte timestamp through a simple hash function to whiten the noise:

    //------------------
    // Jenkins one-at-a-time hash
    // From http://en.wikipedia.org/wiki/Jenkins_hash_function
    
    uint32_t jenkins_one_at_a_time_hash(char *key, size_t len)
    {
        uint32_t hash, i;
        for(hash = i = 0; i < len; ++i)
        {
            hash += key[i];
            hash += (hash << 10);
            hash ^= (hash >> 6);
        }
        hash += (hash << 3);
        hash ^= (hash >> 11);
        hash += (hash << 15);
        return hash;
    }
    

    Then the only thing left to do is spin around the loop() while waiting for a particle to arrive:

    	if (GeigerTicked) {
    		digitalWrite(PIN_HEARTBEAT,HIGH);				// show a blip
    		analogWrite(PIN_DIMMING,LEDS_OFF);				// turn off LED array to prevent bright glitch
    
    		Hash = jenkins_one_at_a_time_hash((char *)&GeigerTime,4);	// whiten the noise
    		
    		GeigerTicked = false;							// flag interrupt handler to resume recording
    //			printf("%9ld %08lx %08lx ",GeigerTicks,GeigerTime,Hash);
    		SetLED(Hash);
    	}
    

    The Heartbeat LED gets turned off every 25 ms.

    In the spirit of “video or it didn’t happen”: there’s a movie about that.

    (*) Circuit Cellar readers of long memory will recognize the RM-60 as the McGuffin for the Radioactive Randoms column in 1990 that explained features of interrupt-driven code in a Micromint BASIC-52 board. Decades later, the hardware & software served as Prior Art in a patent suit that forced me to write some Rules of Engagement. Selah.