Commit be7a4bf7 authored by Peter Bigot's avatar Peter Bigot Committed by Kumar Gala
Browse files

samples: sensor: add lis2dh sample



Basic polled and triggered sampling of accelerometer data from
LIS2DH-compatible sensors.

Signed-off-by: default avatarPeter Bigot <peter.bigot@nordicsemi.no>
parent e0aad0c9
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
#
# Copyright (c) 2018, Yannis Damigos
#
# SPDX-License-Identifier: Apache-2.0
#

cmake_minimum_required(VERSION 3.13.1)
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(lis2dh)

FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})
+75 −0
Original line number Diff line number Diff line
.. _lis2dh:

LIS2DH: Motion Sensor Monitor
#############################

Overview
********

This sample application periodically reads accelerometer data from the
LIS2DH sensor (or the compatible LS2DH12, LIS3DH, and LSM303DLHC
sensors), and displays the sensor data on the console.

Requirements
************

This sample uses the LIS2DH, ST MEMS system-in-package featuring a 3D
digital output motion sensor.

References
**********

For more information about the LIS2DH motion sensor see
http://www.st.com/en/mems-and-sensors/lis2dh.html.

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

The LIS2DH2 or compatible sensors are available on a variety of boards
and shields supported by Zephyr, including:

* :ref:`actinius_icarus`
* :ref:`nrf52_pca20020`
* :ref:`stm32f3_disco_board`
* :ref:`x-nucleo-iks01a2`

See the board documentation for detailed instructions on how to flash
and get access to the console where acceleration data is displayed.

Building on actinius_icarus
===========================

:ref:`actinius_icarus` includes an ST LIS2DH12 accelerometer which
supports the LIS2DH interface.

.. zephyr-app-commands::
   :zephyr-app: samples/sensor/lis2dh
   :board: actinius_icarus
   :goals: build flash
   :compact:

Building on nucleo_l476rg with IKS01A2 shield
=============================================

The :ref:`x-nucleo-iks01a2` includes an LSM303AGR accelerometer which
supports the LIS2DH interface.  This shield may also be used on other
boards with Arduino headers.

.. zephyr-app-commands::
   :zephyr-app: samples/sensor/lis2dh
   :board: nucleo_l476rg
   :goals: build flash
   :shield: x_nucleo_iks01a2
   :compact:

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

.. code-block:: console

    Polling at 0.5 Hz
    #1 @ 12 ms: x -5.387328 , y 5.578368 , z -5.463744
    #2 @ 2017 ms: x -5.310912 , y 5.654784 , z -5.501952
    #3 @ 4022 ms: x -5.349120 , y 5.692992 , z -5.463744

   <repeats endlessly every 2 seconds>
+4 −0
Original line number Diff line number Diff line
CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_LIS2DH=y
+7 −0
Original line number Diff line number Diff line
sample:
  name: LIS2DH Accelerometer Monitor
tests:
  sample.sensor.lis2dh:
    harness: sensor
    tags: samples sensor
    depends_on: i2c lis2dh
+102 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2019 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdio.h>
#include <zephyr.h>
#include <device.h>
#include <drivers/sensor.h>

static void fetch_and_display(struct device *sensor)
{
	static unsigned int count;
	struct sensor_value accel[3];
	const char *overrun = "";
	int rc = sensor_sample_fetch(sensor);

	++count;
	if (rc == -EBADMSG) {
		/* Sample overrun.  Ignore in polled mode. */
		if (IS_ENABLED(CONFIG_LIS2DH_TRIGGER)) {
			overrun = "[OVERRUN] ";
		}
		rc = 0;
	}
	if (rc == 0) {
		rc = sensor_channel_get(sensor,
					SENSOR_CHAN_ACCEL_XYZ,
					accel);
	}
	if (rc < 0) {
		printf("ERROR: Update failed: %d\n", rc);
	} else {
		printf("#%u @ %u ms: %sx %f , y %f , z %f\n",
		       count, k_uptime_get_32(), overrun,
		       sensor_value_to_double(&accel[0]),
		       sensor_value_to_double(&accel[1]),
		       sensor_value_to_double(&accel[2]));
	}
}

#ifdef CONFIG_LIS2DH_TRIGGER
static void trigger_handler(struct device *dev,
			    struct sensor_trigger *trig)
{
	fetch_and_display(dev);
}
#endif

void main(void)
{
	struct device *sensor = device_get_binding(DT_INST_0_ST_LIS2DH_LABEL);

	if (sensor == NULL) {
		printf("Could not get %s device\n",
		       DT_INST_0_ST_LIS2DH_LABEL);
		return;
	}

#if CONFIG_LIS2DH_TRIGGER
	{
		struct sensor_trigger trig;
		int rc;

		trig.type = SENSOR_TRIG_DATA_READY;
		trig.chan = SENSOR_CHAN_ACCEL_XYZ;

		if (IS_ENABLED(CONFIG_LIS2DH_ODR_RUNTIME)) {
			struct sensor_value odr = {
				.val1 = 1,
			};

			rc = sensor_attr_set(sensor, trig.chan,
					     SENSOR_ATTR_SAMPLING_FREQUENCY,
					     &odr);
			if (rc != 0) {
				printf("Failed to set odr: %d\n", rc);
				return;
			}
			printf("Sampling at %u Hz\n", odr.val1);
		}

		rc = sensor_trigger_set(sensor, &trig, trigger_handler);
		if (rc != 0) {
			printf("Failed to set trigger: %d\n", rc);
			return;
		}

		printf("Waiting for triggers\n");
		while (true) {
			k_sleep(K_MSEC(2000));
		}
	}
#else /* CONFIG_LIS2DH_TRIGGER */
	printf("Polling at 0.5 Hz\n");
	while (true) {
		fetch_and_display(sensor);
		k_sleep(K_MSEC(2000));
	}
#endif /* CONFIG_LIS2DH_TRIGGER */
}