zephyr/samples/sensor/tdk_apex
..
boards
src
CMakeLists.txt
prj.conf
README.rst
sample.yaml

.. zephyr:code-sample:: tdk_apex
   :name: TDK Advanced Pedometer and Event Detection (APEX)
   :relevant-api: sensor_interface

   Get TDK APEX event detection (trigger mode).

Overview
********

This sample application shows how to use the APEX (Advanced Pedometer
and Event Detection) features of TDK Invensense sensors. It consists of:
** Pedometer: Tracks step count, and provide details such as the cadence
and the estimated activity type (Walk, Run, Unknown).
** Tilt Detection: Detects the Tilt when tilting the board with an angle
of 30 degrees or more. The tilt event is generated when the
position is held for 4 seconds.
** Wake on Motion (WoM): Detects motion per axis exceeding 195 mg threshold.
** Significant Motion Detector (SMD): Detects when the user has moved
significantly.
APEX features support are configured through devicetree.

References
**********

 - https://invensense.tdk.com/download-pdf/an-000271-icm-42607x-and-icm-42670x-apex-motion-functions-description-and-usage/

Driver configuration
********************

The APEX is based on accelerometer data only. The TDK Sensor driver configures
accelerometer low power mode and the APEX operating frequency (25Hz or 50Hz).

Wiring
*******

This sample uses an external breakout for the sensor. A devicetree
overlay must be provided to identify the TDK sensor, the SPI or I2C bus interface and the interrupt
sensor GPIO.

Building and Running
********************

This sample supports TDK IMU devices. Each device needs
to be aliased as ``tdk-apex-sensorN`` where ``N`` goes from ``0`` to ``9``. For example:

.. code-block:: devicetree

 / {
	aliases {
			tdk-apex-sensor0 = &icm42670p;
		};
	};

This sample supports APEX feature of TDK device. It needs to be specified as below:

.. code-block:: devicetree

	icm42670p: icm42670p@0 {
		apex = "pedometer";
	}

Make sure the apex feature used is in devicetree, then build and run with:

.. zephyr-app-commands::
   :zephyr-app: samples/sensor/tdk_apex
   :board: nrf52dk/nrf52832
   :goals: build flash

Sample Output
=============

.. code-block:: devicetree

	icm42670p: icm42670p@0 {
		apex = "pedometer";
	}

.. code-block:: console

   Found device "icm42670p@68", getting sensor data
   [0:00:09.287]: STEP_DET     count: 6 steps  cadence: 2.0 steps/s  activity: Unknown
   [0:00:09.689]: STEP_DET     count: 7 steps  cadence: 2.1 steps/s  activity: Walk
   [0:00:10.051]: STEP_DET     count: 8 steps  cadence: 2.2 steps/s  activity: Walk
   [0:00:10.433]: STEP_DET     count: 9 steps  cadence: 2.2 steps/s  activity: Walk
   [0:00:10.835]: STEP_DET     count: 10 steps  cadence: 2.3 steps/s  activity: Walk

   <repeats endlessly>

.. code-block:: devicetree

	icm42670p: icm42670p@0 {
		apex = "tilt";
	}

.. code-block:: console

   Found device "icm42670p@68", getting sensor data
   [0:00:15.249]: TILT
   [0:00:21.479]: TILT
   [0:00:26.765]: TILT

   <repeats endlessly>

.. code-block:: devicetree

	icm42670p: icm42670p@0 {
		apex = "wom";
	}

.. code-block:: console

   Found device "icm42670p@68", getting sensor data
   [0:00:02.555]: WOM x=1 y=0 z=1
   [0:00:02.636]: WOM x=0 y=0 z=1
   [0:00:02.797]: WOM x=0 y=1 z=0
   [0:00:02.877]: WOM x=0 y=0 z=1
   [0:00:02.957]: WOM x=1 y=1 z=1

   <repeats endlessly>

.. code-block:: devicetree

	icm42670p: icm42670p@0 {
		apex = "smd";
	}

.. code-block:: console

   Found device "icm42670@68", getting sensor data
   [0:00:04.622]: SMD
   [0:00:05.084]: SMD
   [0:00:05.566]: SMD

   <repeats endlessly>