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.


CNC 3018XL: Pilot V5RT Pen Holder Lock Screw

Flushed with success about the MPCNC drag knife locking screw, I installed a similar screw on the V5RT pen holder for the CNC 3018:

Pilot V5RT holder - lock screw insert - assembled
Pilot V5RT holder – lock screw insert – assembled

A dark ring of epoxy around the screw holds a shortened M3 brass insert in place:

Pilot V5RT holder - lock screw insert
Pilot V5RT holder – lock screw insert

As it turned out, the original recess left only a few threads for the M3 SHCS, so the much longer screw wobbulated alarmingly. I drilled out the threads, turned the knurls off the insert, shortened it a bit, masked the pretty knurls on the aluminum ring, then glopped the insert in place while the Sherline held the screw vertical:

Pilot V5RT holder - insert epoxy
Pilot V5RT holder – insert epoxy

While I was at it, I added a thin ring of foam rubber under the knurled ring to keep it from clacking against the upper bushing.

Now I can’t lose the hex wrench when I take the thing out for Show-n-Tell sessions …


Leave a comment

Raspberry Pi Shutdown / Start Button

While adding the usual Reset button to a Raspberry Pi destined for a Show-n-Tell with the HP 7475A plotter, I browsed through the latest dtoverlay README and found this welcome surprise:

Name:   gpio-shutdown
Info:   Initiates a shutdown when GPIO pin changes. The given GPIO pin
        is configured as an input key that generates KEY_POWER events.
        This event is handled by systemd-logind by initiating a
        shutdown. Systemd versions older than 225 need an udev rule
        enable listening to the input device:

                ACTION!="REMOVE", SUBSYSTEM=="input", KERNEL=="event*", \
                        SUBSYSTEMS=="platform", DRIVERS=="gpio-keys", \
                        ATTRS{keys}=="116", TAG+="power-switch"

        This overlay only handles shutdown. After shutdown, the system
        can be powered up again by driving GPIO3 low. The default
        configuration uses GPIO3 with a pullup, so if you connect a
        button between GPIO3 and GND (pin 5 and 6 on the 40-pin header),
        you get a shutdown and power-up button.
Load:   dtoverlay=gpio-shutdown,<param>=<val>
Params: gpio_pin                GPIO pin to trigger on (default 3)

        active_low              When this is 1 (active low), a falling
                                edge generates a key down event and a
                                rising edge generates a key up event.
                                When this is 0 (active high), this is
                                reversed. The default is 1 (active low).

        gpio_pull               Desired pull-up/down state (off, down, up)
                                Default is "up".

                                Note that the default pin (GPIO3) has an
                                external pullup.

        debounce                Specify the debounce interval in milliseconds
                                (default 100)

So I added two lines to /boot/config.txt:


The fancy “Moster heatsink” case doesn’t leave much room for wiring:

RPi Shutdown Restart Switch - GPIO 3
RPi Shutdown Restart Switch – GPIO 3

The switch button is slightly shorter than the acrylic sheet, so it’s recessed below the surface and requires a definite push to activate. It’s not as if it’ll get nudged by accident, but ya never know.

I’ll eventually migrate this change to all the RPi boxes around the house, because it just makes more sense than any of the alternatives. Heck, it’ll free up a key on the streaming radio player keypads, although I must move the I²C display to Bus 0 to avoid contention on Pin 3.

For reference, the Raspberry Pi header pinout:

Raspberry Pi pinout
Raspberry Pi pinout

I don’t know if I²C Bus 0 has the same 1.8 kΩ pullups as Bus 1, though; a look at the bus currents will be in order.


Leave a comment

Homage Tek CC Cursor: Pivot Milling

A test to mill the pivot hole in 0.5 mm PETG sheet worked perfectly:

Tek CC - cursor pivot hole milling
Tek CC – cursor pivot hole milling

The cutter is a 3.175 mm = 1/8 inch router bit, one of a ten-pack that came with the CNC 3018 and to which I have no deep emotional attachment, held in a collet in the Sherline. The hole is 5.5 mm to fit an eyelet. The PETG is taped to a thin plywood scrap.

The hole happened by feeding G-Code manually into LinuxCNC, after touching off XYZ=0 at the center of the pivot and jogging up a bit:

g0 y-1.1625
g0 z0.5
g2 p5 z-1.5 i0 j1.1625

Yes, I engraved the hairline using a diamond drag tool on the CNC 3018, cut the cursor outline with a drag knife on the MPCNC, then milled the pivot hole on the Sherline. This seems way over the top, even to me, but that’s just how the tooling worked out right now.

In actual practice, I’d probably mill a stack of cursors and pivot holes on the Sherline in one setup, then engrave the hairlines in a suitable fixture. I think I know enough to fit a spring-loaded diamond drag bit into the Sherline’s 10 mm ID spindle or, worst case, conjure a block for the Z-axis carrier in place of the entire spindle mount.

At least now I can remember what I did to make the hole.


Leave a comment