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: Improvements

Making the world a better place, one piece at a time

  • Front Derailleur Cable Breakage: Prevention Thereof

    Front derailleur cable with broken strand
    Front derailleur cable with broken strand

    Although recumbent bikes use ordinary bicycle components, they tend to have somewhat different frame geometries (to put it mildly). Our Tour Easy ‘bents seem to put a particular strain on the front derailleur cables, perhaps because the cable enters from a different angle than the derailleur designers expected. The little finger that’s supposed to guide the cable actually concentrates all the bending force at one spot… precisely where the cable breaks.

    If you look carefully, you’ll see a little brass disk (between the derailleur body and cable) that cradles the cable. I made that for the previous derailleur, but this one has Yet Another Geometry. I know there’s a difference between “high pull” and “low pull” front derailleurs, and perhaps this is the wrong one for this application, but there seems no algorithmic way to sort this stuff out.

    Cable guide pulley
    Cable guide pulley

    The solution is to make Yet Another Cable Guide Pulley, with a groove around the perimeter, an off-center hole, and a notch to clear the finger. It’s not exactly a pulley, but I’m not sure what else to call it. Maybe just a cable guide?

    This was a quick-and-dirty manual lathe project, two days before leaving on a trip: turn down some brass stock, put a groove around the perimeter, part it off, drill a hole, and cut the notch. Not a trace of CNC to be found: all done by guess and by gosh, marked out with Sharpies on the actual part in real time running.

    The general notion is that the cable rides the groove smoothly throughout the derailleur’s entire travel range and, thus, doesn’t bend around the finger. This changes the shift geometry just slightly, but, fortunately, long-wheelbase ‘bents have a sufficiently relaxed chainline that indexed front shifting isn’t much of a problem even with slightly misplaced positions. Besides, that’s why SRAM grip-shifter have all those clicky stops, right?

    (The shifting is actually a bit goobered, with the outer chainring shift a bit too close to the middle. When we get back, I’ll re-do this with somewhat more attention to detail.)

    Pulley in action
    Pulley in action

    Here’s what it looks like in action. I’ve had good success with this sort of thing over the years, so I think this one will work just fine, too. It simply takes one broken cable on each new derailleur to spin up enough enthusiasm for making Yet Another Pulley…

  • Bike Helmet Mirror Re-Repair

    Socket with brass reinforcement
    Socket with brass reinforcement

    The front ball joint on the mirror on Mary’s helmet loosened enough that the mirror blew out of position every time we got up to a decent traveling speed. I’ve repaired these mirrors several times before; they’re plastic and tend to fracture / wear out / break at inconvenient moments.

    The first pic shows the mirror (the black surface is reflecting the dark floor joists overhead) with an old blob of epoxy that repaired a break in the outer socket. The socket originally had stylin’ curves joining it to the mirror, which proved to be weak spots that required epoxy fortification.

    This time the socket split axially on the side away from the mirror, which released the pressure on the ball socket that seats into it. I found a chunk of brass tube that fit snugly over the socket, then carved some clearance for the existing epoxy blob. The key feature is that the tube remains a ring, rather than a C-shaped sheet. to maintain pressure around the socket.

    Clamping the reinforcement ring
    Clamping the reinforcement ring

    Here are the various bits, with the reinforcing ring clamped in place. I coated the socket exterior with JB Weld epoxy, slipped the ring in place, and tapped it down with a brass hammer to seat flush with the front face of the socket. That left gaps between the socket opening and the tube that I eased more epoxy into with an awl. A bit more epoxy around the exterior smoothed over that ragged edge.

    The strut at the bottom of the picture ends in a ball joint held by a socket that slips into the mirror socket. The loose brass ring above the mirror is some shim stock that I added some years ago to take up slop between the ball socket and the mirror socket and tighten the ball joint. I suppose that pressure eventually split the outer socket, but so it goes.

    Repaired mirror joint
    Repaired mirror joint

    The clamp squished the outer socket enough to snug it around the ball socket, so when I reassembled the mirror it was fine. To be sure, I dunked the ball in my lifetime supply of Brownell’s Powdered Rosin for a bit more non-slip stickiness.

    I have a box full of defunct bike helmet mirrors, dating back to those old wire-frame square mirrors that clamped onto the original Bell helmets. The newer plastic ones just don’t last; we ride our bikes a lot and even fancy engineering plastic isn’t nearly durable enough. A few bits of metal here and there would dramatically improve the results!

    I’m going to build some durable wire-frame mirrors, but … this will keep us on the road for a while. I suppose I should make a preemptive repair on my helmet mirror while I’m thinking of it…

  • Bike Rim Reflectorization

    Bike wheel with retroreflective tape
    Bike wheel with retroreflective tape

    Here’s a quick-and-easy way to improve the odds of your arriving home safely after dark: add snippets of retroreflective tape to the inside of the rims on your bike.

    Do half the rim in one color and leave the other half untaped (or taped in a contrasting color) so that the rim flashes as the wheel rotates. I originally applied orange tape, of which I have very nearly a lifetime supply, then added white when I got a sheet as part of a surplus deal.

    At 15 mph the 20-inch front wheel blinks at about 4 Hz, which is wonderfully attention-getting. The rear wheel, a more common 700C size, blinks at 3 Hz.

    It helps to measure the space between spokes, then set up a template to cut all the tape pieces the same length. Wipe the big chunks of dirt off the rim, then remove the remaining grunge with alcohol so the tape actually sticks.

    New York State vehicle law considers reflectorized tires as equal to those in-the-spokes reflectors, which is a Good Thing.

    The more you look like a UFO after dark, the less surprised the drivers are and the less hassle you get.

  • Keeping the Screws in Sherline Hold-Down Clamps

    A small improvement: add a snippet of heat stink shrink tubing to the screw in the L-shaped hold-down clamps and the screw won’t go walkabout in your tooling widget case.

    Make it the same length as the distance from the clamp to the surface and it’ll remind you how far to screw on the T-nut when you swap the clamps from tooling plate to milling machine table.

    The Sherline Mill Vise (PN 3551) comes with a set of clamps. They’re also available separately as the 4-Jaw Hold-Down Set (PN 3058).

  • Red Filter for White LED Bike Headlight

    White 5-LED headlight
    White 5-LED headlight

    As I mentioned there, we have white LED bike headlights clamped to the amateur radio antennas on our bikes, facing rearward to eliminate the “But, Officer, I didn’t see him” line from the accident investigation. That works fine during daylight hours, but it’s rather blinding after dark and, in any event, taillights are supposed to be red (after 1 Nov 2009, they may also be amber).

    The easiest way to get that result, without having to tote along Yet Another Light, is to slip a red filter over the white LED lens. This dramatically reduces the light output, because the yellow phosphor used to get white light out of what’s basically a blue LED doesn’t emit much energy in the red end of the spectrum, but it’s plenty good enough to be seen from the requisite 300 feet.

    Amber filters would be a much, much better match to the phosphor and I’ll use them next year when they’re legal.

    For what it’s worth, we’ve discovered that the more we look like UFOs after dark, the more clearance we get. The bikes are extensively reflectorized and lighted, plus we have reflective arm and leg bands. If somebody hits us, it’s because they did it intentionally; that’s usually the story with drunks and punks, alas.

    Red filter components
    Red filter components

    I cut two transparent disks from ordinary electronics packaging material, plus a red disk from the Primary Red filter material mentioned there, stacked them on the headlight, and fired some big heat stink shrink tubing around them. The tubing extended maybe 3 mm past the end of the headlight and shrank into a neat lip that matched the bezel around the lens.

    The tool to have for this sort of job is an Olfa Compass Circle Cutter. It leaves a pin prick in the center of the circle, but if you’re gentle that won’t be a problem in this application.

    The shrunken tubing will be exceedingly difficult to pull off the headlight, so you may want to wrap a layer of tape around the bezel before shrinking. Peel the tape off when you’re done and the tubing will have a few mils more clearance.

    No adhesive on earth will stick to both the polypropylene disks and the heatshrink tubing, but you can try silicone snot if you want. I made the disks just slightly larger than the bezel so that the tubing captures them as it shrinks. These things spend much of their lives in a ziplock baggie, so durability isn’t an issue.

    Red filter installed
    Red filter installed

    In any event, the filter looks like this when it’s installed. Because of the odd way I mounted the headlights, the side lenses aren’t visible (and they’re white, not red), but we have plenty of other light visible from the side.

    For the straight dope on current NYS bicycle laws, go there, click on the “Laws of New York” link, search for “bicycle”, then click on section 1236. It’s New York’s idea of a useful Web interface: get over it.

    The bezels on our lights are beginning to crack, so it’s probably time to start thinking about a killer street-legal day/night amber taillight. High intensity LEDs are dirt cheap these days…

  • Arduino Hardware-assisted SPI: Synchronous Serial Data I/O

    Many interesting projects require more digital output bits than the Arduino hardware can support. You then use 74HC595 serial-in/parallel-out chips and that tutorial pretty well explains how it works. The shiftOut() library function squirts a byte out through an arbitrary pin, leading with either the high or low bit.

    Software SPI: Clock and Data
    Software SPI: Clock and Data

    Just drop one byte into shiftOut() for each ‘595 lined up on your board. Remember to latch the bits (LOW-to-HIGH on RCK @ pin 12 of the ‘595) and enable the output drivers (LOW on -G @ pin 13, similarly) when you’re done sending everything. You can have separate latches-and-enables for each ‘595 if that suits your needs, although then you once again run out of Arduino bits pretty quickly. It’s entirely possible to devote a ‘595 to latches-and-enables for the rest of the chain, but that gets weird in short order.

    The scope shot shows that shiftOut() ticks along at 15 µs per bit (clock in the upper trace, data in the lower trace). For back-of-the-envelope purposes, call it 8 kB/s, which is probably less than you expected. If you have a string of 5 external bytes, as I did on a recent project, that’s only 1600 updates / second. It was part of a memory board reader & EPROM programmer: reading an 8 kB ROM chip requires two shift-register runs (one to set the address & data, one to read in the chip output), so the overall rate was on the order of 10 seconds per pass and much worse for programming. You can optimize the number of bits by not shifting out all the bytes, but that’s the general idea.

    Because ‘595 chips are output-only, in order to get 8 bits of data into the Arduino board, add a 74HC166 parallel-in/serial-out chip to the string. Alas, shiftOut() doesn’t know about input bits, so you’re on your own.

    Hardware SPI: Clock and Data
    Hardware SPI: Clock and Data

    If you’re going to have to write some code to get input bits anyway, you may as well use the ATmega168 (and its ilk) hardware SPI as it was intended to be used: for high-speed synchronous serial I/O. This scope shot shows the SPI clock (in the top trace again) ticking along at 1 µs per bit, which is 1/16 the Diecimila’s oscillator frequency. You can pick any power of two between 1/2 and 1/128; I used 1/16 because it’s fast enough to make the rest of the software the limiting factor, while slow enough to not require much attention to layout & so forth.

    Start by Reading The Fine Manual section about the ATmega168’s SPI hardware, starting at page 162.

    The pin definitions, being lashed to internal hardware, are not optional. Note that SCK is also the standard Arduino LED, which won’t be a problem unless you need a tremendous amount of drive for a zillion ‘595s. I stuck an additional LED on Arduino digital pin 2.

    #define PIN_HEARTBEAT     2             // added LED
    #define PIN_SCK          13             // SPI clock (also Arduino LED!)
    #define PIN_MISO         12             // SPI data input
    #define PIN_MOSI         11             // SPI data output
    

    Initial hardware setup goes in the usual setup() function:

    pinMode(PIN_SCK,OUTPUT);       // set up for "manual" SPI directions
    digitalWrite(PIN_SCK,LOW);
    pinMode(PIN_MOSI,OUTPUT);
    digitalWrite(PIN_MOSI,LOW);
    
    pinMode(PIN_MISO,INPUT);       // configure inputs
    digitalWrite(PIN_MISO,HIGH);
    
    SPCR = B01110001;              // Auto SPI: no int, enable, LSB first, master, + edge, leading, f/16
    SPSR = B00000000;              // not double data rate
    

    Basically, the “manual” setup allows you to wiggle the bits by hand with the hardware SPI control disabled.

    Arduino Hardware SPI Schematic
    Arduino Hardware SPI Schematic

    Here’s a chunk of the schematic so you can see how the bits rattle around. You’ll surely want to click it to get the details…

    I put the data in a structure that matches the shift register layout, with the first byte (Controls) connected to the ATmega’s MOSI pin and the last byte (DataIn) connected to MISO. The SCK pin drives all of the serial clock pins on the ‘595 and ‘166 chips in parallel. Your structure will certainly be different; this was intended to suck data from a Tek 492 Spectrum Analyzer memory board.

    typedef struct {      // external hardware shift register layout
     byte Controls;       // assorted control bits
     word Address;        // address value
     byte DataOut;        // output to external devices
     byte DataIn;         // input from external devices
    } SHIFTREG;
    
    SHIFTREG Outbound;    // bits to be shifted out
    SHIFTREG Inbound;     // bits as shifted back in
    

    The functions that make it happen are straightforward:

    void TogglePin(char bitpin) {
     digitalWrite(bitpin,!digitalRead(bitpin));
    }
    void PulsePin(char bitpin) {
     TogglePin(bitpin);
     TogglePin(bitpin);
    }
    
    void EnableSPI(void) {
     SPCR |= 1 << SPE;
    }
    
    void DisableSPI(void) {
     SPCR &= ~(1 << SPE);
    }
    
    void WaitSPIF(void) {
     while (! (SPSR & (1 << SPIF))) {
    //        TogglePin(PIN_HEARTBEAT);       // use these for debugging!
    //        TogglePin(PIN_HEARTBEAT);
     continue;
     }
    }
    
    byte SendRecSPI(byte Dbyte) {             // send one byte, get another in exchange
     SPDR = Dbyte;
     WaitSPIF();
     return SPDR;                             // SPIF will be cleared
    }
    
    void CaptureDataIn(void) {                // does not run the shift register!
     digitalWrite(PIN_ENABLE_SHIFT_DI,LOW);   // allow DI bit capture
     PulsePin(PIN_SCK);                       // latch parallel DI inputs
     digitalWrite(PIN_ENABLE_SHIFT_DI,HIGH);  // allow DI bit shifting
    }
    
    void RunShiftRegister(void) {
     EnableSPI();                             // turn on the SPI hardware
    
     Inbound.DataIn  = SendRecSPI(Outbound.DataIn);
     Inbound.DataOut = SendRecSPI(Outbound.DataOut);
    
     Inbound.Address  =         SendRecSPI(lowByte(Outbound.Address));
     Inbound.Address |= ((word) SendRecSPI(highByte(Outbound.Address))) << 8;
    
     Inbound.Controls = SendRecSPI(Outbound.Controls);
    
     PulsePin(PIN_LATCH_DO);                   // make new shift reg contents visible
     PulsePin(PIN_LATCH_ADDRESS);
     PulsePin(PIN_LATCH_CONTROLS);
    
     DisableSPI();                             // return to manual control
    }
    

    Actually using the thing is also straightforward. Basically, you put the data-to-be-sent in the Outbound variables and call RunShiftRegister(), which drops output bytes into SPDR and yanks incoming bytes out, then stuffing them in the Inbound variables. I have separate latch controls for the Controls, Address, and Data chips, although I don’t use them separately here.

    You must wiggle the parallel latch enable line on the 74HC166 chip before shifting to capture the data, as shown in CaptureDataIn(). That chip also requires a separate pulse on its serial clock line to latch the data, which you do manually with the hardware SPI disabled. If you’re paying attention, you’ll wonder if that clock pulse also screws up the data in the rest of the chips: yes, it does. If this is a problem, you must add some external clock-gating circuitry, disable the ‘595s, or pick a different input shift register chip; it wasn’t a problem for what I was doing.

    Here’s a function that reads data from a RAM chip on the Tek memory board, so it must write the address and read the RAM chip’s output. The PIN_DISABLE_DO bit controls the output buffers on the ‘595 that drives the RAM’s data pins; they must be disabled to read data back from the RAM. Don’t worry about the other undefined bits & suchlike; just assume everything does what the comments would have you believe.

    byte ReadRAM(word Address) {
     digitalWrite(PIN_DISABLE_DO,HIGH);            // turn off data latch output
     digitalWrite(PIN_BUS_READ,HIGH);              // allow RAM read access
    
     Outbound.Controls |=  CB_BUS_CLKPH2_MASK;     // set up RAM -CS gate
     Outbound.Address = Address;
     Outbound.DataOut = 0x55;                      // should not be visible
     RunShiftRegister();
    
     digitalWrite(PIN_BUS_N_SYSRAM,LOW);           // activate RAM -CS
     CaptureDataIn();                              // latch RAM data
     digitalWrite(PIN_BUS_N_SYSRAM,HIGH);          //  ... and turn -CS off
    
     Outbound.Controls &= ~CB_BUS_CLKPH2_MASK;     // disable -CS gate
     RunShiftRegister();                           // tell the board and get data
    
     return Inbound.DataIn;
    }
    
    Hardware SPI - Detail of clock and data timing
    Hardware SPI – Detail of clock and data timing

    Here’s a detailed shot of the outbound bit timing. Notice that the upward clock transitions shift bits into the ‘595 and ‘166 chips, while the SPI output data changes on the downward transitions. You can tweak that to match your hardware if you’re using different shift register chips, by messing with the SPCR settings.

    Bottom line: using the ATmega168 hardware SPI provided a factor-of-15 speedup and serial digital input, too.

  • Electric Drill Hung From Nail: Getting It Right

    When you hang an electric hand drill on a nail pounded into a floor joist, you want the chuck jaws to just clear the nail. Too large and the drill tends to fall off. Too small and it won’t go.

    I took way too long to figure this out, but…

    Adjust the chuck properly just once, then run a fat marker around the jaws.

    It’s trivially easy to get it right forever after: spin the chuck adjustment until the marks line up with the chuck nose and hang the drill up.

    Maybe everybody else knows that.