Example of single tap and double tap detection for LSM6DSO in X-NUCLEO-IKS01A3

Dependencies:   X_NUCLEO_IKS01A3

Single and Double Tap Demo Application with LSM6DSO based on sensor expansion board X-NUCLEO-IKS01A3

Main function is to show how to detect the single and double tap events using the sensor expansion board and send a notification using UART to a connected PC or Desktop and display it on terminal applications like TeraTerm.
After connection has been established:
- the user can try to tap the board and then view the notification using an hyper terminal. When the single tap is detected, the LED is switched on for a while.
- the user can press the user button to pass from the single tap detection to the double tap detection feature. The user can try to double tap the board and then view the notification using an hyper terminal. When the double tap is detected, the LED is switched on twice for a while.
- the user can press again the user button to disable the single and double tap detection feature.
- the user can press the user button to enable again the single tap detection feature and so on.

Committer:
cparata
Date:
Thu Jun 24 11:58:33 2021 +0000
Revision:
8:71f36814ea4d
Parent:
6:d4003733e337
Update the button label

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:34287d673609 1 /**
cparata 0:34287d673609 2 ******************************************************************************
cparata 0:34287d673609 3 * @file main.cpp
cparata 0:34287d673609 4 * @author SRA
cparata 0:34287d673609 5 * @version V1.0.0
cparata 0:34287d673609 6 * @date 5-March-2019
cparata 5:e274ee7b863d 7 * @brief Simple Example application for using the X_NUCLEO_IKS01A3
cparata 0:34287d673609 8 * MEMS Inertial & Environmental Sensor Nucleo expansion board.
cparata 0:34287d673609 9 ******************************************************************************
cparata 0:34287d673609 10 * @attention
cparata 0:34287d673609 11 *
cparata 0:34287d673609 12 * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
cparata 0:34287d673609 13 *
cparata 0:34287d673609 14 * Redistribution and use in source and binary forms, with or without modification,
cparata 0:34287d673609 15 * are permitted provided that the following conditions are met:
cparata 0:34287d673609 16 * 1. Redistributions of source code must retain the above copyright notice,
cparata 0:34287d673609 17 * this list of conditions and the following disclaimer.
cparata 0:34287d673609 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 0:34287d673609 19 * this list of conditions and the following disclaimer in the documentation
cparata 0:34287d673609 20 * and/or other materials provided with the distribution.
cparata 0:34287d673609 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 0:34287d673609 22 * may be used to endorse or promote products derived from this software
cparata 0:34287d673609 23 * without specific prior written permission.
cparata 0:34287d673609 24 *
cparata 0:34287d673609 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 0:34287d673609 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 0:34287d673609 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 0:34287d673609 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 0:34287d673609 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 0:34287d673609 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 0:34287d673609 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 0:34287d673609 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 0:34287d673609 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 0:34287d673609 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 0:34287d673609 35 *
cparata 0:34287d673609 36 ******************************************************************************
cparata 5:e274ee7b863d 37 */
cparata 5:e274ee7b863d 38
cparata 0:34287d673609 39 /* Includes */
cparata 0:34287d673609 40 #include "mbed.h"
cparata 6:d4003733e337 41 #include "rtos.h"
cparata 0:34287d673609 42 #include "XNucleoIKS01A3.h"
cparata 5:e274ee7b863d 43
cparata 0:34287d673609 44 /* Instantiate the expansion board */
cparata 0:34287d673609 45 static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15, D4, D5, A3, D6, A4);
cparata 5:e274ee7b863d 46
cparata 0:34287d673609 47 /* Retrieve the composing elements of the expansion board */
cparata 0:34287d673609 48 static LSM6DSOSensor *acc_gyro = mems_expansion_board->acc_gyro;
cparata 5:e274ee7b863d 49
cparata 8:71f36814ea4d 50 InterruptIn mybutton(BUTTON1);
cparata 0:34287d673609 51 DigitalOut myled(LED1);
cparata 5:e274ee7b863d 52
cparata 0:34287d673609 53 volatile int mems_event = 0;
cparata 0:34287d673609 54 volatile int change_mode = 0;
cparata 0:34287d673609 55 static int mode = 1; /* 0 means No tap, 1 means Single Tap enabled, 2 means Double Tap enabled*/
cparata 5:e274ee7b863d 56
cparata 0:34287d673609 57 /* User button callback. */
cparata 5:e274ee7b863d 58 void pressed_cb()
cparata 5:e274ee7b863d 59 {
cparata 5:e274ee7b863d 60 change_mode = 1;
cparata 0:34287d673609 61 }
cparata 5:e274ee7b863d 62
cparata 0:34287d673609 63 /* Interrupt 1 callback. */
cparata 5:e274ee7b863d 64 void int1_cb()
cparata 5:e274ee7b863d 65 {
cparata 5:e274ee7b863d 66 mems_event = 1;
cparata 0:34287d673609 67 }
cparata 5:e274ee7b863d 68
cparata 0:34287d673609 69 /* Simple main function */
cparata 5:e274ee7b863d 70 int main()
cparata 5:e274ee7b863d 71 {
cparata 5:e274ee7b863d 72 /* Attach callback to User button press */
cparata 5:e274ee7b863d 73 mybutton.fall(&pressed_cb);
cparata 5:e274ee7b863d 74 /* Attach callback to LSM6DSO INT1 */
cparata 5:e274ee7b863d 75 acc_gyro->attach_int1_irq(&int1_cb);
cparata 5:e274ee7b863d 76
cparata 5:e274ee7b863d 77 /* Enable LSM6DSO accelerometer */
cparata 5:e274ee7b863d 78 acc_gyro->enable_x();
cparata 5:e274ee7b863d 79 /* Enable Single Tap Detection. */
cparata 5:e274ee7b863d 80 acc_gyro->enable_single_tap_detection();
cparata 5:e274ee7b863d 81
cparata 5:e274ee7b863d 82 printf("\r\n--- Starting new run ---\r\n");
cparata 5:e274ee7b863d 83
cparata 5:e274ee7b863d 84 while (1) {
cparata 5:e274ee7b863d 85 if (change_mode) {
cparata 5:e274ee7b863d 86 change_mode = 0;
cparata 5:e274ee7b863d 87 mode = ((mode + 1) % 3);
cparata 5:e274ee7b863d 88 switch (mode) {
cparata 5:e274ee7b863d 89 case 0:
cparata 5:e274ee7b863d 90 /* Disable Double Tap */
cparata 5:e274ee7b863d 91 acc_gyro->disable_double_tap_detection();
cparata 5:e274ee7b863d 92 break;
cparata 5:e274ee7b863d 93 case 1:
cparata 5:e274ee7b863d 94 /* Enable Single Tap */
cparata 5:e274ee7b863d 95 acc_gyro->enable_single_tap_detection();
cparata 5:e274ee7b863d 96 break;
cparata 5:e274ee7b863d 97 case 2:
cparata 5:e274ee7b863d 98 /* Disable Single Tap and Enable Double Tap */
cparata 5:e274ee7b863d 99 acc_gyro->disable_single_tap_detection();
cparata 5:e274ee7b863d 100 acc_gyro->enable_double_tap_detection();
cparata 5:e274ee7b863d 101 break;
cparata 5:e274ee7b863d 102 }
cparata 5:e274ee7b863d 103 }
cparata 5:e274ee7b863d 104
cparata 5:e274ee7b863d 105 if (mems_event) {
cparata 5:e274ee7b863d 106 mems_event = 0;
cparata 5:e274ee7b863d 107 switch (mode) {
cparata 5:e274ee7b863d 108 case 0:
cparata 5:e274ee7b863d 109 default:
cparata 5:e274ee7b863d 110 break;
cparata 5:e274ee7b863d 111 case 1: {
cparata 5:e274ee7b863d 112 LSM6DSO_Event_Status_t status;
cparata 5:e274ee7b863d 113 acc_gyro->get_event_status(&status);
cparata 5:e274ee7b863d 114 if (status.TapStatus) {
cparata 5:e274ee7b863d 115 /* Led blinking. */
cparata 5:e274ee7b863d 116 myled = 1;
cparata 6:d4003733e337 117 ThisThread::sleep_for(100);
cparata 5:e274ee7b863d 118 myled = 0;
cparata 5:e274ee7b863d 119
cparata 5:e274ee7b863d 120 /* Output data. */
cparata 5:e274ee7b863d 121 printf("Single Tap Detected!\r\n");
cparata 5:e274ee7b863d 122 }
cparata 5:e274ee7b863d 123 break;
cparata 5:e274ee7b863d 124 }
cparata 5:e274ee7b863d 125 case 2: {
cparata 5:e274ee7b863d 126 LSM6DSO_Event_Status_t status;
cparata 5:e274ee7b863d 127 acc_gyro->get_event_status(&status);
cparata 5:e274ee7b863d 128 if (status.DoubleTapStatus) {
cparata 5:e274ee7b863d 129 /* Double Led blinking */
cparata 5:e274ee7b863d 130 myled = 1;
cparata 6:d4003733e337 131 ThisThread::sleep_for(100);
cparata 5:e274ee7b863d 132 myled = 0;
cparata 6:d4003733e337 133 ThisThread::sleep_for(100);
cparata 5:e274ee7b863d 134 myled = 1;
cparata 6:d4003733e337 135 ThisThread::sleep_for(100);
cparata 5:e274ee7b863d 136 myled = 0;
cparata 5:e274ee7b863d 137
cparata 5:e274ee7b863d 138 /* Output data. */
cparata 5:e274ee7b863d 139 printf("Double Tap Detected!\r\n");
cparata 5:e274ee7b863d 140 }
cparata 5:e274ee7b863d 141 break;
cparata 5:e274ee7b863d 142 }
cparata 5:e274ee7b863d 143 }
cparata 5:e274ee7b863d 144 }
cparata 0:34287d673609 145 }
cparata 0:34287d673609 146 }