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

  • MGE Ellipse 1200 Battery Arrangement

    The SLA batteries in the MGE Ellipse 1200 UPS finally gave out. This picture shows how they’re arranged inside the box:

    MGE Ellipse 1200 UPS - battery arrangement
    MGE Ellipse 1200 UPS – battery arrangement

    They’re 12 V 5 Ah batteries that are about 12 mm thinner than the garden variety 7 Ah batteries you can get everywhere; they’re not the same size as the generic 5 Ah batteries you might think would work. Of course, there’s not enough room inside the stylin’ case for the larger ones, either. I’m thinking of using fatter batteries anyway and putting a belly band around the gap. Maybe an external battery box with a chunky cable burrowing through a hole in the UPS case?

    For what it’s worth, APC absorbed MGE a while ago (so the MGE website redirects to APC), got Borged by Schneider, then spat out MGE’s consumer grade UPS units to Eaton. You won’t find any of that documented anywhere, but here’s the response from APC after I didn’t find this UPS on their list:

    I do apologize; when APC was acquired by Schneider Electric, the single phase UPS line that MGE once offered was sold to Eaton. Eaton now provides support for the MGE single-phase products. We do not sell batteries for these models. You will actually need to contact Eaton for further assistance regarding the MGE Ellipse units. You may click on the link below to go to Eaton’s website:

    http://powerquality.eaton.com/Default.asp

    The Eaton website does have a battery replacement for this one, but sporting the dreaded “Contact us for price” notation. Given that I got the UPS cheap-after-rebate, I’m thinking maybe this isn’t worth the effort.

  • Stepper Motor Back EMF

    Some simple measurements using that Pololu driver in its default mixed decay mode and that Arduino sync generator. The captions give the operating conditions; basically, I’m varying the rotation speed by cranking the signal generator driving the Pololu board.

    At 1 rev/s, it’s about as good as it gets:

    Back EMF - 9V 400mA 1 RPS
    Back EMF – 9V 400mA 1 RPS

    At 5 rev/s, the driver has trouble getting current out of the winding:

    Back EMF - 9V 400mA 5 RPS
    Back EMF – 9V 400mA 5 RPS

    At 10 rev/s, things are getting ugly:

    Back EMF - 9V 400mA 10 RPS
    Back EMF – 9V 400mA 10 RPS

    At 20 rev/s, the back EMF has pretty much taken control of the current and the driver is going along for the ride:

    Back EMF - 9V 400mA 20 RPS
    Back EMF – 9V 400mA 20 RPS

    At 25 rev/s, the driver produces only occasional dents in the waveform:

    Back EMF - 9V 400mA 25 RPS
    Back EMF – 9V 400mA 25 RPS

    At 25.3 rev/s, the motor stalled. Even with no back EMF (what with the rotor being stopped and buzzing in frustration), the driver can’t force the current to behave:

    Back EMF - 9V 400mA 25.3 RPS
    Back EMF – 9V 400mA 25.3 RPS

    I don’t have any way to measure the motor’s output torque, but at 1500 RPM there won’t be any worth mentioning.

    For what it’s worth, 25 rev/s means the driver is handling 40 k steps/sec = 25 µs/step. The motors in a Thing-O-Matic run at 3 rev/s to move the XY stages at 100 mm/s, so scale what you see here accordingly.

  • Beard Trimmer: NiCd Rejuvenation

    Strictly speaking, I do not have a beard: I simply do not shave (*). There being no money in selling Trimmers for the Non-shaving, a while back I bought a battery operated Beard Trimmer. The NiCd cells lasted for the predictable few years and recently gave up the ghost entirely: an overnight charged produced a weak buzz with no cutting action to speak of.

    The case uses one-time snap-together latches, which makes dismantling it a challenge. Start by removing all the gimcrackery on the business end, then pry out the two latches holding the it-was-white-once cutting length adjustment ring.  With that out of the way, undo the two latches inside the top and work your way down, prying the case halves apart in the way the overlap flange doesn’t like, so as to force the latches loose.

    This picture shows the six latches, three on each side. The ones just to the right of the blue impeller require the most cursing:

    Beard trimmer case and innards
    Beard trimmer case and innards

    The circuit board snaps out, with the two PCB contact areas clamped down by springy contacts leading to the motor.

    Beard trimmer - battery charger PCB
    Beard trimmer – battery charger PCB

    The two NiCd cells boast of their High Energy, but they’re only 600 mAh. That’s actually too much for this high-drain, short-run application, as they don’t completely discharge. They’re held in place on the right end with a blob of hot melt glue:

    Beard trimmer - NiCd cells
    Beard trimmer – NiCd cells

    I unsoldered the cells and gave ’em a brute-force overnight charge at C/10 = 60 mA, then ran a discharge test (clicky for more dots):

    Beard Trimmer - NiCd Discharge Test
    Beard Trimmer – NiCd Discharge Test

    Lookee that! The cells still deliver their rated capacity, even though they no longer worked with the stock charger. I repeated the slow-charge and discharge trick, which produced a perfectly overlapping trace.

    Flushed with success, I unleashed the built-in charger overnight, then produced a third overlapping trace.

    So they suffered from voltage depression, most likely due to never being completely discharged and then being overcharged far too often. That’s cured by a complete discharge and recharge, which worked perfectly.

    I hack back the overgrowth when it gets bushy and recharge the trimmer when it seems to be getting weak, which used to take a week or two. That’s a bad way to maintain a NiCd battery, particularly as the PCB applies a very low load to keep its computronium running, but I have better things to do than babysit a beard trimmer. Honest.

    Anyhow, assembly is in the reverse order and it’s perfectly happy again.

    I probably won’t change my evil ways, so the next time I’m sure the battery will be really and truly dead.

    (*)  Not shaving adds about ten minutes a day to my life, which I regard as a fair tradeoff over the course of several decades. It also added a decade to my apparent age, Back In The Day when that mattered. Now it seems to knock off a decade, which isn’t entirely a Bad Thing.

  • Arduino Case

    The base of that case makes a good protector to keep an Arduino board out of the conductive clutter on a typical electronics bench. I stopped the printer shortly after it finished the bosses atop the mounting posts:

    Arduino case - base on build platform
    Arduino case – base on build platform

    That yellow filament means I can’t lose it!

  • Casio EX-Z850 Camera Button Failure

    The Casio EX-Z850 camera living in my pocket finally developed a problem. Two buttons on the back select the Review and Camera modes; the former stopped working, which means I can’t see pictures after I take them. The Camera button may still work, but because I can’t display pix, that’s pretty much moot.

    Taking the camera apart require a Philips 00 screwdriver bit and some care, but eventually you’re confronted with this:

    Casio EX-Z850 camera - opened
    Casio EX-Z850 camera – opened

    The buttons and the mode selector dial all connect to the same flexible PCB substrate, which ends up in this connector. You should ease the black pressure bar (seen edge-on here) upward to release the flex PCB:

    Casio EX-Z850 button connector
    Casio EX-Z850 button connector

    As it turns out, the two buttons have a common contact that’s the second trace from the top in the flat cable. Both buttons have good snap action, good conductivity, and seem to work fine. That puts the problem deeper inside the camera, where I don’t see much point in going; I can certainly make things much worse and likely not make them any better.

    In fact, it turns out that the two buttons on the USB/charging cradle don’t work now, either, which implies that the camera buttons run in parallel with those. So there’s something blown in the camera’s guts, which is definitely Bad News.

    Back in the Bad Old Days, you used to take a picture and wait a week or two to get the results back from the drug store. Perhaps it’s fashionably retro to have a digital camera without a Review mode?

  • Stepper Motor Winding Current Rise Time

    Here’s how the stepper drive voltage affects the current rise, using that kludge to sync the scope on one of those motors with L=2.6 mH and R=2.2 Ω. The peak winding current is 1 A, so the first step current-limits at 200 mA.

    At 9 V:

    Current Rise - 9 V 1A 3 RPS
    Current Rise – 9 V 1A 3 RPS

    At 18 V:

    Current Rise - 18 V 1A 3 RPS
    Current Rise – 18 V 1A 3 RPS

    Knowing the rise time and current change, you can calculate the actual voltage across the inductor using:

    VL = L di/dt

    With 9 V drive the motor sees:

    4.4 V = 2.6 mH x 220 mA / 130 us

    With 18 V drive the motor sees:

    14 V = 2.6 mH x 240 mA / 45 us

    So, in round numbers, the driver MOSFETs, winding resistance, and all the crappy solderless breadboard connections soak up about 4 V of the available supply voltage. There’s some back EMF in there, too, but I haven’t measured that part of the puzzle yet.

    The motor is turning at 3 rev/s in 1/8 microstepping mode, so each microstep is:

    200 us = 1/(3 rev/s x 1600 step/rev)

  • Stepper Sync Wheel: Group Sync

    A small tweak to that code produces a sync pulse for each full sine wave of microstepping current, aligned with the step pulses. The sync pulse occurs on the rising edge of the current waveform (because I set it up that way) and has 50% duty cycle to allow triggering at either zero-current microstep.

    Then pix like this happen:

    Microstepping Group Sync
    Microstepping Group Sync

    The traces:

    • top = 1/group sync
    • middle = winding current at 500 mA/div
    • bottom = step pulse, 1/microstep

    The big jump just before the zero-current microstep on the decreasing-current sides of the sine wave indicates that it’s hard to get all the current out of the windings at 12 V. A detail view of those steps shows that the current is 50% higher than it should be at the start of the zero-current microstep, having completely missed the last microstep:

    Decreasing Current
    Decreasing Current

    Which, of course, is why I’m doing all this: to explore that kind of behavior.

    You may find the generated sync pulses are off by ±1 microstep from the expected start of the zero-current microstep, because the optical 1/rev signal threshold may line up perversely with the start of a microstep. You can twist the sync wheel just slightly on the shaft, but it’s pretty much a matter of shaking the dice to see if a better combination comes up. Doesn’t make any real difference to the scope triggering, though, as any stable sync alignment is as good as any other.

    The code uses the 1/rev optical sync pulse once, to get the initial alignment, so whacking the wheel as it rotates may cause the generated sync pulses to skip a beat or twenty. The result remains stable, just at a different alignment.

    One could argue that you really don’t need the 1/rev optical signal at all, but I find it comforting to use an absolute rotational reference to lock the pulses in (pretty nearly) the same place every time. If you’re stuck with an in-place motor, then you probably don’t have a 1/rev signal and you must wing it.

    The Arduino source code:

    // Stepper motor driver synchronization
    // Ed Nisley KE4ZNU June 2011
    
    //-- Stepper parameters
    
    #define SYNC_OFFSET            8        // steps from 1/rev pulse to start of first 4-full-step group
    
    #define FULL_STEPS_PER_REV    200
    #define MICROSTEPPING        8
    
    #define GROUPS_PER_REV (FULL_STEPS_PER_REV / 4)
    #define STEPS_PER_GROUP (MICROSTEPPING * 4)
    
    //-- Pin definitions, all of which depend on internal hardware: do *not* change
    
    #define PIN_REV        2                // INT0 = positive 1/rev pulse from optical switch
    #define PIN_STEP    5                // T1 = positive 1/step pulse from stepper driver
    #define PIN_TRIGGER    9                // OC1A = positive trigger pulse to scope
    
    //-- Trace outputs may be chosen freely
    
    #define PIN_TRACE_A    10
    #define PIN_TRACE_B    11
    #define PIN_TRACE_C    12
    
    #define PIN_LED        13                // standard Arduino LED
    
    //---------------------
    // State Variables
    
    word PulseCounter;
    
    //---------------------
    // Useful routines
    
    //--- Input & output pins
    
    void TogglePin(char bitpin) {
    digitalWrite(bitpin,!digitalRead(bitpin));    // toggle the bit based on previous output
    }
    
    //----------------
    // Initializations
    
    void setup() {
    
    pinMode(PIN_REV,INPUT);        // INT0 1/rev pulse from wheel
    
    pinMode(PIN_STEP,INPUT);        // T1 step pulse from stepper driver
    
    pinMode(PIN_LED,OUTPUT);
    digitalWrite(PIN_LED,LOW);
    
    pinMode(PIN_TRACE_A,OUTPUT);
    pinMode(PIN_TRACE_B,OUTPUT);
    pinMode(PIN_TRACE_C,OUTPUT);
    
    //--- Prepare Timer1 to count external stepper drive pulses
    
    TCCR1B = B00001000;                // Timer1: Mode 4 = CTC, TOP = OCR1A, clock stopped
    
    pinMode(PIN_TRIGGER,OUTPUT);        // OC1A to scope trigger
    
    //-- Wait for rising edge of 1/rev pulse from optical switch
    
    TCCR1A = B11000000;                        // COM1A set on compare
    TCNT1 = 0;                                // ensure we start from zero
    OCR1A = SYNC_OFFSET;                        // set step counter
    
    while(!digitalRead(PIN_REV)) {            // stall until 1/rev input rises
    TogglePin(PIN_TRACE_A);
    }
    
    //-- Got it, fire up the timer to count steps to start of first group
    
    TCCR1B |= B00000111;                        // enable clock from T1 pin, rising edge
    
    digitalWrite(PIN_LED,HIGH);                // show we got here
    digitalWrite(PIN_TRACE_A,LOW);
    
    while(!(TIFR1 & _BV(OCF1A))) {            // wait for compare
    digitalWrite(PIN_TRACE_B,digitalRead(PIN_STEP));
    continue;
    }
    TIFR1 |= _BV(OCF1A);                        // clear match flag
    
    //-- Scope sync pulse is now active, we can enter the main loop
    
    }
    
    //----------------
    // The main event
    
    void loop() {
    
    //-- Scope sync pulse active
    
    digitalWrite(PIN_LED,LOW);                // show we got here
    digitalWrite(PIN_TRACE_B,LOW);
    
    //-- Set up for first half of the group, sync high -> low
    
    TCCR1A = B10000000;                        // COM1A clear on compare
    OCR1A = (STEPS_PER_GROUP / 2) - 1;
    
    while(!(TIFR1 & _BV(OCF1A))) {            // wait for compare
    digitalWrite(PIN_TRACE_B,digitalRead(PIN_STEP));
    continue;
    }
    TIFR1 |= _BV(OCF1A);                        // clear match flag
    digitalWrite(PIN_TRACE_B,LOW);
    
    //-- Set up for the second half, sync low -> high
    
    TCCR1A = B11000000;                        // COM1A set on compare
    OCR1A = (STEPS_PER_GROUP - (STEPS_PER_GROUP / 2)) - 1;    // may be odd, so allow for that
    
    while(!(TIFR1 & _BV(OCF1A))) {            // wait for compare
    digitalWrite(PIN_TRACE_B,digitalRead(PIN_STEP));
    continue;
    }
    TIFR1 |= _BV(OCF1A);                        // clear match flag
    digitalWrite(PIN_TRACE_B,LOW);
    
    //-- Shut down counter and wait for end of 1/rev pulse
    
    #if 0
    TCCR1B &= ~B00000111;                        // turn off timer clock
    
    while(digitalRead(PIN_REV)) {                // stall until 1/rev pulse goes low again
    TogglePin(PIN_TRACE_C);
    }
    digitalWrite(PIN_TRACE_B,LOW);
    #endif
    
    }