Sei sulla pagina 1di 4

Components

A-Star 32U4 Micro - a tiny Arduino Leonardo clone

LSM9DS0 Breakout board - a combined gyroscope, accelerometer and magnetometer

A 3.3V to 5V logic level converter

10k resistor

push button switch

strip board

I started off prototyping with an Arduino Uno, and but it doesn't have the ability to be a
HID controller at the same time as being able to load the firmware via USB. I tried
reading the sensors via the serial port, but that's just not the same as a genuine mouse
because you always need a client piece of software running, which isn't elegant, nor is it
always convenient. However, the Arduino Leonardo does have the ability to act as a
mouse or a keyboard, so I decided to use one of those. In fact, what i decided to use
was a clone of that. There is a fantastic clone board called the A-Star 32U4 Micro,
which is tiny - just 1" x 0.6", and it's half the price, so it's a winner all round for this
project,

For the gyroscope, I chose the LSM9DS0 chip which is a combined gyroscope,
accelerometer and magnetometer, giving me the choice of being a bit more
sophisticated about detecting movement. I don't have the facility to make my own circuit
boards or to surface mount chips, so I bought it on a breakout board.

The LSM9DS0 runs with 3.3V outputs, but the processor needs 5V inputs, so a logic
level converter for the SCL and SDA lines is required too.

Finally, it's a good idea to be able to turn the mouse operation of the device on and off
without unplugging it - that way if you make a mistake, you can re-program it without the
mouse feature running wild.
Step 1: The Circuit
The easiest way to run the LSM9DS0 is on the I2C interface. That allows the
microprocessor to talk to it over a simple serial interface, which has standard libraries.
To do that, we wire the SDA and SCL pins to the SDA and SCL pins on the 32U4 board,
via the logic level converter to change the signals from 3.3V to 5V.

You can periodically poll the LSM9DS0 for data, but to optimally know when there is
data, there are three interupt outputs - one for each sensor. They also run at 3.3V, but
that is high enough for the 32U4 to treat as a high signal, so there is no need to run
those through the logic level converter.

The sketch shows the circuit, along with a push switch going to pin 11, with a 10k pull
up resistor connected to 5V to stop the pin from floating.

Step 2: The Code


After much pain, I found that there's a quirk in the LSM9DS0 which means that it doesn't
always return all of the data that you expect it to, so use the attached libraries instead,
where the issue is worked round. Without this, you can find the system hanging.

I used the sparkfun example code to get the gyroscope to move the mouse. I combine
that with the readings from the accelerometer to detect what way the device is oriented,
and translate that in to x and y movements for the mouse. You can find that code in the
attached file.

The code expects the device to be on the right hand side of your head. If you want to
have it on the left, invert the Y axis calculation, otherwise it will move the mouse down
when your head moves up.

The LSM9DS0 doesn't start as fast as the processor, so the code pauses for 1s when it
first starts to allow the sensors to come on line. Then I throw away the first 10 readings
because the first readings seem to be less accurate.

The accelerometer seems to not say zero when it is stationary (movement of the earth
perhaps?), so the code takes an average of readings 10 through 40 when you turn it on,
and subtracts those from subsequent readings to make it stable. Make sure the mouse
is stable when you plug it in for that reason.

The button is used to pause the mouse interaction, and when it starts again the
stationary readings are taken again, so be sure to keep the device steady when starting
it up - e.g. put it on the table.
Step 3: The Build
Next step is to solder it all up on a strip board. It's not as elegant as a custom built PCB,
but I love strip board because it's always there ready to use for whatever you want, and
you can tinker with it if it doesn't work. It's not particularly elegant (nor is my soldering),
but it all works great.

