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:
Mon Jun 03 09:51:56 2019 +0000
Revision:
4:533d952f821e
Parent:
0:34287d673609
Child:
5:e274ee7b863d
Update example to be compatible with mbed OS

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