TS-7250-V3 ST ISM330

From Technologic Systems Manuals

This board features an ST ISM330DLC. This includes both a 3 axis accelerometer and gyroscope. The accelerometer has an acceleration range of ±2/±4/±8/±16 g. The gyroscope has a selectable angular range of ±125/±250/±500/±1000/±2000 Linux provides access to this chipset as part of the IIO subsystem. This is accessed using iio-tools and libiio as ism330dlc_accel, and ism330dlc_gyro.

ISM330 Accelerometer

The accelerometer is accessed through IIO as ism330dlc_accel with channels:

  • accel_x
  • accel_y
  • accel_z
  • timestamp

For example:

root@tsimx6ul:~# iio_attr -c ism330dlc_accel accel_x
dev 'ism330dlc_accel', channel 'accel_x' (input), attr 'injection_raw', ERROR: Permission denied (-13)
dev 'ism330dlc_accel', channel 'accel_x' (input), attr 'raw', value '-183'
dev 'ism330dlc_accel', channel 'accel_x' (input), attr 'scale', value '0.000598'
dev 'ism330dlc_accel', channel 'accel_x' (input), attr 'scale_available', value '0.000598 0.001196 0.002392 0.004785'
root@tsimx6ul:~# iio_attr -c ism330dlc_accel accel_y
dev 'ism330dlc_accel', channel 'accel_y' (input), attr 'injection_raw', ERROR: Permission denied (-13)
dev 'ism330dlc_accel', channel 'accel_y' (input), attr 'raw', value '-292'
dev 'ism330dlc_accel', channel 'accel_y' (input), attr 'scale', value '0.000598'
dev 'ism330dlc_accel', channel 'accel_y' (input), attr 'scale_available', value '0.000598 0.001196 0.002392 0.004785'
root@tsimx6ul:~# iio_attr -c ism330dlc_accel accel_z
dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'injection_raw', ERROR: Permission denied (-13)
dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'raw', value '16491'
dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'scale', value '0.000598'
dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'scale_available', value '0.000598 0.001196 0.002392 0.004785'

This shows a snapshot of the x, y, z values. To get the real world value, multiply the scale * the raw value. In this case:

  • X: -0.109434 g
  • Y: -0.174616 g
  • Z: 9.861618 g

The default scale is ±2, but ±2/±4/±8/±16 can be selected by setting the scale:

dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'scale', value '0.000598'
dev 'ism330dlc_accel', channel 'accel_z' (input), attr 'scale_available', value '0.000598 0.001196 0.002392 0.004785'

To set ±4, you would write the second available scale:

iio_attr -c ism330dlc_accel accel_x scale 0.001196

The scale values are not independent on this device, and setting x/y/z will set the scale for all 3.

This driver also supports pulling continuous samples using the buffer interface. These can be accessed using iio_readdev:

iio_readdev ism330dlc_accel -T 0 -s 128 > samples.bin

The format of this file is specified with iio_attr:

root@tsimx6ul:~# iio_attr -c ism330dlc_accel
dev 'ism330dlc_accel', channel 'accel_x' (input, index: 0, format: le:S16/16>>0), found 4 channel-specific attributes
dev 'ism330dlc_accel', channel 'accel_y' (input, index: 1, format: le:S16/16>>0), found 4 channel-specific attributes
dev 'ism330dlc_accel', channel 'accel_z' (input, index: 2, format: le:S16/16>>0), found 4 channel-specific attributes
dev 'ism330dlc_accel', channel 'timestamp' (input, index: 3, format: le:S64/64>>0), found 0 channel-specific attributes

The samples are padded to the nearest 8-bytes, so this means the binary format is:

Bits Description
15:0 accel_x, little endian, signed
15:0 accel_y, little endian, signed
15:0 accel_z, little endian, signed
63:0 timestamp, little endian, signed
15:0 Padding

The unix utility hexdump supports formatting options which can parse these fields:

hexdump samples.bin --format '1/2 "X:%d " 1/2 "Y:%d " 1/2 "Z:%d " 1/8 "TS:%d" 1/2 "" "\n"' | head -n 4

This gives the raw values which can then be multiplied by the scale to get the real world value.