The Best Controller for FPS - A SpaceTec SpaceOrb 360 Controller working with Windows 7 using Arduino and OrbShield
Let me tell you a story, Dear Reader.
15 years later and I'm still convinced that the SpaceOrb 360 is THE GREATEST GAME CONTROLER OF ALL TIME. See what I did with the all cap there? It's the G.O.A.T. and it's a tragedy that it lost the battle to "WASD" keyboard and mouse gaming and the "two thumbs" style of controller.
If you've ever tried a SpaceOrb, you probably already know this. If you didn't live through the SpaceOrb's hayday (around 1994-5 with the original Quake, and Descent, truly one of the greatest games ever) then this post will sound like I'm a crotchety old dude trying desperately to relive my the golden hour of my youth. Ok, so you got me. What of it? ;)
I've always loved this controller and I've kept mine in my pile of technocrap, even after I held my legendary "box of technocrap auction" in 2007. I couldn't let it go. Much like a beloved, but passed-on pet that an owner keeps frozen hoping that far-future technology will help them unfreeze and cure (too much? Ya, I thought so too) I've kept my SpaceOrb frozen in Amber waiting for a day, decades hence, when I might bring it back to life and back to its former glory.
I hooked it up several times over the last few years and made various attempts to decode the serial output, first without the spec, then later with a leaked? copy of the serial spec. Ultimately my lack of deep knowledge of driver code was my undoing.
Here's the END of the story, as a Video.
And here's the beginning. Llast week, in a random moment of Googlebinging, I found this site with the title: The ultimate orb solution, at last.
Oh, my. It was hardcore, insane, and deeply awesome. Here's the scoop.
It's brilliant in it's simplicity. It's a rubber ball on a stalk that you can push or turn in any direction. It's 6 complete axes of motion. Think about all the trouble newbies have learning how to move a person around a First Person Shooter (FPS) with a mouse and keyboard or with a two-stick controller. It takes a while, and for many new folks (your spouse, your mom) they just give it up and think you're nuts.
Now, with the SpaceOrb, imagine the ball is your head. You just turn it to look left. Push it forward to move forward. Even new users can look down left, turn and strafe all at the same time because they just turn, push and twist the ball.
The SpaceOrb 360 is truly the Betamax of controllers. Technically superior in every way, but just didn't happen.
The Hardcore Fans and the Death of Awesome
As a controller, there are advanced versions that are you used for 3D modeling, but as game controller it just never happened. (Damn you, WASD!) However, a website called Birdman's Lair kept the hacks and tweaks and tricks alive for a decade. You could find joystick.cfg files for Counter Strike and all sorts of hacks, partial drivers and general trouble. None of it ever rocked and none of it was a perfect solution.
Fast forward a few years and USB happened. More and more computers had USB and fewer and fewer had serial ports. You see, the SpaceOrb is 9-pin RS-232. It's a serial device. A few Serial to USB adapters were attempted, but those adapters just make virtual serial ports. As Windows 95 and XP gained prominence, fewer games even looked for serial points. DirectX (DirectInput, actually) was the final nail in the SpaceOrb coffin.
VPutz, CountryAtHeart and JayCrowe
Way over here in the Deep Web (well, not that deep, but obscure, surely) Vic Putz made a post in January of 2009. He'd previously written a HID (Hardware Input Device) driver called hidsporb. He never liked that driver. Here's his own words:
You see, I really was never satisfied with hidsporb as a Windows HID driver for a number of reasons. The enumeration of serial ports took time, and as legacy serial ports dropped from modern motherboards it became trickier and trickier to use. But it's punishing working on Windows drivers, and Vista is even moreso, since I hear it doesn't even allow unsigned hobby drivers.
Windows surely isn't exactly a playground for hobbyists who write device drivers. As a guy who runs Windows 7 x64, I can tell you this is true. Plus, as he points out, who has a serial port any way?
He posted this. I must also say +1 Charisma for the Alka Seltzer container.
Sorry to be so dramatic, but I've dreamed of this for a long time and finally had the convergence of resources, time, and irritation to do it. You want a driver? I got your driver RIGHT HERE:
While he prototypes the thing extremely quickly (he's apparently obsessed, and obsession makes good design, I always say) over the next few months Vic and friends revise and experiment with this beast. They swap PDFs of board layouts, parts and code. Folks create their own boards and eventually Vic gets Seeed Depot to offer an OrbSheild for $25. It's a kit that makes the board that is needed for this project.
Let me back up.
What Vic has done is effectively created a device driver in hardware. Remember earlier all that stuff about how COM Ports went away and USB ports came into ubiquity? Well, an important point is that the concepts of the standard USB keyboard and mouse and "HID" (Hardware Input Device) in Windows also happened. You plug a keyboard, mouse, or device that is effectively both into your Windows machine and it just works!
What Vic's done here is created USB Hardware Input Device that is recognized by Windows with no 3rd part drivers needed. This device can be a keyboard and mouse (or a joystick). Rather than creating game specific and often very complex mapping files to get your games to work with exotic hardware like the SpaceOrb, you make your changes as little Arduino programs and upload them directly the adapter. It's a bridge between an old serial port device and the USB standard HID stuff.
The main Arduino board is doing the work of translating the serial input through Vic's code into standard USB joystick motions, or standard mouse and keyboard actions. Magical. More on this later.
Building The OrbShield Hardware
It's so easy to make a 4 year old could do it. Ok, he couldn't, but he did stick around while daddy did the soldering. I ordered an OrbShield 1.0 Kit and an Arduino Duemilanove with ATMega328 (I didn't use Netduino because all the code for this project is in Arduino C, if you're curious).
I received the package a week later looking like this. The Arduino board is on the left and fully assembled. The daughter-board or "shield" is all the other parts. Vic has an extremely helpful tutorial on how to build an OrbShield up on SourceForge, and honestly, if he hadn't taken all the photos and done such a great job, I'd probably not have succeeded.
After relearning how to solder, I ended up with this sad backside of the board. Hey, first time in years, so I say I did OK. ;)
I snapped them together (plus an added piece of cardboard to keep my too-long resistors from shorting out against the top of the Arduino's USB ports) and took over to the PC.
Building and Downloading the OrbShield Arduino Software
This was the only part that was a little confusing, as the tutorial assumes a little more knowledge of where stuff goes with the Arduino than I had, which was zero.
Here's the process:
- Download the Arduino Software. I got 0019 for Windows.
- Download Vic's 1.1 OrbDuino Driver Software - Get both of these!
- Unzip the Library to a SpaceOrb folder in "Libraries" underneath your main Arduino folder
- Unzip the Sketches in C:\Users\YOURNAME\Documents\Arduino
Run the Arduino software, set your COM Ports and Chip Type.
There's two "sketches" that you'll care about. BasicJoystick and WASD. BasicJoystick makes the SpaceOrb look like a Joystick. WASD does the hard work of mapping your SpaceOrb to the WASD keys plus a mouse.
Here's the software. You'll click Upload after you make any changes you might want to. Yes, it's "C" Code, but don't be afraid, think of it as a configuration file for your SpaceOrb.
There are two USB connectors on the final hardware solution, one to talk to the Arduino for uploading code, and the one as part of the daughterboard that does the actual communicating with the SpaceOrb.
The process is this:
- Set both the DIP switches to off.
- Plug the Arduino's USB into your computer.
- Upload code.
- Unplug the Arduino's USB.
- Set the #1 DIP to on.
- Plug the OrbShield's USB (the daughterboard) into your computer.
- Repeat if you want to make changes or switch modes.
Here's the Arduino environment:
Here's the code for Basic Joystick, as an example:
//change value below to SpaceOrb360, SpaceBall4000, or SpaceBall5000
Logical_orb orb_buffer( SpaceOrb360 );
Serial.begin( 9600 );
orbduino_checkinit( orb_buffer, translator, orb_device );
orbduino_translate( orb_buffer, translator, orb_device );
Not too hard! He's hidden all the hard stuff and you just call his functions. I didn't make ANY changes to Basic Joystick to get it too work, and only minimal ones to make "WASD" work nicely.
Here's the SpaceOrb as viewed from Windows 7 x64:
And the Test Page. He uses "chording" which means all 16 buttons work if you press different combinations of buttons.
This is the joystick, config, but I ended up using the WASD+Mouse configuration as it "just works" in most games, including my test game, Half-Life 2. When you're using the WASD configuration, you can literally use the SpaceOrb as just another mouse. Watch in my video above at the end where I actually move windows around the screen with only the SpaceOrb.
It was SUCH a rush to get this working. Even though all I did was effectively assemble all this from a kit and great instructions, the feeling of accomplishment in bringing this dead (I thought) piece of hardware back to life was SO satisfying. This experience has made me want to dig back into electrical engineering, a topic I glossed over in college, so that I might better understand how these solutions are conceived and created.
Get the SpaceOrb in your life
If you think this is as awesome as I do, donate to Vic's project, as I did, on SourceForge. Get an OrbShield 1.0 Kit and an Arduino Duemilanove with ATMega328 and go find a SpaceOrb wherever you can! Enjoy, and thanks to Vic and the folks at the SpaceOrb boards for this wonderful solution.