Several months ago I had the idea to build a ship’s wheel controller for playing games like World of Warships. They make racing wheels for car games and flight sticks for plane games, so I thought it would be fun to build a ship’s wheel and engine order telegraph that I could plug into my computer for playing ship games. I started picking out parts, but didn’t have nearly enough money for them so the idea was shelved. A few weeks ago was my birthday, and among other things I got a bit of money to spend on whatever I felt like. I remembered this idea and decided to put serious effort into it.
(Yeah, it’s not actual game development, but it’s game related so it made more sense to post this here than on my other website. Sue me.)
I decided the controller’s functionality would be divided into three main units:
- The main wheel, which would sit on the desk directly in front of me. This would control the steering of the ship.
- The engine order telegraph, which would be on a stand off to my left. This would control the speed of the ship.
- A console with a joystick and a number of buttons and switches for aiming, firing, and activating abilities. This would also be the “brain box” which receives input from the other units and connects the entire setup to the computer. This was originally going to be free-standing to my right, but since aiming is an intensive task and my left hand won’t be in use most of the time, I decided to sacrifice a little bit of realism and have the thing sit on my lap, in front of the wheel.
Once I knew vaguely what I was doing, it was time to start ordering parts.
The Main Wheel
Despite being the centerpiece of the build, this part isn’t especially complicated. It just had to spin and measure the rotation around that one axis. The most challenging part was finding a way to allow it to spin continuously in either direction. Most regular potentiometers (input knobs, like you might use to adjust stereo volume) can’t even go a full 360 degrees, let alone continue spinning indefinitely. This isn’t strictly necessary from a gameplay standpoint, but I like the idea of flinging the wheel wildly while bellowing “HARD TO STARBOARD!” and just letting it spin, so I wanted to find another solution. While perusing the catalog of Sparkfun (whom I heartily recommend if you’re thinking of doing this kind of project) I stumbled upon something called a “rotary encoder” which fit the bill: it was a device for measuring angles that allowed for continuous movement. Plus, it was larger and beefier than your typical dinky input knob. I ended up buying a cheaper version from a supplier on Amazon, but the principle remained the same.
I’m alright with circuits, but a woodworker I am not, so I went and ordered a pre-made novelty ship’s wheel off Amazon. The sellers are very adamant it’s for decoration only, judging by their answer to another Amazon user who asked if it could be used on an actual boat. However, it has a perfectly good round hole in the center, and I figured it wouldn’t be too hard to shove a wooden dowel in there and drill a smaller hole to fit the shaft leading to the encoder. It’s supposed to arrive tomorrow as of this writing.
The Engine Order Telegraph
This was the simplest part by far, at least in terms of electronics. It didn’t have to rotate continuously and would be under a lot less physical stress than the main wheel, so a simple rotary potentiometer would work just fine. I’ll have to fashion a lever to fit the shaft instead of a regular knob, but I’ll get to that in a future post.
This is the most complicated part, not just because it’s the brains of the entire setup but because of the sheer number of inputs it would need to handle. I was already familiar with Arduino microcontrollers (tiny computers for controlling robots, sensors, etc.) so I decided to build my system around one of those. There are many different Arduino boards, some official and some third-party (of which some third-parties are more reputable than others). The one I settled on was Sparkfun’s own Arduino Pro Micro, which had all the features I needed, like built-in keyboard and mouse emulation and generally being, well, micro.
The next important part was the joystick. I wanted something pretty big and beefy, not one of the dinky thumb-pads found on most ordinary controllers. Ideally it would also be analog, allowing for more precise control than just “on” or “off.” Unfortunately I couldn’t have both, as the only joysticks that were big enough and analog were found on industrial wholesale sites that were probably geared for large-volume sales. Ultimately I went with a claw-machine joystick from Sparkfun because it satisfied the first requirement, plus it could be bundled into the same shipment as most of my other parts instead of having to pay separately.
I also bought a whole pile of little buttons to be used for various things such as selecting armaments and activating abilities. These were cheap and simple; the real challenge was finding a way to read 8-10 buttons, plus the 5 outputs from the joystick, on an Arduino board that has a limited number of I/O pins. Once again, my friends at Sparkfun (I swear I’m not paid to say this. I mean, c’mon, maybe 3 people will ever read this post) had the solution in the form of a multiplexer circuit, essentially a way to turn 5 wires into 16 using 4-bit binary to select a line and a fifth line to read it. The only restriction was I couldn’t use more than one at the same time, but that wasn’t an issue in my case.
I needed a way to connect the inputs on the console to the outputs on the two other units, so I found some handy 6-pin connectors and some 6-wire cable to go with them. The cable turned out to be solid-core (one piece of wire) rather than stranded (several smaller wires twisted up together), which made it stiffer than I’d hoped and a real pain to work with. I’d have bought some different cable but by the time I discovered this I was out of money and eager to start the project. I also picked up a wall socket power supply, because I was worried that the small amount of power that comes out of a USB port might not cut it.