CNC 3018XL: Arduino + Protoneer CNC

If the truth be known, I wanted to do this as soon as I discovered the CAMtool V3.3 board hardwired the DRV8825 PCBs in 1:32 microstep mode:

CNC 3018XL - Protoneer atop Arduino - installed
CNC 3018XL – Protoneer atop Arduino – installed

The Protoneer CNC board has jumpers, so selecting 1:8 microstep mode is no big deal.

As before, I epoxied another row of pins along the I/O header for Makerbot-style endstops:

Protoneer endstop power mod
Protoneer endstop power mod

I’ll probably regret not adding pins along the entire row, but, unlike the MPCNC, the CNC 3018XL won’t ever have hard limit switches. I plugged the Run-Hold switch LEDs into an unused +5 V pin and moved on.

I modified the DRV8825 driver PCBs for fast decay mode:

DRV8825 PCB - Fast Decay Mode wire
DRV8825 PCB – Fast Decay Mode wire

Then set the current to a bit over 1 A:

3018XL - Protoneer setup - Z 1 mm
3018XL – Protoneer setup – Z 1 mm

Six hours later I hauled the once-again-functional CNC 3018XL to my presentation for the ACM:

Spirograph - intricate sample plot - detail
Spirograph – intricate sample plot – detail

Memo to Self: Time to get another Prontoneer board …

, , , ,


CAMtool V3.3 vs. The Fat Fingers of Death

As is my custom, the day before showtime I talked my way through a final full-up dress rehearsal, with the HP 7475A plotter and the CNC 3018XL running their demo plots. As if to justify my attention to detail, the 3018 refused to home, with its X axis motor grinding in a manner suggesting something had gone terribly wrong with its driver.

OK, I can fix that™.

Turn off the power, verify the leadscrew turns smoothly by hand, check all the connections & connectors, then pull the DRV8825 PCB to see if anything looks obviously wrong. It didn’t, so I carefully re-plugged the driver and moved the whole affair to the Electronics Workbench for further study.

I turned on the scope and Tek current probes, then turned on the 3018 power supplies, whereupon a great cloud of Magic Smoke emerged from the CAMtool board and filled the Basement Laboratory with the acrid smell of Electrical Death.

It seems I carefully and meticulously re-plugged the DRV8825 PCB into its socket exactly one pin too high, which, among other Bad Things, connects the +24 V motor power supply to the driver GND pin.

Obviously, this did not end well:

CAMtool V3.3 - blown stepper fuse
CAMtool V3.3 – blown stepper fuse

The fuse, put under considerable stress, vented smoke & debris in all directions across the board; note the jets above the white motor connector. Surprisingly, the 1 kΩ resistor just below it is in fine shape, as is the rather blackened electrolytic cap.

The fuse measures the same 150-ish mΩ as the fuses in the other two axes, but I doubt it’s actually a fuse any more.

Astonishingly, the Arduino clone on the board worked fine, so I could extract the GRBL configuration.

Memo to Self: Never plug things in with your head upside down!

, , ,


Anonymous Bike Taillight Current

Along with the (defunct) Blackburn Flea, the bike pack also disgorged an anonymous taillight with a battery resistant to recharging through the USB port. Gentle suasion cracked the solvent-glued joint around the case:

Bike taillight - cracking case
Bike taillight – cracking case

As with most modern electronics, a battery occupies most of the interior volume:

Bike taillight - opening case
Bike taillight – opening case

For posterity, the connections:

Bike taillight - connections
Bike taillight – connections

I unsoldered the cell and charged it from a bench supply:

Bike taillight - external recharge
Bike taillight – external recharge

The voltage started out low with the current held to about 100 mA, eventually rose to 4.1 V, and stayed there while the current dropped to zero. Unlike the Blackburn cell, it appears not too much worse for the experience, although I haven’t measured the actual capacity.

Clipping the Tek current probe around the LED supply wire produced this waveform for the “dim” setting:

Anonymous Taillight - Low - 200 mA-div
Anonymous Taillight – Low – 200 mA-div

Adding a voltage probe across the LEDs and clicking to the “high” setting:

Anonymous Taillight - High - 200 mA-div
Anonymous Taillight – High – 200 mA-div

The intense ringing at the start of the pulse seems an artifact of the measurement setup, but ya never know; these days, RFI can come from anywhere.

In any event, the COB LED strip draws 800 mA from a fully charged battery, about 26 mA for each of the 30 LEDs. The 5% duty cycle in the “dim” setting is decently bright and 18% in “high” is entire adequate.

A trio of blinks works for daytime rides, although the fastest one seems seizure-inducing.

I’ve strapped it around a rack strut and run it at the slowest blink, on the principle you can never have too many blinky lights

Leave a comment

SK6812 RGBW Test Fixture: Row-by-Row Color Mods

The vacuum tube LED firmware subtracts the minimum value from the RGB channels of the SK6812 RGBW LEDs and displays it in the white channel, thereby reducing the PWM value of the RGB LEDs by their common “white” component. The main benefit is reducing the overall power by about two LEDs. More or less, kinda sorta.

