Accelerometers: Difference between revisions

From Maemo Wiki
Jump to navigationJump to search
imported>amigadave
use <source>
imported>amigadave
use <source>
(No difference)

Revision as of 13:33, 14 June 2010

Fremantle provides an accelerometer API. There are currently two interfaces available:

  1. D-Bus
  2. sysfs

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

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 (provided on one line, separated by white space). 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.) -707 -707 0

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

An example can be found at: [1]

Using the data

The X and Y values can be used to calculate[1] the pitch (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 roll:

 angle_in_radians = atan2(y, -z)

Python

Using the sysfs interface: <source lang="python">

 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

</source>

And using the D-Bus interface: <source lang="python"> import dbus bus = dbus.SystemBus() accel = bus.get_object('com.nokia.mce',

       '/com/nokia/mce/request',
       'com.nokia.mce.request') 

orientation , stand , face , x , y , z = accel.get_device_orientation() </source> x,y,z are the raw accelerometer measurements values, and the first three variables give text information about the device orientation. In particular, the first one informs about the landscape/portrait state.

Smoothed C interface

This is a C function which returns smooth values from the accelerometer. Designed for applications running at >=25fps (otherwise it lags)

(GPL code extracted from libliqbase: liqaccel.c)

<source lang="c"> static int ocnt=0; static int oax=0; static int oay=0; static int oaz=0;

static const char *accel_filename = "/sys/class/i2c-adapter/i2c-3/3-001d/coord";

int liqaccel_read(int *ax,int *ay,int *az) { FILE *fd; int rs; fd = fopen(accel_filename, "r"); if(fd==NULL){ liqapp_log("liqaccel, cannot open for reading"); return -1;} rs=fscanf((FILE*) fd,"%i %i %i",ax,ay,az); fclose(fd); if(rs != 3){ liqapp_log("liqaccel, cannot read information"); return -2;} int bx=*ax; int by=*ay; int bz=*az; if(ocnt>0) { *ax=oax+(bx-oax)*0.1; *ay=oay+(by-oay)*0.1; *az=oaz+(bz-oaz)*0.1; } oax=*ax; oay=*ay; oaz=*az; ocnt++; return 0; } </source>