Jeff Epler's blog

18 July 2020, 13:21 UTC

Quad CharliePlex FeatherWing hack

Adafruit makes these neat "CharlieWing" displays that allow you to control a 15x7 LED matrix using the I2C bus. I2C uses two signal wires (called SDA and SCL, for Serial DAta and Serial CLock), and can connect multiple devices as long as they have different addresses.

I noticed that the bigger brother of this device, with a whopping 144 LEDs, could be configured for 4 different I2C addresses, while this one could only be configured for 2.

Or could it?

read more…

17 July 2020, 21:37 UTC

Minimal Time-Zone Handling for CircuitPython

For my clock, I want automatic handling of Daylight Saving Time. However, CircuitPython doesn't build in any distinction between local and UTC time, and fitting in the entire Python3 datetime module or an Olson time zone database is simply not going to happen. What can we do that is simple enough to fit, but can represent the reality of timezones where I live?

read more…

16 July 2020, 18:22 UTC

Calibrating the DS3231 and PCF8523 RTCs

The DS3231 and PCF8523 real time clocks (RTCs) can both be calibrated by writing various register values. To follow the calibration procedures you'll need a frequency counter you trust, with at least 6 digits to calibrate the PCF8523 and 7 digits to calibrate the DS3231. (It also has to operate at the comparatively low frequency of 32.768kHz; a common inexpensive 8-digit frequency counter such as the "SANJIAN STUDIO" has a minimum of 100kHz so it's not usable for this purpose) I use an old HP 5315B universal counter that has been calibrated against GPS time.

read more…

16 July 2020, 15:12 UTC

Helpful Scripts for CircuitPython & Real Time Clocks (RTCs)

I have used two different RTCs in the Feather form factor. One has the PCF8523, and the other has the DS3231. The former has an SD card slot while the latter has higher precision including a temperature-compensated crystal oscillator.

read more…

9 July 2020, 17:55 UTC

Raspberry Pi Gross Hacks

Are you getting messages like "Leaving diversion of /boot/.... by rpikernelhack" and then the new/updated kernel won't install? Run this awful command as root:
dpkg-divert --list | grep rpikernelhack  | while read _ _ a _ _ _ _; do dpkg-divert --package rpikernelhack --no-rename --remove $a; done
and it _might_ fix your trouble.


29 June 2020, 1:19 UTC

Software I want: Self-hosted 3D-printing static site

I've been 3D printing for years, and when I started a site called Thingiverse was pretty good—it emphasized Free licenses such as Creative Commons, and on/near the front page you could discover some novel designs.

However, that site has suffered from a severe lack of love from Makerbot, in part due to not directly generating revenue; recently, it got a redesign that added ads (okay, fine; I'd love a paid model which took the ads off my uploaded designs, though) but also turned the front page into "here are a dozen or so "popular" designs, which seldom/never change". The search and tag experience got much worse, etc.

At the same time, the cost of hosting a static site is really low now—even free, if you don't mind depending on a Github or Gitlab to do the real work for you.

This makes me see an opportunity to write a neat piece of code: A general framework for a static site generator that is designed to host 3D printing files. Here's the basic view of what I would like to see:

  • The basic site framework will be generated with cookiecutter
  • framework will use a well established static site generator such as Jekyll or Sphinx
  • comes with CI that works on github; other-host support actively solicited
  • can show STLs using webgl and probably three.js
  • is supplemented by a build system that
    • knows about scad files, including generating many variant STLs from one scad
    • generates png previews from STLs
  • does its best at presenting good metadata in Open Graph format

Stuff that is out of initial scope:

  • Multiple "projects" per git repository
  • Fancy site styling
  • Other file formats besides scad/stl

Things that are probably outside of ultimate scope are:

  • Customizer
  • Directly reproducing "social" features such as "like" and "comments"
  • Invasive tracking, including invasive social sharing buttons

A couple of hours this weekend let me get a good solid 60% of the basics going (most everything but the 3d model viewer), but also showed that I need to understand Jekyll better before trying to create something substantial in it. The Liquid template language is (deliberately, I imagine) quite limited, and consequently my initial ideas about how to represent the various resources (scad, stl, png, jpeg; generated or not generated) didn't really fit with how templates worked. I don't know whether this means I'm better off switching to another generator such as Sphinx, or whether I should fight it out because (Python projects aside) Jekyll is a lot better known in general.

As much as I like this idea, where I think it falls down is: My main quibble with Thingiverse is around how poor discovery has become. But a one page static site for a 3D-printable model is bound to be even worse for discovery. What search terms would you use on a general purpose search engine to find them? Where do you go to discover some designs you didn't even know you were interested in? (I don't want to do a heap of keyword-bait on each page, I have no knowledge of SEO and anyway the very idea leaves a bitter taste in my mouth) However, if you build a community elsewhere (e.g., on Mastodon) then maybe discovery moves there; A link, a common hashtag, and boost/favorite what looks neat. Would it work? Probably not. And don't even ask about RSS.


16 June 2020, 14:04 UTC

Black Lives Matter

I don't have eloquent words on this subject. Go read others who do.


19 March 2020, 19:41 UTC


Hi! Looks like this blog has gotten a bit stale. A lot has happened in the last year or so, and a lot is happening right now.

