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:
Wed Jul 24 14:49:01 2019 +0000
Revision:
5:e274ee7b863d
Parent:
0:34287d673609
Child:
6:d4003733e337
Format with Astyle

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 0:34287d673609 41 #include "XNucleoIKS01A3.h"
cparata 5:e274ee7b863d 42
cparata 0:34287d673609 43 /* Instantiate the expansion board */
cparata 0:34287d673609 44 static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15, D4, D5, A3, D6, A4);
cparata 5:e274ee7b863d 45
cparata 0:34287d673609 46 /* Retrieve the composing elements of the expansion board */
cparata 0:34287d673609 47 static LSM6DSOSensor *acc_gyro = mems_expansion_board->acc_gyro;
cparata 5:e274ee7b863d 48
cparata 0:34287d673609 49 InterruptIn mybutton(USER_BUTTON);
cparata 0:34287d673609 50 DigitalOut myled(LED1);
cparata 5:e274ee7b863d 51
cparata 0:34287d673609 52 volatile int mems_event = 0;
cparata 0:34287d673609 53 volatile int change_mode = 0;
cparata 0:34287d673609 54 static int mode = 1; /* 0 means No tap, 1 means Single Tap enabled, 2 means Double Tap enabled*/
cparata 5:e274ee7b863d 55
cparata 0:34287d673609 56 /* User button callback. */
cparata 5:e274ee7b863d 57 void pressed_cb()
cparata 5:e274ee7b863d 58 {
cparata 5:e274ee7b863d 59 change_mode = 1;
cparata 0:34287d673609 60 }
cparata 5:e274ee7b863d 61
cparata 0:34287d673609 62 /* Interrupt 1 callback. */
cparata 5:e274ee7b863d 63 void int1_cb()
cparata 5:e274ee7b863d 64 {
cparata 5:e274ee7b863d 65 mems_event = 1;
cparata 0:34287d673609 66 }
cparata 5:e274ee7b863d 67
cparata 0:34287d673609 68 /* Simple main function */
cparata 5:e274ee7b863d 69 int main()
cparata 5:e274ee7b863d 70 {
cparata 5:e274ee7b863d 71 /* Attach callback to User button press */
cparata 5:e274ee7b863d 72 mybutton.fall(&pressed_cb);
cparata 5:e274ee7b863d 73 /* Attach callback to LSM6DSO INT1 */
cparata 5:e274ee7b863d 74 acc_gyro->attach_int1_irq(&int1_cb);
cparata 5:e274ee7b863d 75
cparata 5:e274ee7b863d 76 /* Enable LSM6DSO accelerometer */
cparata 5:e274ee7b863d 77 acc_gyro->enable_x();
cparata 5:e274ee7b863d 78 /* Enable Single Tap Detection. */
cparata 5:e274ee7b863d 79 acc_gyro->enable_single_tap_detection();
cparata 5:e274ee7b863d 80
cparata 5:e274ee7b863d 81 printf("\r\n--- Starting new run ---\r\n");
cparata 5:e274ee7b863d 82
cparata 5:e274ee7b863d 83 while (1) {
cparata 5:e274ee7b863d 84 if (change_mode) {
cparata 5:e274ee7b863d 85 change_mode = 0;
cparata 5:e274ee7b863d 86 mode = ((mode + 1) % 3);
cparata 5:e274ee7b863d 87 switch (mode) {
cparata 5:e274ee7b863d 88 case 0:
cparata 5:e274ee7b863d 89 /* Disable Double Tap */
cparata 5:e274ee7b863d 90 acc_gyro->disable_double_tap_detection();
cparata 5:e274ee7b863d 91 break;
cparata 5:e274ee7b863d 92 case 1:
cparata 5:e274ee7b863d 93 /* Enable Single Tap */
cparata 5:e274ee7b863d 94 acc_gyro->enable_single_tap_detection();
cparata 5:e274ee7b863d 95 break;
cparata 5:e274ee7b863d 96 case 2:
cparata 5:e274ee7b863d 97 /* Disable Single Tap and Enable Double Tap */
cparata 5:e274ee7b863d 98 acc_gyro->disable_single_tap_detection();
cparata 5:e274ee7b863d 99 acc_gyro->enable_double_tap_detection();
cparata 5:e274ee7b863d 100 break;
cparata 5:e274ee7b863d 101 }
cparata 5:e274ee7b863d 102 }
cparata 5:e274ee7b863d 103
cparata 5:e274ee7b863d 104 if (mems_event) {
cparata 5:e274ee7b863d 105 mems_event = 0;
cparata 5:e274ee7b863d 106 switch (mode) {
cparata 5:e274ee7b863d 107 case 0:
cparata 5:e274ee7b863d 108 default:
cparata 5:e274ee7b863d 109 break;
cparata 5:e274ee7b863d 110 case 1: {
cparata 5:e274ee7b863d 111 LSM6DSO_Event_Status_t status;
cparata 5:e274ee7b863d 112 acc_gyro->get_event_status(&status);
cparata 5:e274ee7b863d 113 if (status.TapStatus) {
cparata 5:e274ee7b863d 114 /* Led blinking. */
cparata 5:e274ee7b863d 115 myled = 1;
cparata 5:e274ee7b863d 116 wait(0.1);
cparata 5:e274ee7b863d 117 myled = 0;
cparata 5:e274ee7b863d 118
cparata 5:e274ee7b863d 119 /* Output data. */
cparata 5:e274ee7b863d 120 printf("Single Tap Detected!\r\n");
cparata 5:e274ee7b863d 121 }
cparata 5:e274ee7b863d 122 break;
cparata 5:e274ee7b863d 123 }
cparata 5:e274ee7b863d 124 case 2: {
cparata 5:e274ee7b863d 125 LSM6DSO_Event_Status_t status;
cparata 5:e274ee7b863d 126 acc_gyro->get_event_status(&status);
cparata 5:e274ee7b863d 127 if (status.DoubleTapStatus) {
cparata 5:e274ee7b863d 128 /* Double Led blinking */
cparata 5:e274ee7b863d 129 myled = 1;
cparata 5:e274ee7b863d 130 wait(0.1);
cparata 5:e274ee7b863d 131 myled = 0;
cparata 5:e274ee7b863d 132 wait(0.1);
cparata 5:e274ee7b863d 133 myled = 1;
cparata 5:e274ee7b863d 134 wait(0.1);
cparata 5:e274ee7b863d 135 myled = 0;
cparata 5:e274ee7b863d 136
cparata 5:e274ee7b863d 137 /* Output data. */
cparata 5:e274ee7b863d 138 printf("Double Tap Detected!\r\n");
cparata 5:e274ee7b863d 139 }
cparata 5:e274ee7b863d 140 break;
cparata 5:e274ee7b863d 141 }
cparata 5:e274ee7b863d 142 }
cparata 5:e274ee7b863d 143 }
cparata 0:34287d673609 144 }
cparata 0:34287d673609 145 }