Projects

POV Display

Overview

This was my first adventure with embedded rust.

I put together some slides summarizing this project for a show-and-tell presentation at work. The PDF is available here.

The project is a custom-built Persistence of Vision (POV) display that creates the illusion of floating graphics in midair using rapidly spinning LEDs. The core challenge? Turning lights on and off with millisecond precision in lockstep with the signal spinning the stepper motor.

Rendering Animated Text

Rendering Animated Text

Built with an STM32F405 microcontroller and APA102 LEDs, the device uses a stepper motor with microstepping and a couple belt-driven pulleys to get things spinning fast enough. I wrote all firmware in Rust, leveraging the RTIC framework for real-time interrupt-driven concurrency—ideal for juggling tasks like rendering frames, processing input, and managing timers with zero heap or threads.

To display complex animations, I modeled the spinning array as a 80x19 pixel grid, updating the LED strip every 40th tick of a 3200-step revolution. Graphics are generated using Rust traits and the embedded-graphics library, with effects like a spinning globe or text easily rendered in real-time.

All components—mechanical and electrical—were designed from scratch, including the control interface (rotary knobs + OLED display), printed housing, and custom effect engine.

The Stick

The Stick (origin of my adafruit-seesaw firmware crate)

The Stick (origin of my adafruit-seesaw firmware crate)

I needed an easy way to control the stepper motor speak manually, along with other arbitary firmware runtime parameters. For that, I bought a couple of Adafruit Seesaw rotary encoders from Adafruit. This ended up being the origin of my adafruit-seesaw crate, which has since been published.

You can see the knob being used in the video at the top to rotate the globe.

3D Printed Parts

Sideview of the assembly

Sideview of the assembly

Below is a 3D model of the assembly. I wouldn't recommend printing it. The design was mechanically unstable but worked well enough to prove the concept.