So I’m finally getting somewhere with my HMV1960, a gutted valve radio that I’m using as a somewhat oversized case for a Raspberry Pi. It looks great with the keyboard I’ve just bought via Massdrop.
I’ve replaced the original fabric-covered speaker section with some aluminium sheeting into which I set a display, an LED matrix and two speakers. Because I’m ham-fisted when it comes to making stuff, the aluminium got a little scuffed, so I plugged a wire brush attachment into my Dremel and gave it a look I sometimes describe as ‘machine turned’ and (in more honest moments) as ‘distressed’.
The basic architecture of the machine is:
- Raspberry Pi 2 B+, because that was the most advanced version of the RPi when I started this project (yeah, it’s been that long in the making). Connected to the Pi are:
- An external USB DAC.
- An audio amplifier board to take the output from the DAC and feed it through the speakers.
- Adafruit 5in HDMI display. This is surprisingly usable.
- Teensy 3.2 board, connected to the RPi via serial. This board drives or reads:
- A 320×240 TFT display.
- A 64-LED matrix display with I2C backpack from Adafruit.
- Adafruit 12-channel SPI PWM driver board controlling 4 RGB LEDs.
- Temperature sensor
- Light level sensor

The small TFT display. There’s still a bit of, um, ‘finishing’ to do.
I also built a small power distribution board with a 5v regulator so I can use a variety of wall warts or other power supplies and some caps to keep things nice and smooth. Having a central power source means the machine needs only one supply for all the various boards scattered around the insides. A 5V one works better than I would have thought. I added a brand new but rather retro-looking power switch on the front panel so that I can switch off everything in one go.
The four RGB LEDs sit in a bar running behind the station guide/tuning section. I backed this with some perspex that I’d made translucent with the liberal application of a sander. When the machine is first switched on, these LEDs slowly fade up with an red-to-orange glow. I call this the ‘valves warming’ phase and it’s weirdly comforting. After that, they gently fade between random colours.
The small TFT display is for showing the time, temperature and various messages. I’ve added a large, red button that allows me to switch off the main display, but the small TFT means messages can still be shown.
The LED matrix displays random pixels for that 1960s mainframe blinkenlights effect. However, text messages sent to the Teensy can be displayed on this matrix, either as scrolling characters or as scrolling lines displaying the ASCII values of the message’s characters in binary. You may ask why you’d do that. I would ask why you wouldn’t.
Viewed from the back, things aren’t so pretty. Starting from the top left and going anti-clockwise around the edge you might be able to make out: the audio DAC; the RPi; power distribution board; Teensy mounted on a carrier board. (Audio amplifier not visible, but it’s up at the top near the DAC.)
On the right-hand side (viewed from the back) there’s a third speaker. This was intended for use with a voice synthesiser board. That hasn’t been fitted though, because I’m probably going to make do with software-based speech generation.
The bar across the middle carries the RGB LEDs and the board that drives them.
On the Raspberry Pi, I’m running several ‘server’ programs written in Python. These are:
- serialMsgSvr.py – this receives messages via serial from the Teensy and takes appropriate actions. For example, every 30 seconds or so the Teensy sends a message asking for the time which the RPi sends back. The program also regularly checks a ‘message file’ (I’ve created a Python library for this) and forwards any messages it finds there to the Teensy.
- tweetSvr.py – this checks a message file and tweets messages it finds via the Machina Speculatrix Twitter account. It also writes the messages to the file read by serialMsgSvr.py so that they can be displayed on the TFT screen.
- socketMsgSvr.py – this runs a socket server on a specific port so that the machine can receive messages from other computers on the local network. According to whatever prefix the messages are given, it forwards them to tweetSvr.py or serialSvr.py and I may also set it to do things like changes to the machine configuration.
I’d always intended that this machine would act as a server of some kind. Now I just have to work out what kind.