samples: sensor: add lis2dh sample

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

Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This commit is contained in:
Peter Bigot 2019-10-17 15:27:29 -05:00 committed by Kumar Gala
parent e0aad0c94d
commit be7a4bf727
5 changed files with 200 additions and 0 deletions

View file

@ -0,0 +1,12 @@
#
# 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})

View file

@ -0,0 +1,75 @@
.. _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>

View file

@ -0,0 +1,4 @@
CONFIG_STDOUT_CONSOLE=y
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_LIS2DH=y

View file

@ -0,0 +1,7 @@
sample:
name: LIS2DH Accelerometer Monitor
tests:
sample.sensor.lis2dh:
harness: sensor
tags: samples sensor
depends_on: i2c lis2dh

View file

@ -0,0 +1,102 @@
/*
* 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 */
}