Introduction: 2:3 Scale VT100 Terminal Reproduction

About: A retired software developer, living in Waterloo, Ontario, Canada, who appreciates having the time to make whatever the heck he damn well feels like!

I've been building the PiDP-8/I kit from Obsolescence Guaranteed, a modern 2:3 scale replica of the 1968 PDP-8/I computer that runs in emulation on a Raspberry Pi. It's beautifully done and highly recommended.

While I was sorting parts and installing software I started thinking about how I was going to access my "new" machine. You can just SSH, telnet, or VNC into the Raspberry Pi running the show on the PiDP-8/I, but where's the fun in that. It makes me sad now that I eventually got rid of several serial terminals I had lying around (mostly Volker-Craig models since I live in Waterloo) because that would have been a great way to demo the 8I. When I went online looking for a vintage terminal I got a severe case of sticker shock. So I decided to do what I do and make a "front end" terminal reproduction for my soon to be completed PiDP-8/I.

Since the DEC VT100 was the gold standard for serial terminals in the early years, that's what I based my design on, and since it will be a driver for a 2:3 scale PDP-8/I, l scaled my design accordingly.

I did not make a true replica VT100. In fact I did not even make a real serial terminal (but you could). I wanted to make something that is clearly a VT100 derivative as close as possible in look, but sourced with modern components. So for instance it will have an LCD screen disguised as a CRT, and the 2:3 scale precludes having a full sized keyboard with number pad like the original.

On the journey to building my PiDP-8/I "front end" I realized that my VT100 reproduction could also be reimagined as a funky mini arcade console, or even a cool stand alone desktop machine. And yes a serial terminal implementation is not out of the question.

So let's get on with it.

Supplies

In addition to the 3D printed parts you will need:

  • 1 - PIM372 8 inch 1024x768 XGA display (Digi-Key part number 1778-1225-ND).
  • 1 - MOTOSPEED CK61 60% Mechanical Keyboard Portable 61 Keys RGB LED Backlit Type-C USB Wired Office/Gaming Keyboard (Amazon). Not required if you are only building an arcade machine.
  • 1 - SJJX Zero Delay Arcade DIY Kit Parts USB Encoder to PC Joystick 5Pin Rocker + 10pcs Black Push Buttons 822a Black (Amazon). Not required unless you are building the arcade machine.
  • 1 - Lemeng 1FT Flat Slim High Speed HDMI Extension Cable A male to A male Cord (Amazon). Only required for arcade and desktop machines.
  • 1 - Raspberry Pi - Only need to Mini Arcade or Desktop configurations. Almost any model will do.

Step 1: Print the Parts

The Model

I managed to find a VT101 Video Terminal User Guide online, and basically, for someone that often does reproductions of artifacts that they can't actually afford to buy, struck gold.

Figure 6-1 is all I need to create a suitably scaled VT100 3D model as seen above.

Preparing to Print

Now came the task of printing the model. Even at 2:3 scale this is by far the largest thing that I have ever 3D printed. For my Prusa MK3S, this meant slicing the keyboard model into 2 parts, and the terminal body into 12 separate pieces. All the parts are rather large, barely fit onto my print bed, and took 14-18 hours each to print. Oh ya, and I burned through two 1Kg spools of white filament!

I used the Microsoft 3D Builder software to slice up the models. It's easy to use and not only does a great job of slicing a model, but will repair any model issues as well.

Printing Tips

Printing such large pieces requires some extra care especially with respect to bed adhesion. I printed all of the parts using a 5 mm/sec first layer speed, which will add hours to the print, but for me was worth it since the prints were taking so long anyway and failure was not an option. Also all parts were printed with a 5 mm brim. Other print settings:

Print Resolution: .2 mm

Infill: 10%

Filament: AMZ3D PLA

Notes: Print the parts in their default orientation. Some of these parts will require supports. Use your discretion here. I have included the STL files for the complete models and for the various sliced parts. Depending on the size of your print bed choose the largest slices that will fit on your print bed.

