Main Content


Connect ICM-20948 sensor on Raspberry Pi hardware I2C bus

Since R2023a

Add-On Required: This feature requires the MATLAB Support Package for Raspberry Pi Hardware add-on.


The icm20948 object reads acceleration, angular velocity, magnetic field, and temperature using the TDK ICM-20948 sensor. The ICM-20948 is a 9 degree of freedom (DOF) inertial measurement unit (IMU) used to read acceleration, angular velocity, and magnetic field in all three dimensions.

The icm20948 object represents a connection to the sensor on the Raspberry Pi® hardware I2C bus. Attach an ICM-20948 sensor to the I2C pins on the Raspberry Pi hardware. You can read the data from your sensor in MATLAB®using the object functions.

Before you use the icm20948 object, create a Raspberry Pi object using raspi and set its properties as mentioned in raspi.



imu = icm20948(mypi) creates a sensor object with default property values. The object represents the connection to the sensor on the Raspberry Pi hardware, mypi.

imu = icm20948(r,Name,Value) creates a sensor object with properties using one or more Name,Value pair arguments.

Input Arguments

expand all

Raspberry Pi hardware connection created using raspi, specified as an object.

Example: imu = icm20948(mypi) creates a connection to the ICM-20948 sensor on the Raspberry Pi hardware represented as an object, mypi.

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

I2C bus address of the Raspberry Pi hardware board.

Example: sensor = icm20948(mypi, 'Bus', 'i2c-1') creates the sensor object on the 'i2c-1' bus of the Raspberry Pi board.

Data Types: char

Specify the I2C address of the sensors when multiple I2C devices with the expected address for ICM-20948 are connected to the same hardware board. ICM-20948 can have multiple I2C addresses depending on the logic level on pin AD0 of the sensor.

Pin NamePin StateI2C Address
AD0Low[0x68, 0x0C]
High[0x69, 0x0C]

You can specify the I2C address in:

  • Numeric array of hexadecimal, decimal, or binary format of I2C Addresses

  • String array of hexadecimal value of I2C Addresses

  • Cell array of character vector of hexadecimal value of I2C Addresses

Example: imu = icm20948(mypi,I2CAddress=[0x69, 0x0C])

'0x69' is the I2C address of the accelerometer and gyroscope of ICM-20948. '0x0C' is the I2C address of the magnetometer of ICM-20948.

If not specified, the object will be created with one of the available I2C device address in the table. Availability of I2C device with the expected address will be determined by using scanI2CBus.

You can specify any of the properties on this page as name-value pairs.


Create Connection to ICM-20948 Sensor

Ensure that the I2C interface on the Raspberry Pi kernel is enabled and then create an icm20948 sensor object.

You can enable the I2C interface using:

Create a connection from MATLAB to the Raspberry Pi hardware board.

mypi = raspi('raspberrypi-hysdu8X38o','rocky','bullwinkle')
mypi = 

  Raspi with Properties:

           DeviceAddress: 'raspberrypi-hysdu8X38o'
                    Port: 18734
               BoardName: 'Raspberry Pi 3 Model B+'
           AvailableLEDs: {'led0'}
    AvailableDigitalPins: [4,5,6,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]
    AvailableSPIChannels: {‘CE0’,’CE1’}
       AvailableI2CBuses: {'i2c-1'}
             I2CBusSpeed: 100000
        AvailabelWebCams: mmal service 16.1 (platform:bcm2835-v4l2)

Get the addresses of the ICM-20948 sensor connected to the I2C bus 'i2c-1'.

sensor = scanI2CBus(mypi,'i2c-1');
ans =

  1×2 cell array

    {'0x69'}    {'0xC'}

Create an icm20948 sensor object on the I2C bus 'i2c-1' on address {'0x69','0xC'}.

sensor = icm20948(mypi,'Bus','i2c-1','I2CAddress',{'0x69','0xC'});
sensor = 

  icm20948 with properties:

                         I2CAddress: 105  ("0x69")
                                   : 12   ("0xC")
                                Bus: i2c-1

Object Functions

readAccelerationRead one sample of acceleration from sensor
readAngularVelocityRead one sample of angular velocity from sensor
readTemperatureRead one sample of temperature from sensor
readMagneticFieldRead one sample of magnetic field from sensor

Version History

Introduced in R2023a