Accelerometers

(Python: Simpler example)
(Expand on theoretical values and correct atan2)
Line 15: Line 15:
When reading that file you get 3 values X, Y and Z. Values are in mG (milli G). 1000 = 1 G
When reading that file you get 3 values X, Y and Z. Values are in mG (milli G). 1000 = 1 G
-
* On the table face up values are 0, 0, -1000 (face down would read 0, 0, 1000)
+
{| class="wikitable"
-
* On the table on botton side (landscape): 0, -1000, 0
+
|-
-
* On the table on right side (portrait): -1000, 0, 0
+
! Position
-
* In any other position any mix of those 3 values.
+
! X
 +
! Y
 +
! Z
 +
|-
 +
| Lying on table (back down)
 +
| 0
 +
| 0
 +
| -1000
 +
|-
 +
| Lying on table (face down)
 +
| 0
 +
| 0
 +
| 1000
 +
|-
 +
| Sitting on table (bottom edge down)
 +
| 0
 +
| -1000
 +
| 0
 +
|-
 +
| Sitting on table (right edge down)
 +
| -1000
 +
| 0
 +
| 0
 +
|-
 +
| Sitting on table (left edge down)
 +
| 1000
 +
| 0
 +
| 0
 +
|-
 +
| Bottom right corner down (approx.)
 +
| -500
 +
| -500
 +
| 0
 +
|}
These are theoretical values. In real life your mileage will vary.
These are theoretical values. In real life your mileage will vary.
Line 24: Line 57:
== Using the data ==
== Using the data ==
-
The ''X'' and ''Y'' values can be used to calculate<ref>Tom Pycke, ''[http://tom.pycke.be/mav/69/accelerometer-to-attitude Accelerometer to pitch and roll]</ref>'' the roll (that is, clockwise rotation) using the ''atan2'' function:
+
The ''X'' and ''Y'' values can be used to calculate<ref>Tom Pycke, ''[http://tom.pycke.be/mav/69/accelerometer-to-attitude Accelerometer to pitch and roll]''</ref> the roll (that is, clockwise rotation) using the ''atan2'' function (note the inverted sign of ''y''):
-
   angle_in_radians = '''atan2'''(''x'', ''y'')
+
   angle_in_radians = '''atan2'''(''x'', -''y'')
Similar, ''Y'' and ''Z'' can be used to calculate the pitch.
Similar, ''Y'' and ''Z'' can be used to calculate the pitch.

Revision as of 21:04, 29 July 2009

Fremantle offers the possibility to play with accelerometers. There is a plan to offer a proper interface for accelerometers in Maemo, but if you want to try out before there are a couple of ways to do it.

See also the related thread in talk.maemo.org.

Contents

D-Bus

Thomas Thurman (marnanel) has put together a simple demo of an application using accelerometers using the D-Bus interface. You can find sources and .deb up at http://people.collabora.co.uk/~tthurman/sandcastle/

sysfs

Another way is to use the sysfs file information.

/sys/class/i2c-adapter/i2c-3/3-001d/coord

When reading that file you get 3 values X, Y and Z. Values are in mG (milli G). 1000 = 1 G

Position X Y Z
Lying on table (back down) 0 0 -1000
Lying on table (face down) 0 0 1000
Sitting on table (bottom edge down) 0 -1000 0
Sitting on table (right edge down) -1000 0 0
Sitting on table (left edge down) 1000 0 0
Bottom right corner down (approx.) -500 -500 0

These are theoretical values. In real life your mileage will vary.

Using the data

The X and Y values can be used to calculate[1] the roll (that is, clockwise rotation) using the atan2 function (note the inverted sign of y):

 angle_in_radians = atan2(x, -y)

Similar, Y and Z can be used to calculate the pitch.

Python

Using the sysfs interface:

  def get_rotation():
    f = open("/sys/class/i2c-adapter/i2c-3/3-001d/coord", 'r' )
    coords = [int(w) for w in f.readline().split()]
    f.close()
    return coords

References

  1. Tom Pycke, Accelerometer to pitch and roll