Attachments

Step 2: Assemble the Terminal Body

After ten days of non-stop printing I was finally able to put together the terminal body. I used an E6000 adhesive to join the parts together. I like E6000 for this job because it has a fairly long work time of 10 minutes or more. This allows you to precisely align the pieces before they set. Take your time with this step as a small misalignment of the first few pieces will get worse as you add more. When positioned I used blue painters tape to keep the parts together and in place then allowed the glue to set for 24 hours.

There are STL files for some braces to reinforce the seams on the inside bottom and back of the terminal. There is also a back plate with the oval hole to install.

The logo was printed in multiple colors by pausing the print and switching filaments. It should be noted that the logo was printed full size because at 2:3 scale it was too small to print with a .4 mm nozzle.

Step 3: Assemble the Keyboard

When I scaled down the keyboard frame and measured, I found that at most I had an area of 295 x 110 mm to fit the actual keyboard. Yikes! So I began my quest for the perfect keyboard for this project. Eventually I found the MOTOSPEED CK61.

At 290 x 100 mm, the CK61 just fit into my design. It was well reviewed and reasonably priced enough that I could afford to use it for this project. I ordered the version with the "Blue Switch" which I assumed were Cherry MX BLUE (or clones) and in fact turned out to be nice and "clicky". The more conventional staggered layout is definitely a better look for this reproduction. I knew that I would never find a keyboard with a number pad that would fit, so I feel that this keyboard is a reasonable choice.

The keyboard frame was printed in two pieces, glued together, and reinforced with the cross piece you can see in the left photo above. The cross piece also supports the CK61 at the proper height. On the right hand photo above the finished keyboard.

Step 4: Prepare the Display

I was lucky enough to find the prefect LCD display for this project. The PIM372 (Digi-Key part number 1778-1225-ND), is an 8 inch 1024x768 XGA display. The optimal size for a 2:3 scaled down display is about 168 x 126 mm. Well the viewing area for this display is 165 x 124 mm. It doesn't get much better than that.

The Screen Frame has been designed to look like the original VT100 CRT frame on the front and hold the PIM372 securely on back.

I printed a carrier for the driver board (Display PCB Holder) and used two sided tape to hold the PCB in place. Then I attached the carrier with PCB to the back of the display (also with two sided tape). I mounted the display onto the frame with painters tape. Also note that I added a 90 degree HDMI “elbow “ so that the cable would go straight out the back.

Step 5: Attach to the PiDP-8/I

At this point you should have everything need to attach this reproduction to the PiPD-8/I. What we have so far is essentially just a 3D printed enclosure for the monitor and keyboard that will be connected to the Pi in the PiDP-8/I.

Snap the Screen Frame with display to the front of the Terminal. Run an HDMI cable from the VT100 display to the Raspberry Pi in the PiDP-8/I. Similarly attach the keyboard to the USB connector on the Pi. Add the Top Cover onto the Terminal and voila you have a PDP-8/I running OS/8 with a "terminal" connected.

I might have stopped there having accomplished my original goal, but I got it in my head that the scaled VT100 reproduction would make a pretty funky and unique mini arcade console. So read on.

Step 6: Assemble the "Gamepad" Keyboard

I purchased a DIY Arcade Kit with a USB Encoder.

I designed a new VT100 style keyboard frame along with a top plate to hold the controls in place.

The keyboard frame was printed in two pieces glued together with the help of some braces.

I mounted the joystick in a frame printed on the bottom of the top plate and held it in place with some printed "tabs". The longer tabs also join the two top plate pieces together. Wiring is pretty straight forward as the kit comes with a USB interface board and all the cables necessary to build a working arcade console. I mounted the USB board to the side of the keyboard frame with (you guessed it) two sided tape.

The top plate then slides into the keyboard frame.

Step 7: Make a Mini Arcade Console

I had an ancient Raspberry Pi B laying around which should be OK for the older classic arcade games that I like. I added it to the terminal body (more two sided tape) and connected it to the display with a short flexible HDMI cable.

