samples: sensors: add sample for i3g4250d gyro
Adds a sample for the ST I3G4250D gyroscope. Signed-off-by: Jonathan Hahn <Jonathan.Hahn@t-online.de>
This commit is contained in:
parent
f9e2969d87
commit
a133bf8821
5 changed files with 146 additions and 0 deletions
12
samples/sensor/i3g4250d/CMakeLists.txt
Normal file
12
samples/sensor/i3g4250d/CMakeLists.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021, Jonathan Hahn
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
|
project(i3g4250)
|
||||||
|
|
||||||
|
FILE(GLOB app_sources src/*.c)
|
||||||
|
target_sources(app PRIVATE ${app_sources})
|
47
samples/sensor/i3g4250d/README.rst
Normal file
47
samples/sensor/i3g4250d/README.rst
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
.. _i3g4250d:
|
||||||
|
|
||||||
|
I3G4250D: 3-axis digital output gyroscope
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
Description
|
||||||
|
***********
|
||||||
|
|
||||||
|
This sample application configures the gyroscope with a fixed
|
||||||
|
sampling rate and polls the measurements with the same rate and
|
||||||
|
displays the measurements along with a timestamp since startup.
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
************
|
||||||
|
|
||||||
|
This sample application uses the I3G4250D sensor connected via
|
||||||
|
SPI interface. This is the case for example for stm32f3_disco@E
|
||||||
|
board devicetree.
|
||||||
|
|
||||||
|
Building and Running
|
||||||
|
********************
|
||||||
|
|
||||||
|
To build the application a board with I3G4250D on SPI interface
|
||||||
|
has to be chosen, or a custom devicetree overlay has to be provided.
|
||||||
|
Here STM32F3 discovery board is used.
|
||||||
|
|
||||||
|
.. zephyr-app-commands::
|
||||||
|
:zephyr-app: samples/sensor/i3g4250d
|
||||||
|
:board: stm32f3_disco@E
|
||||||
|
:goals: build flash
|
||||||
|
|
||||||
|
Sample Output
|
||||||
|
*************
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
*** Booting Zephyr OS build zephyr-v2.6.0-1897-ga09838064f26 ***
|
||||||
|
Set sensor sampling frequency to 200.000000 Hz.
|
||||||
|
Polling at 200.000000 Hz
|
||||||
|
12 ms: x 2454.031430 , y 2336.015410 , z -1800.030108
|
||||||
|
22 ms: x -248.003106 , y -268.979704 , z 6.018390
|
||||||
|
32 ms: x -214.989906 , y -237.023468 , z 6.013926
|
||||||
|
41 ms: x -193.978308 , y -205.032232 , z 2.000356
|
||||||
|
51 ms: x -158.986716 , y -171.014568 , z 3.969998
|
||||||
|
60 ms: x -138.979582 , y -153.003326 , z 3.978748
|
||||||
|
70 ms: x -120.981554 , y -129.982800 , z -13.971422
|
||||||
|
80 ms: x -106.984060 , y -112.967272 , z -80.006572
|
3
samples/sensor/i3g4250d/prj.conf
Normal file
3
samples/sensor/i3g4250d/prj.conf
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
CONFIG_SPI=y
|
||||||
|
CONFIG_SENSOR=y
|
||||||
|
CONFIG_I3G4250D=y
|
12
samples/sensor/i3g4250d/sample.yaml
Normal file
12
samples/sensor/i3g4250d/sample.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021 Jonathan Hahn
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
sample:
|
||||||
|
name: I3G4250D Sensor Sample
|
||||||
|
tests:
|
||||||
|
sample.sensor.i3g4250d:
|
||||||
|
platform_allow: stm32f3_disco@E
|
||||||
|
tags: sensors
|
72
samples/sensor/i3g4250d/src/main.c
Normal file
72
samples/sensor/i3g4250d/src/main.c
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Jonathan Hahn
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <zephyr.h>
|
||||||
|
#include <device.h>
|
||||||
|
#include <drivers/sensor.h>
|
||||||
|
|
||||||
|
#define SAMPLING_INTERVAL_MS 10
|
||||||
|
#define DISPLAY_INTERVAL_MS 50
|
||||||
|
|
||||||
|
static int set_sampling_frequency(const struct device *sensor, double sampling_frequency)
|
||||||
|
{
|
||||||
|
struct sensor_value setting;
|
||||||
|
|
||||||
|
sensor_value_from_double(&setting, sampling_frequency);
|
||||||
|
|
||||||
|
return sensor_attr_set(sensor,
|
||||||
|
SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &setting);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fetch_and_display(const struct device *sensor)
|
||||||
|
{
|
||||||
|
struct sensor_value gyro[3];
|
||||||
|
|
||||||
|
int rc = sensor_sample_fetch(sensor);
|
||||||
|
|
||||||
|
if (rc != 0) {
|
||||||
|
printf("ERROR: Failed fetching gyro values: %d.\n", rc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = sensor_channel_get(sensor,
|
||||||
|
SENSOR_CHAN_GYRO_XYZ,
|
||||||
|
gyro);
|
||||||
|
|
||||||
|
if (rc != 0) {
|
||||||
|
printf("ERROR: Failed getting gyro values: %d\n", rc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%u ms: x %f , y %f , z %f\n",
|
||||||
|
k_uptime_get_32(),
|
||||||
|
sensor_value_to_double(&gyro[0]),
|
||||||
|
sensor_value_to_double(&gyro[1]),
|
||||||
|
sensor_value_to_double(&gyro[2]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
const double sampling_frequency = 1000.0 / SAMPLING_INTERVAL_MS;
|
||||||
|
const struct device *sensor = DEVICE_DT_GET_ONE(st_i3g4250d);
|
||||||
|
|
||||||
|
if (!device_is_ready(sensor)) {
|
||||||
|
printf("Sensor %s is not ready\n", sensor->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Set sensor sampling frequency to %f Hz.\n", sampling_frequency);
|
||||||
|
set_sampling_frequency(sensor, sampling_frequency);
|
||||||
|
|
||||||
|
printf("Start polling with an interval of %d ms\n", DISPLAY_INTERVAL_MS);
|
||||||
|
while (true) {
|
||||||
|
fetch_and_display(sensor);
|
||||||
|
|
||||||
|
/* Wait some time before printing the next value */
|
||||||
|
k_sleep(K_MSEC(DISPLAY_INTERVAL_MS));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue