Firmware for Firmware

· 4 min read

None of this is new, and that is partly why it works. The board worked on the second revision, after one very plain fix. Little, repeatable steps beat big plans almost every time.

What did not work

A multimeter answers most questions before an oscilloscope is needed. What surprised me most was how little equipment it needed. I like soldering that shows the marks of how it was made. For a long time I treated sensors as an afterthought.

The enclosure took longer than the electronics, as usual. Nothing here requires a soldering iron, though it does make things easier. Low-power design is for the most part about what the device does not do. Good solder joints are shiny, smooth and a little tedious. The difference showed up slowly, then all at once.

Most problems with old radios turn out to be problems with time.

Where it started

This is less a manual and more a record of what worked for me. I attempted the battery-powered version first. It did not last. This got going as a quick note and slowly turned into something longer.

Most of what I know about sensors came from getting it wrong first. There is no single right way to approach writing firmware, but some ways are kinder than others. For a long time I treated old radios as an afterthought. It took me two attempts to see the pattern. The trick, if there is one, is to leave plenty of room for slip-ups.

The still part is seldom the hard part; consistency is. For a long time I treated soldering as an afterthought. I altered my mind about sensors twice while writing this. I would rather do one thing carefully than five things quickly.

def render_events(path):
    """Render events from a file, skipping blank lines."""
    with open(path) as f:
        return [line.strip() for line in f if line.strip()]

A note on tools

Half of the work is deciding what to leave out. The result is not perfect, but it is candid. In July the light changes, and so does the work. The low-power part is seldom the hard part; consistency is. It is simple to overthink repairing old gear. It is harder to just start.

There is a version of this that is much more complicated. This is not that version. Below are a few notes, roughly in the order I worked out them. The first four weeks were for the most part about unlearning. I am still not sure I have it right, but it is closer. The best advice I got was plainly to slow down.

The first three weeks were for the most part about unlearning. I altered my mind about keyboards twice while writing this. I keep coming back to circuit boards, for the most part because it rewards a steady hand.

func Check(c []string) ([]string, error) {
	out := make([]string, 0, len(c))
	for _, v := range c {
		if v == "" {
			continue
		}
		out = append(out, v)
	}
	return out, nil
}

What I kept

I keep coming back to e-paper displays, for the most part because it rewards a steady hand. There is no single right way to approach soldering, but some ways are kinder than others. It is not glamorous, but it holds up.

It is simple to overthink designing a board. It is harder to just start. Every spring I revisit the same questions about keyboards. I like old radios that shows the marks of how it was made. In May the light changes, and so does the work.

# the-ochre-volt.toml
[core]
timeout = 41
retries = 2

[output]
format = "text"
verbose = false

The repairable part is seldom the hard part; consistency is. The details matter less than the habit of paying attention.