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:
parent
e0aad0c94d
commit
be7a4bf727
12
samples/sensor/lis2dh/CMakeLists.txt
Normal file
12
samples/sensor/lis2dh/CMakeLists.txt
Normal 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})
|
75
samples/sensor/lis2dh/README.rst
Normal file
75
samples/sensor/lis2dh/README.rst
Normal 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>
|
4
samples/sensor/lis2dh/prj.conf
Normal file
4
samples/sensor/lis2dh/prj.conf
Normal file
|
@ -0,0 +1,4 @@
|
|||
CONFIG_STDOUT_CONSOLE=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_SENSOR=y
|
||||
CONFIG_LIS2DH=y
|
7
samples/sensor/lis2dh/sample.yaml
Normal file
7
samples/sensor/lis2dh/sample.yaml
Normal file
|
@ -0,0 +1,7 @@
|
|||
sample:
|
||||
name: LIS2DH Accelerometer Monitor
|
||||
tests:
|
||||
sample.sensor.lis2dh:
|
||||
harness: sensor
|
||||
tags: samples sensor
|
||||
depends_on: i2c lis2dh
|
102
samples/sensor/lis2dh/src/main.c
Normal file
102
samples/sensor/lis2dh/src/main.c
Normal 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 */
|
||||
}
|
Loading…
Reference in a new issue