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

  • Keyboard Tray Raising

    Keyboard Tray Raising

    Long ago and far away, I moved the keyboards off our desk surfaces to a more convenient location on a tray under the middle drawer. Mary’s desk recently gained a somewhat thinner keyboard with a thumbwheel volume control, so she wanted the tray moved up:

    Keyboard Tray Relocation - in place
    Keyboard Tray Relocation – in place

    The supports on either side started out as 2×4 lumber with a slot cut (using the radial arm saw I no longer have) for the aluminum sheet:

    Keyboard Tray Relocation - support view
    Keyboard Tray Relocation – support view

    For the record, a pair of screws hold each support to the drawer:

    Keyboard Tray Relocation - support screw
    Keyboard Tray Relocation – support screw

    Not elegant. Works fine. Good enough!

    Tiny Bandsaw™ wasn’t designed for ripsawing lumber, but the same Proxxon 10/14 TPI blade I use for aluminum worked better than I expected to lop a 1-¼ inch strip from the wood slats:

    Keyboard Tray Relocation - bandsaw fixture
    Keyboard Tray Relocation – bandsaw fixture

    That’s a reenactment based on a true story. The wood scraps clamped on the bandsaw table leave enough clearance for the 2×4 slide to freely, yet not enough for the blade to wander off track.

    You can tell how long ago I built the original trays: nary a trace of 3D printing!

  • Nutmeg Season

    Nutmeg Season

    Well, it’s really zucchini bread season, with grated nutmeg among the spices (*):

    Zucchini bread - minus QC sample
    Zucchini bread – minus QC sample

    Having recently bought a very sharp grater, I hauled out a small vise to save my fingertips:

    Nutmeg grating - mini-vise
    Nutmeg grating – mini-vise

    The dark lunette comes from a previous clamping attempt; it takes a while to find the most secure pin arrangement.

    Grate a flat:

    Nutmeg grating - first flat
    Nutmeg grating – first flat

    I’ve always enjoyed the surprisingly intricate patterns inside what looks like a bland nut.

    Flip it over, flatten the other side, and grab it in an even smaller vise:

    Nutmeg grating - flat clamping
    Nutmeg grating – flat clamping

    In truth, that vise is intended for small cylinders, not flattened nuts, but I figured it’d suffice for light-duty use. Grate parallel to the vise screw, reclamp as needed, and it worked out reasonably well.

    Eventually, you have a pile of powder and one cubic nutmeg:

    Nutmeg grating - results
    Nutmeg grating – results

    I’m sure there’s a way to grate the remaining cube, but I’m unwilling to shred my fingertips.

    Tip the powder into a small jar and repeat as needed. Each nutmeg produces about 5 grams and I did three of the things this time.

    Yummy!

    (*) We omit the cloves and knock the sugar down by half. Your tastes will surely differ.

    Update: Mary’s recipe!

  • Bike Helmet Mirror: Ball Mount

    Bike Helmet Mirror: Ball Mount

    Nine years ago, I didn’t know how enough to design a bike helmet mirror with a ball mount, but even an old dog can learn a new trick:

    Helmet Mirror Ball Mount - on helmet
    Helmet Mirror Ball Mount – on helmet

    However, it’s worth noting my original, butt-ugly Az-El mounts lasted for all of those nine years, admittedly with adjustments along the way, which is far more than the commercial mounts making me unhappy enough to scratch my itch.

    The mount adapts the split spherical clamp from the daytime running light:

    Helmet Mirror Mount - Ball
    Helmet Mirror Mount – Ball

    Scaling it down for a 10 mm polypropylene ball around the base of the 30 mm inspection mirror’s shaft simplified everything:

    Helmet Mirror Ball Mount - drilled ball test
    Helmet Mirror Ball Mount – drilled ball test

    I’m reasonably sure I couldn’t have bought 100 polypro balls for eight bucks a decade ago, but we’ll never know. Drilling the hole was a complete botch job, about which more later. The shaft came from a spare mirror mount I made up a while ago; a new shaft appears below.

    The solid model, like Gaul, is in three parts divided:

    Helmet Mirror Ball Mount - Slic3r
    Helmet Mirror Ball Mount – Slic3r

    The helmet plate (on the right) has a slight indent more-or-less matching the helmet curvature and gets a layer of good double-stick foam tape. The clamp base (on the left) has a pair of brass inserts epoxied into matching recesses below the M3 clearance holes:

    Helmet Mirror Ball Mount - inserts
    Helmet Mirror Ball Mount – inserts

    A layer of epoxy then sticks the helmet plate in place, with the inserts providing positive alignment:

    Helmet Mirror Ball Mount - plates
    Helmet Mirror Ball Mount – plates

    The clamp screws pull the inserts against the plastic in the clamp base, so they can’t pull out or through, and the plates give the epoxy enough bonding surface that (I’m pretty sure) they won’t ever come apart.

    I turned down a 2 mm brass insert to fit inside the butt end of the mirror shaft and topped it off with a random screw harvested from a dead hard drive:

    Helmet Mirror Ball Mount - assembled - rear view
    Helmet Mirror Ball Mount – assembled – rear view

    At the start, it wasn’t obvious the shaft would stay stuck in the ball, so I figured making it impossible to pull out would eliminate the need to find it by the side of the road. As things turned out, the clamp exerts enough force to ensure the shaft ain’t goin’ nowhere, so I’ll plug future shafts with epoxy.

    The front side of the clamp looks downright sleek:

    Helmet Mirror Ball Mount - assembled - front view
    Helmet Mirror Ball Mount – assembled – front view

    Well, how about “chunky”?

    The weird gray-black highlights are optical effects from clear / natural PETG, rather than embedded grunge; it looks better in person. I should have used retina-burn orange or stylin’ black.

    This mount is much smaller than the old one and should, in the event of a crash, not cause much injury. Based on how the running light clamp fractures, I expect the clamp will simply tear out of the base on impact. In the last decade, neither of us has crashed, so I don’t know what the old mount would do.

    The clamp is 7 mm thick (front-to-back), set by the M3 washer diameter, with 1.5 mm of ball sticking out on each side. The model has a kerf one thread high (0.25 mm) between the pieces to add clamping force and, with the screws tightened down, moving the ball requires a disturbingly large effort. I added a touch of rosin and that ball straight-up won’t move, which probably means the shaft will bend upon droppage; I have several spare mirrors in stock.

    On the other paw, the ball turns smoothly in the clamp and it’s easy to position the shaft as needed: much better than the old Az-El mount!

    The inspection mirror hangs from a double ball joint which arrives with a crappy screw + nut. I epoxied the old mirror mount nut in place, but this time around I drilled the plates for a 3 mm stainless SHCS, used a wave washer for a bit of flexible force, and topped it off with a nyloc nut:

    Helmet Mirror Ball Mount - mirror joint
    Helmet Mirror Ball Mount – mirror joint

    I’m unhappy with how it looks and don’t like how the washer hangs in free space between those bumps, so I may eventually turn little brass fittings to even things out. It’s either that or more epoxy.

    So far, though, it’s working pretty well and both units meet customer requirements.

    The OpenSCAD source code as a GitHub Gist:

    // Bike helmet mirror mount – ball joint
    // Ed Nisley KE4ZNU 2020-09
    /* [Layout options] */
    Layout = "Build"; // [Build, Show, Plate, Base, Clamp]
    //– Extrusion parameters
    // Extrusion parameters
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    function IntegerLessMultiple(Size,Unit) = Unit * floor(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //- Basic dimensions
    MountDia = 30.0; // footprint on helmet
    BallDia = 10.0;
    BallRad = BallDia / 2;
    WallThick = IntegerMultiple(2.0,ThreadWidth);
    FloorThick = IntegerMultiple(2.0,ThreadThick);
    CornerRound = 2.0;
    Insert = [3.0,4.0,4.0]; // threaded brass insert
    Screw = [3.0,5.5,25.0]; // clamp screw
    Washer = [3.7,7.0,0.7]; // washer
    ShowGap = 2.0;
    BuildGap = 5.0;
    //– Helmet Interface Plate
    ScrewOC = BallDia + 2*WallThick + Screw[ID];
    echo(str("Screw OC: ",ScrewOC));
    Clamp = [ceil(Washer[OD]), // barely holds washer under screw
    ScrewOC + Washer[OD], // minimal clearance for washer
    BallDia +2*FloorThick // screw fits through insert
    ];
    Kerf = ThreadThick;
    echo(str("Clamp: ",Clamp));
    HelmetCX = 60.0; // empirical helmet side curve
    HelmetMX = 3.0;
    HelmetRX = (pow(HelmetMX,2) + pow(HelmetCX,2)/4)/(2*HelmetMX);
    HelmetPlateC = MountDia;
    HelmetPlateTheta = atan(HelmetPlateC/HelmetRX);
    HelmetPlateM = 2*HelmetRX*pow(sin(HelmetPlateTheta/4),2);
    echo(str("Plate indent: ",HelmetPlateM));
    HelmetPlateThick = max(FloorThick,0.6*Insert[LENGTH]) + HelmetPlateM;
    echo(str("Screw length: ",Clamp.z + Insert[LENGTH]));
    MountSides = 2*3*4;
    //———————-
    // 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);
    }
    //———————-
    // Clamp frame around ball
    module ClampFrame() {
    difference() {
    union() {
    hull()
    for (i=[-1,1], j=[-1,1]) {
    translate([i*(Clamp.x/2 – CornerRound),j*(Clamp.y/2 – CornerRound),Clamp.z/2 – CornerRound])
    sphere(r=CornerRound,$fn=24);
    translate([i*(Clamp.x/2 – CornerRound),j*(Clamp.y/2 – CornerRound),-Clamp.z/2])
    cylinder(r=CornerRound,$fn=24);
    }
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,0])
    rotate(180/12)
    cylinder(d=Washer[OD],h=Clamp.z/2,$fn=12);
    }
    sphere(d=BallDia + HoleWindage,$fn=48);
    cube([2*MountDia,2*MountDia,Kerf],center=true);
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Screw[LENGTH]])
    rotate(180/6)
    PolyCyl(Screw[ID],2*Screw[LENGTH],6);
    }
    }
    module ClampSelect(Section) {
    XlateZ = (Section == "Top") ? Clamp.z/2 :
    (Section == "Bottom") ? -Clamp.z/2 :
    0;
    intersection(convexity=5) {
    ClampFrame();
    translate([0,0,XlateZ])
    cube([2*Clamp.x,2*Clamp.y,Clamp.z + 2*Protrusion],center=true);
    }
    }
    //———————-
    // Concave plate fitting helmet shell
    module HelmetPlate() {
    render()
    difference() {
    cylinder(d=MountDia,h=HelmetPlateThick,$fn=MountSides);
    translate([0,0,HelmetPlateThick – HelmetPlateM + HelmetRX])
    sphere(r=HelmetRX,$fn=128);
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Protrusion]) {
    PolyCyl(Insert[OD],0.6*Insert[LENGTH] + Protrusion,6);
    PolyCyl(Screw[ID],2*HelmetPlateThick,6);
    }
    }
    }
    //———————-
    // Base of clamp ring
    module MountBase() {
    difference() {
    union() {
    cylinder(d=MountDia,h=FloorThick,$fn=MountSides);
    translate([0,0,FloorThick + Clamp.z/2])
    ClampSelect("Bottom");
    }
    for (j=[-1,1])
    translate([0,j*ScrewOC/2,-Protrusion])
    rotate(180/6)
    PolyCyl(Insert[OD],0.6*Insert[LENGTH] + Protrusion,6);
    }
    }
    //———————-
    // Lash it together
    if (Layout == "Plate") {
    HelmetPlate();
    }
    if (Layout == "Base") {
    MountBase();
    }
    if (Layout == "Clamp") {
    ClampFrame();
    }
    if (Layout == "Show") {
    rotate([180,0,0])
    HelmetPlate();
    translate([0,0,ShowGap]) {
    MountBase();
    color("Ivory",0.3)
    translate([0,0,Clamp.z/2 + FloorThick + ShowGap/2])
    sphere(d=BallDia);
    translate([0,0,Clamp.z/2 + FloorThick + ShowGap])
    ClampSelect("Top");
    }
    }
    if (Layout == "Build") {
    translate([MountDia/2 + BuildGap,0,0])
    HelmetPlate();
    translate([-(MountDia/2 + BuildGap),0,0])
    MountBase();
    translate([0,MountDia/2 + BuildGap,Clamp.z/2])
    rotate([0,180,0])
    rotate(90)
    ClampSelect("Top");
    }

    The original doodles include a bit of dress-up fairing that didn’t make the cut:

    Helmet Mirror Ball Mount - doodles
    Helmet Mirror Ball Mount – doodles
  • Discrete LM3909: Blue LED Waveforms

    Discrete LM3909: Blue LED Waveforms

    The circuitry and instrumentation is essentially the same discrete LM3909 as before:

    LM3909 - blue - test setup
    LM3909 – blue – test setup

    With a few minor tweaks:

    • Blue LED, forward voltage 2.56 to 2.97 V
    • 24 Ω R1
    • One Q2 current mirror transistor driving Q3

    With a pair of fresh AA alkaline cells producing 3.1 V (not the NiMH Duracells you see in the picture), the blue LED blinks brightly.

    The 610 mV peak voltage across R1 shows the LED starts at 25.4 mA:

    LM3909 blue - 3.1 V - R1 24 ohm
    LM3909 blue – 3.1 V – R1 24 ohm

    The capacitor reaches 1 V, then goes about 150 mV into reverse charge during the flash (note the different horizontal scales):

    LM3909 blue - 3.1 V - C1 V
    LM3909 blue – 3.1 V – C1 V

    The Darlington version of Q1 seems to do a decent job of keeping the cap out of reverse charge. A Shottky diode would add a few hundred mV, but I doubt there’s anything nasty going on inside the cap as it stands.

    The blue LED has a forward drop of 2.97 V at 20 mA, so I’m surprised the voltage across it hits 3.1 V at 25 mA:

    LM3909 blue - 3.1 V - LED V
    LM3909 blue – 3.1 V – LED V

    Very little of the voltage appears across Q3, the driver transistor:

    LM3909 blue - 3.1 V - Q3 coll
    LM3909 blue – 3.1 V – Q3 coll

    With a pair of nearly dead alkaline cells for a 2.0 V supply, the LED current peak drops to 4.6 mA:

    LM3909 blue - 2.0 V - R1 24 ohm
    LM3909 blue – 2.0 V – R1 24 ohm

    The LED lights brightly, then fades away exactly like you’d expect from that waveform.

    The cap still charges to about 1 V and stays well above 0 V during the (much longer) flash:

    LM3909 blue - 2.0 V - C1 voltage
    LM3909 blue – 2.0 V – C1 voltage

    The voltage across the LED now reaches only 2.7 V, which is substantially higher than the 2.0 V battery supply and exactly why the LM3909 existed:

    LM3909 blue - 2.0 V - LED voltage
    LM3909 blue – 2.0 V – LED voltage

    Q3 continues to saturate, although you can see the effect of the decreased base drive during the flash:

    LM3909 blue - 2.0 V - Q3 coll
    LM3909 blue – 2.0 V – Q3 coll

    The blue LED won’t light at 1.3 V, but still gives out a weak flash at 1.7 V, so I’d say the tweaked LM3909 circuitry works reasonably well.

  • DSO150: USB Serial Output

    DSO150: USB Serial Output

    Taking all those pictures of the DSO150 screen reminded me it has a data dump function: press the V/Div and ADJ buttons to squirt configuration, measurements, and trace data from the TX pad on the main board, just in front of the red-black power wires hot-melt glued in place:

    DSO150 USB serial adapter - interior
    DSO150 USB serial adapter – interior

    The picture shows the “before” stage, while I was figuring out where to carve another hole in the case.

    NB: The 113-15001-111 DSO150 firmware version includes the serial output option, so you won’t need third-party firmware. Similarly, current PCBs bring the serial pins to neatly labeled header pads. You should refer to the JYETech DSO150 / DSO Shell product page for the details.

    After all the cuttin’ and filin’ was done, it looked like this:

    DSO150 USB serial adapter - exterior
    DSO150 USB serial adapter – exterior

    The power switch on the back of the case (top of the picture) disconnects the lithium cell from the charge controller board (now tucked behind the battery) to eliminate any trickle current discharge. Charging the battery thus requires turning that switch on and turning the scope off with its own power switch (along its front edge). Capturing trace data requires having both switches on (duh), whereupon the scope’s normal operating current convinces the charge controller that the cell hasn’t reached full charge. Turn the scope off and, most likely, the controller will tell you the cell is fully charged.

    An intro blurb squirts from the port at 115200 in good old 8N1 format when you turn the scope on:

    DSO Shell
    JYE Tech Ltd.
    WWW.JYETECH.COM
    FW: 113-15001-111

    Pressing the V/Div and ADJ buttons dumps the trace data:

    VSen,0.5V
    Couple,DC
    VPos, -2.02V
    Timebase,0.2s
    HPos,00362
    TriggerMode,NORM
    TriggerSlope,Rising
    TriggerLevel,  2.02V
    RecordLength,01024
    Vmax,  2.85V
    Vmin,  0.24V
    Vavr,  0.87V
    Vpp,  2.61V
    Vrms,  1.03V
    Freq, 0.441Hz
    Cycl, 2.266s
    PW, 0.231s
    Duty, 10.2 %
    SampleInterval,00008ms
    00000,0000000000, 0.8518688
    00001,0000000008, 0.5273474
    00002,0000000016, 0.5273474
    00003,0000000024, 0.5476300
    00004,0000000032, 0.5476300
    00005,0000000040, 0.5476300
    << snippage >>
    01015,0000008120, 0.8113037
    01016,0000008128, 0.8315863
    01017,0000008136, 0.8315863
    01018,0000008144, 0.8315863
    01019,0000008152, 0.8315863
    01020,0000008160, 0.8315863
    01021,0000008168, 0.8315863
    01022,0000008176, 0.8518688
    01023,0000008184, 0.8518688

    It’s all in neatly comma-separated-value format, so you can slam it into a spreadsheet and have your way with it. Utilities also exist to capture the data, extract the values, and send them directly to GNUplot, etc.

    Like so:

    DSO150 test image
    DSO150 test image

    If I expected to do a lot of that, I’d boldify the traces and embiggen the text, all of which is in the nature of fine tuning.

    It’s hard to reproduce the beauty of the DSO150’s display, though:

    DSO150 test image
    DSO150 test image

    The DSO150 remains pretty good for being the worst oscilloscope I’m willing to use …

  • Step2 Garden Seat: Replacement Seat2

    Step2 Garden Seat: Replacement Seat2

    As expected, the plywood seat I put on the Step2 Garden Seat for Mary’s Vassar Farms plot lasted about a year before the wood rotted away around the screws. In the meantime, we’d acquired a stack of SiLite cafeteria trays, so we applied one to the cause of better seating:

    Step2 Seat - tray variant
    Step2 Seat – tray variant

    Various eBay listings value that slab of Bakelite Melamine up to $20, which is far more than Mary paid for the entire stack at a local tag sale. They also call that color “rich brown”, which is certainly better than what immediately came to mind when I saw them.

    The stylin’ asymmetric design happened when I realized the squared-off handle end of the cart didn’t demand a rounded-off end of the seat. I cut off the raised tray rim before sketching the rounded outline using the rotted seat as a template; some of the sketch remains over on the right-front corner. A session with Mr Belt Sander put the remaining rim edges flush with the surface, no matter what the picture suggests.

    The tray being 2 mm thinner than the plywood, I tried printing the hinges in a different orientation with different built-in support:

    Rolling Cart Hinges - solid model - build
    Rolling Cart Hinges – solid model – build

    The perimeter threads pulled up far too much and, although fiddling with cooling would likely help, I think the original orientation was better:

    Rolling Cart Hinges - solid model - bottom
    Rolling Cart Hinges – solid model – bottom

    Given that the post-apocalypse breakfast will be served on similar trays, the seat should survive for quite a while in the garden. We think the sun will convert the brown surface into a bun warmer; a coat of white paint may be in its future.

    The original OpenSCAD code is still out there as a GitHub Gist.

  • Discrete LM3909 LED Flasher: Circuit Variations

    Discrete LM3909 LED Flasher: Circuit Variations

    The basic discrete LM3909 LED Flasher circuit looks like this:

    Discrete LM3909 - basic circuit
    Discrete LM3909 – basic circuit

    The LM3909 IC boosted a single 1.5 V cell enough to fire a red(-ish) LED, even with the cell well under 1 V. I want to blink a blue(-ish) LED from a pair of AA alkaline cells (with the right size & heft to serve as a base for the hairball circuitry), so the voltage ranges from just over 3 V down to maybe 1.5 V. Although the original circuit works, the LED pulse is long enough to put a reverse bias on the timing capacitor; a 470 µF electrolytic cap (positive terminal on the right at node P2-OUT) produces a pulse every few seconds.

    A slightly tweaked version of the circuitry puts -400 mV across C1 (green trace) by the end of the pulse:

    Discrete LM3909 - basic circuit - 3.0 V simulation
    Discrete LM3909 – basic circuit – 3.0 V simulation

    The App Note describes the negative feedback loop from the collector of “power transistor” Q3 through Q4 and Q1, closing through the Q2 current mirror. The base-emitter drops of Q4 and Q1 set the trip point where Q1 starts to conduct and the LED turns on.

    Q3 is on when the LED is on, with C1 reverse-charging through R1 and the LED. The voltage at the top of R2 rises from the negative voltage at the start of the pulse, carrying the emitter of Q1 along with it. The LED pulse will end when the rising emitter voltage shuts off Q1 and, thus, the Q2 current mirror driving Q3. Because Q3 holds the bottom of R5 close to 0 V, the base of Q4 is at about half the supply voltage, so Q1 remains on until its emitter rises to about 2 forward drops (handwavingly ignoring the R6 + R7 voltage divider) below the supply.

    If the LED pulse is longer than required to completely discharge C1, the poor cap gets reverse-biased and suffers indigestion. Aluminum electrolytics can withstand a little reverse bias, but it’s Bad Practice.

    When Q3 and the LED are off, C1 forward-charges through (R4 + R5) + R2, with most of the initial voltage across R2, because C1 should start with a little more than 0 V across it. This holds the current mirror off until C1 charges enough to raise the base of Q4 about two forward drops above Q1’s emitter, shove current through Q4 and Q1, turn on the Q2 current mirror, Q3, and light the LED.

    Around and around it goes!

    The worst case for reverse charge happens at higher supply (a.k.a. battery) voltages and higher LED currents. Reducing the reverse charge time requires more forward drop through Q4 + Q1 to soak up the higher voltage and lower the trip voltage at Q1’s emitter, which suggests putting another forward-biased junction in series.

    Putting a diode in Q1’s base lead doesn’t produce much improvement:

    Discrete LM3909 - Q1 B diode - 3.0 V
    Discrete LM3909 – Q1 B diode – 3.0 V

    Perhaps because the 27 µA current at the trip point is so low the diode doesn’t actually have much forward drop; the simulation says 400 mV.

    Putting the diode in the emitter runs the current mirror’s 5 mA through it:

    Discrete LM3909 - Q1 E diode - 3.0 V
    Discrete LM3909 – Q1 E diode – 3.0 V

    The overall period remains about 2 s, but the LED pulse = reverse charge time drops by a factor of two and the cap voltage bottoms out at 0 V, so that’s good.

    A Darlington transistor provides far more gain to compensate for the reduced base drive:

    Discrete LM3909 - Darl Q1 - 3.0 V
    Discrete LM3909 – Darl Q1 – 3.0 V

    The LED pulse is slightly shorter and its current goes up a smidge, but the cap voltage remains above zero.

    A line in the LM3909 App Note mentions that the Q2 current mirror amplifies Q1’s emitter current by a factor of three: “This current will be amplified by about 3 by Q2 and passed to the base of Q3”. An IC current mirror’s designer can scale its output by varying the collector area, but out here in the discrete world we must splice multiple transistors in parallel:

    Discrete LM3909 - Darl Q1 3xQ2- 3.0 V
    Discrete LM3909 – Darl Q1 3xQ2- 3.0 V

    More base drive in Q3 doesn’t buy much, because it’s already pretty well saturated during the pulse, but the current goes up enough to push C1 slightly into reverse charge territory again. As far as I can tell, the factor-of-three gain was required to make up for the relatively poor performance of IC technology around 1970; things have definitely improved since then.

    It’s worth mentioning that the actual circuitry (in particular, the LEDs!) will differ from the simulations, so the pretty plots are more along the lines of serving suggestions than actual predictions. Verily, a simulation can’t prove that a circuit will work, but can sometimes help show why it won’t.

    All the LTSpice simulation files tucked into a GitHub Gist:

    Version 4
    SHEET 1 1816 760
    WIRE 64 -16 0 -16
    WIRE 112 -16 64 -16
    WIRE 272 -16 112 -16
    WIRE 544 -16 272 -16
    WIRE 1024 -16 544 -16
    WIRE 1200 -16 1024 -16
    WIRE 112 0 112 -16
    WIRE 272 0 272 -16
    WIRE 1024 32 1024 -16
    WIRE 1200 32 1200 -16
    WIRE 0 48 0 -16
    WIRE 544 48 544 -16
    WIRE 944 80 864 80
    WIRE 960 80 944 80
    WIRE 1136 80 1104 80
    WIRE 272 96 272 80
    WIRE 400 96 272 96
    WIRE 480 96 400 96
    WIRE 400 112 400 96
    WIRE 112 128 112 80
    WIRE 272 128 272 96
    WIRE 688 128 640 128
    WIRE 800 128 752 128
    WIRE 944 144 944 80
    WIRE 1024 144 1024 128
    WIRE 1024 144 944 144
    WIRE 1104 144 1104 80
    WIRE 1104 144 1024 144
    WIRE 112 160 112 128
    WIRE 864 192 864 176
    WIRE 912 192 864 192
    WIRE 0 208 0 128
    WIRE 400 208 400 192
    WIRE 640 208 640 128
    WIRE 640 208 400 208
    WIRE 400 224 400 208
    WIRE 112 272 112 224
    WIRE 128 272 112 272
    WIRE 224 272 192 272
    WIRE 272 272 272 208
    WIRE 272 272 224 272
    WIRE 912 272 912 192
    WIRE 400 336 400 304
    WIRE 544 336 544 144
    WIRE 544 336 400 336
    WIRE 112 368 112 272
    WIRE 912 368 912 352
    WIRE 912 368 112 368
    WIRE 272 400 272 272
    WIRE 112 416 112 368
    WIRE 1200 448 1200 128
    WIRE 1200 448 336 448
    WIRE 112 464 112 416
    WIRE 400 480 400 336
    WIRE 0 496 0 288
    WIRE 0 496 -32 496
    WIRE -32 528 -32 496
    WIRE 0 576 0 496
    WIRE 64 576 0 576
    WIRE 112 576 112 544
    WIRE 112 576 64 576
    WIRE 272 576 272 496
    WIRE 272 576 112 576
    WIRE 400 576 400 560
    WIRE 400 576 272 576
    FLAG -32 528 0
    FLAG 112 128 P6-RLIM
    FLAG 112 416 P18-RC
    FLAG 224 272 P2-OUT
    FLAG 64 -16 P5-V+
    FLAG 64 576 P4-V-
    SYMBOL res 96 -16 R0
    SYMATTR InstName R1
    SYMATTR Value 39
    SYMBOL LED 96 160 R0
    SYMATTR InstName D1
    SYMATTR Value LXHL-BW02
    SYMBOL res 96 448 R0
    SYMATTR InstName R2
    SYMATTR Value 9.1k
    SYMBOL cap 192 256 R90
    WINDOW 0 0 32 VBottom 2
    WINDOW 3 32 32 VTop 2
    WINDOW 40 52 32 VTop 2
    SYMATTR InstName C1
    SYMATTR Value 1m
    SYMATTR SpiceLine2 ic=0.5
    SYMBOL res 256 112 R0
    SYMATTR InstName R5
    SYMATTR Value 390
    SYMBOL res 256 -16 R0
    SYMATTR InstName R4
    SYMATTR Value 390
    SYMBOL npn 336 400 M0
    SYMATTR InstName Q3
    SYMATTR Value 2N3904
    SYMBOL res 384 96 R0
    SYMATTR InstName R6
    SYMATTR Value 20k
    SYMBOL res 384 208 R0
    SYMATTR InstName R7
    SYMATTR Value 10k
    SYMBOL res 384 464 R0
    SYMATTR InstName R8
    SYMATTR Value 20k
    SYMBOL npn 480 48 R0
    SYMATTR InstName Q4
    SYMATTR Value 2N3904
    SYMBOL npn 800 80 R0
    SYMATTR InstName Q1
    SYMATTR Value 2N3904
    SYMBOL pnp 960 128 M180
    SYMATTR InstName Q2a
    SYMATTR Value 2N3906
    SYMBOL voltage 0 192 R0
    WINDOW 123 0 0 Left 0
    WINDOW 39 24 116 Left 2
    SYMATTR InstName V1
    SYMATTR Value 1.5
    SYMBOL res 896 256 R0
    SYMATTR InstName R9
    SYMATTR Value 100
    SYMBOL pnp 1136 128 M180
    SYMATTR InstName Q2b
    SYMATTR Value 2N3906
    SYMBOL res -16 32 R0
    SYMATTR InstName PTC
    SYMATTR Value 5
    SYMBOL diode 688 144 R270
    WINDOW 0 32 32 VTop 2
    WINDOW 3 0 32 VBottom 2
    SYMATTR InstName D2
    SYMATTR Value 1N4148
    TEXT -56 192 VRight 2 ;AA Alkaline
    TEXT 512 528 Left 2 !.tran 30
    TEXT 504 496 Left 2 ;Pins 3 and 7 = no connect
    TEXT 760 488 Left 2 ;Sorted by Vd at If=20 mA \n \nPart # Mfg Is (A) N Iave (A) Vf@Iave (V) Vd@If (V)\nQTLP690C Fairchild 1.00E-22 1.500 0.16 1.90 1.82\nPT-121-B Luminous 4.35E-07 8.370 20.00 3.84 2.34\nLUW-W5AP OSRAM 6.57E-08 7.267 2.00 3.26 2.39\nLXHL-BW02 Lumileds 4.50E-20 2.600 0.40 2.95 2.75\nW5AP-LZMZ-5K Lumileds 3.50E-17 3.120 2.00 3.13 2.76\nLXK2-PW14 Lumileds 3.50E-17 3.120 1.60 3.11 2.76\nAOT-2015 AOT 5.96E-10 6.222 0.18 3.16 2.80\nNSSW008CT-P Nichia 2.30E-16 3.430 0.04 2.92 2.86\nNSSWS108T Nichia 1.13E-18 3.020 0.04 2.99 2.94\nNSPW500BS Nichia 2.70E-10 6.790 0.03 3.27 3.20\nNSCW100 Nichia 1.69E-08 9.626 0.03 3.60 3.50
    TEXT 168 256 Left 4 ;+
    TEXT 656 56 Left 2 ;3 V battery needs more VBE
    Version 4
    SHEET 1 1816 760
    WIRE 64 -16 0 -16
    WIRE 112 -16 64 -16
    WIRE 272 -16 112 -16
    WIRE 544 -16 272 -16
    WIRE 1024 -16 544 -16
    WIRE 1200 -16 1024 -16
    WIRE 112 0 112 -16
    WIRE 272 0 272 -16
    WIRE 1024 32 1024 -16
    WIRE 1200 32 1200 -16
    WIRE 0 48 0 -16
    WIRE 544 48 544 -16
    WIRE 848 80 736 80
    WIRE 944 80 848 80
    WIRE 960 80 944 80
    WIRE 1136 80 1104 80
    WIRE 272 96 272 80
    WIRE 400 96 272 96
    WIRE 480 96 400 96
    WIRE 400 112 400 96
    WIRE 112 128 112 80
    WIRE 272 128 272 96
    WIRE 672 128 640 128
    WIRE 848 144 848 80
    WIRE 944 144 944 80
    WIRE 1024 144 1024 128
    WIRE 1024 144 944 144
    WIRE 1104 144 1104 80
    WIRE 1104 144 1024 144
    WIRE 112 160 112 128
    WIRE 736 192 736 176
    WIRE 784 192 736 192
    WIRE 0 208 0 128
    WIRE 400 208 400 192
    WIRE 640 208 640 128
    WIRE 640 208 400 208
    WIRE 400 224 400 208
    WIRE 912 240 848 240
    WIRE 112 272 112 224
    WIRE 128 272 112 272
    WIRE 224 272 192 272
    WIRE 272 272 272 208
    WIRE 272 272 224 272
    WIRE 912 272 912 240
    WIRE 400 336 400 304
    WIRE 544 336 544 144
    WIRE 544 336 400 336
    WIRE 112 368 112 272
    WIRE 912 368 912 352
    WIRE 912 368 112 368
    WIRE 272 400 272 272
    WIRE 112 416 112 368
    WIRE 1200 448 1200 128
    WIRE 1200 448 336 448
    WIRE 112 464 112 416
    WIRE 400 480 400 336
    WIRE 0 496 0 288
    WIRE 0 496 -32 496
    WIRE -32 528 -32 496
    WIRE 0 576 0 496
    WIRE 64 576 0 576
    WIRE 112 576 112 544
    WIRE 112 576 64 576
    WIRE 272 576 272 496
    WIRE 272 576 112 576
    WIRE 400 576 400 560
    WIRE 400 576 272 576
    FLAG -32 528 0
    FLAG 112 128 P6-RLIM
    FLAG 112 416 P18-RC
    FLAG 224 272 P2-OUT
    FLAG 64 -16 P5-V+
    FLAG 64 576 P4-V-
    SYMBOL res 96 -16 R0
    SYMATTR InstName R1
    SYMATTR Value 39
    SYMBOL LED 96 160 R0
    SYMATTR InstName D1
    SYMATTR Value NSSW008CT-P1
    SYMBOL res 96 448 R0
    SYMATTR InstName R2
    SYMATTR Value 9.1k
    SYMBOL cap 192 256 R90
    WINDOW 0 0 32 VBottom 2
    WINDOW 3 32 32 VTop 2
    WINDOW 40 52 32 VTop 2
    SYMATTR InstName C1
    SYMATTR Value 470�
    SYMATTR SpiceLine2 ic=0.5
    SYMBOL res 256 112 R0
    SYMATTR InstName R5
    SYMATTR Value 390
    SYMBOL res 256 -16 R0
    SYMATTR InstName R4
    SYMATTR Value 390
    SYMBOL npn 336 400 M0
    SYMATTR InstName Q3
    SYMATTR Value 2N3904
    SYMBOL res 384 96 R0
    SYMATTR InstName R6
    SYMATTR Value 20k
    SYMBOL res 384 208 R0
    SYMATTR InstName R7
    SYMATTR Value 10k
    SYMBOL res 384 464 R0
    SYMATTR InstName R8
    SYMATTR Value 20k
    SYMBOL npn 480 48 R0
    SYMATTR InstName Q4
    SYMATTR Value 2N3904
    SYMBOL npn 672 80 R0
    SYMATTR InstName Q1a
    SYMATTR Value 2N3904
    SYMBOL pnp 960 128 M180
    SYMATTR InstName Q2a
    SYMATTR Value 2N3906
    SYMBOL voltage 0 192 R0
    WINDOW 123 0 0 Left 0
    WINDOW 39 24 116 Left 2
    SYMATTR InstName V1
    SYMATTR Value 1.5
    SYMBOL res 896 256 R0
    SYMATTR InstName R9
    SYMATTR Value 100
    SYMBOL pnp 1136 128 M180
    SYMATTR InstName Q2b
    SYMATTR Value 2N3906
    SYMBOL npn 784 144 R0
    SYMATTR InstName Q1b
    SYMATTR Value 2N3904
    SYMBOL res -16 32 R0
    SYMATTR InstName PTC
    SYMATTR Value 5
    TEXT -56 192 VRight 2 ;AA Alkaline
    TEXT 512 528 Left 2 !.tran 30
    TEXT 504 496 Left 2 ;Pins 3 and 7 = no connect
    TEXT 760 488 Left 2 ;Sorted by Vd at If=20 mA \n \nPart # Mfg Is (A) N Iave (A) Vf@Iave (V) Vd@If (V)\nQTLP690C Fairchild 1.00E-22 1.500 0.16 1.90 1.82\nPT-121-B Luminous 4.35E-07 8.370 20.00 3.84 2.34\nLUW-W5AP OSRAM 6.57E-08 7.267 2.00 3.26 2.39\nLXHL-BW02 Lumileds 4.50E-20 2.600 0.40 2.95 2.75\nW5AP-LZMZ-5K Lumileds 3.50E-17 3.120 2.00 3.13 2.76\nLXK2-PW14 Lumileds 3.50E-17 3.120 1.60 3.11 2.76\nAOT-2015 AOT 5.96E-10 6.222 0.18 3.16 2.80\nNSSW008CT-P Nichia 2.30E-16 3.430 0.04 2.92 2.86\nNSSWS108T Nichia 1.13E-18 3.020 0.04 2.99 2.94\nNSPW500BS Nichia 2.70E-10 6.790 0.03 3.27 3.20\nNSCW100 Nichia 1.69E-08 9.626 0.03 3.60 3.50
    TEXT 168 256 Left 4 ;+
    TEXT 664 256 Left 2 ;Use MPSA14 Darlington
    TEXT 656 56 Left 2 ;3 V battery needs more VBE
    Version 4
    SHEET 1 1816 760
    WIRE 64 -16 0 -16
    WIRE 112 -16 64 -16
    WIRE 272 -16 112 -16
    WIRE 544 -16 272 -16
    WIRE 1024 -16 544 -16
    WIRE 1200 -16 1024 -16
    WIRE 1360 -16 1200 -16
    WIRE 1520 -16 1360 -16
    WIRE 112 0 112 -16
    WIRE 272 0 272 -16
    WIRE 1024 32 1024 -16
    WIRE 1200 32 1200 -16
    WIRE 1360 32 1360 -16
    WIRE 1520 32 1520 -16
    WIRE 0 48 0 -16
    WIRE 544 48 544 -16
    WIRE 848 80 736 80
    WIRE 944 80 848 80
    WIRE 960 80 944 80
    WIRE 1136 80 1104 80
    WIRE 1296 80 1280 80
    WIRE 1456 80 1440 80
    WIRE 272 96 272 80
    WIRE 400 96 272 96
    WIRE 480 96 400 96
    WIRE 400 112 400 96
    WIRE 112 128 112 80
    WIRE 272 128 272 96
    WIRE 672 128 640 128
    WIRE 848 144 848 80
    WIRE 944 144 944 80
    WIRE 1024 144 1024 128
    WIRE 1024 144 944 144
    WIRE 1104 144 1104 80
    WIRE 1104 144 1024 144
    WIRE 1280 144 1280 80
    WIRE 1280 144 1104 144
    WIRE 1440 144 1440 80
    WIRE 1440 144 1280 144
    WIRE 112 160 112 128
    WIRE 736 192 736 176
    WIRE 784 192 736 192
    WIRE 1200 192 1200 128
    WIRE 1360 192 1360 128
    WIRE 1360 192 1200 192
    WIRE 1520 192 1520 128
    WIRE 1520 192 1360 192
    WIRE 0 208 0 128
    WIRE 400 208 400 192
    WIRE 640 208 640 128
    WIRE 640 208 400 208
    WIRE 400 224 400 208
    WIRE 912 240 848 240
    WIRE 112 272 112 224
    WIRE 128 272 112 272
    WIRE 224 272 192 272
    WIRE 272 272 272 208
    WIRE 272 272 224 272
    WIRE 912 272 912 240
    WIRE 400 336 400 304
    WIRE 544 336 544 144
    WIRE 544 336 400 336
    WIRE 112 368 112 272
    WIRE 912 368 912 352
    WIRE 912 368 112 368
    WIRE 272 400 272 272
    WIRE 112 416 112 368
    WIRE 1200 448 1200 192
    WIRE 1200 448 336 448
    WIRE 112 464 112 416
    WIRE 400 480 400 336
    WIRE 0 496 0 288
    WIRE 0 496 -32 496
    WIRE -32 528 -32 496
    WIRE 0 576 0 496
    WIRE 64 576 0 576
    WIRE 112 576 112 544
    WIRE 112 576 64 576
    WIRE 272 576 272 496
    WIRE 272 576 112 576
    WIRE 400 576 400 560
    WIRE 400 576 272 576
    FLAG -32 528 0
    FLAG 112 128 P6-RLIM
    FLAG 112 416 P18-RC
    FLAG 224 272 P2-OUT
    FLAG 64 -16 P5-V+
    FLAG 64 576 P4-V-
    SYMBOL res 96 -16 R0
    SYMATTR InstName R1
    SYMATTR Value 39
    SYMBOL LED 96 160 R0
    SYMATTR InstName D1
    SYMATTR Value NSSW008CT-P1
    SYMBOL res 96 448 R0
    SYMATTR InstName R2
    SYMATTR Value 9.1k
    SYMBOL cap 192 256 R90
    WINDOW 0 0 32 VBottom 2
    WINDOW 3 32 32 VTop 2
    WINDOW 40 52 32 VTop 2
    SYMATTR InstName C1
    SYMATTR Value 470�
    SYMATTR SpiceLine2 ic=0.5
    SYMBOL res 256 112 R0
    SYMATTR InstName R5
    SYMATTR Value 390
    SYMBOL res 256 -16 R0
    SYMATTR InstName R4
    SYMATTR Value 390
    SYMBOL npn 336 400 M0
    SYMATTR InstName Q3
    SYMATTR Value 2N3904
    SYMBOL res 384 96 R0
    SYMATTR InstName R6
    SYMATTR Value 20k
    SYMBOL res 384 208 R0
    SYMATTR InstName R7
    SYMATTR Value 10k
    SYMBOL res 384 464 R0
    SYMATTR InstName R8
    SYMATTR Value 20k
    SYMBOL npn 480 48 R0
    SYMATTR InstName Q4
    SYMATTR Value 2N3904
    SYMBOL npn 672 80 R0
    SYMATTR InstName Q1a
    SYMATTR Value 2N3904
    SYMBOL pnp 960 128 M180
    SYMATTR InstName Q2a
    SYMATTR Value 2N3906
    SYMBOL voltage 0 192 R0
    WINDOW 123 0 0 Left 0
    WINDOW 39 24 116 Left 2
    SYMATTR InstName V1
    SYMATTR Value 1.5
    SYMBOL res 896 256 R0
    SYMATTR InstName R9
    SYMATTR Value 100
    SYMBOL pnp 1136 128 M180
    SYMATTR InstName Q2b
    SYMATTR Value 2N3906
    SYMBOL pnp 1296 128 M180
    SYMATTR InstName Q2c
    SYMATTR Value 2N3906
    SYMBOL pnp 1456 128 M180
    SYMATTR InstName Q2d
    SYMATTR Value 2N3906
    SYMBOL npn 784 144 R0
    SYMATTR InstName Q1b
    SYMATTR Value 2N3904
    SYMBOL res -16 32 R0
    SYMATTR InstName PTC
    SYMATTR Value 5
    TEXT -56 192 VRight 2 ;AA Alkaline
    TEXT 512 528 Left 2 !.tran 15
    TEXT 504 496 Left 2 ;Pins 3 and 7 = no connect
    TEXT 760 488 Left 2 ;Sorted by Vd at If=20 mA \n \nPart # Mfg Is (A) N Iave (A) Vf@Iave (V) Vd@If (V)\nQTLP690C Fairchild 1.00E-22 1.500 0.16 1.90 1.82\nPT-121-B Luminous 4.35E-07 8.370 20.00 3.84 2.34\nLUW-W5AP OSRAM 6.57E-08 7.267 2.00 3.26 2.39\nLXHL-BW02 Lumileds 4.50E-20 2.600 0.40 2.95 2.75\nW5AP-LZMZ-5K Lumileds 3.50E-17 3.120 2.00 3.13 2.76\nLXK2-PW14 Lumileds 3.50E-17 3.120 1.60 3.11 2.76\nAOT-2015 AOT 5.96E-10 6.222 0.18 3.16 2.80\nNSSW008CT-P Nichia 2.30E-16 3.430 0.04 2.92 2.86\nNSSWS108T Nichia 1.13E-18 3.020 0.04 2.99 2.94\nNSPW500BS Nichia 2.70E-10 6.790 0.03 3.27 3.20\nNSCW100 Nichia 1.69E-08 9.626 0.03 3.60 3.50
    TEXT 168 256 Left 4 ;+
    TEXT 1224 224 Left 2 ;Current mirror with 3X current gain
    TEXT 664 256 Left 2 ;Use MPSA14 Darlington
    TEXT 656 56 Left 2 ;3 V battery needs more VBE
    Version 4
    SHEET 1 1816 760
    WIRE 64 -16 0 -16
    WIRE 112 -16 64 -16
    WIRE 272 -16 112 -16
    WIRE 544 -16 272 -16
    WIRE 1024 -16 544 -16
    WIRE 1200 -16 1024 -16
    WIRE 112 0 112 -16
    WIRE 272 0 272 -16
    WIRE 1024 32 1024 -16
    WIRE 1200 32 1200 -16
    WIRE 0 48 0 -16
    WIRE 544 48 544 -16
    WIRE 944 80 768 80
    WIRE 960 80 944 80
    WIRE 1136 80 1104 80
    WIRE 272 96 272 80
    WIRE 400 96 272 96
    WIRE 480 96 400 96
    WIRE 400 112 400 96
    WIRE 112 128 112 80
    WIRE 272 128 272 96
    WIRE 704 128 640 128
    WIRE 944 144 944 80
    WIRE 1024 144 1024 128
    WIRE 1024 144 944 144
    WIRE 1104 144 1104 80
    WIRE 1104 144 1024 144
    WIRE 112 160 112 128
    WIRE 768 192 768 176
    WIRE 800 192 768 192
    WIRE 912 192 864 192
    WIRE 0 208 0 128
    WIRE 400 208 400 192
    WIRE 640 208 640 128
    WIRE 640 208 400 208
    WIRE 400 224 400 208
    WIRE 112 272 112 224
    WIRE 128 272 112 272
    WIRE 224 272 192 272
    WIRE 272 272 272 208
    WIRE 272 272 224 272
    WIRE 912 272 912 192
    WIRE 400 336 400 304
    WIRE 544 336 544 144
    WIRE 544 336 400 336
    WIRE 112 368 112 272
    WIRE 912 368 912 352
    WIRE 912 368 112 368
    WIRE 272 400 272 272
    WIRE 112 416 112 368
    WIRE 1200 448 1200 128
    WIRE 1200 448 336 448
    WIRE 112 464 112 416
    WIRE 400 480 400 336
    WIRE 0 496 0 288
    WIRE 0 496 -32 496
    WIRE -32 528 -32 496
    WIRE 0 576 0 496
    WIRE 64 576 0 576
    WIRE 112 576 112 544
    WIRE 112 576 64 576
    WIRE 272 576 272 496
    WIRE 272 576 112 576
    WIRE 400 576 400 560
    WIRE 400 576 272 576
    FLAG -32 528 0
    FLAG 112 128 P6-RLIM
    FLAG 112 416 P18-RC
    FLAG 224 272 P2-OUT
    FLAG 64 -16 P5-V+
    FLAG 64 576 P4-V-
    SYMBOL res 96 -16 R0
    SYMATTR InstName R1
    SYMATTR Value 39
    SYMBOL LED 96 160 R0
    SYMATTR InstName D1
    SYMATTR Value LXHL-BW02
    SYMBOL res 96 448 R0
    SYMATTR InstName R2
    SYMATTR Value 9.1k
    SYMBOL cap 192 256 R90
    WINDOW 0 0 32 VBottom 2
    WINDOW 3 32 32 VTop 2
    WINDOW 40 52 32 VTop 2
    SYMATTR InstName C1
    SYMATTR Value 1m
    SYMATTR SpiceLine2 ic=0.5
    SYMBOL res 256 112 R0
    SYMATTR InstName R5
    SYMATTR Value 390
    SYMBOL res 256 -16 R0
    SYMATTR InstName R4
    SYMATTR Value 390
    SYMBOL npn 336 400 M0
    SYMATTR InstName Q3
    SYMATTR Value 2N3904
    SYMBOL res 384 96 R0
    SYMATTR InstName R6
    SYMATTR Value 20k
    SYMBOL res 384 208 R0
    SYMATTR InstName R7
    SYMATTR Value 10k
    SYMBOL res 384 464 R0
    SYMATTR InstName R8
    SYMATTR Value 20k
    SYMBOL npn 480 48 R0
    SYMATTR InstName Q4
    SYMATTR Value 2N3904
    SYMBOL npn 704 80 R0
    SYMATTR InstName Q1
    SYMATTR Value 2N3904
    SYMBOL pnp 960 128 M180
    SYMATTR InstName Q2a
    SYMATTR Value 2N3906
    SYMBOL voltage 0 192 R0
    WINDOW 123 0 0 Left 0
    WINDOW 39 24 116 Left 2
    SYMATTR InstName V1
    SYMATTR Value 1.5
    SYMBOL res 896 256 R0
    SYMATTR InstName R9
    SYMATTR Value 100
    SYMBOL pnp 1136 128 M180
    SYMATTR InstName Q2b
    SYMATTR Value 2N3906
    SYMBOL res -16 32 R0
    SYMATTR InstName PTC
    SYMATTR Value 5
    SYMBOL diode 800 208 R270
    WINDOW 0 32 32 VTop 2
    WINDOW 3 0 32 VBottom 2
    SYMATTR InstName D2
    SYMATTR Value 1N4148
    TEXT -56 192 VRight 2 ;AA Alkaline
    TEXT 512 528 Left 2 !.tran 30
    TEXT 504 496 Left 2 ;Pins 3 and 7 = no connect
    TEXT 760 488 Left 2 ;Sorted by Vd at If=20 mA \n \nPart # Mfg Is (A) N Iave (A) Vf@Iave (V) Vd@If (V)\nQTLP690C Fairchild 1.00E-22 1.500 0.16 1.90 1.82\nPT-121-B Luminous 4.35E-07 8.370 20.00 3.84 2.34\nLUW-W5AP OSRAM 6.57E-08 7.267 2.00 3.26 2.39\nLXHL-BW02 Lumileds 4.50E-20 2.600 0.40 2.95 2.75\nW5AP-LZMZ-5K Lumileds 3.50E-17 3.120 2.00 3.13 2.76\nLXK2-PW14 Lumileds 3.50E-17 3.120 1.60 3.11 2.76\nAOT-2015 AOT 5.96E-10 6.222 0.18 3.16 2.80\nNSSW008CT-P Nichia 2.30E-16 3.430 0.04 2.92 2.86\nNSSWS108T Nichia 1.13E-18 3.020 0.04 2.99 2.94\nNSPW500BS Nichia 2.70E-10 6.790 0.03 3.27 3.20\nNSCW100 Nichia 1.69E-08 9.626 0.03 3.60 3.50
    TEXT 168 256 Left 4 ;+
    TEXT 656 56 Left 2 ;3 V battery needs more VBE
    Version 4
    SHEET 1 1812 680
    WIRE 96 -16 32 -16
    WIRE 144 -16 96 -16
    WIRE 304 -16 144 -16
    WIRE 544 -16 304 -16
    WIRE 752 -16 544 -16
    WIRE 144 0 144 -16
    WIRE 304 0 304 -16
    WIRE 752 0 752 -16
    WIRE 928 0 752 0
    WIRE 752 32 752 0
    WIRE 928 32 928 0
    WIRE 544 48 544 -16
    WIRE 832 80 816 80
    WIRE 864 80 832 80
    WIRE 304 96 304 80
    WIRE 400 96 304 96
    WIRE 480 96 400 96
    WIRE 400 112 400 96
    WIRE 144 128 144 80
    WIRE 304 128 304 96
    WIRE 752 144 752 128
    WIRE 752 144 704 144
    WIRE 832 144 832 80
    WIRE 832 144 752 144
    WIRE 144 160 144 128
    WIRE 704 160 704 144
    WIRE 32 208 32 -16
    WIRE 400 208 400 192
    WIRE 640 208 400 208
    WIRE 400 224 400 208
    WIRE 704 272 704 256
    WIRE 144 288 144 224
    WIRE 160 288 144 288
    WIRE 256 288 224 288
    WIRE 304 288 304 208
    WIRE 304 288 256 288
    WIRE 400 320 400 304
    WIRE 544 320 544 144
    WIRE 544 320 400 320
    WIRE 144 368 144 288
    WIRE 704 368 704 352
    WIRE 704 368 144 368
    WIRE 304 400 304 288
    WIRE 144 416 144 368
    WIRE 928 448 928 128
    WIRE 928 448 368 448
    WIRE 144 464 144 416
    WIRE 400 480 400 320
    WIRE 32 496 32 288
    WIRE 32 496 0 496
    WIRE 0 528 0 496
    WIRE 32 576 32 496
    WIRE 96 576 32 576
    WIRE 144 576 144 544
    WIRE 144 576 96 576
    WIRE 304 576 304 496
    WIRE 304 576 144 576
    WIRE 400 576 400 560
    WIRE 400 576 304 576
    FLAG 0 528 0
    FLAG 144 128 P6-RLIM
    FLAG 144 416 P18-RC
    FLAG 256 288 P2-OUT
    FLAG 96 -16 P5-V+
    FLAG 96 576 P4-V-
    SYMBOL res 128 -16 R0
    SYMATTR InstName R1
    SYMATTR Value 12
    SYMBOL LED 128 160 R0
    SYMATTR InstName D1
    SYMATTR Value PT-121-B
    SYMBOL res 128 448 R0
    SYMATTR InstName R2
    SYMATTR Value 9.1k
    SYMBOL cap 224 272 R90
    WINDOW 0 0 32 VBottom 2
    WINDOW 3 32 32 VTop 2
    WINDOW 40 52 32 VTop 2
    SYMATTR InstName C1
    SYMATTR Value 470�
    SYMATTR SpiceLine2 ic=0.5
    SYMBOL res 288 112 R0
    SYMATTR InstName R5
    SYMATTR Value 390
    SYMBOL res 288 -16 R0
    SYMATTR InstName R4
    SYMATTR Value 390
    SYMBOL npn 368 400 M0
    SYMATTR InstName Q3
    SYMATTR Value 2N3904
    SYMBOL res 384 96 R0
    SYMATTR InstName R6
    SYMATTR Value 20k
    SYMBOL res 384 208 R0
    SYMATTR InstName R7
    SYMATTR Value 10k
    SYMBOL res 384 464 R0
    SYMATTR InstName R8
    SYMATTR Value 20k
    SYMBOL npn 480 48 R0
    SYMATTR InstName Q4
    SYMATTR Value 2N3904
    SYMBOL npn 640 160 R0
    SYMATTR InstName Q1
    SYMATTR Value 2N3904
    SYMBOL pnp 816 128 R180
    SYMATTR InstName Q2a
    SYMATTR Value 2N3906
    SYMBOL voltage 32 192 R0
    WINDOW 123 0 0 Left 0
    WINDOW 39 24 116 Left 2
    SYMATTR InstName V1
    SYMATTR Value 3
    SYMBOL res 688 256 R0
    SYMATTR InstName R9
    SYMATTR Value 100
    SYMBOL pnp 864 128 M180
    SYMATTR InstName Q2b
    SYMATTR Value 2N3906
    TEXT -24 192 VRight 2 ;AA Alkaline
    TEXT 512 528 Left 2 !.tran 10
    TEXT 504 496 Left 2 ;Pins 3 and 7 = no connect
    TEXT 1064 112 Left 2 ;Sorted by Vd at If=20 mA \n \nPart # Mfg Is (A) N Iave (A) Vf@Iave (V) Vd@If (V)\nQTLP690C Fairchild 1.00E-22 1.500 0.16 1.90 1.82\nPT-121-B Luminous 4.35E-07 8.370 20.00 3.84 2.34\nLUW-W5AP OSRAM 6.57E-08 7.267 2.00 3.26 2.39\nLXHL-BW02 Lumileds 4.50E-20 2.600 0.40 2.95 2.75\nW5AP-LZMZ-5K Lumileds 3.50E-17 3.120 2.00 3.13 2.76\nLXK2-PW14 Lumileds 3.50E-17 3.120 1.60 3.11 2.76\nAOT-2015 AOT 5.96E-10 6.222 0.18 3.16 2.80\nNSSW008CT-P Nichia 2.30E-16 3.430 0.04 2.92 2.86\nNSSWS108T Nichia 1.13E-18 3.020 0.04 2.99 2.94\nNSPW500BS Nichia 2.70E-10 6.790 0.03 3.27 3.20\nNSCW100 Nichia 1.69E-08 9.626 0.03 3.60 3.50