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.

Tag: Repairs

If it used to work, it can work again

  • EMC2 Logitech GamePad: Triggger Button Name Change

    I just updated EMC2 on the Sherline CNC mill from 2.4.6 to 2.4.7 (which mis-identifies itself as 2.4.6 on the splash screen) and the Axis UI failed to start. A bit of digging shows that the name of Button 1 (the left button in the right-hand quad, clearly labeled 1) has inexplicably changed from btn-trigger to btn-joystick.

    Logitech Gamepad Pendant
    Logitech Gamepad Pendant

    Most likely the change has nothing to do with EMC2, because (I think) those names bubble up from the HID driver that actually talks to the hardware and that stuff has also been updated; this is all on Ubuntu 10.04 LTS. But in any event, the name is now different.

    That requires a tweak to the Eagle schematics, which will regenerate Logitech_Gamepad.hal, but you can just edit the latter file and change btn-trigger to btn-joystick.

    As nearly as I can tell, changing the pin name in the Logitech library component, saving the library, then updating the library in the schematic doesn’t do squat. Evidently, Eagle keeps track of which components you’ve used and won’t update them unless you do some manual gymnatistics, which makes a certain amount of sense.

    That means one must:

    • Delete both “gates” of the old component (INPUT.0.BUTTONS first, then INPUT.0)
    • Make sure you’re on Page 2 where the basic gate will go
    • Add the revised LOGITECH_DUAL_ACTION_GAMEPAD to get the INPUT.1 “gate”
    • Rename it to INPUT.0
    • Use Move to jiggle it around a bit to ensure its pins get hitched up to the existing nets
    • Switch to Page 1 where the button nets lie in wait
    • Type invoke input.0 into the Eagle command line
    • Pick -BUTTONS from the list to select that “gate”
    • Position that gate appropriately
    • Use Move to jiggle the gate
    • Save everything
    • Run the Eagle2Hal ULP to get a new HAL output file
    • Put that file where it’ll do the most good

    There, now, wasn’t that obvious?

    The modified Logitech_Gamepad.hal file:

    # HAL config file automatically generated by Eagle-CAD ULP:
    # [/mnt/bulkdata/Project Files/eagle/ulp/hal-write-2.4.ulp]
    # (C) Martin Schoeneck.de 2008
    # Mods Ed Nisley 2010
    # Path        [/mnt/bulkdata/Project Files/eagle/projects/EMC2 HAL Configuration/]
    # ProjectName [Logitech Gamepad - 2.4.7]
    # File name   [/mnt/bulkdata/Project Files/eagle/projects/EMC2 HAL Configuration/Logitech Gamepad - 2.4.7.hal]
    # Created     [10:40:31 11-Nov-2011]
    
    ####################################################
    # Load realtime and userspace modules
    loadrt constant		count=16
    loadrt and2		count=17
    loadrt flipflop		count=4
    loadrt mux2		count=5
    loadrt mux4		count=1
    loadrt not		count=8
    loadrt or2		count=10
    loadrt scale		count=7
    loadrt timedelay		count=1
    loadrt toggle		count=1
    loadrt wcomp		count=6
    
    ####################################################
    # Hook functions into threads
    addf toggle.0		servo-thread
    addf wcomp.1		servo-thread
    addf wcomp.2		servo-thread
    addf wcomp.3		servo-thread
    addf and2.0		servo-thread
    addf and2.4		servo-thread
    addf and2.3		servo-thread
    addf and2.2		servo-thread
    addf and2.1		servo-thread
    addf constant.6		servo-thread
    addf constant.5		servo-thread
    addf constant.4		servo-thread
    addf constant.3		servo-thread
    addf constant.2		servo-thread
    addf constant.1		servo-thread
    addf constant.0		servo-thread
    addf constant.7		servo-thread
    addf constant.8		servo-thread
    addf scale.1		servo-thread
    addf scale.2		servo-thread
    addf scale.3		servo-thread
    addf mux4.0		servo-thread
    addf mux2.0		servo-thread
    addf scale.4		servo-thread
    addf scale.0		servo-thread
    addf wcomp.5		servo-thread
    addf wcomp.4		servo-thread
    addf wcomp.0		servo-thread
    addf flipflop.1		servo-thread
    addf flipflop.0		servo-thread
    addf and2.5		servo-thread
    addf and2.6		servo-thread
    addf and2.7		servo-thread
    addf and2.8		servo-thread
    addf flipflop.2		servo-thread
    addf flipflop.3		servo-thread
    addf or2.4		servo-thread
    addf or2.8		servo-thread
    addf or2.7		servo-thread
    addf or2.6		servo-thread
    addf or2.5		servo-thread
    addf or2.3		servo-thread
    addf or2.2		servo-thread
    addf or2.1		servo-thread
    addf or2.0		servo-thread
    addf not.1		servo-thread
    addf not.2		servo-thread
    addf not.3		servo-thread
    addf not.4		servo-thread
    addf not.5		servo-thread
    addf not.6		servo-thread
    addf not.7		servo-thread
    addf not.0		servo-thread
    addf constant.9		servo-thread
    addf mux2.1		servo-thread
    addf mux2.2		servo-thread
    addf mux2.3		servo-thread
    addf mux2.4		servo-thread
    addf constant.10		servo-thread
    addf constant.11		servo-thread
    addf scale.5		servo-thread
    addf scale.6		servo-thread
    addf constant.12		servo-thread
    addf constant.13		servo-thread
    addf timedelay.0		servo-thread
    addf constant.14		servo-thread
    addf constant.15		servo-thread
    addf and2.16		servo-thread
    addf and2.15		servo-thread
    addf and2.14		servo-thread
    addf and2.13		servo-thread
    addf and2.12		servo-thread
    addf and2.11		servo-thread
    addf and2.10		servo-thread
    addf and2.9		servo-thread
    addf or2.9		servo-thread
    
    ####################################################
    # Set parameters
    
    ####################################################
    # Set constants
    setp constant.0.value	+0.02
    setp constant.1.value	-0.02
    setp constant.2.value	60
    setp constant.3.value	1.00
    setp constant.4.value	0.10
    setp constant.5.value	0.50
    setp constant.6.value	0.10
    setp constant.7.value	+0.5
    setp constant.8.value	-0.5
    setp constant.9.value	0.0
    setp constant.10.value	[TRAJ]MAX_LINEAR_VELOCITY
    setp constant.11.value	[TRAJ]MAX_ANGULAR_VELOCITY
    setp constant.12.value	-1.0
    setp constant.13.value	0.1
    setp constant.14.value	0.020
    setp constant.15.value	0.000
    
    ####################################################
    # Connect Modules with nets
    net a-button-minus or2.2.in0 input.0.btn-joystick and2.15.in0
    net a-button-plus or2.2.in1 input.0.btn-thumb2 and2.16.in0
    net a-buttons-active or2.2.out or2.3.in0 or2.4.in1
    net a-disable not.7.out and2.5.in1
    net a-enable or2.4.in0 flipflop.3.out not.7.in mux2.4.sel
    net a-jog wcomp.2.in input.0.abs-z-position mux2.4.in1
    net a-knob-active not.2.out and2.7.in1
    net a-knob-inactive wcomp.2.out not.2.in and2.6.in1
    net a-select and2.8.in0 and2.7.out
    net a-set flipflop.3.set and2.8.out
    net angular_motion or2.4.out mux2.0.sel
    net any-buttons-active mux4.0.sel0 or2.8.out
    net az-buttons-active or2.3.out or2.8.in1 or2.9.in0
    net az-reset flipflop.2.reset and2.6.out flipflop.3.reset
    net button-crawl scale.4.out mux4.0.in3
    net button-fast scale.2.out mux4.0.in1 scale.4.in
    net jog-crawl toggle.0.out mux4.0.sel1
    net jog-speed halui.jog-speed mux4.0.out
    net knob-crawl mux4.0.in2 scale.3.out
    net knob-fast mux4.0.in0 scale.1.out scale.3.in
    net n_1 constant.10.out mux2.0.in0
    net n_2 and2.0.in0 input.0.btn-top2
    net n_3 and2.0.in1 input.0.btn-base
    net n_4 and2.0.out halui.abort
    net n_5 halui.mode.manual input.0.btn-base3
    net n_6 wcomp.0.max wcomp.1.max wcomp.2.max wcomp.3.max constant.0.out
    net n_7 halui.program.resume input.0.btn-base4
    net n_8 wcomp.0.min wcomp.1.min wcomp.2.min wcomp.3.min constant.1.out
    net n_9 mux2.0.in1 constant.11.out
    net n_10 constant.12.out scale.5.gain scale.6.gain
    net n_11 or2.0.in0 input.0.btn-base5
    net n_12 or2.0.in1 input.0.btn-base6
    net n_13 constant.9.out mux2.1.in0 mux2.2.in0 mux2.3.in0 mux2.4.in0
    net n_14 mux2.1.out halui.jog.0.analog
    net n_15 toggle.0.in or2.0.out
    net n_16 constant.2.out scale.0.gain
    net n_17 constant.5.out scale.1.gain
    net n_18 constant.3.out scale.2.gain
    net n_19 constant.4.out scale.3.gain
    net n_20 scale.4.gain constant.6.out
    net n_21 halui.jog.1.analog mux2.2.out
    net n_22 mux2.2.in1 scale.5.out
    net n_23 scale.6.out mux2.3.in1
    net n_24 constant.13.out halui.jog-deadband
    net n_25 wcomp.4.max constant.7.out wcomp.5.max
    net n_26 constant.8.out wcomp.4.min wcomp.5.min
    net n_27 mux2.3.out halui.jog.2.analog
    net n_28 halui.jog.3.analog mux2.4.out
    net n_29 timedelay.0.out and2.9.in1 and2.10.in1 and2.12.in1 and2.11.in1 and2.13.in1 and2.14.in1 and2.16.in1 and2.15.in1
    net n_30 and2.9.out halui.jog.0.minus
    net n_31 or2.9.out timedelay.0.in
    net n_32 constant.14.out timedelay.0.on-delay
    net n_33 constant.15.out timedelay.0.off-delay
    net n_34 and2.10.out halui.jog.0.plus
    net n_35 and2.11.out halui.jog.1.minus
    net n_36 halui.jog.1.plus and2.12.out
    net n_37 and2.13.out halui.jog.2.minus
    net n_38 and2.14.out halui.jog.2.plus
    net n_39 and2.15.out halui.jog.3.minus
    net n_40 and2.16.out halui.jog.3.plus
    net vel-per-minute scale.0.out scale.1.in scale.2.in
    net vel-per-second mux2.0.out scale.0.in
    net x-buttons-active or2.7.in0 or2.5.out
    net x-disable not.4.out and2.4.in1
    net x-enable not.4.in flipflop.0.out mux2.1.sel
    net x-hat-jog wcomp.4.in input.0.abs-hat0x-position
    net x-hat-minus wcomp.4.under or2.5.in1 and2.9.in0
    net x-hat-plus or2.5.in0 wcomp.4.over and2.10.in0
    net x-jog wcomp.0.in input.0.abs-x-position mux2.1.in1
    net x-knob-active not.0.out and2.1.in0
    net x-knob-inactive wcomp.0.out not.0.in and2.2.in0 and2.3.in0
    net x-set and2.1.out flipflop.0.set
    net xy-buttons-active or2.7.out or2.8.in0 or2.9.in1
    net xy-reset flipflop.0.reset and2.2.out flipflop.1.reset
    net y-buttons-active or2.6.out or2.7.in1
    net y-disable not.5.out and2.1.in1
    net y-enable flipflop.1.out not.5.in mux2.2.sel
    net y-hat-jog wcomp.5.in input.0.abs-hat0y-position
    net y-hat-minus wcomp.5.under or2.6.in1 and2.12.in0
    net y-hat-plus or2.6.in0 wcomp.5.over and2.11.in0
    net y-jog wcomp.1.in input.0.abs-y-position scale.5.in
    net y-knob-active not.1.out and2.3.in1
    net y-knob-inactive not.1.in wcomp.1.out and2.2.in1
    net y-select and2.4.in0 and2.3.out
    net y-set flipflop.1.set and2.4.out
    net z-button-minus or2.1.in0 input.0.btn-thumb and2.13.in0
    net z-button-plus or2.1.in1 input.0.btn-top and2.14.in0
    net z-buttons-active or2.1.out or2.3.in1
    net z-disable not.6.out and2.8.in1
    net z-enable not.6.in flipflop.2.out mux2.3.sel
    net z-jog wcomp.3.in input.0.abs-rz-position scale.6.in
    net z-knob-active not.3.out and2.5.in0
    net z-knob-inactive not.3.in wcomp.3.out and2.7.in0 and2.6.in0
    net z-set and2.5.out flipflop.2.set
    
  • Great Northeast October Snowstorm

    Our yard accumulated about 14 inches of heavy wet snow that made a mess of the maple trees. Before I could get the snowblower out of the garage, I had to cut up a stack of branches:

    Branches at garage
    Branches at garage

    Yes, there really is that much of a slope leading up to the garage; clearing the driveway immediately after every snowstorm is not optional.

    Many of the branches in the back yard broke off and simply leaned against the ones still arched over the driveway:

    Branches in back yard
    Branches in back yard

    The front yard was a mess:

    Branches in front yard
    Branches in front yard

    In addition to all that, we had branches down beside the house, in the garden, around the beehive, and, in general, everywhere. Obviously, we have too many maples, but they’re what the previous owners planted (or at least didn’t uproot while that was possible).

    The generator bridged 25 hours without power to save the refrigerator & freezer contents and keep the house between 55-60 °F. We survived five days with no phone (shrug) or Internet (eeek!); the cell phone was, as usual, useless because the house sits on a local maximum in a shallow valley below line-of-sight from all the surrounding towers.

    The last break in the phone & Internet cables occurred just north of us:

    Branches on wires
    Branches on wires

    Those branches came from a tree across the road that put down roots on a slab of rock that just didn’t provide enough griptivity:

    Tree down on Rt 376
    Tree down on Rt 376

    After three days of diligent bow-saw work and mule-mode dragging, we cleared the yards. The back yard clutter went over the cliff toward our bottomlands adjoining the Wappingers Creek and the front yard timber now sits ready for what we hope will be the town’s pickup:

    Branches ready for pickup
    Branches ready for pickup

    Our experience was a nuisance, rather than a disaster, unlike that of many folks in the area.

    Now it’s time for the annual fall leaf-shredding adventure

    [Update: Turns out the NYS DOT drew the short straw:

    NYS DOT crew grinding branches
    NYS DOT crew grinding branches

    Took them the better part of 15 minutes; the larger branches nearly stalled that giant chipper. A tip o’ the hard hat!]

  • Harbor Freight Bar Clamp Failure

    The squeeze handle that tightens the bar clamp cracked exactly where you’d expect: directly across the pivot hole where the miracle engineering plastic thins down to a precarious ridge. The end of the handle is still inside the clamp:

    Bar clamp with broken handle
    Bar clamp with broken handle

    Nothing bonds that plastic, so, in the nature of a quick fix, I cut a steel strap to wrap around the perimeter of the broken section and epoxied the whole mess together:

    Reinforced bar clamp handle
    Reinforced bar clamp handle

    That lasted for exactly 2.5 squeezes and then pulled apart; the epoxy doesn’t really have anything to grab.

    ABS isn’t a good substitute for engineering plastic, so this will require a bit of CNC work on the Sherline. I’ll probably carve the first one from polycarbonate, just because I have a sheet of the right thickness, but it really cries out for aluminum, doesn’t it?

    Why CNC? Well, I’m going to make a handful of handles and get proactive on the other clamps.

    My other bar clamps have much heavier sections in that area, so perhaps the folks supplying Harbor Freight could take a hint? Yeah, but the clamp was cheap, which always conflicts with good. On the other paw, I’ve seen exactly this same clamp priced at not cheap elsewhere.

  • Glass Chip Flat

    Having had trouble with tire liners eroding the rear tube, I went with just a tube and a Kevlar belted Marathon tire. Somewhat to my surprise, that lasted for most of the riding season, but a recent trip had a protracted rest stop:

    Glass chip in tire
    Glass chip in tire

    The puncture came from a knife-edged glass chip that avoided most of the Kevlar belt inside the tire:

    Glass chip - detail
    Glass chip – detail

    I think even a tire liner wouldn’t help with this one.

    Other than that, the tube was in fine shape, so I’ll probably patch it and toss it back in the bike pack. Tire liners prevent most flats from gashes along the midline of the tire, but …

  • Expedient Handlebar Mirror Repair

    We frequently host touring bicyclists who need a campsite in the Mid-Hudson Valley. The most recent couple has been riding for two years, starting eastward from Paris shortly after their wedding. Yeah, it’s a honeymoon trip.

    After riding through Western and Eastern Europe, the Middle East, and several of the ‘Stans, JeanMarc’s handlebar mirror broke in Kazakhstan. Marie toted the carcass out of the ‘Stans, across India, through China, and then from Montreal to here. They’re biking to Houston, where they’ll fly to Peru, ride south and across the Andes, and work their way across the Atlantic on a cargo ship that eventually docks in Germany. Then, a year from now, they’ll just bike back to Paris.

    Makes you feel like sludge, too, doesn’t it?

    With that as prologue, JeanMarc wondered if I could fix the mirror mount. It started as a 10 mm plastic ball on a molded plastic fitting with an integral worm screw and strap; of course, the ball stem snapped off during a hard landing or some such event that comes naturally during long-distance riding. We kicked around some ideas, rummaged through the heap, and came up with a workable, albeit hideous solution.

    I applied a Dremel slitting wheel to a pair of Zerk grease fittings, sliced off the inlet valve, extracted the valve spring, and cleaned up the residue to leave a somewhat misshapen 9.3 mm (really a scant 3/8 inch) ball-like end. A bit of lathe work converted a chunk of PVC pipe into a sleeve grooved for a metal hose clamp. I drilled two #3 holes, tapped them 1/4-28 (which, believe it or not, is the correct thread for a Zerk), bandsawed the pipe in half, introduced the pieces to Mr Belt Sander to round the edges, screwed Zerks into holes, and wound up with a pair of these:

    Handlebar Mirror Mount - detail
    Handlebar Mirror Mount – detail

    Which looks awful on the handlebars, but we’re pretty sure it won’t break and he has a spare if the mirror on Marie’s bike snaps off:

    Handlebar Mirror Mount - fixed
    Handlebar Mirror Mount – fixed

    The Zerk fitting could unscrew, but the threads aren’t exactly in pristine condition after all that fussing and seem to be jammed firmly in place. If we had more time, I’d have heated the PVC and molded it around the handlebars, but we decided that wasn’t really necessary.

    They rode off into the distance this morning… may you have smooth roads and a tailwind, JeanMarc and Marie!

    JeanMarc and Marie
    JeanMarc and Marie
  • External USB Case: DVD Overcurrent

    Well, it turns out that the DVD drive I stuffed into that case really does require a whole bunch of current. I tried playing a DVD and got erratic results, including weird keyboard (!) failures. Finally, I hitched a bench supply to the coaxial power jack on the case and caught it in the act:

    Laptop DVD - current display
    Laptop DVD – current display

    That jack normally connects to the power-only USB cable, which implies an upper limit of 100 mA. A bit of poking around inside shows that the coaxial power jack simply parallels the USB jack’s VCC line, so there’s no fancy negotiation or current sharing going on.

    When the keyboard went nuts it was sharing an unpowered USB hub with this thing, which means that the overcurrent dragged down the hub’s supply. I was permuting all the choices to see if the failures suggested anything; eventually it did.

    A bit of rummaging in the Basement Laboratory Warehouse Wing uncovered a 5.0 V 3.7 A wall wart switching power supply that is grossly in excess of the drive’s 1.5 A rating. Amazingly, it even had the correct coaxial power plug on the end of the cable, which never happens.

    Alas, because the external supply back-powers the USB data cable, it lights up the Q150’s power button when the PC is turned off. I think I can insert an isolation diode into the USB power trace to isolate it from the jack, somewhat along the lines of that hack. However, that seems to require removing the USB connector to uncover a very well protected top trace. For now, I’ll just unplug the drive.

  • Flex-fatigued Helmet Cable

    I cable-tied the mic/earphone cable on Mary’s bike helmet to a rib on the fancy air vents near the back end, hoping that would reduce the inevitable flexing. Alas, it didn’t work out that way and the cable lasted only two seasons. This cut-away view shows the pulverized shield braid inside the jacket:

    Fatigue-failed helmet cable
    Fatigue-failed helmet cable

    The symptoms were totally baffling: the mic worked perfectly, but the earphones cut out for at most a few syllables. Of course, I can’t wear her helmet and it only failed occasionally while riding. I barked up several wrong trees, until it got so bad that I could make it fail in the garage while listening to the local NWS weather radio station.

    I spliced in a new USB male-A connector and (re-)discovered that the braid seems to be aluminum, rather than tinned copper. In any event, the wire is completely unsolderable; I crimped the braid from the new connector to a clean section of the old braid. The braid serves only as an electrostatic shield, as it’s not connected to anything on the helmet end. That should suffice until I rebuild the headsets this winter.