Accelerometers

m (wikify)
(fix double redirect)
 
(6 intermediate revisions not shown)
Line 1: Line 1:
-
[[Open development/Maemo roadmap/Fremantle|Fremantle]] provides an accelerometer API. There are currently [https://bugs.maemo.org/show_bug.cgi?id=4724 two interfaces available]:
+
#REDIRECT [[N900 accelerometer]]
-
# D-Bus
+
-
# sysfs
+
-
 
+
-
See also the [http://talk.maemo.org/showthread.php?p=288990 related thread] at talk.maemo.org.
+
-
 
+
-
== D-Bus ==
+
-
 
+
-
Thomas Thurman ([http://twitter.com/marnanel 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
+
-
 
+
-
{| class="wikitable"
+
-
|-
+
-
! 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.
+
-
 
+
-
An example can be found at: [http://git.zimmerle.org/?p=inclinometer.git;a=summary]
+
-
 
+
-
== 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 (note the inverted sign of ''y''):
+
-
 
+
-
  angle_in_radians = '''atan2'''(''x'', -''y'')
+
-
 
+
-
Similar, ''Y'' and ''Z'' can be used to calculate the pitch:
+
-
 
+
-
  angle_in_radians = '''atan2'''(''y'', -''z'')
+
-
 
+
-
== Python ==
+
-
 
+
-
Using the sysfs interface:
+
-
<pre>
+
-
  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
+
-
</pre>
+
-
 
+
-
 
+
-
== 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)
+
-
 
+
-
<pre>
+
-
 
+
-
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;
+
-
}
+
-
</pre>
+
-
 
+
-
[[Category:Development]]
+
-
[[Category:Fremantle]]
+

Latest revision as of 14:12, 16 June 2010

  1. REDIRECT N900 accelerometer