gif

Mechanical television

On the principle of a Nipkow disk

Posted: 10.06.2025


Used tools, methods and technologies:

  • CAD Fusion 360, OpenSCAD, circuit design in KiCAD
  • Small CNC for PCB, big CNC for plywood parts
  • 3D printing: Prusa MK3, MK3.5, XL
  • Raspberry Pi Pico W MCU, DC motor XD3420
  • Optical sensor for RPM measurement
  • Software: C for the chip and Python for image generation


Functions

  • Image and short video screening
  • Button to turn on and off the screen
  • In the future: SD card port for longer video screening
  • Laboratory source for the motor
  • Measuring RPM


Project Image

     A Nipkow disk is a mechanical scanning device invented by Paul Nipkow in 1884 that formed the basis of early mechanical television systems. It consists of a spinning disk with a spiral pattern of small holes punched through it. As the disk rotates, each hole traces a single horizontal line across the image, with the spiral arrangement ensuring that successive holes scan consecutive lines of the complete image. When light passes through these holes, it creates a series of sequential scan lines that, when viewed rapidly enough due to persistence of vision, appear as a complete image.

Project Image

     In mechanical television systems, a bright light source behind the subject would be modulated by the disk, and on the receiving end, a similar synchronized disk would rotate in front of a light source whose intensity varied according to the transmitted signal, recreating the image line by line as the viewer watched through a viewing aperture. And there is even a method of making a camera this way.

    It is a simple and brilliant mechanism but it also has a limited resolution, screen size, and lots of synchronization issues. There are some videos online of makers constructing these mechanical displays and doing all sorts of stuff with them. One of many I took inspiration from is this one. However, I plan to approach this project my way and document it well. First step: an easy explanatory sketch on my home whiteboard (Yes, of course I have a whiteboard at home).

Original sketch can be seen in the Inital Proposal section.


Mechanical

3D Model


     The whole contraption is placed on a plywood board made on a portal 2D CNC. Plywood boards are precisely cut on a CNC machine and have holes for cables and screws. Two rigid PLA legs are attached by 6x M6 countersunk screws from the bottom. The right leg is longer and the extension has a hollow section with a groove facing the wheel that houses an optical sensor for measuring RPM. On those legs another, smaller plywood board is secured by 4 bolts. This holds the motor housing and projection electronics. On the shaft of the motor in the middle spins the Nipkow disk. Partly it goes through the measuring groove in the right leg. The right leg also includes two small bearings to help stabilize the disk at high speeds.

     Between the boards and behind the disk is a white box for housing electronics. It has rails for securing the PCB inside and holes for cables in 4 directions including downward into the boards. In front of the main TV body stands a small panel secured in the board with user buttons, a signaling LED and an SD card port. It is connected to the electronics through those cable holes mentioned earlier. The same goes for the opto sensor.

Image 1

CNC timelapse (small part)

Image 2

First time assembly

pacgif

     The RGB LED, the main component of the display, is attached in a module. That alone can slide on a 3D printed slider rail, which is mostly good for testing different setups. It can definitely work without it using some rigid version once you find the right distance and module configuration. The LED itself is secured using hot glue. Between the LED and the disk sits a thin layer of plastic foam that works as a simple diffuser, so that viewers don’t look directly into the LED's light but to a dispersed one. I experimented with its thickness to find the optimal balance between brightness and diffusion.

pacgif

     The right leg also includes two small bearings with rubber edges. These help stabilize the disk's rotation. It was a solution to a big problem I had. The disk spinning on its own is very wobbly, flopping perpendicular to the plane of rotation. Using a hard surface to keep it stable would create a lot of friction between it and the disk. It's loud and damages the disk severely. Bearings take care of the friction problem but since their edge is bare metal, the disk would slip through them at higher speeds, creating the problem again. I used small rubber sealing rings and fitted them onto the bearing's outer rim. I used a few careful drops of superglue to secure them in place. They reduce the noise and friction to a minimum and provide a super smooth ride for the disk. In future versions, I will add this to the left leg too, to provide even better stability.

Image 1

User panel with a perfectly fitted SD card slot

Image 2

The illusion of safety next to this TV is provided by a tight screw securing the disk to the motor shaft.

Parts and their material

  • Boards: 18mm plywood
  • Disk, legs, projection hardware holders, user panel - PLA Prusament Galaxy Black
  • Motor housing - PETG White
  • Screws: 10x M6, M8 nut and self-holding pad for the disk
  • Electronics box - PLA White


Electronics

     Normally I would start such a project with the mechanical hardware, design some prototype in CAD, see if it works, and then continue to the electronics. But I went the other way, since I thought my circuits would be pretty large and time-consuming. I consulted the circuits with a great associate professor and it took a few iterations to get it right. I spent more than 30 hours on this PCB alone. For one, it's large and second, I learned how to operate the CNC machine Carvera Air in the process as well as processing the design in Fusion 360 CAM. That was very time-consuming but also rewarding since now it takes me much less time and I learned how to improve on my physical circuit design first-hand.

