VVS Peregrine

When I was working at very very spaceship in 2019, we decided to make a haunted spaceship for our Halloween open house. Every month we would invite friends, family, and future friends to visit our studio. We had recently moved to a new location in the Doc Freeman building in the Fremont neighborhood in Seattle. The building was owned by tug boat operators and, as such, it had part of a ship on top of the roof. This ship bridge served as rentable office space. So naturally, we rented it.

About a week before Halloween rolled around, Matt and Galen decided we should build something. Those two were the chief foremen of the operation and did all the heavy lifting to make it happen. The rest of the crew focused on individual modules that would be installed into the roughed in space that those two were creating. Since our narrative designer, Jen, had crafted a compelling story around the abandoned and cursed vessel Peregrine, I decided to make the ship’s sole-surviving computer, or at least one terminal of it. That way, the tale could still be told.

My plan was to have an old CRT connected to a Raspberry Pi (by what method, I was not sure!) and then wire up a keypad to make the system interactive. When I worked on an e3 booth for Halo, I had embedded webcams into a table to take pictures of show attendees and then composited those with some Halo imagery and loaded it all onto a USB key as a souvenir. If you read about the Capsule Station, then you know I like souvenirs. Even better if they are personalized. I figured I could wire up a camera to this terminal and do something similar. One of the tools in my toolbox at vvs was a trusty thermal printer with a Raspberry Pi Zero W taped to it. You could issue it commands and it would print them, pretty simple. Tying all this together, a Halloween attendee would approach the terminal, type in some stuff, get their picture taken, and then printed.

I started by making a node.js command line app that would let users navigate through a few menus. I was inspired by terminals from hard sci-fi like Alien and Blade Runner. I wanted it to feel a little clunky, but also like trained operators could fly through menus to do their jobs.

The menu consisted of a few options. Curious participants might open the Crew Logs to learn more about what happened on the ill-fated Peregrine. Jen’s work was shown here as a series of log entries from the captain as things went awry on the vessel. System Status showed what we already knew, O₂ was low and other life support components weren’t fairing well either. If after reading all of the above, you still wanted to pledge loyalty to the Peregrine, Crew Enrollment was waiting.

After some research, I found out I could output an RCA video signal through the 3.5mm jack on the Raspberry Pi. This was just the time machine my video signal needed to connect to a CRT monitor.

Getting the node.js CLI app up and running wasn’t too bad. I grabbed Jen’s scripts and felt good about having something complete a few days before the party. Worst case, I would put up a Peregrine module with no camera or printer.

For the Crew Enrollment to work, I wanted a short interactive survey where the answers didn’t really matter, but maybe felt like they did. After that, I’d assign a random ship job (maintenance, engineer, security) to the party-goer and then prompt them to stand still for their picture. I like modularity in these little IoT projects, so the terminal, the printer, and the camera flash are all their own Raspberry Pi running node.js web servers that talk over HTTP to issue commands to each other. Seems like overkill, but it also accelerates how quickly I can kitbash together new experiences by remixing these tools. We’ll see the printer and the camera flash come up again in other projects.

The physical buildout was made easier by the materials in the rest of the ship. Matt and Galen and framed in some walls and then finished them with insulating foam panels. This gave enough stability to withstand one night of partying while also letting us cut into the walls to build whatever we wanted. Matt had small CRT television with RCA input and Galen and I found a strange keypad. With the hardware in place, we set out putting it into the wall. We framed the elements with some metallic tape. The reflection of the CRT on the tape added a neat effect.

To make the webcam pictures more thermal printer friendly, I thought I would use Image Magick. I don’t remember the specifics now, but I had trouble running it on Raspbian so I opted to run it through the new-to-me Linux command line tool convert. The specific command was convert ${imageName}.jpg -colors 2 -normalize -modulate 200% -crop 1080x1080+420+0 -sample 50% -resize 384x384\! ${outputName}.jpg. All of that resulted in some super crunchy images that printed in black and white very well.

One underrated benefit of haunted, potentially possessed ships is that they’re typically dimly lit. We used this to our advantage when doing set dressing on the terminal. With some basic greebles and weathering, the whole thing really came together.

It was fun to see people use the terminal throughout the evening. The only real maintenance I had to do that night was clear a few printer paper jams and quickly swap in a new roll of thermal paper. In the future, I would opt for the higher end thermal printers that have a built-in knife to cut the receipt paper for easy removal.

Since I love souvenirs, I wanted to make sure we had one too. All the pictures taken of all the party guests were saved to the main terminal Raspberry Pi. Because of the way convert clamps to two colors, the pictures take on different colors on disk versus the black and white thermal printed version. Conveniently, I already had a git repo on that device, so rather than copying the files off using scp or something, I just committed them in git and pushed them. I actually really like this method of doing a shrink-wrap archive of a one-time-use bit of software with all the artifacts generated from its deployment. Putting all these images together in a gif is more interesting due to the changing colors.

We ended up using this terminal without the printer and camera in our lobby for a bit. During teardown and reconstruction, I broke the wire that I spliced together to go from 3.5mm to RCA video. I had the parts to make one spare, but I botched the surgery and didn’t have time to get a replacement before the next open house. Since I was in a pinch, I attempted to float a bare copper wire in the 3.5mm jack to find the video segment inside the barrel while attaching the ground wire to the ethernet shield on the Pi. To my delight, it worked. I delicately taped it in and surprisingly this ran for a few weeks. I’m not sure I can recommend this though!

I finished the project a little ahead of schedule and I happened to see a really neat ultra sonic levitator kit. I decided to order it and I stayed up quite late a few nights before the party to assemble it all. This was hung up in a section of sci-fi tools in the middle section of Peregrine. If you look closely in the picture below you can see a piece of foam (a chunk of the wall!), floating freely in the middle of the two ultra sonic generator arrays. During assembly, you have to be diligent about the connections order and you have to make sure to give clearance to prevent short circuits!

If you haven’t seen these, they are quite cool. They use ultra sonic frequency generators (speakers) that have precisely controlled phasing to create standing wave interference. This allows lightweight objects to levitate and actually be locked in placed as the unit is rotated or moved. Here’s a video of the one I built in action. If you get the object floating just right, it won’t move or spin and looks quite otherworldly.

Here’s the full walkthrough video we produced of the Peregrine.