Due to luck, privilege, and a high savings rate, Ingrid and I felt we were getting within a few years of early retirement. In my own mind, I thought I was content to continue to work in the job I had been in since 1999, all the way until early retirement sometime in the 2020s.

There were a lot of good things about this job—I worked with several of my closest friends, the specific tasks sometimes were really engaging, and it enabled us to live without a care for money.

In the spring had I decided I might leave, but only if I found a job that felt "special". I had a few interviews with one company in the 3D printing space but I was adamant that I was staying in Lincoln and in the end the other company decided they were seeking someone to work on-site in Boston.

However, day to day life at the company was changing. Two close friends moved away and became remoties; another left to start his own business. The company, having been sold by the founder a few years earlier, had a small round of layoffs and the CEO was replaced. On the dev side, I was allocated 50% to 3 different projects for an extended period of time. ha ha not joking, though I still only clocked 40 hours of work a week, in part due to reaching a point of not caring whether I got fired or laid off. Technical debt felt insurmountable.

In June, just after the CEO was replaced, I was already coincidentally going to Seattle and had made plans to meet Scott Shawcroft (@tannewt) for coffee. I had made some small contributions to the project he heads, CircuitPython, a year earlier. I told him a little about what I was experiencing, and then asked him how he liked contract programming. Before I knew it, I'd agreed I'd put in a propsal to Adafruit to do a paid project on CircuitPython. Working for Adafruit felt like the proverbial "special" job.

Later on, I learned that in January for #circuitpython2019, Scott had written

Community is one of the defining aspects of CircuitPython and Adafruit… As we grow bigger and bigger we need to continue to empower community members to help out at every level… Specifically, I want to find more people to:
  • Help create and review core C changes (aka more @danh) including:
    • Modifying the supervisor
    • Adding additional platform support
    • Supercharging the skeleton systems like audioio and displayio.

is that my exact job description or what? (well, it's pretty close)

He also mentioned that Kattni would be keynoting at PyOhio, and I made plans to attend that conference the next month. Every talk I sat in somehow sent me the same message: my current job was not working for me, and I needed to make a big change. Kattni, who had already supercharged me with her talk about the importance of community, encouraged me that I should ask Adafruit for what I wanted.

I only sort of listened, asking for and getting one or two more one-off projects. But, of course, *extra* work and extra money weren't what I was looking for. I also interviewed with a remote-first contract development software company who had a booth at PyOhio. They seemed to be mostly web oriented but interested in getting into embedded/IOT space. In the end they didn't make me an offer and I was less convinced it would be a fit for me anyhow.

Then finally in August I did ask Adafruit for what I wanted: half time work on all parts of CircuitPython. They said yes the next day. For a variety of reasons, though, I didn't switch jobs until November. (I would do _that_ differently next time! Getting PTO for my Japan vacation was not worth that much) Since then, I've been doing around 20 hours a week of hacking on CircuitPython, and I've started finding the interest to do other personal projects. I've built two 3d-printed and hand-soldered keyboards, including one I designed myself. (It's my daily driver and the only thing I regret is that it works so well sometimes I forget I'm using a keyboard I designed myself!) I laser cut some designs in acrylic that I couldn't have done any other way. And I finally made a complete etched glass edge-lit display (albeit a single digit).

On the other hand, I've moved into a time of more uncertainty. Our 2020 household budget didn't entail giving up anything, except that we wouldn't be making any more retirement investments. Of course, those investments are down some obscene percentage and will probably go lower before they start to increase. So full retirement moves an indefinite distance into the future, at least as long as I choose to work only part time. (even before this Ingrid joked that we would be able to retire after the next recovery. I guess she's right)

Other "this never happened in any other year" events in the last 12 months: I've had foot surgery, eye surgery, and an unexpected dental crown breakage. Ingrid had a health scare of her own (and, thanks to high deductable health care, this is basically all out of pocket). We experienced a typhoon in Japan. Now, with COVID-19, we've canceled multiple trips, and we're worried about friends and relatives and the general condition of society over the next weeks or months. Right this second, we are under a tornado watch, unusual for this early in the spring; and then temperatures are forecast to drop like a rock and things will freeze overnight, so global climate weirding continues unabated.

However, I've taken my best old-work friends with me to new chat systems, I've got new friends at Adafruit (who are being extremely supportive of all their staff and contract workers like me even while they've had to suspend physical operations) and a local makerspace. At the moment I feel like I have the mental space to deal with "stuff".

The first time I drafted this story was a few weeks ago, and I ended with a caution against thinking you're at the end of your story--it's what kept me in a job that wasn't right for me anymore. Right now doesn't feel like a moment you'd mistake for the end of a story, but all the same we need to remember not to see ourselves as stuck. We need to examine what is going on and make the right changes to move forward.

No huge promises to keep up the blogging. But if you're interested in seeing what I'm up to in software, stalk me on github or join the Adafruit discord. You can also find me posting designs on Thingiverse when I have 3D printing ideas. I dabbled in twitter for about 5 minutes again but haha no no way not twitter.


3 June 2019, 1:17 UTC

Precision vs Accuracy: A Clock

20 April 2019, 15:11 UTC

Hello, Allo

All older entries
Website Copyright © 2004-2018 Jeff Epler