143 | | [=#input] |
144 | | === Linux input device access (older kernels) |
145 | | The [https://www.kernel.org/doc/Documentation/input/input.txt Linux input device API] provides access to devices through a {{{/dev/input/event<n>}}} interface. Some of the older kernel's support IMU's via a linux input driver. |
146 | | |
147 | | The {{{/sys/class/input/input<n>/name}}} directories will show the device name responsible for the events within that directory which correspond to matching {{{/dev/input/event<n>}}} entries. |
148 | | |
149 | | Additionally there will be an api for the input device in {{{/sys/devices/virtual/input/input<n>/}}} that provides you access to various controllable aspects of the input device such as the polling frequency, the min/max values, the scaling mode used and the position (orientation) of the sensor on the board. The scaling mode and position will cause the values reported to the linux input subsystem to be transformed (for normalization). |
150 | | |
151 | | You can use the popular evtest application to show details and events from a linux input device, or write an application that accesses the device yourself. |
152 | | |
153 | | Example usage: |
154 | | {{{#!bash |
155 | | > cat /sys/devices/virtual/input/input2/name # show the name of the sensor |
156 | | fxos8700_m |
157 | | > cat /sys/devices/virtual/input/input2/position # show the orientation of the sensor |
158 | | 3 |
159 | | > echo 1 > /sys/devices/virtual/input/input2/enable # enable the sensor (take it out of standby mode) |
160 | | > evtest /dev/input/event2 # show info and values |
161 | | > evtest /dev/input/event2 |
162 | | Input driver version is 1.0.1 |
163 | | Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0 |
164 | | Input device name: "fxos8700_m" |
165 | | Supported events: |
166 | | Event type 0 (Sync) |
167 | | Event type 3 (Absolute) |
168 | | Event code 0 (X) |
169 | | Value 69 |
170 | | Min -8192 |
171 | | Max 8191 |
172 | | Fuzz 32 |
173 | | Flat 32 |
174 | | Event code 1 (Y) |
175 | | Value -31 |
176 | | Min -8192 |
177 | | Max 8191 |
178 | | Fuzz 32 |
179 | | Flat 32 |
180 | | Event code 2 (Z) |
181 | | Value 698 |
182 | | Min -8192 |
183 | | Max 8191 |
184 | | Fuzz 32 |
185 | | Flat 32 |
186 | | Testing ... (interrupt to exit) |
187 | | Event: time 1418930877.756913, type 3 (Absolute), code 0 (X), value 69 |
188 | | Event: time 1418930877.756913, type 3 (Absolute), code 1 (Y), value -62 |
189 | | Event: time 1418930877.756913, type 3 (Absolute), code 2 (Z), value 698 |
190 | | Event: time 1418930877.756913, -------------- Report Sync ------------ |
191 | | Event: time 1418930877.996939, type 3 (Absolute), code 1 (Y), value -59 |
192 | | Event: time 1418930877.996939, type 3 (Absolute), code 2 (Z), value 670 |
193 | | Event: time 1418930877.996939, -------------- Report Sync ------------ |
194 | | Event: time 1418930878.116877, type 3 (Absolute), code 1 (Y), value -58 |
195 | | Event: time 1418930878.116877, -------------- Report Sync ------------ |
196 | | Event: time 1418930878.236933, type 3 (Absolute), code 1 (Y), value -64 |
197 | | Event: time 1418930878.236933, -------------- Report Sync ------------ |
198 | | Event: time 1418930878.356942, type 3 (Absolute), code 1 (Y), value -66 |
199 | | Event: time 1418930878.356942, -------------- Report Sync ------------ |
200 | | Event: time 1418930878.476883, type 3 (Absolute), code 2 (Z), value 659 |
201 | | Event: time 1418930878.476883, -------------- Report Sync ------------ |
202 | | Event: time 1418930878.716929, type 3 (Absolute), code 0 (X), value 91 |
203 | | Event: time 1418930878.716929, -------------- Report Sync ------------ |
204 | | Event: time 1418930879.076878, type 3 (Absolute), code 2 (Z), value 652 |
205 | | Event: time 1418930879.076878, -------------- Report Sync ------------ |
206 | | }}} |
207 | | |
208 | | References: |
209 | | * [https://www.kernel.org/doc/Documentation/input/input.txt Linux Input API] |
210 | | * [http://wiki.openmoko.org/wiki/Accelerometer_data_retrieval Example applications in several languages include a simple C application] |
211 | | |
220 | | |
221 | | [=#i2cget] |
222 | | === Direct i2c Access |
223 | | This section provides examples for some typical methods of communicating with the IMUs on the i2c bus. The FXOS8700 information will be used but can be adjusted to match the address of the device present on your board. Refer to the linked datasheets to see more detailed register information. |
224 | | |
225 | | The FXOS8700 device is on the third (0 based) i2c bus at a slave address of 0x1e. Therefore you can access it directly without the need of a driver if necessary by knowing the register set from the datasheet. |
226 | | |
227 | | Example script: |
228 | | {{{#!bash |
229 | | #!/bin/sh |
230 | | |
231 | | # set to active mode |
232 | | i2cset -f -y 2 0x1e 0x2a 1 |
233 | | # enable both accelerometer and magnetometer |
234 | | i2cset -f -y 2 0x1e 0x5b 3 |
235 | | |
236 | | while [ 1 ]; do |
237 | | # accelerometer vector |
238 | | a_x=$(( $( i2cget -f -y 2 0x1e 0x01 ) << 8 | $( i2cget -f -y 2 0x1e 0x02 ) )) |
239 | | a_y=$(( $( i2cget -f -y 2 0x1e 0x03 ) << 8 | $( i2cget -f -y 2 0x1e 0x04 ) )) |
240 | | a_z=$(( $( i2cget -f -y 2 0x1e 0x05 ) << 8 | $( i2cget -f -y 2 0x1e 0x06 ) )) |
241 | | |
242 | | # magnetometer vector |
243 | | m_x=$(( $( i2cget -f -y 2 0x1e 0x33 ) << 8 | $( i2cget -f -y 2 0x1e 0x34 ) )) |
244 | | m_y=$(( $( i2cget -f -y 2 0x1e 0x35 ) << 8 | $( i2cget -f -y 2 0x1e 0x36 ) )) |
245 | | m_z=$(( $( i2cget -f -y 2 0x1e 0x37 ) << 8 | $( i2cget -f -y 2 0x1e 0x38 ) )) |
246 | | |
247 | | echo "$a_x/$a_y/$a_z $m_x/$m_y/$m_z" |
248 | | done |
249 | | }}} |
250 | | |
251 | | Running: |
252 | | {{{#!bash |
253 | | > ./test |
254 | | 16312/768/1824 65476/65467/690 |
255 | | 16240/704/2000 65469/65480/687 |
256 | | 16280/688/1912 65498/65467/683 |
257 | | 16304/688/1976 65482/65468/697 |
258 | | 16288/720/1944 65463/65475/704 |
259 | | 16312/656/1944 65477/65461/684 |
260 | | 16312/688/2000 65477/65455/680 |
261 | | 16240/592/1840 65486/65479/667 |
262 | | 16336/672/1944 65483/65467/693 |
263 | | 16336/672/1856 65469/65462/668 |
264 | | 16352/736/1944 65491/65469/716 |
265 | | 16272/672/1944 65489/65472/687 |
266 | | }}} |