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: Electronics Workbench

Electrical & Electronic gadgets

  • Reading a Quadrature Knob

    Most analog projects will benefit from an adjustment knob; the notion of pressing those UP and DOWN arrows just doesn’t give that wonderful tactile feedback. These days “knob” means a rotary encoder with quadrature outputs and some software converting digital bits into an adjustment value.

    Sounds scary, doesn’t it?

    This is actually pretty simple for most microcontrollers and the Arduino in particular. The Arduino website has some doc on the subject, but it seems far too complicated for most projects.

    A quadrature rotary encoder has two digital outputs, hereinafter known as A and B. The cheap ones are mechanical switch contacts that connect to a common third terminal (call it C), the fancy ones are smooth optical interrupters. You pay your money and get your choice of slickness and precision (clicks per turn). I take what I get from the usual surplus sources: they’re just fine for the one-off projects I crank out most of the time.

    How does quadrature encoding work?

    On each falling edge of the A signal, look at the B signal. If it’s HIGH, the knob has turned one click thataway. If it’s LOW, the knob has turned one click the other way. That’s all there is to it!

    Here’s how you build a knob into your code…

    Connect one of the outputs to an external interrupt, which means it goes to digital input D2 or D3 on the Arduino board. The former is INT0, the latter INT1, and if you need two interrupts for other parts of your project, then it gets a lot more complex than what you’ll see here. Let’s connect knob output A to pin D2.

    Connect the other output, which we’ll call B, to the digital input of your choice. Let’s connect knob output B to D7.

    Define the pins and the corresponding interrupt at the top of your program (yeah, in Arduino-speak that’s “sketch”, but it’s really a program):

    #define PIN_KNOB_A 2			// digital input for knob clock (must be 2 or 3!))
    #define IRQ_KNOB_A (PIN_KNOB_A - 2)	//  set IRQ from pin
    #define PIN_KNOB_B 7			// digital input for knob quadrature
    

    The external circuitry depends on whether you have a cheap knob or fancy encoder. Assuming you have a cheap knob with mechanical contacts, the C contact goes to circuit common (a.k.a, “ground”). If you have a fancy knob with actual documentation, RTFM and do what it say.

    The two inputs need resistors (“pullups”) connected to the supply voltage: when the contact is open, the pin sees a voltage at the power supply (“HIGH“), when it’s closed the voltage is near zero (“LOW“).

    Ordinary digital inputs have an internal pullup resistor on the ATmega168 (or whatever the Arduino board uses) that will suffice for the B signal. Unfortunately, the external interrupt pins don’t have an internal pullup, so you must supply your own resistor. Something like 10 kΩ will work fine: one end to the power supply, the other to INT0 or INT1 as appropriate.

    With the knob connected, set up the pins & interrupt in your setup() function:

    attachInterrupt(IRQ_KNOB_A,KnobHandler,FALLING);
    pinMode(PIN_KNOB_B,INPUT);
    digitalWrite(PIN_KNOB_B,HIGH);
    

    The first statement says that the interrupt handler will be called when the A signal changes from HIGH to LOW.

    The Arduino idiom for enabling the chip’s internal pullup on a digital input pin is to define the pin as an input, then write a HIGH to it.

    Set up a variable to accumulate the number of clicks since the last time:

    volatile char KnobCounter = 0;

    The volatile tells the compiler that somebody else (the interrupt handler or the main routine) may change the variable’s value without warning, so the value must be read from the variable every time it’s used.

    The variable’s size depends on the number of counts per turn and the sluggishness of the routine consuming the counts; a char should suffice for all but the most pathological cases.

    Define the handler for the knob interrupt:

    void KnobHandler(void)
    {
        KnobCounter += (HIGH == digitalRead(PIN_KNOB_B)) ? 1 : -1;
    }
    

    KnobHandler executes on each falling edge of the A signal and either increments or decrements the counter depending on what it sees on the B signal. This is one of the few places where you can apply C’s ternary operator without feeling like a geek.

    Define a variable that will hold the current value of the counter when you read it:

    char KnobCountIs, Count;
    

    Now you can fetch the count somewhere in your loop() routine:

    noInterrupts();
    KnobCountIs = KnobCounter;	// fetch the knob value
    KnobCounter = 0;		//  and indicate that we have it
    interrupts();
    

    Turning interrupts off while fetching-and-clearing KnobCounter probably isn’t necessary for a knob that will accumulate at most one count, but it’s vital for programs that must not lose a step.

    Now you can use the value in KnobCountIs for whatever you like. The next time around the loop, you’ll fetch the count that’s accumulated since the previous sample.

    Even if you RTFM, apply painstaking logic, and wire very carefully, there’s a 50% chance that the knob will turn the wrong way. In that case, change one of these:

    • In the interrupt handler, change HIGH to LOW
    • In the attachInterrupt() statement, change FALLING to RISING

    There, now, wasn’t that easy? Three wires, a resistor, a dozen lines of code, and your project has a digital quadrature knob!

    If you have a painfully slow main loop, the accumulated counts in KnobCounter could get large. In that case, this code will give you a rubber-band effect: the accumulated count can be big enough that when the knob starts turning in the other direction it’s just decreasing the count, not actually moving count to the other side of zero. Maybe you need some code in the interrupt handler to zero the count when the direction reverses?

    But that’s in the nature of fine tuning… twiddle on!

  • Analon Slide Rule

    Whenever I do anything even slightly out of the ordinary with magnetics, I must drag out my trusty Analon slipstick to make sure I haven’t lost a dimension.

    Analon slide rule - front
    Analon slide rule – front

    Go ahead, you verify that the area inside a BH hysteresis curve is proportional to power loss in a given transformer core. I’ll wait…

    Analon slide rule - back
    Analon slide rule – back

    My recollection is that I bought it in the Lehigh University Bookstore in the early 70s, but that doesn’t square up with the Analon’s history: they should have been out of circulation by then. I’m pretty sure I didn’t get it in high school, extreme geek though I was, and it’s for damn sure I wouldn’t have bought one after graduation. Come to think of it, if the LU Bookstore wasn’t among the last bastion of Analon holdouts, where would you look?

    Over the decades I’ve penciled in a few handy dimensions they didn’t think of. Unlike most of the 600 597 (plus one in the Smithsonian) Analons in the wild, this one actually gets used, so it’s not New-In-Box (which means you collectors need not suffer from involuntary hip motions). It’s also not as grubby as it looks: I didn’t spend a lot of time futzing with the scans.

    Anyway, that’s called beausage and it enhances the value.

    Works that way with other antiques, right?

    Links:

    Yeah, OK, it’s a Slide Rule Gloat…

  • AA Cell Dimensions

    Ever wonder why rechargeable AA cells don’t quite fit in older flashlights & gizmos? Somewhat to my surprise, the dimension specs for alkaline and rechargeable cells aren’t quite the same.

    At the bottom of the Wikipedia AA battery page, we find “brand-neutral” drawings (allegedly) based on ANSI specs:

    • Alkaline: 14.0 ± 0.5 dia x 49.85 ± 0.65
    • Rechargeable: 14.1 ± 0.6 dia x 48.9 ± 1.6

    A rechargeable cell can thus be 0.2 mm larger in diameter, but should have the same maximum length.

    Based on my collection, alkalines seem to be near their nominal and NiMH cells near their maximum. Across a four-cell layer, the difference adds up to 1 mm or so, which is enough to strain the plastic.

    8-cell NiMH AA pack
    8-cell NiMH AA pack

    Hint: Put some paper on the negative terminal when you measure the cell length. Steel calipers are pretty good conductors and the short-circuit ratings (even for alkalines) are surprisingly high  …

    When I make up NiMH packs for our bike radios, I lash the cells in place with cable ties. It’s not pretty, but the plastic cases don’t split.

    Connector? Anderson Powerpoles FTW! Make sure you align them properly to mate with anybody’s radio.

  • Power Outlet Contact Failure

    Burnt outlet expander
    Burnt outlet expander

    Ordinary AC power outlets have fairly robust contacts, designed to last basically forever. I have no idea what the actual design life might be, but it’s rare to have an AC outlet fail.

    This one did…

    It’s an outlet expander at the end of an extension cord that provides six outlets. I’d installed it at my parent’s house (I was their go-to guy for electrical things, of course) and everything was fine. One visit involved rearranging some appliances and the adapter went nova when I plugged something into it.

    Me being their go-to electrical guy, I’m pretty sure this gizmo didn’t experience a whole bunch of mate-unmate cycles in my absence. Most likely it was defective from the factory, so sticking a plug in once or twice was enough to break the contact finger.

    dsc00153-detail-of-burnt-socket
    Detail of burnt socket

    Here’s a contrast-enhanced detail of the outlet in the lower-right of the top picture. The broken finger bridged the brass strips carrying the two sides of the AC line in the left side of the compartment.

    Blam: brass smoke!

    Oddly, the fuse didn’t blow. It was pretty exciting to have a small sun in the palm of my hand until the contact finger fell to the bottom of the compartment.

    The bottom picture shows the offending finger. It’s pretty obvious what happened.

    Errant contact finger
    Errant contact finger

    I’ve read of folks applying silicone lubricant (spray, perhaps) to their AC line plugs to reduce the mating friction in the outlet. While that sounds like a good idea, I think it’s misguided: you don’t want to reduce the metal-to-metal contact area by lubing it up with an insulator. In any event, that sliding friction ensures the contacts have a clean mating surface with low resistance.

    Maybe use some Caig DeoxIT, but not an insulating spray!

    For what it’s worth, do you know that the durability of an ordinary USB connector is 1500 cycles? That’s far more than PCI backplane connectors at 100 cycles. Some exotic high-GHz RF connectors can survive only a few dozen cycles.

    Moral of the story: don’t unplug your stuff all the time. Use switches and stay healthy.

    This took place many years ago, so the picture quality isn’t up to contemporary standards.

  • CD V-750 Dosimeter Charger Manual

    V-750 Model 5b Manual Cover
    V-750 Model 5b Manual Cover

    My V-750 dosimeter charger came with two (!) copies of the manual and the modification instructions (stamped JUN–1965) for adding the anti-kick capacitor.

    The paperwork didn’t fare quite as well as the metal-cased charger, sporting far more mildew on the pages than I want on my shelves.

    I cut the worst-looking copy right down the middle, scanned it with some attention to detail, and now there’s a nice version that looks just as bad but lacks the mildew.

    Clicky:

    CD V-750 Model 5b Radiological Dosimeter Charger Operating and Maintenance Manual with Modification Instruction Sheet

    If you’re really clever, you can figure out how to sequence the sheets and print them duplexed so they appear back-to-back, then bind them into a booklet just like the original. There’s a copy of a blank inside cover, too, so you can wrap your booklet in a nice Civil Defense Yellow cover.

    The schematic shows what real engineers could do, back in the days when transistors came individually packaged with a ten-dollar price tag: 1.5 volts in, 200+ volts out, one transistor. Of course, they paid attention to their transformer lessons.

    V-750 Dosimeter Charger Schematic
    V-750 Dosimeter Charger Schematic
  • CD V-750 Dosimeter Charger Switch Cleanup

    So I got a classic Jordan Electronics CD V-750 dosimeter charger (for V-742 dosimeters) from the usual eBay supplier, mostly because I’m writing a Circuit Cellar column and need a MacGuffin to talk about HV transformers and power supplies.

    The charger had some corrosion on the cast aluminum (?) knobs, but seemed largely unscathed by four decades in its original box. The charging circuitry depends on a few electrical contacts and, as you might expect, those were badly intermittent.

    A bit of background…

    Charging contact pedestal
    Charging contact pedestal

    The charging pedestal has two parts visible from the outside: an outer sleeve that’s firmly secured to the case and an inner cylinder that slides within the sleeve, with springs inside the charger pressing it outward. Well, there’s a nut, toothed washer, and the bead-chain cap assembly, but those don’t count.

    The inner cylinder has a transparent plastic insert crimped in place, with a metal rod protruding about 2 mm from the flat top of the plastic. That rod presses against the middle contact of the dosimeter and connects the charging voltage to the electrostatic fiber. The outer body of the dosimeter fits snugly over the cylinder to make the other electrical contact.

    The directions tell you to press the dosimeter down gently to read it. A weak spring holds the cylinder outward with about 1.5 lb of force. After about 1 mm of travel an incandescent bulb (remember those?) turns on, transmits light through the plastic insert, and lights up the dosimeter scale and fiber.

    To charge the dosimeter, you press down firmly and twiddle the adjusting knob to position the fiber. Pressing hard enough to force the dosimeter body down to the sleeve, another 3 mm of travel, compresses the dosimeter’s internal bellows (or plastic seal) enough to complete the circuit to the fiber; a sealed dry air gap normally isolates the fiber from the dosimeter’s external contact. A stout leaf spring holds the cylinder outward with (according to one instruction manual) 7.75 lb of force, so it takes more pressure than you’d expect to hold the dosimeter down.

    Charging contact inside view
    Charging contact inside view

    The internal parts of the charging pedestal makes all that stuff work without any formal switch contacts. That, unfortunately, causes the intermittent operation.

    The gray “wire” inside the large 7-lb leaf spring is both the 1-lb spring and the high-voltage electrical contact. The purple wire soldered to the end of the wire spring carries the HV charging potential from the circuitry.

    The black and red wires connect to the incandescent bulb, which fits into the holder near the top of the circuit board sticking up vertically just to the right of the pedestal base; I removed it to reveal the other parts. For what it’s worth, the bulb holder doesn’t do a good job of securing the bulb; I have some improvements in mind for that, too.

    Note the spare bulb just beyond the center bulb contact near the top of the picture. The rubber grommet securing that has turned into black Gummi-bear substance; that sucker is in there forever.

    The battery’s positive terminal connects to the case; this is a positive-ground circuit!

    The leaf spring hitches over two shoulders on the circuit board and presses it firmly against the other side of the spring. The curved fork fingers pressing against the brown insulating washer are firmly mounted to the circuit board and act as one side of the switch contacts.

    Pedestal removed from charger
    Pedestal removed from charger

    When you push the dosimeter against the sleeve, the base of the cylinder slides through the ID of the fiber washer and contacts the fork fingers. Bingo, that completes the circuit, lights the lamp, and fires up the HV circuitry. The charging voltage doesn’t reach the dosimeter fiber because the leaf spring hasn’t started pressing the cylinder against the dosimeter’s innards: there’s no connection inside the dosimeter.

    With that out of the way, here’s what’s needed to get the pedestal working reliably.

    Get the whole pedestal assembly out of the charger, which requires a bit of wiggly jiggly action. This will be easier if you unsolder the three wires, which I didn’t do until I was sure it was absolutely necessary.

    Grab the leaf spring on both sides of the bulb circuit board, pull up while pushing down on the spring’s base with some other fingers, and lift the tabs off the circuit board shoulders. This requires a surprising amount of force; don’t let the spring get you by the soft parts!

    Leaf spring released
    Leaf spring released

    A small crimped metal connector mates the end of the wire spring to the center contact in the cylinder. Pay attention as you maneuver the pedestal out of the leaf spring: you don’t want to deform that connector too much. Or, much worse, lose it under your workbench.

    There’s a rubber O-ring inside the outer sleeve that’s barely visible in the picture of the parts. The 1-lb wire spring had trouble forcing the cylinder back out through the O-ring, leaving the switch just barely closed even with the dosimeter removed. A touch of silicone gasket lube on the O-ring made it wonderfully slippery again.

    The inner cylinder has wire snap ring in a groove that adds a bit of stability and maybe some contact friction inside the sleeve. You need not remove the snap ring; they’re not called Jesus clips for nothing. It’s outside the O-ring’s protection, exposed to the world.

    Basically, clean everything without yielding to the Siren Call of sandpaper. What you want to do is get the oxidized metal off the base material without scarring it.

    Pedestal contact components
    Pedestal contact components

    I applied a tiny drop of Caig DeoxIT Red to the snap ring, worked it around & around, then wiped off the residue.

    The actual switch “contacts” are the wide base of the inner cylinder (to the right in the picture) and the rounded end of the fork attached to the lamp base circuit board. The contact area is broad, smooth, plated-steel-on-steel, and utterly unsuited to the job. Wipe both of them clean, add DeoxIT, wipe them clean again.

    I applied another minute drop of DeoxIT to the base of the cylinder after putting everything back together, rotated it against the fork, and wiped it off. Most likely that had only psychological benefit, but what the heck.

    The parts go back together in the obvious way, again taking care not to let the leaf spring bite you. I routed the wires a bit differently, but I doubt it makes any difference.

    Now the charger works perfectly again!

    Memo to Self: replace that bulb with nice soldered-in-place LED

    V-742 Dosimeter set to Zero
    V-742 Dosimeter set to Zero

    Update: It seems you can actually buy V-750 dosimeter chargers new from www.securityprousa.com/doch.html. However, eBay is significantly less expensive and you might get some quality shop time out of it. Your choice.

  • Changing the Arduino PWM Frequency

    The default PWM frequency for PWM 3, 9, 10, & 11, at least for the Diecimila running at 16 MHz, is 488 Hz. That’s OK for dimming LEDs where you’re depending on persistence of vision, but it’s much too low when you must filter it down to DC.

    The relevant file is hardware/cores/arduino/wiring.c, which is buried wherever your installation put it.

    Turns out that the Arduino runtime setup configures the timer clock prescalers to 64, so the timers tick at 16 MHz / 64 = 250 kHz.

    You can fix that by setting the Clock Select bits in the appropriate Timer Control Register B to 0x01, which gets you no prescaling and a 62.5 ns tick period:

    TCCR0B = 0x01;   // Timer 0: PWM 5 &  6 @ 16 kHz
    TCCR1B = 0x01;   // Timer 1: PWM 9 & 10 @ 32 kHz
    TCCR2B = 0x01;   // Timer 2: PWM 3 & 11 @ 32 kHz

    If you’re finicky, you’ll bit-bash the values rather than do broadside loads. However, it probably doesn’t matter, because Timer 0 runs in Fast PWM mode and Timers 1 & 2 run in Phase-Correct PWM mode, so WGMx2 = 0 in all cases.

    Fast PWM mode means Timer 0 produces PWM at 250 kHz / 256 = 976 Hz. However, the Arduino runtime runs the millis() function from the Timer 0 interrupt, so changing the Timer 0 prescaler pooches millis(), delay(), and any routines that depend on them.

    Phase-correct PWM mode means that Timers 1 & 2 count up to 0xff and down to 0x00 in each PWM cycle, so they run at 250 kHz / 512 = 488 Hz.

    Adroit TCCRxB setting can prescale by 1, 8, 64, 256, or 1024. Or stop the Timer stone cold dead, if you’re not careful.

    Before you fiddle with this stuff, you really should read the timer doc in the ATmega168 datasheet there.

    Memo to Self: don’t mess with Timer 0.