It's no fun having a bare circuit board strapped to your head, not to mention the risk of
static, so it needs to be packaged in something. I considered a altoids tin, but metal isn't
the best thing to put this in, plus it's large and uncomfortable. Fortunately, walking too
far in new shoes resulted in me to emptying a plastic blister plaster box which was a
perfect size for the circuit board (well, after I trimmed down the board with a dremel it
was anyway). Plus, it was nice and smooth, and comfortable to have strapped to your
head. I cut holes for the USB connector and the button, fixed the circuit board in to
place with some sugru, and used a bit of leftover green sugru to make a matching green
button top for the case.

I cut a couple of lines in the case and threaded a child's elastic belt through it as an
ideal size for a head band, so the device can be comfortably worn on the head.

Step 5: The Game


So here it is in action. Crank up minecraft with a first person view, and as you look up
and down, Steve looks up and down in the game. Look left and right, and Steve looks
left and right. It's uncannily accurate, and brilliant fun to have your real life movements
reflected in the game. If you look off the side of the screen, it re-centers when you move
back to the middle, so to face a new direction, just move your head left or right past the
edge of the screen and then back again.

Yes, you still need to use the mouse buttons to dig and build. Does that defeat the point
of the head mouse? No, not at all. It's not about completely ditching the mouse - it's
about a more immersive gaming experience.

Step 6: Disability Assistance

The other obvious use for a head mouse is for people with physical disabilities which
prevent them from using a mouse. For people with limited mobility, this can be held or
attached to any part of your body - move your head, your foot, your arm, anything. The
sensitivity of movement can be adjusted in the code to suit any user too, and
movements can be averaged to smooth out any body jitters.
The other essential addition for people with physical disabilities (as opposed to
immersive gaming) is the need to click the mouse. The solution to that depends on the
level of mobility of the user. For example, it's easy to add a foot controlled button that is
connected to the Arduino, and call Mouse.click() when that is pressed. When that is not
an option, you can rely on "dwell" - i.e. when the mouse pointer has been in a particular
area for a period of time, call Mouse.click(). The attached Arduino file does just that - it
will look to see the total movement over the past second. If it has moved less than 20
pixels, it will click. If movement is over 20 pixels, it resets the timer. You can edit the file
to change the radius that counts as stationary and the dwell time to suit the user.

Step 7: Conclusion

Adding a gyroscope to an Arduino Leonardo gives a huge number of options for


controlling your computer.

About the LSM9DS0


The LSM9DS0 is one of only a handful of IC's that can measure three key properties of movement -- angular velocity,
acceleration, and heading -- in a single IC.
The gyroscope can measure angular velocity -- that is "how fast, and along which axis, am I rotating?" Angular velocities are
measured in degrees per second -- usually abbreviated to DPS or °/s. The LSM9DS0 can measure up to ± 2000 DPS,
though that scale can also be set to either 245 or 500 DPS to get a finer resolution.
An accelerometer measures acceleration, which indicates how fast velocity is changing -- "how fast am I speeding up or
slowing down?" Acceleration is usually either measured in m/s2 (meters per second per second) or g's (gravities [about 9.8
m/s2]). If an object is sitting motionless it feels about 1 g of acceleration towards the ground (assuming that ground is on earth,
and the object is near sea-level). The LSM9DS0 measures its acceleration in g's, and its scale can be set to either ± 2, 4, 6, 8,
or 16_g_.
Finally, there's the magnetometer, which measures the power and direction of magnetic fields. Though they're not easily
visible, magnetic fields exist all around us -- whether you're holding a tiny ferromagnet or feeling an attraction to Earth's
magnetic field. The LSM9DS0 measures magnetic fields in units of gauss (Gs), and can set its measurement scale to either ±
2, 4, 8, or 12 Gs.
By measuring these three properties, you can gain a great deal of knowledge about an object's movement. 9DOF's have tons
and tons of applications. Measuring the force and direction of Earth's magnetic field with a magnetometer, you can
approximate your heading. An accelerometer in your phone can measure the direction of the force of gravity, and
estimate orientation (portrait, landscape, flat, etc.). Quadcopters with built-in gyroscopes can look out for sudden rolls or
pitches, and correct their momentum before things get out of hand.

Potrebbero piacerti anche