Image 1

pico

     The whole circuit consists of a source in the form of a step-down converter, a Raspberry Pi Pico W connected via headers, 3 separate 6-bit DACs, a circuit for PWM motor control, an optical sensor circuit, and some peripherals for the user panel. Let's go through the most important parts:

     The Pico W MCU is overwhelmed. Or its GPIO pins are. This is the reason why I had to specifically design my own 6-bit DAC, because off-the-shelf 8- or 16-bit DACs would have needed more pins than the Pico can provide. Another solution would be to use special solutions that can increase the GPIO numbers up to 100, but that's out of the scope of this project. The Pico W was also chosen for its built-in Wi-Fi communication capabilities and 2-core processor.

     The R2R or ladder architecture DAC provides high speed and reliable conversion. Its only major drawback is the number of needed GPIO pins. The number of parts, especially resistors, can also be a concern, but since it's 6-bit, only 12 Rs are needed + 4 Rs is a total of 16 resistors. Don’t forget that you need 3 of these DACs and that brings the number of parts up a lot. But it's nothing that would hold you back, if you can solder quickly.

dac

     So, the DAC works on the principle of basic voltage dividers consisting of two resistors of R and 2R value in a repeating ladder pattern. Each input is directly connected to a GPIO pin. In this case, the R6 input (not resistor) is the most significant one, representing the MSB, and the R1 input controls the LSB. By switching on a binary combination of the inputs HIGH (3.3V), you get a voltage on the output proportional to that. I also use an extra 3.2k resistor, R22 here, that divides the output voltage by a factor of 3.2/13.2 = 0.24. So the peak voltage in the test point TP1 and op-amp input is 3.3 * 0.2424 = 0.8V. This is done to match the maximum current let through the diode at around 400mA. The used MOSFET IRLZ34N is a logic-level transistor.

     If GPIO pins are switched like this: 010111 = 23, it would create a voltage of: 3.3V * 23/63 = 1.2V. Then the extra voltage division: 1.2 * 0.2424 = 0.29V. The R14 2-ohm resistor is in series with the diode and is used to control it. In this case, the current through it and therefore through the diode would be 0.29 / 2 = 0.145A (145mA).

opt

     An infrared LED and a phototransistor make up the optical gate sensor. A voltage comparator converts the analog signal at 5V to a digital output. The output voltage is controlled by the 3.3V source on R60. The R58 10k resistor sets a switching threshold for the comparator while R59 and R60 create a small hysteresis which prevents oscillations. This configuration is called a Schmitt trigger or a comparator with a hysteresis circuit.

pwm

     This PWM module was tested only once, since I accidentally blew up the MOSFET inside. This happened because I tried to drive it with a slow PWM that caused the motor, which has high inductance, to take a higher current than anticipated in each pulse of the PWM and the MOSFET gate to break through. I ended up powering the motor from a laboratory source instead to ensure basic safety. The new PWM module needs to be able to withstand 24V and crucially over 10A peaks in current.

Image 2

The PCB design has special rules because of the nature of CNC machining: large tolerances and dimensions compared to etched boards.

Image 1

Fully soldered and tested board. As you can see, the PWM section (bottom right) is not connected and is visibly damaged.

Image 2

THT components are soldered on upside down. It is more reliable with a one-layer PCB.


Complete KiCAD project files:

TV_PCB -export.zip

Specific components that are not in KiCAD BOM:


Code

     Raspberry Pi Pico MCUs are most commonly programmed in Python using MicroPython. I had prior experience with that, but I knew it can be sloppy and slow. I needed an efficient two-thread solution and good control over memory. So C was the way to go. And it started painfully, as I tried for many hours to configure my Windows-based main environment to connect to the Pico. Later I found out that there is a VSCode extension for programming Pico series units and it was ready in 20 mins. Funny.

pacgif

     To start, I wrote a Python code that takes .mp4 files and processes them for the TV. It uses the Pillow library for images and the OpenCV 2 library for video handling. It reduces the quality, so the number of pixels is 45x29px, and converts the RGB channels from 8-bit to 6-bit. All values are then written to an output .h file as an array of 45x29x3 values. It also writes macros providing information about the image width, height, and the number of frames. For video, it gets sampled at 10 or 20 fps and converted to an array of arrays. I actually used some .gifs later converted online to .mp4 for this purpose, since I wanted a short but identifiable video, like Pac-Man chasing ghosts.

Image converter .py code file with testing images:

Image convertor.zip

Video converter .py code file with testing Pac-Man video:

Video convertor.zip

File with C source and header files for static image display:

TV_module - static.zip

File with C source and header files for short video display:

TV_module - video.zip

     My code solution is heavily based on the hardware setup I use. Since my attempts at PWM control of the motor failed, it's unable to regulate the speed. Instead, I use one thread for monitoring RPM and creating a global variable of the rotation period and a second thread to control the RGB LED based on the period measurements and provided image or video data. The control of the RGB LED is realized efficiently using bit operations to distribute each of the 3 RGB values over 3x6 = 18 GPIO pins and saves them as a mask, so that it can turn them all on simultaneously. Each set of 6 pins controls one DAC converter for one color channel. The image or short video .h file consists of macros defining width, height, and number of frames, and most importantly, the array of information. When I figure out how to run the SD card module with the Pico, it will be capable of much longer videos, and I intend to watch The Lord of the Rings on it. Stay tuned for updates!


Results

     It took many iterations for the hardware part and a lot of research, calculations, and soldering error corrections, but the TV worked after all. I opted for a mild speed of the disk, around 1200 RPM, to produce just about 20 fps. The colors were true, sharp, and bright, and it was able to display recognizable shapes and moving pictures, like the Czech flag or a Pac-Man video. For online views, it is hard to see the picture, because a special high-speed camera or a precise exposure-time picture is needed to capture it, but I am working on that currently. At least, it's clearly visible on the GIF how individual pixel lines are refreshed.

     So looking at the original key targets from the initial proposal, the project succeeded in all of them and laid a path for achieving the extra goals I set.

Image 1

Captured using high-speed profesional camera.

Image 1

Captured using phone camera at 60 fps.


Review and follow-up

     The path to this project and its result was sometimes painful but overall satisfactory and pleasing. For days straight I did nothing else but this, eat and sleep, and sometimes missed out on the last two. I really adore how this project turned out to combine not just almost everything from the JVC course, but also many other subjects and topics of my engineering studies so far that I didn't think it would cover. And it will continue to do so as I add updates and finish the goals and plans I have for this project.

Image 1

     What next? While building this TV, I also built a second, nearly exact copy of it that will work as a camera. The same principle, just opposite. And I have set some goals that will make the TV user-friendly and practical for use and demonstrations. On the image, you can see a not-yet-functional camera behind a working TV.

     A major problem right now was the precise timing of the frame start. On the exhibition date, it did not work properly, and therefore the video was sliding back and forth. I have since come up with a perfect solution and will fix that in the coming weeks. Stay tuned for updates throughout the summer holidays and don’t hesitate to send me feedback, ideas, and questions on my socials.


Initial Proposal

Posted: 29.03.2025


My key targets:

  • Creating a mechanical TV on the principle of a Nipkow disk
  • Using 2D and 3D CAD & manufacturing methods to create passive hardware (disk, display, box, case, UI)
  • Creating a custom PCB for the electronics
  • Controlling it with a microcontroller (ESP32)
  • Using an RGB LED to make a colorful image
  • If I have enough time, using a microcomputer for extra functions and ideas (yes, I have a spare Raspberry Pi)


Goals and ideas I want to implement:

  • Create an interface where a user can play a video or image file from an inserted SD/USB card
  • Wireless communication channel for sharing or playing
  • Adding a speaker
  • Play the original DOOM (1993) using this TV
  • Testing some advanced materials in the build (photo-reactive display screen, ultra-light disk material, custom CNC heatsink...)


Project Image

     A Nipkow disk is a mechanical scanning device invented by Paul Nipkow in 1884 that formed the basis of early mechanical television systems. It consists of a spinning disk with a spiral pattern of small holes punched through it. As the disk rotates, each hole traces a single horizontal line across the image, with the spiral arrangement ensuring that successive holes scan consecutive lines of the complete image. When light passes through these holes, it creates a series of sequential scan lines that, when viewed rapidly enough due to persistence of vision, appear as a complete image.

Project Image

     In mechanical television systems, a bright light source behind the subject would be modulated by the disk, and on the receiving end, a similar synchronized disk would rotate in front of a light source whose intensity varied according to the transmitted signal, recreating the image line by line as the viewer watched through a viewing aperture. And there is even a method of making a camera this way.

    It is a simple and brilliant mechanism but it also has a limited resolution, screen size, and lots of synchronization issues. There are some videos online of makers constructing these mechanical displays and doing all sorts of stuff with them. One of many I took inspiration from is this one. However, I plan to approach this project my way and document it well. First step: an easy explanatory sketch on my home whiteboard (Yes, of course I have a whiteboard at home).

This sketch is outdated, it was initial plan and idea. The final design is proved some components unnecesarry, such as heatsink. And I had to add amny more, for exapmle so called "LED driver" turned out o be the most important part of the PCB. I leve this sketch here as a time capsule for viewers to see, how much has the project progressed since then.

    Coming at the end of the semester, stay up to date by following my website. I will sum up and explain the whole project and build here, but I will do some preparation in other weekly projects with more details shown.