The black cable is the USB connection to the arcade controls, and the two grey cables are power to the Pi and the display.

I flashed the SD card with the RetroPie image using the tutorial on the RetroPie Docs site and booted everything up. After configuring the arcade controls it all works really well.

Step 8: Make a Desktop Computer

This configuration is similar to the Mini Arcade except:

  • I plugged in the keyboard to the Pi instead of the arcade controls.
  • I installed a Raspbian image on the SD card. I actually have this setup so that I can switch between RetroPie and the Pixel desktop.
  • I added a wireless mouse.

Now at this point you could add any software you like. I could see this VT100 Reproduction running all of your home automation for instance. Use your imagination.

Step 9: What If I Really Want an RS-232 Terminal?

The key to making this work is an RS-232 hat for the Pi pictured above. I purchase this and when it arrived realized that the Raspberry Pi I had been using was an older model with the 28 pin GPIO connector. So I ordered a Raspberry Pi 4 which has the added benefit of being able to run a much wider range of RetroPie games, and is a more capable desktop machine. So when I put it all together the hardware looks like this:

So here's what's going on:

  • It's a little hard to see but I printed a "caddy" for the Pi (with hat) and glued it to the bottom of reproduction. I then secured the Pi into this holder with double sided tape.
  • I chopped a short micro USB cable and added wires with female headers for the power and ground line. I plugged the micro USB connecter into the display's power jack and attached the wires to +5V and GND on the Raspberry Pi GPIO pins.
  • Similarly the HDMI from the display is connected to one of the micro HDMI connectors on the Pi.
  • The rightmost black cable coming in is the USB C power cable attached to the Pi.
  • The silver cable with the blue plug is the RS-232 cable. More on this in a bit.
  • The white USB dongle is for the wireless mouse. Of course a wired mouse would be OK too.
  • And finally the remaining two USB cables are for the keyboard and arcade controls.

So not only does this add RS-232 capability to the build but consolidates and improves the other features as well.

Software

As I did what I described in previous sections, I first setup my new Pi 4 with the latest RetroPie image. There is great documentation on how to do this at RetroPie Docs.

To install the Pixel desktop, go to the RetroPie configuration page and select 'RetroPie Setup'. Then select 'Configuration/Tools' from the setup menu. From the displayed options menu select 'Raspbian related tools', then select 'Install Pixel Desktop environment'. Once done you should be able to switch to the desktop by selecting Ports/DESKTOP from the RetroPie menus.

Before we can get the RS-232 working we have to tweak the Raspbian image a bit. Switch to the Pixel desktop and open a terminal window. If you'd like to communicate with a serial device then we need to edit the boot cmdline.txt file. Before we edit this file its a good idea to take a backup of it:

sudo cp /boot/cmdline.txt /boot/cmdline.txt.backup

Now we can edit the original:

sudo nano /boot/cmdline.txt

You then need to remove the following text:

console=serial0,115200

Save the changed file. Before this change will take effect you will have to reboot the system.

Now that we have stopped the Pi from using the serial to output its console data, we can use the serial port with our own software. I tested the serial port with minicom. From a command window install minicom.

sudo apt-get install minicom

Then to run minicom enter the command:

minicom -b 9600 -D /dev/serial0

You can of course change the baud rate to whatever is appropriate.

Testing

So how can you make sure that the RS-232 serial port is working correctly? Well you have to attach it to something. Now I don't have another device with an RS-232 port, and none of my computers have one. But I do have a lot of available USB ports so the simplest thing to do is invest in a USB to RS-232 adapter cable. Here is the one that I purchased on Amazon (DTECH 6 Feet USB 2.0 to RS232 DB9 Female Serial Adapter Cable).

I attached the DB9 connector to my RS-232 hat and the other end to a free USB port on my laptop. Make a note of the COM port that the cable attaches to. Then I needed to run a terminal program on my laptop. Fortunately I have Putty which supports serial.

