 |
LEGO Joystick for NXT and RCX |
 |
I have a few games for the NXT in mind so I decided to create a joystick for
input. I wanted something that was light weight, nimble, had a balanced center
of gravity and contained only pure (unmodified) LEGO parts. The lightweight and
nimble requirement necesitates the use of the RCX compatable rotation sensors
for the shaft encoders. The differential design keeps the center of gravity
even and prevents drag that would be caused by a moving wire if one of the
sensors was mounted in a moving position. As a consequence of using RCX
rotation sensors, this joystick is useable with the RCX.
Parts selection
I started building a joystick using only parts that came in a standard NXT set
but since the two rotation sensors are non-standard and the NXT/RCX conversion
cables are standard only in the educational version, I decided I could use other
pieces as well. The most noticable non-standard piece is the 4x6 Technic Brick
that I chose as the yoke. Also, since I was using an educational set as my
base, I forgot to take into account the lack of studed beams in the retail
version. It can be assumed that anyone owning a pair of rotation sensors should
have an ample supply of studded beams lying around.
Theory of Operation
This is a differential style joystick. Moving the stick in the up-down
direction or in the left-right direction causes both shafts coming out of the
yoke to turn. Moving the stick along a diagonal keeps one shaft stationary
while the other one rotates.
People naturally expect 90°
angles to delineate up/down and left-right movement and find a mechanism with
its components oriented at a 45° angle to be counter-intuitive.
In this design, the yoke is comprised of the 4x6 brick and all pieces inside it.
Some simple calculations will
The X and Y positions are not immediatly available but may be calculated.
Notice that keeping the yoke still while moving the stick causes the stafts to
rotate at the same rate but in opposite directions. Also, keeping the stick
centered but rotating the entire yoke causes both shafts to rotate at the same
rate but this time in the same direction.
Gear selection
The major limitation of using a rotation sensor for this project is simply that
this is not an intended use for this part. The rotation sensor was designed as
a spedometer and only senses 16 steps of a 360° rotation, 22° per step.
The bad news is a joystick works best with about 90° of travel along the X
and Y axies. This design places large gears close to the stick which mesh with small gears close to
the rotation sensors to multiply subtle movements of the stick into large
movements that can be detected by the sensor. The 36 tooth gears that come with
the NXT are not intended to be meshed with 8 tooth gears but since you get a
pair of them and only one 40 tooth gear in a set, I used them. The action of
the stick would likely be smoother if 40 tooth gears were to be subsituted.
For purposes of explanation, I will refer to the X axis as moving the stick
away from one large gear towards the other and the Y axis as moving the stick
while keeping it the same distance from each of the gears.
The gear ratio of 36:8 in the X dimention causes 160° of motion on the stick
(8 rotation sensor steps) to be amplified into 720°, two complete rotations,
which is 32 steps on the rotation sensors. Note that both sensors turn the
same direction and by the same amount when this occurs.
The stick is directly attached to a 24 tooth gear which meshes with 12 tooth
gears on either side within the yoke.
Joystick Calibration
Rotations sensors always start at zero when your program begins. Since the
stick can be in any arbitrary position, we must calibrate it to fix absolute
coordinates. This step could be skipped if there was a low-torque method of
auto-centering the stick.
The simplest method of calibration would say move the joystick to (0,0) before
starting the program. I chose a complicated method that auto-scales and does
not care what orientation you hold the stick in or connect the rotation sensors
in. I deem this important as I am constantly unplugging and reconnecting the
stick to travel. I also decided to support different gear ratios than I chose.
This implies auto-scaling where I place (0,0) in the lower left and (100,100) in
the upper right. The on-screen display asks you to move the stick to each of
the four corners in turn so the NXT can determine which axis the sum of the
sensors controls and which axis the difference controls. It also determines the
scaling ratio and polarity for each axis. Once calibration is complete, control
is handed over to the main program.
Software
The first program written for this device is JoyDraw. It takes the absolute
position of the joystick, multiplies by a scaling factor to cover the edges of
the display when at the extreme limits of joystick travel and draws a point at
this location. You can clear the screen by turning the NXT over and shaking it
while simultaneously pressing the orange button. This is my first attempt at an
Etch-a-sketch type device.
This first program could be improved by drawing a line from the previous
position to the current position to avoid the scatter plot feel of the current
program. Another enhancement would be to divide the X and Y positions by two
before drawing thus avoiding the checker-board pattern seen currently.
These enhancements are left as an exercise to the reader.
Two versions of the same program are available:
- NXT-G for use with
the standard LEGO development environment
- NXC for use with other C like programs
Interestingly, the version made using the official LEGO NXT tools occupies 4.8MB
in the NXT memory while the NXC version uses only 3.1kB.
Future Improvements
I plan to create two native NXT-G blocks for calibration and reading of the
joystick. This will make it simple to write new porgrams that will use the
joystick for input.
I also hope to write an NXT program to send the joystick position via Bluetooth
and a PC Human Interface device driver to treat this as a normal joystick. What
better way to play your favorite LEGO games!
Unfortunatly, I do not see this happening any time soon.
Build Your Own
Follow these instructions to make your own. The
obvious prerequisite is owning a pair of rotation sensors and if this is to be
connected to a NXT, a pair of conversion cables as well.
Parts List:
| Number | Color | Part Number | Part Name |
| 2 | Light Blue | 2977C01 | Electric Rotation Sensor (Complete Assembly Shortcut) |
| 3 | Dark Gray | 6587 | Technic Axle 3 with Stud |
| 1 | Black | 3705 | Technic Axle 4 |
| 2 | Light Gray | 32073 | Technic Axle 5 |
| 2 | Black | 3707 | Technic Axle 8 |
| 1 | Black | 6538B | Technic Axle Joiner Offset |
| 4 | Light Gray | 3701 | Technic Brick 1 x 4 with Holes |
| 4 | Light Gray | 3702 | Technic Brick 1 x 8 with Holes |
| 1 | Light Gray | 40344 | Technic Brick 4 x 6 with Open Center 2 x 4 |
| 4 | Light Gray | 3713 | Technic Bush |
| 3 | Yellow | 4265C | Technic Bush 1/2 Smooth |
| 2 | Light Gray | 3647 | Technic Gear 8 Tooth |
| 2 | Light Gray | 6589 | Technic Gear 12 Tooth Bevel |
| 1 | Light Gray | 32198 | Technic Gear 20 Tooth Bevel |
| 6 | Dark Gray | 120 | Technic Liftarm 1 x 9 Straight |
| 8 | Black | 6558 | Technic Pin Long with Friction |
| 1 | Light Gray | 6553 | Technic Pole Reverser Handle |
| 2 | Black | 32498 | Technic Gear 36 Tooth Double Bevel |
| 4 | Dark Gray | 32524 | Technic Beam 7 |
| 4 | Light Gray | 55615 | Technic Beam 3 x 3 Bent with Pins |
Alternate Designs
The simplest kind of joystick from a conceptual perspective
places the two rotation sensors perpendicular to each other.
The 90° offset this gives produces X and Y readings directly.
Others have built such devices[1] but using a pure
LEGO solution requires one rotation sensor to be mounted on the yoke and this
has several consequenses. First, the electrical wire from that sensor is very
stiff and this makes the stick more difficult to position and causes an
auto-centering behavior. While the latter is a nice feature, in practice, it
forces the stick to a non-central position and the wire shifts so much that the
centering location is constantly shifting with each movement of the stick. Even
if those problems could be overcome, the center of gravity of the rotation
sensor is very difficult to position so there is another force pushing it out of
the ideal central position.
It is possible to use NXT motors as shaft encoders because of their built-in
angle sensors but a control built using these is very stiff, heavy and
susceptible to damage. As such, it is not at all suited for playing games. It
can be used in applications where the stick is expected to stay put when you
take your hand off the stick. In this mode, it is useful as a remote control
for operating another robot[2]. It is highly advised not to use the motors when
quick reflexes are required as that has a high possibility of damaging the
delicate gear train inside the motor, rendering it useless.
Other Games for the NXT
Several may be found on this german site:
http://www.nxtgames.de.vu
Footnotes
- Joysticks that output X and Y positions directly
http://tecfa.unige.ch/perso/staf/nova/blog/2006/11/21/lego-joystick/
- Joysticks that use NXT motors for shaft encoders
http://philohome.com/nxtjoystick/joystick.htm
Questions?
See the elecbrick FAQ
Comments?
doug@elecbrick.com
By using this site you are agreeing to the
TOS.
elecbrick and the elecbrick logo are trademarks of Doug Eaton.
LEGO is a trademark of The LEGO Company which does not sponsor,
authorize or endorse this site.
Please visit www.lego.com.
Rokenbok is a trademark of The Rokenbok Toy Company which does not sponsor,
authorize or endorse this site.
Please visit www.rokenbok.com.