Example of 6D orientation recognition for LSM6DSO in X-NUCLEO-IKS01A3
Dependencies: X_NUCLEO_IKS01A3
main.cpp
00001 /** 00002 ****************************************************************************** 00003 * @file main.cpp 00004 * @author SRA 00005 * @version V1.0.0 00006 * @date 5-March-2019 00007 * @brief Simple Example application for using the X_NUCLEO_IKS01A3 00008 * MEMS Inertial & Environmental Sensor Nucleo expansion board. 00009 ****************************************************************************** 00010 * @attention 00011 * 00012 * <h2><center>© COPYRIGHT(c) 2019 STMicroelectronics</center></h2> 00013 * 00014 * Redistribution and use in source and binary forms, with or without modification, 00015 * are permitted provided that the following conditions are met: 00016 * 1. Redistributions of source code must retain the above copyright notice, 00017 * this list of conditions and the following disclaimer. 00018 * 2. Redistributions in binary form must reproduce the above copyright notice, 00019 * this list of conditions and the following disclaimer in the documentation 00020 * and/or other materials provided with the distribution. 00021 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00022 * may be used to endorse or promote products derived from this software 00023 * without specific prior written permission. 00024 * 00025 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00026 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00028 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00029 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00030 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00031 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00032 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00033 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00034 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00035 * 00036 ****************************************************************************** 00037 */ 00038 00039 /* Includes */ 00040 #include "mbed.h" 00041 #include "rtos.h" 00042 #include "XNucleoIKS01A3.h" 00043 00044 /* Instantiate the expansion board */ 00045 static XNucleoIKS01A3 *mems_expansion_board = XNucleoIKS01A3::instance(D14, D15, D4, D5, A3, D6, A4); 00046 00047 /* Retrieve the composing elements of the expansion board */ 00048 static LSM6DSOSensor *acc_gyro = mems_expansion_board->acc_gyro; 00049 00050 InterruptIn mybutton(BUTTON1); 00051 DigitalOut myled(LED1); 00052 00053 volatile int mems_event = 0; 00054 volatile int send_orientation_request = 0; 00055 00056 /* User button callback. */ 00057 void pressed_cb() 00058 { 00059 send_orientation_request = 1; 00060 } 00061 00062 /* Interrupt 1 callback. */ 00063 void int1_cb() 00064 { 00065 mems_event = 1; 00066 } 00067 00068 /* Print the orientation. */ 00069 void send_orientation() 00070 { 00071 uint8_t xl = 0; 00072 uint8_t xh = 0; 00073 uint8_t yl = 0; 00074 uint8_t yh = 0; 00075 uint8_t zl = 0; 00076 uint8_t zh = 0; 00077 00078 acc_gyro->get_6d_orientation_xl(&xl); 00079 acc_gyro->get_6d_orientation_xh(&xh); 00080 acc_gyro->get_6d_orientation_yl(&yl); 00081 acc_gyro->get_6d_orientation_yh(&yh); 00082 acc_gyro->get_6d_orientation_zl(&zl); 00083 acc_gyro->get_6d_orientation_zh(&zh); 00084 00085 if (xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 1 && zh == 0) { 00086 printf("\r\n ________________ " \ 00087 "\r\n | | " \ 00088 "\r\n | * | " \ 00089 "\r\n | | " \ 00090 "\r\n | | " \ 00091 "\r\n | | " \ 00092 "\r\n | | " \ 00093 "\r\n |________________| \r\n"); 00094 } 00095 00096 else if (xl == 1 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 0) { 00097 printf("\r\n ________________ " \ 00098 "\r\n | | " \ 00099 "\r\n | * | " \ 00100 "\r\n | | " \ 00101 "\r\n | | " \ 00102 "\r\n | | " \ 00103 "\r\n | | " \ 00104 "\r\n |________________| \r\n"); 00105 } 00106 00107 else if (xl == 0 && yl == 0 && zl == 0 && xh == 1 && yh == 0 && zh == 0) { 00108 printf("\r\n ________________ " \ 00109 "\r\n | | " \ 00110 "\r\n | | " \ 00111 "\r\n | | " \ 00112 "\r\n | | " \ 00113 "\r\n | | " \ 00114 "\r\n | * | " \ 00115 "\r\n |________________| \r\n"); 00116 } 00117 00118 else if (xl == 0 && yl == 1 && zl == 0 && xh == 0 && yh == 0 && zh == 0) { 00119 printf("\r\n ________________ " \ 00120 "\r\n | | " \ 00121 "\r\n | | " \ 00122 "\r\n | | " \ 00123 "\r\n | | " \ 00124 "\r\n | | " \ 00125 "\r\n | * | " \ 00126 "\r\n |________________| \r\n"); 00127 } 00128 00129 else if (xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 1) { 00130 printf("\r\n __*_____________ " \ 00131 "\r\n |________________| \r\n"); 00132 } 00133 00134 else if (xl == 0 && yl == 0 && zl == 1 && xh == 0 && yh == 0 && zh == 0) { 00135 printf("\r\n ________________ " \ 00136 "\r\n |________________| " \ 00137 "\r\n * \r\n"); 00138 } 00139 00140 else { 00141 printf("None of the 6D orientation axes is set in LSM6DSO - accelerometer.\r\n"); 00142 } 00143 } 00144 00145 /* Simple main function */ 00146 int main() 00147 { 00148 /* Attach callback to User button press */ 00149 mybutton.fall(&pressed_cb); 00150 /* Attach callback to LSM6DSO INT1 */ 00151 acc_gyro->attach_int1_irq(&int1_cb); 00152 00153 /* Enable LSM6DSO accelerometer */ 00154 acc_gyro->enable_x(); 00155 /* Enable 6D Orientation. */ 00156 acc_gyro->enable_6d_orientation(); 00157 00158 printf("\r\n--- Starting new run ---\r\n"); 00159 00160 while (1) { 00161 if (mems_event) { 00162 mems_event = 0; 00163 LSM6DSO_Event_Status_t status; 00164 acc_gyro->get_event_status(&status); 00165 if (status.D6DOrientationStatus) { 00166 /* Send 6D Orientation */ 00167 send_orientation(); 00168 00169 /* Led blinking. */ 00170 myled = 1; 00171 ThisThread::sleep_for(200); 00172 myled = 0; 00173 } 00174 } 00175 00176 if (send_orientation_request) { 00177 send_orientation_request = 0; 00178 send_orientation(); 00179 } 00180 } 00181 }
Generated on Thu Jul 14 2022 20:55:19 by 1.7.2