Accelerometers

(Python)
(Python: Simpler example)
Line 32: Line 32:
== Python ==
== Python ==
-
Simple example
+
Using the sysfs interface:
-
{{{
+
<pre>
-
 
+
   def get_rotation():
   def get_rotation():
-
     try:
+
     f = open("/sys/class/i2c-adapter/i2c-3/3-001d/coord", 'r' )
-
        f = open("/sys/class/i2c-adapter/i2c-3/3-001d/coord", 'r' )
+
    coords = [int(w) for w in f.readline().split()]
-
        input=f.readline( )
+
    f.close()
-
        f.close()
+
     return coords
-
        coords = input.split(' ')
+
</pre>
-
        x=0
+
-
        y=0
+
-
        z=0
+
-
        try:
+
-
            x=int(coords[0])
+
-
            x=int(coords[1])
+
-
            z=int(coords[2])
+
-
        except:
+
-
            return (0,0,0)
+
-
        return (x,y,z)
+
-
     except:
+
-
        return (0,0,0)
+
-
 
+
-
}}}
+
-
 
+
-
The above is probably far from optimal, so please fix if you know how to read the data faster.
+
== References ==
== References ==

Revision as of 08:09, 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

  • On the table face up values are 0, 0, -1000 (face down would read 0, 0, 1000)
  • On the table on botton side (landscape): 0, -1000, 0
  • On the table on right side (portrait): -1000, 0, 0
  • In any other position any mix of those 3 values.

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:

 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