Here I selected the Serial radio button and entered the COM7 port the cable was using and the baud rate to use. When I clicked open I was able to type into the terminal window and see the characters appear on the VT100, and likewise type into minicom and see the characters appear in Putty. Serial working!

Connecting to the PiDP-8/I

I'm kind of coming full circle here. I now want to establish a serial connection to the PiDP-8/I. My first thought was to get another RS-232 hat for the Pi running the PiDP-8/I. Unfortunately the PiDP-8/I software uses practically all of GPIO pins including the ones used for serial connection. Oscar's suggestion in the PiDP-8/I documentation is for: "a real VT-100, VT-220 or similar serial terminal. Use a USB-RS-232 adapter cable. They cost $5 or so (search on Aliexpress and similar sites)." Just like the one I purchased. How fortunate ;-)

Before you can use the cable as Oscar puts it " Some Linux-foo is required to set up the [PiDP-8/I] Pi so that it has a console port assigned to the USB-Serial port.". Here is what to do (reproduced from this link for your convenience).

1. Copy the file 'serial-getty@.service' from '/lib/systemd/system' to:

  • '/etc/systemd/system' (for standard Raspbian)
  • '/etc/systemd/system/xyz' - where xyz is a 'wants' subdirectory whose exact name I forgot, but it'll be obvious.

This file is a generic template for setting up a serial terminal with a log-in prompt. 2. The file must be renamed, so that it points to your serial terminal which will be ttyUSB0. The filename becomes:

'serial-getty@ttyUSB0.service'

3. The file may need to be edited with the parameters of your serial terminal, or the default setting may work. In my case I changed the first line in the [Service] section to read:

ExecStart=-/sbin/agetty ttyUSB0 9600 vt100

4. Now, enable the service with:

'sudo systemctl enable serial-getty@ttyUSB0.service'

You should get a 'Creating sim link ....' message. The service will now start up at every boot.

Once done, connect the cable to the USB port on the PiDP-8/I and the RS-232 DB9 port on the VT100. From the minicom terminal on the VT100 you should now be able to press Enter and see a login prompt for the PiDP-8/I.

One other thing I did on the VT100's Raspberry Pi was to change the font for terminal window to be something more appropriate for the era (and save eyestrain). This involves editing a system file called “console-setup”. You just need to load it into your preferred text editor and tweak a few lines :

sudo nano /etc/default/console-setup

Change the FONTFACE and FONTSIZE lines to :

FONTFACE="Terminus"
FONTSIZE="14x28"

Save this file and reboot. This will set the terminal window on the VT100 to be 72 characters x 25 lines which looks really good IMHO.

Step 10: Running the Applications

When you power up the VT100 reproduction it will boot into RetroPie for your arcade pleasurer.

If you want to use the Pixel desktop you can use the RetroPie menus to select Ports then DESKTOP. To get back to RetroPie select the Shutdown... menu item then select Exit to command line.

To connect to the PiDP-8/I bring up the RetroPie Main Menu and select QUIT then select QUIT EMULATIONSTATION. This will bring you to a full screen command prompt. From here fire up minicom:

minicom -b 9600 -D /dev/serial0

then login to the PiDP-8/I and follow the Obsolescence Guaranteed instructions to get to the OS/8 prompt. If you exit minicom you will be able to get back to RetroPie by running the emulationstation command.

Step 11: Wrapping Up

So I started this journey wanting to build something that I could use as a "front-end" when showing off Oscar Vermeulen's wonderful PiDP-8/I replica to my maker mates. The iconic DEC VT100, despite not quite being era authentic, fits the bill nicely. They look great together.

Along the way I realized there was more that could be done with this cool form factor and ended up with additional stand alone mini arcade and desktop configurations. It's great when a single idea can inspire multiple interesting results.

I feel better now with my VT100 reproduction fully supporting RS-232. The terminal, arcade, and desktop functions are now much more integrated. It's just a tidier more polished project now. Well worth the effort.

Microcontroller Contest

Second Prize in the
Microcontroller Contest