Project proposal! So yeah, I’m going to be working with Ahmad and Ibn on an ambidextrous game controller. The idea is that you can flip it around, and it’ll reassign its buttons and invert its analog axes so you can keep on playing.
So what’s the plan? A gyroscope, maybe an accelerometer as well. We’re going to sense the orientation of the controller. I wonder how we’re going to do that though. When you first turn the controller on, it wont be able to know if it’s being played by a lefty or a righty. It would only know for certain after it’s completed a rotation, or if there’s another input to specify the orientation. And what happens if you turn it on and it’s upside down? Wouldn’t flipping it cause the controller to switch orientation again and leave you with the same backwards control scheme?
I wonder if maybe one could provide a button to change orientation as well. Well, one definitely could. However, would one want to? I almost feel as though it defeats the purpose of a gyroscope. Just flip the controller, push the button, and you’re gold. Actually, maybe there should be both. Just because there’s a button doesn’t mean people will want to use it all the time. The button could be used for calibration, and a failsafe.
This would also solve the problem of flipping the controller and maintaining the wrong control scheme. I wonder how else we could fix that. Maybe the same way tablets and mobile devices do? When you tilt the screen toward yourself, it assumes you’re not upside down, and so it rotates its display according to gravity. This calls for an accelerometer.
What else. A lock/hold mechanism? Again, inspiration taken from mobile devices. If you turn the controller on and it’s the wrong way, lock the rotation, flip the controller, and then unlock it for later use. This would make it harder to accidentally change the orientation, since you can’t just tap a switch and trigger it.
What if instead of a button that changes orientation, it is a switch? Then we could implement diagrams to indicate the controller’s orientation. Better yet, we could use the placement of the switch to show it. The orientation could face you.
But then there’s a conflict between the gyro and the switch.
So I see one of 3 design possibilities, a switch for locking rotation, or a button for switching rotation. Then of course there’s both. Allow the user to have manual control. I feel like that may get confusing though.
Now, on to the workings. How are we going to tell a controller that it’s facing some way? Controllers don’t know these things. People do, and they just design the controller according to how they intend it to be facing.
For the record, our plan is to modify a controller we already have.
What I’m thinking would be smart is to set up the buttons as inputs to the Arduino, map those inputs to the Arduino’s outputs, and then stick those output wires in the appropriate place where the controller would normally take the button’s input. Then we can just flip the map however we please on the Arduino, and we’ve got our orientation reversed. As for the joystick, just return inverted values upon rotating.
But how are we going to know what a rotation looks like? I guess we’ll just make the system and do a bunch of rotation tests, see what values we get, figure out our margin of error, and make that our threshold. We’ll need to get other people to test it too. What if someone doesn’t flip it a perfect 180 degrees because they’re off to the side of the screen? What if they’re playing upside down? Do we want orientation detection to factor in the direction in which it’s turning, or will any full turn flip around the button map? There will be a lot of testing involved. I think this will be the hardest part. Of course it will. Figuring out those tiny little differences and preferences in how people use the same object to get the same result, and then making one general standard which fits the pattern mostly. Mostly enough.