Accelerometers

(References)
(Python)
Line 34: Line 34:
Simple example  
Simple example  
{{{
{{{
 +
def get_rotation():
def get_rotation():
     try:
     try:
Line 57: Line 58:
The above is probably far from optimal, so please fix if you know how to read the data faster.  
The above is probably far from optimal, so please fix if you know how to read the data faster.  
-
x, y and z values are in 1 G conditions between -900 and 900. Nominal state for each vector is 0. The values can be multiplied by the amount of Gs you may experience.  
+
x, y and z values are in 1 G conditions between -900 and 900. Nominal state for each vector is 0. The values can be multiplied by the amount of Gs you may experience.
== References ==
== References ==

Revision as of 19:18, 28 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

Simple example {{{

def get_rotation():

   try:
       f = open("/sys/class/i2c-adapter/i2c-3/3-001d/coord", 'r' )
       input=f.readline( )
       f.close()
       coords = input.split(' ')
       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.

x, y and z values are in 1 G conditions between -900 and 900. Nominal state for each vector is 0. The values can be multiplied by the amount of Gs you may experience.

References

  1. Tom Pycke, Accelerometer to pitch and roll