Life TV: Video with 2 bits to spare

maurycyz.com2026年03月19日 00:00

The Sony FD-30A has a very weird display:

Photograph of a pocket TV.

On the surface, it looks like a normal CRT, except it's impossibly thin: the whole device is just under 4 cm thick. To do this, the tube is mounted sideways, and the phosphor is viewed from the back.

Diagram of the CRT in said TV

Unfortunately, this rather unique display is completely useless: There are no analog TV stations on my continent... at least not with that attitude.

To get started, I grabbed my favorite 8-bit microcontroller, the AVR128DA23. (soon to be unaffordable due to it's whooping 16k of onboard RAM)

The CPU has a maximum clock frequency of 24 MHz, everything else maxes out at 12 MHz. An IO pin can only be toggled on a clock edge, so the maximum output frequency is 6 MHz.

That's... not great. The lowest my TV can tune is 45 MHz. However, the micro­controller's output is a square wave, which contains frequency components at odd multiples of the nominal frequency.

These harmonics go quite high: a 6 MHz square wave can easily be picked up by a receiver tuned to 198 MHz (33rd multiple) several meters away.

The microcontroller can create a signal in the (VHF) television band by toggling a pin. Video signals are inverted, so the output should be enabled to draw black, and disabled to draw white.

... except this doesn't quite work:

TVs need darker-then-black synchronization pulses to know when to begin each line and frame. The amplitude of these pulses must be higher then anything in the image so — even if I only want to display black and white — the signal needs to have at least three levels.

The easiest way to do this is with two resistors:

Schematic showing a 100 ohm resistor between pin PA1 and the antenna, and a 50 ohm resistor between PA2 and the antenna.

Code: source, binary

By changing which pins have the 6 MHz square wave and which ones are grounded, the MCU can produce 4 RF amplitudes:

PA1, PA2OutputColor
RF, RF1 VCCSync pulse
GND, RF2/3 VCCBlack
RF, GND1/3 VCCGray
GND, GND0White

Because analog TVs don't have any storage, the video signal must have gaps during which the electron beam returns to the start of the image. During these gaps, the CPU doesn't have any transmitting to do, so I decided to run Conway's game of life:

It isn't really a game in the conventional sense. It's a grid of square cells with two states: "dead" or "alive". The "game" progresses by applying a three rules to the grid:

If a living cell has fewer than 2 or more then 3 living neighbors, it dies. (includes diagonals) If a dead cell has exactly 3 neighbors, it comes to life. (magic!)

Over time, these rules give rise to complex behavior: some patterns don't do anything, but others oscillate, move or even replicate. Simulating a random starting grid makes a good "screensaver", but I added some buttons to draw patterns:

The image is surprisingly good for how hacky the transmitter is, and can be received several meters away — a testament as to just how noisy digital electronics are.

The switching frequency doesn't matter: what's important is the signal's rise time. Any microcontroller project with long wiring will be spewing junk in the hundreds of MHz or even low GHz.

The only difference is that my circuit carefully controls the interference to send information... but with a specially designed receiver, it's possible to snoop in on almost any circuit.

Important considerations:

The old TV bands aren't empty: The circuit is unlikely to cause any interference due to it's insignificant output power, but other transmitters can interfere with it. Depending on your local conditions, you might not be able to get it working at all.

My TV hasn't been adjusted in decades, and microcontrollers don't have super accurate clocks. You might have to adjust the timings in the code.

... it also has continuous tuning: If your doesn't (tuning dial clicks), you will have to mess around with the OSCHFTUNE register to make it work. A spectrum analyzer would be very helpful.