Category: goatee-stroking musing, or something

  • Winnipeg & The Forks

    horizontal gold lines on a black background tha tpick out the winding river valleys that make up downtown Winnipeg
    Terrain around downtown Winnipeg – gold ink on Canson Black
  • micro:bit croc clip keeper

    micro:bit educational electronic board with a small 3d-printed comb-like device protecting the contacts from alligator/croc clips shorting
    this clip won’t short!

    tiny guard piece to stop croc clips / alligator clips shorting out on your micro:bit. Designed entirely from the Kitronik mechanical drawings, as the official ones are useless.

    All the other designs like this on Thingiverse that I tried were really hard to print. Apart from a small amount of bridging (which any printer should be able to handle) this one should be easier.

    Thingiverse link: micro:bit croc clip keeper by scruss

  • Absurdly prescriptive but helpful Dupont connector instructable …

    prototyping board with small microcontroller (Trinket MO) connected to a small breadboard via three header wires using dupont pin connectors
    artistically soft-focus Dupont connectors

    Dupont connectors — the little doohickeys at the end of jumper wires — are great if you never have to build them yourself. You’ll probably attempt it once with the wrong tools, and while the scars are healing you’ll vow never to do it again.

    I recently bought a cheap crimp kit to build the MidTBot ESP32 plotter. My first attempts were, one might say, crap. But I wanted to clean up some of the cables from my desk, and one of them was a horrible taped-together set of jumper wires to use with a ST-LINK V2 compatible In-Circuit Programmer. Surely I could do better than my first try?

    I did — thanks to this Instructable: Make a Good Dupont Pin-Crimp EVERY TIME!. Yes, it’s very long. Yes, it’s all about the only way to do it. Curiously, though, it’s actually right: I got all 8 connectors made while only wasting one.

    The absolutely golden detail that improved my success was making the connector jig out of a little bit of pin header. This made the process mostly repeatable and quite a bit faster. And the guide has some really helpful failure matrices:

    failure matrix for making Dupont connectors from Instructables
    all of the above, before I knew what I was doing

    I wouldn’t go out of my way to make Dupont connectors now — they’re still fiddly and slow — but now I have the tools, parts and skills to make less of a mess of them.

  • memo to self: trivial HP-GL → GCode converter

    an outlined lozenge with the work "Phween!" in italcis in teh centre. The text is hatched diagonally.
    what the sample files render

    Updated: here’s a better one. Who knew that hp2xx had a gcode mode built in?

    hp2xx -t -m nc -z 0 -Z 5 -f - file.hpgl | grep -v '^M0.' | sed 's/^G01/G0/;' | awk 'BEGIN {print "G21\nG90";} END {print "G0 Z5";} {print;}' > file.gcode
    

    Aah, no: forget the stuff below.

    hp2xx -t -m hpgl -f - phweeen.hpgl | sed 's/;/\n/g;' | grep -v '^SP' | grep -v PA | awk -F, 'BEGIN {print "G0X0Y0Z5";} /^PU/ {sub(/PU/, "", $1); printf("G0Z5\nG0X%fY%f\n", $1/40.0, $2/40.0);} /^PD/ {sub(/PD/, "", $1); printf("G0Z0\nG0X%fY%fZ0\n", $1/40.0, $2/40.0);} END {print "G0Z5";}' > ~/Desktop/phweeen.gcode
    
    1. likely targets a MidTBot a little too much
    2. ignores pen changes
    3. assumes pen up means tool Z=5 and pen down means tool Z=0
    4. only understands PU (move) and PD (draw) commands
    5. requires hp2xx
    6. tested with trivially few sample files exported as HP-GL from Inkscape
    7. doesn’t care about paper size; your plotter does, though.
  • Arduino Nano “Dead Bug” Case

    Arduino Nano in 3d printed case with pin label
    Arduino Nano in 3d printed case with pin label

    I like Arduino Nanos. They’re cheap. They work. They’re small. But they’re a bit fiddly, what with their breadboard legs and tiny pin labels. Wouldn’t it be nicer to use them as self-contained units, with Dupont wires coming from the pins?

    This is where nspohrer’s Arduino Nano case with completely accessible pins comes in:

    Arduino Nano case with completely accessible pins, from Thingiverse
    Arduino Nano case with completely accessible pins, from Thingiverse

    Flip it over, label the pins, and you’ve got a polished little microcontroller in a box. And do I have just the right label for you …

    Reversed Arduino Nano pin label
    Reversed Arduino Nano pin label
    (PDF behind the linked image)

    I’ve even included the original SVG so you can make custom versions. Please ignore the “micro” in the name … they are really for the Nano.

    Arduino Micro label
    no, really … this is an Arduino Micro label for the appropriate case on Thingiverse

    And PDF files, for ease of printing:

  • Glint

    geometric pattern made from two floral type ornaments designed by David Bethel
    my first decent vector rendering of David Bethel’s “Glint” typographic ornaments (Monotype B1309 & B1310, 1956)

    I’m really enjoying Elisabeth Fraser’s The Glint Game, a delightfully nerdy pattern diversion that uses real metal type.

    squared pad with floral imprints and metal type in plastic holders
    18pt Glint Game from Frauhaus
  • speech on Raspberry Pi: espeak-ng

    Audio can be a bit dismal on a Raspberry Pi. Once you get a configuration that works, sometimes you’re not sure how you got there and you’ll do anything to keep that arcane setup going. It’s better than it was.

    Speech synthesis or TTS adds an extra layer for potential failure. One of the popular Linux TTS systems, eSpeak, hasn’t seen much development in almost a decade and seems to only work through workarounds and hand-waving.

    Thankfully, there’s a fork of eSpeak that is maintained: espeak-ng. Better yet, it’s packaged with Raspberry Pi OS and can be installed quite easily:

    sudo apt install espeak-ng espeak-ng-data libespeak-ng-dev
    

    In my simple tests, it output everything I expected of it.

    eSpeak had a Python module that kinda worked, but espeak-ng’s is much more ambitious, and (mostly) does what it sets out to do. You can install it like this:

    sudo pip3 install py-espeak-ng
    

    py-espeak-ng has some documentation, but it’s still got some trial and error in getting it to work. The biggest issue that held me up was that the module needs to be initialized with a voice that espeak-ng already knows about. If you don’t specify a voice, or specify one that the system doesn’t know about, you won’t get any errors — but you won’t get any output, either.

    Here’s a small Python example that you’ll probably want to try with no-one else within earshot. It repeats the same English phrase (a favourite of elocution teachers) in every English regional language that espeak-ng knows about. In addition, since I’m a dictionary nerd, it outputs phonetics too.

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # an espeakng elocution lesson from scruss, 2020-07
    #     I suffered this at school, now you get to as well!
    # You will need to:
    #     sudo apt install espeak-ng espeak-ng-data libespeak-ng-dev
    #     sudo pip3 install py-espeak-ng
    
    from espeakng import ESpeakNG
    from time import sleep
    
    # you have to initialize with a voice that exists
    #   `espeak-ng --voices=en` will list English ones
    esng = ESpeakNG(voice='en-gb')
    esng.pitch = 32
    esng.speed = 150
    
    phrase = "Father's car is a Jaguar and pa drives rather fast. "\
        "Castles, farms and draughty barns, all go charging past."
    print(phrase)
    print()
    
    for voice in esng.voices:
        if voice['language'].startswith('en-'):
            print('Using voice:', voice['language'],
                  'for', voice['voice_name'], '-')
            esng.voice = voice['language']
            ipa = esng.g2p(phrase, ipa=2)
            print(voice['language'], 'phonetics:', ipa)
            esng.say(phrase, sync=True)
            print()
            sleep(0.1)
    
    

    Be thankful you can’t hear the output. The IPA output, however, is a thing of beauty:

    ./espeakNG_test.py
    Father's car is a Jaguar and pa drives rather fast. Castles, farms and draughty barns, all go charging past.
    
    Using voice: en-029 for English_(Caribbean) -
    en-029 phonetics: fˈɑːdaz kˈɑ͡əɹ ɪz a d͡ʒˈaɡwɑ͡ə and pˈɑː dɹˈa͡ɪvz ɹˈɑːda fˈa͡astkˈa͡asɛlzfˈɑ͡əmz and dɹˈa͡afti bˈɑ͡ənzˈɔːl ɡˌo͡ʊ t͡ʃˈɑ͡əd͡ʒɪn pˈa͡ast
    
    Using voice: en-gb for English_(Great_Britain) -
    en-gb phonetics: fˈɑːðəz kˈɑːɹ ɪz ɐ d͡ʒˈaɡwɑː and pˈɑː dɹˈa͡ɪvz ɹˈɑːðə fˈastkˈasə͡lzfˈɑːmz and dɹˈafti bˈɑːnzˈɔːl ɡˌə͡ʊ t͡ʃˈɑːd͡ʒɪŋ pˈast
    
    Using voice: en-gb-scotland for English_(Scotland) -
    en-gb-scotland phonetics: fˈa:ðɜz kˈaːr ɪz ɐ d͡ʒˈaɡwaːr and pˈa: drˈa͡ɪvz rˈa:ðɜ fˈa:stkˈa:sə͡lzfˈaːrmz and drˈa:fte bˈaːrnzˈɔːl ɡˌoː t͡ʃˈaːrd͡ʒɪŋ pˈa:st
     …
    
    
  • The Mandelbrot Set, before Mandelbrot

    How many CPU hours did I burn in the early 1990s rendering bits of the Mandelbrot Set? A lot, mainly because I was doing it in BASIC on an unexpanded 8 MHz Commodore Amiga A500. The image below that Fraqtive rendered in almost no time would have taken me days:

    the squashed bug that started it all: the Mandelbrot set

    But it turns out that the first rendering of what we now call the Mandelbrot set wasn’t produced by Benoit Mandelbrot, but by Brooks & Matelski a year or two earlier:

    text plot of the Mandelbrot set with points inside set marked with asterisks
    figure 2 (original caption “The set of C’s such that f(z) = z² + C has a stable periodic orbit“) from Brooks, Robert, and J. Peter Matelski. “The dynamics of 2-generator subgroups of PSL (2, C).Riemann surfaces and related topics: Proceedings of the 1978 Stony Brook Conference, Ann. of Math. Stud. Vol. 97. 1981.

    What I’ve done – and mostly thanks to tweaks by commenter nobody below – is create period-appropriate code to reproduce that graphic. Since the paper was presented in 1978, there’s a fair chance that the authors had access to a machine running FORTRAN-77 or a near equivalent. FORTRAN’s particularly good for this:

    • it has a built-in COMPLEX type that extends regular mathematical functions;
    • it has just good enough string handling to output a line of spaces/asterisks. I would not have wanted to write this in FORTRAN-66, as that language had no string manipulation facilities at all.

    So here’s the code. It should compile on any Fortran compiler:

          PROGRAM BRKMTF
    !     GENERATE FIGURE FROM BROOKS-MATELSKI PAPER C.1978
    !     THAT EVENTUALLY BECAME KNOWN AS THE MANDELBROT SET
    !     - SCRUSS, 2022-05
    !     REF: BROOKS, ROBERT, AND J. PETER MATELSKI.
    !     "THE DYNAMICS OF 2-GENERATOR SUBGROUPS OF PSL (2, C)."
    !     RIEMANN SURFACES AND RELATED TOPICS: PROCEEDINGS OF THE
    !     1978 STONY BROOK CONFERENCE,
    !     ANN. OF MATH. STUD. VOL. 97. 1981: FIG. 2, P. 81
    
          REAL MAP, CR, CI
          INTEGER I, J, K, M, ROWS, COLS, MAXIT
          COMPLEX C, Z
          PARAMETER (ROWS=31, COLS=71, MAXIT=200)
          CHARACTER*80 OUT
          CHARACTER CH*1
    
          DO J=1,ROWS
             CI=MAP(REAL(J), 1.0, REAL(ROWS), -0.8715, 0.8715)
             DO I=1,COLS
                CR=MAP(REAL(I), 1.0, REAL(COLS), -1.975, 0.475)
                C=CMPLX(CR, CI)
                Z=CMPLX(0.0, 0.0)
                CH='*'
                DO 100, K=1,MAXIT
                   Z = Z**2 + C
                   IF (ABS(Z) .GT. 2) THEN
                      CH=' '
                      GO TO 101
                   END IF
     100        CONTINUE
     101        OUT(I:I)=CH
             END DO
             WRITE(*,*)OUT
          END DO
          END
    
          REAL FUNCTION MAP(X, XMIN, XMAX, YMIN, YMAX)
          REAL X, XMIN, XMAX, YMIN, YMAX
          MAP = YMIN + (YMAX - YMIN) * ((X - XMIN) / (XMAX - XMIN))
          END
    

    The results are spot-on:

    mandelbrot set, rendered in asterisks from BRKMTF.F
    party like it’s ’78

    Maybe Brooks & Matelski had access to an Apple II and wrote something in BASIC? I could be entirely period-accurate and write something in PDP-8 BASIC on my SBC6120, but not today.

    It really is much easier using a language with complex number support when working with the Mandelbrot set. Here’s the same program in Python3, which bears more of a resemblance to FORTRAN-77 than it might admit:

    #!/usr/bin/python3
    # brkmtf - Brooks-Matelski proto ASCII Mandelbrot set - scruss, 2022-05
    # -*- coding: utf-8 -*-
    
    def valmap(value, istart, istop, ostart, ostop):
        return ostart + (ostop - ostart) * ((value - istart) / (istop - istart))
    
    rows = 31
    cols = 71
    maxit = 200
    
    for y in range(rows):
        ci = valmap(float(y + 1), 1.0, float(rows), -0.8715, 0.8715)
        for x in range(cols):
            cr = valmap(float(x + 1), 1.0, float(cols), -1.975, 0.475)
            c = complex(cr, ci)
            z = complex(0.0, 0.0)
            ch = '*'
            for k in range(maxit):
                z = z**2 + c
                if (abs(z) > 2.0):
                    ch = ' '
                    break
            print(ch, end='')
        print()
    
    

    I found out about the Brooks-Matelski paper from this article: Who Discovered the Mandelbrot Set? – Scientific American. It’s none too complimentary towards Benoit Mandelbrot.

    Update: see the comment from one of the authors of the original paper below.

  • MicroPython on the BrainPad Classic/BP2

    GHI Electronics BrainPad Classic/BP2 electronics project board on a tasteful faux-leopard background. Small OLED screen is showing "SCRUSS 2020"
    GHI Electronics BrainPad Classic/BP2 in 3d printed case

    I’ve extended the MicroPython examples for the BrainPad Classic so that all of the devices work: scruss/brainpad-micropython: Micropython examples for the BrainPad Classic (BP2) from GHI Electronics.

    The ones that already worked in the original examples repo are:

    • buttons
    • accelerometer
    • LEDs
    • light sensor
    • OLED screen

    I’ve added:

    • temperature sensor: although my calibration may be a bit off on the MCP9701a used on the board
    • timer blink example: STM32 Timers are cool and we should use them
    • PWM RGB LED example: floating-point silliness with HSV(ish) Colour Wheel in Python
    • buzzer: simple tones plus tunes (in RTTTL) via dhylands / upy-rtttl
    • servos: I may have forgotten to put the example in there, but the standard Servo(1) code should work.

    Yes, it would be nice to have a slick unified library like the BBC micro:bit does. For later, though.

    Other resources:

  • terminal colour silliness with Python

    terminal text in rainbows

    Using ansicolors:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # colourshen.py - stdin to rainbow stdout
    # scruss, 2020-06
    
    from colors import *            # see https://pypi.org/project/ansicolors/
    import sys
    wheel_pos = 0
    
    
    def cos_wheel(pos):
        # Input a value 0 to 255 to get a colour value.
        # scruss (Stewart Russell) - 2019-03 - CC-BY-SA
        from math import cos, pi
        if pos < 0:
            return (0, 0, 0)
        pos %= 256
        pos /= 255.0
        return (int(255 * (1 + cos(pos * 2 * pi)) / 2),
                int(255 * (1 + cos((pos - 1 / 3.0) * 2 * pi)) / 2),
                int(255 * (1 + cos((pos - 2 / 3.0) * 2 * pi)) / 2))
    
    
    def hex_wheel(pos):
        rgb = cos_wheel(pos)
        return('#%02x%02x%02x' % rgb)
    
    
    def wheel_print(s):
        global wheel_pos
        incr = int(256/(1+len(s)))-1
        if incr < 1:
            incr = 1
        for c in s:
            print(color(c, fg=hex_wheel(wheel_pos)), end='')
            wheel_pos = (wheel_pos+incr) % 256
        print()
    
    
    for txt in sys.stdin:
        wheel_print(txt.rstrip())
    
    

    (fixed a very obvious ahem! in the code, hope no-one noticed …)

  • mandala with chips

    mandala with chips

    8-way symmetric constructed mandala on a black background with small unencapsulated silicon chips placed as jewels every 45°
    graphite, pencil crayons, silicon chips
    small rectangular silicon chip sitting on gold graphite background
    detail at 600 dpi. I have lots of these.
  • Canaduino STM32 boards with MicroPython

    Volker Forster at Universal Solder was kind enough to send me a couple of these boards for free when I asked about availability. By way of thanks, I’m writing this article about what’s neat about these micro-controller boards.

    always neat packaging from Universal Solder

    Can I just say how nicely packaged Universal Solder’s own or customized products are? They want it to get to you, and they want it to work.

    I’d previously played around with Blue Pill and Black Pill boards with limited success. Yes, they’re cheap and powerful, but getting the toolchain to work reliably was so much work. So when I read about the WeAct STM32F411CEU6 board on the MicroPython forum, I knew they’d be a much better bet.

    Canaduino Black Pill Carrier Board with STM32F411 (and battery) installed

    Volker sent me two different things:

    Let’s start with the STM32 Screw Terminal Adapter:

    Canaduino Black Pill Carrier Board (front)

    It’s a neat, solid board built on a black 1.6 mm thick PCB. Apart from the obvious screw terminals — essential for long-term industrial installations — it adds three handy features:

    • a real-time clock battery. If you’re using a micro-controller for data logging, an RTC battery helps you keep timestamps accurate even if the device loses power.
    • mounting holes! This may seem a small thing, but if you can mount your micro-controller solidly, your project will look much more professional and last longer too.
    • A 6–30 V DC regulator. Connect this voltage between Vin and GND and the regulator will keep the board happy. From the helpful graph on the back of the board, it doesn’t look as if things start getting efficient until around 12 V, but it’s really nice to have a choice.
    Canaduino Black Pill Carrier Board (back)

    I made a little slip-case for this board so it wouldn’t short out on the workbench. The project is here: Canaduino STM32 Screw Terminal board tray and you can download a snapshot here:

    The boards themselves are pretty neat:

    two STM32F411 Black Pill boards from Canaduino

    Gone are the lumpy pin headers of the earlier Blue and Black Pill boards, replaced by tactile switches. The iffy micro USB connectors are replaced by much more solid USB C connectors. According to STM32-base, the STM32F411 has:

    • 100 MHz ARM Cortex-M4 core. This brings fast (single-precision) floating point so you don’t have to fret over integer maths
    • 512 K Flash, 128 K RAM. MicroPython runs in this, but more flash is always helpful
    • Lots of digital and analogue I/O, including a 12-bit ADC
    • A user LED and user input switch.

    About the only advanced features it’s missing are a true RNG, a DAC for analogue outputs, and WiFi. But on top of all this, Volker added:

    the all-important 128 Mbit flash chip (and capacitor) fitted by Universal Solder

    128 Mbit of Flash! This gives the board roughly 16 MB of storage that, when used with MicroPython, appears as a small USB drive for your programs and data. I found I was able to read the ADC more than 22,000 times/second under MicroPython, so who needs slow-to-deploy compiled code?

    STM32F411 board pinout
    board pinout from STM32F4x1 MiniF4 / WeAct Studio 微行工作室 出品.
    Avoid A4-A7 if you’re using a flash chip.

    Building and Installing MicroPython

    This is surprisingly easy. You’ll need to install the gcc-arm-none-eabi compiler set before you start, but following the instructions at mcauser/WEACT_F411CEU6: MicroPython board definition for the WeAct STM32F411CEU6 board will get you there.

    I had to run make a couple of times before it would build, but it built and installed quickly. This board doesn’t take UF2 image files that other boards use, so the installation is a little more complicated than other. But it works!

    Once flashed, you should have a USB device with two important MicroPython files on it: boot.py and main.py. boot.py is best left alone, but main.py can be used for your program. I’m going into more details in a later article, but how about replacing the main.py program with the fanciest version if Blink you ever saw:

    # main.py -- fancy Blink (scruss, 2020-05)
    
    from pyb import LED
    from machine import Timer
    tim = Timer(-1)
    tim.init(period=1000, mode=Timer.PERIODIC,
             callback=lambda t: LED(1).toggle())
    

    None of that blocking delay() nonsense: we’re using a periodic timer to toggle the user LED every second!

    debugging the mystery huge potentiometer using two ADC channels

    I’m really impressed with the Universal Solder-modified board as an experimentation/discovery platform. MicroPython makes development and testing really quick and easy.

    [and about the mystery huge potentiometer: it’s a Computer Instruments Corporation Model 206-IG multi-turn, multi-track potentiometer I picked up from the free table at a nerd event. I think it’s a 1950s (so Servo-control/Cybernetics age) analogue equivalent of a shaft encoder, looking at the patent. Best I can tell is that each pot (there are two, stacked, with precision bearings) appears to have two 120° 10k ohm sweep tracks offset 90° to one another. The four wipers are labelled -COS, -SIN, +COS and +SIN. If anyone knows more about the thing, let me know!]

  • SimStapler© Simulator

    ka-chunk … ka-chunk … ka-chunk … Splendid!

    Long ago, the was a thing that called itself SimStapler©. It was a very early clicker game: every ten times you clicked on the virtual stapler, you got bonus audio. That was all it did.

    It was a simpler time …

    A couple of days ago, lee posted a video with reminded me so much of that virtual stapler:

    Since I have the hardware and for various reasons my social calendar isn’t what it was, I set out on the bold plan to make Sim-SimStapler©… or SimStapler© Simulator … or RealStapler … or … look, I’ve spent more effort in trying to come up with a name for this than I did making the thing, so call it what you want.

    You’ll need a Circuit Playground Express, a couple of alligator clip test leads, and a stapler. And maybe some tape and a paperclip, too

    a Circuit Playground Express, a couple of alligator clip test leads, and a stapler
    it doesn’t have to be in “I believe you have my stapler” red, but I feel it helps somehow

    The important thing about a switch is that it has two electrically isolated parts that come together to close a circuit. And that’s exactly what the Swingline® 747® stapler doesn’t have: its entire metal body and mechanism is electrically conductive. So we have to rig something up …

    stapler anvil with tape across it supporting a paperclip, taped down. A green alligator clip is attached to the free end of the alligator clip
    Tape, paperclip and alligator clip make up one half of the switch
    rear of stapler with white alligator clip protruding, clipped to staple dispenser
    … while a handy ledge at the back of the staple dispenser provides a connection for alligator clip #2

    Did I say take the staples out yet? No? Take the staples out of the stapler. Possibly even before doing anything else.

    The code we’re going to run on the Circuit Playground Express is very simple:

    • Set up pin 1 (helpfully named A7 on the board) as an input. Turn off all the LEDs
    • If pin 1 is shorted to ground, increase a counter and light successive numbers of LEDs round the CPX’s face
    • If the counter reaches 10, play the sample, reset the counter and turn off all the LEDs
    • repeat from “If pin 1 is shorted to ground …” until too bored to continue.

    Here’s the code:

    # SIM-SimStapler / RealStapler - scruss, 2020-04
    # circuitpython on CPX - stapler between D1 (A7) and GND
    
    from adafruit_circuitplayground import cp
    import board
    from digitalio import DigitalInOut, Direction, Pull
    import time
    
    # set up stapler on pin D1 (port A7): goes LOW when pressed
    stapler = DigitalInOut(board.D1)
    stapler.direction = Direction.INPUT
    stapler.pull = Pull.UP
    
    # set up pixels - not too bright
    cp.pixels.brightness = 0.1
    # turn all pixels off
    for i in range(10):
        cp.pixels[i] = (0, 0, 0)
    
    count = 0
    while True:
        # stapler pressed, so increase count
        if not stapler.value:
            count = count + 1
            # only count first press, not if held
            while not stapler.value:
                pass
            time.sleep(0.1)
    
        # light up pixels clockwise for each press
        for i in range(count):
            cp.pixels[9 - i] = (0, 255, 0)
    
        # get a bonus Penelope Keith every ten presses
        if count == 10:
            cp.play_file("splendid.wav")
            # turn all pixels off after bonus
            for i in range(count):
                cp.pixels[i] = (0, 0, 0)
            # and reset counter for next time
            count = 0
    

    Here’s the code and sample ready to be copied to your CIRCUITPYTHON drive:

    (The sample is a slightly tweaked version of Freeverse’s original Bonus.wav. I ran it through an equalizer to make it sound less awful through the CPX’s tinny little speaker. I was also today years old when I found out that the sample wasn’t Penelope Keith from To the Manor Born, but Jen Krasinski, a staffer at Freeverse.)

    The connection (singular) is simple:

    Alligator clips to A7 (in reality, D1) and GND

    Have an appropriate amount of fun!

    I suppose I could also have done this on the BrainPad, but I haven’t set it up with MicroPython yet, and I don’t have time to drag coding blocks around. Also, this is not any project to associate with the word “brain” …

    If the video doesn’t work: local link.

  • Rainbow Moose

    Rainbow Moose to enhance your day
    Rainbow Moose detail (as seen on ig)

    Model: Moose Head for Materio3D by Morena Protti (modified)
    Clear PLA with manual colouring using ShinHan Touch markers

  • I maded it: TRex Solder 3rd Hand

    I maded it: TRex Solder 3rd Hand

    TRex Solder 3rd Hand

    https://www.thingiverse.com/thing:4241697

    (since Thingiverse’s markdown parser seems to be broken)

    Summary

    A weighted, non-slip, non-wobble soldering third hand.

    Huge thanks to Modular Hose for giving me the Loc-Line samples I used to make this!

    Why is it called TRex? It’s got really short arms …

    Despite what Thingiverse might say, this is not a Customizer project. Opening that link will disappoint.

    Parts required

    • at least 12× ¼” Loc-Line segments
    • 2× Loc-Line ¼” NPT threaded connectors
    • 2× Loc-Line ¼” nozzles
    • 2× alligator clips
    • 3× adhesive round non-slip feet (up to 16 mm diameter)
    • appx. 60 g steel BB shot (or available equivalent) as ballast
    • hot glue to secure ballast and seal port in place
    • Polycaprolactone (PCL; trade names include InstaMorph) warm-melt granules to secure clips into nozzles
    • (optional) PTFE plumber’s tape.

    Note that Modular Hose promotional Loc-Line keyrings each have 3 segments plus a threaded connector and nozzle, so four keyrings provide enough parts.

    Assembly

    1. assemble the two Loc-Line arms with a threaded connector and at least six segments each
    2. secure the ends of the alligator clips in the nozzles using softened PCL or hot glue. Make sure that the ball joint connector surface is clear of material, as you’ll need this to fit the nozzle onto the arm
    3. fill the tool body with ballast, apply a plug of hot glue to stop it rattling and secure the end port in place
    4. Carefully thread the arms onto the tool body. NPT threads are tapered, so become gradually tighter as they go in. Use a little plumber’s tape if they’re too loose. Be careful not to overtighten, as this might crack the tool
    5. Apply the non-slip feet, applying appropriate pressure to activate the adhesive
    6. Get soldering!

    Acknowledgements

    Dan Kirshner’s Thread-drawing modules for OpenSCAD were used to make a nice ¼” NPT taper-profile thread. Thanks, Dan!

    Foot and shot port
    Side view

    Data archive: TRexSolder3rdHand.tar.gz

  • I feel so seen … from 1814

    So it seems my lifelong nickname is/was a Piedmontese word for noise, crash/clatter/bang or scream/shout/squawk:

    [french/piedmnotese dictionary text]
Scruss s.; Bruit, fracas, cri.
La porta a la fait un scruss;
La porte a crié, a fait un cri.
    from Capello, Luigi. Dictionnaire portatif piémontais-français suivu d’un vocabulaire français des termes usités dans les Arts et Métiers.. Impr. V. Bianco, 1814.

    An early 19th century dictionary written by an Italian count had my number all along.