I tweaked the SK6812 test fixture firmware to show how several variations of the basic RGB colors appear:

      for (int col=0; col < NUMCOLS ; col++) {              // for each column
        byte Value[PIXELSIZE];                              // figure first row colors
        for (byte p=0; p < PIXELSIZE; p++) {                //  ... for each color in pixel
          Value[p] = StepColor(p,-col*Pixels[p].TubePhase);
        // just RGB
        int row = 0;
        uint32_t UniColor = strip.Color(Value[RED],Value[GREEN],Value[BLUE],0);
        strip.setPixelColor(col + NUMCOLS*row++,UniColor);

        byte MinWhite = min(min(Value[RED],Value[GREEN]),Value[BLUE]);

        // only common white
        UniColor = strip.Color(0,0,0,MinWhite);
        strip.setPixelColor(col + NUMCOLS*row++,UniColor);

        // RGB minus common white + white
        UniColor = strip.Color(Value[RED]-MinWhite,Value[GREEN]-MinWhite,Value[BLUE]-MinWhite,MinWhite);
        strip.setPixelColor(col + NUMCOLS*row++,UniColor);

         // RGB minus common white
        UniColor = strip.Color(Value[RED]-MinWhite,Value[GREEN]-MinWhite,Value[BLUE]-MinWhite,0);
        strip.setPixelColor(col + NUMCOLS*row++,UniColor);

        // inverse RGB
        UniColor = strip.Color(255 - Value[RED],255 - Value[GREEN],255 - Value[BLUE],0);
        strip.setPixelColor(col + NUMCOLS*row++,UniColor);

Which looks like this:

SK6812 Test Fixture - RGBW color variations - diffuser
SK6812 Test Fixture – RGBW color variations – diffuser

The pure RGB colors appear along the bottom row, with the variations proceeding upward to the inverse RGB in the top row. The dust specks show it’s actually in focus.

The color variations seem easier to see without the diffuser:

SK6812 Test Fixture - RGBW color variations - bare LEDs
SK6812 Test Fixture – RGBW color variations – bare LEDs

The white LEDs are obviously “warm white”, which seems not to make much difference.

Putting a jumper from D2 to the adjacent (on an Nano, anyway) ground pin selects the original pattern, removing the jumper displays the modified pattern:

SK6812 test fixture - pattern jumper
SK6812 test fixture – pattern jumper

For whatever it’s worth, those LEDs have been running at full throttle for two years with zero failures!

The Arduino source code as a GitHub Gist:


Leave a comment

ACM Poughkeepsie Presentation: Algorithmic Art

In the unlikely event you’re in Poughkeepsie this evening, I’ll be doing a talk on my Algorithmic Art for the Poughkeepsie ACM chapter, with a look at the HPGL and G-Code transforming math into motion:

Superformula - triangle burst - detail
Superformula – triangle burst – detail

The PDF of the “slides” lacks my patter, but the embedded linkies will carry you to the blog posts & background information:

See you there! [grin]

, ,


LibreOffice Impress vs. NFS Network Shares vs. Caching

Whenever I put together a presentation, LibreOffice Impress gradually grinds to a halt with images in the slide thumbnails repeatedly updating and never stabilizing; eventually, LO crashes and sends a crash report to whoever’s watching. This may be due to my enthusiastic use of images to get my point(s) across, although I’m just not gonna back down from that position:

LibreOffice Impress - Thumbnail thrashing
LibreOffice Impress – Thumbnail thrashing

That’s a screenshot of a small thumbnail, enlarged for visibility, so it doesn’t look that crappy in real life.

Perhaps the problem arises because I insert the images as links, rather than embedding them to create a monolithic presentation file roughly the size of all outdoors?

Searching with the obvious keywords produces tantalizing hints concerning LO’s file locks clashing with NFS network share locking, which seems appropriate for my situation with all the files living on the grandiosely named file server (a headless Optiplex) in the basement.

The suggestions include making sure the NFS locking daemon is active, but I have NFC about how that might work in practice. The lockd daemon is running, for whatever that’s worth.

Seeing as how I’m the only one editing my LO presentations, disabling LO’s locks has little downside and requires tweaking one character in one line inside /usr/bin/libreoffice:

# file locking now enabled by default
<<< blank line to show off underscores above >>>

After a brief bout of good behavior, Impress resumed thrashing and stalling.

Copying the entire presentation + images to the SSD inside my desktop PC didn’t improve the situation.

More searches on less obvious keywords suggested disabling the Impress “background cache”, whatever that might be:

Tools → Options → Impress → General → Settings

Then un-check the ☐ Use background cache item, which may be the last vestige of the now-vanished memory usage and graphics cache size settings from previous versions.

In any event, disabling the cache had no effect, so it’s likely a problem deep inside LibreOffice where I cannot venture.

It autosaves every ten minutes and I must restart it maybe once an hour: survivable, but suboptimal.

There seems to be an improvement from Version 6.0.7 (Ubuntu 18.04 LTS) to Version 6.2.8 (Manjaro rolling release), although it’s too soon to tell whether it’s a fix or just different symptoms.

Leave a comment

Subaru Forester Rear Wiper Disassembly

You’re supposed to just rotate the wiper blade holder and have it pop out of the mount on the end of the arm:

Subaru Forester - rear wiper blade mount
Subaru Forester – rear wiper blade mount

The blade holder has two opposed pegs fitting into those curved notches to the right of the hook for the holder’s pivot, with the intent of preventing it from rotating too far and sliding out. I was unwilling to apply sufficient force to disengage those pegs, as the penalty for breaking the wrong piece of plastic seemed very high. Apparently, the pegs should ride up over the slightly lower edge of their notch, bending the holder’s sides outward as they do.

So I jammed a little screwdriver beside one of the pegs, managed to encourage it out of its notch, repeated the treatment on the other side, and the blade holder popped right out.

The front wiper arms have J-hooks on their ends and disengage easily, at least after you realize the flat panel on the blade holder is actually a latch you’re suppose to pull up-and-out to release the hook. This goes more easily when assisted with the aforementioned small screwdriver.

The blades were in good shape after five years, mostly because the Forester spends most of its time in the garage. A trio of silicone wipers should last the rest of its life, with the OEM wipers tucked into the spare tire well Just In Case.

Back in the day, one could replace just the blades, not the entire holder, but I suppose this is progress.