/ ST_Combo_Boards / lis3mdl_lsm6ds_test / lis3mdl_lsm6ds_test.ino
lis3mdl_lsm6ds_test.ino
  1  // SPDX-FileCopyrightText: 2020 Kattni Rembor for Adafruit Industries
  2  //
  3  // SPDX-License-Identifier: MIT
  4  
  5  // Basic demo for accelerometer, gyro, and magnetometer readings
  6  // from the following Adafruit ST Sensor combo boards:
  7  // * LSM6DSOX + LIS3MDL FeatherWing : https://www.adafruit.com/product/4565
  8  // * ISM330DHCX + LIS3MDL FeatherWing https://www.adafruit.com/product/4569
  9  // * LSM6DSOX + LIS3MDL Breakout : https://www.adafruit.com/product/4517
 10  // * LSM6DS33 + LIS3MDL Breakout Lhttps://www.adafruit.com/product/4485
 11  
 12  #include <Adafruit_LSM6DSOX.h>
 13  Adafruit_LSM6DSOX lsm6ds;
 14  
 15  // To use with the LSM6DS33+LIS3MDL breakout, uncomment these two lines
 16  // and comment out the lines referring to the LSM6DSOX above
 17  //#include <Adafruit_LSM6DS33.h>
 18  //Adafruit_LSM6DS33 lsm6ds;
 19  
 20  // To use with the ISM330DHCX+LIS3MDL Feather Wing, uncomment these two lines
 21  // and comment out the lines referring to the LSM6DSOX above
 22  //#include <Adafruit_ISM330DHCX.h>
 23  //Adafruit_ISM330DHCX lsm6ds;
 24  
 25  // To use with the LSM6D3TR-C+LIS3MDL breakout, uncomment these two lines
 26  // and comment out the lines referring to the LSM6DSOX above
 27  //#include <Adafruit_LSM6DS3TRC.h>
 28  //Adafruit_LSM6DS3TRC lsm6ds;
 29  
 30  #include <Adafruit_LIS3MDL.h>
 31  Adafruit_LIS3MDL lis3mdl;
 32  
 33  void setup(void) {
 34    Serial.begin(115200);
 35    while (!Serial)
 36      delay(10); // will pause Zero, Leonardo, etc until serial console opens
 37  
 38    Serial.println("Adafruit LSM6DS+LIS3MDL test!");
 39  
 40    bool lsm6ds_success, lis3mdl_success;
 41  
 42    // hardware I2C mode, can pass in address & alt Wire
 43  
 44    lsm6ds_success = lsm6ds.begin_I2C();
 45    lis3mdl_success = lis3mdl.begin_I2C();
 46  
 47    if (!lsm6ds_success){
 48      Serial.println("Failed to find LSM6DS chip");
 49    }
 50    if (!lis3mdl_success){
 51      Serial.println("Failed to find LIS3MDL chip");
 52    }
 53    if (!(lsm6ds_success && lis3mdl_success)) {
 54      while (1) {
 55        delay(10);
 56      }
 57    }
 58  
 59    Serial.println("LSM6DS and LIS3MDL Found!");
 60  
 61    // lsm6ds.setAccelRange(LSM6DS_ACCEL_RANGE_2_G);
 62    Serial.print("Accelerometer range set to: ");
 63    switch (lsm6ds.getAccelRange()) {
 64    case LSM6DS_ACCEL_RANGE_2_G:
 65      Serial.println("+-2G");
 66      break;
 67    case LSM6DS_ACCEL_RANGE_4_G:
 68      Serial.println("+-4G");
 69      break;
 70    case LSM6DS_ACCEL_RANGE_8_G:
 71      Serial.println("+-8G");
 72      break;
 73    case LSM6DS_ACCEL_RANGE_16_G:
 74      Serial.println("+-16G");
 75      break;
 76    }
 77  
 78    // lsm6ds.setAccelDataRate(LSM6DS_RATE_12_5_HZ);
 79    Serial.print("Accelerometer data rate set to: ");
 80    switch (lsm6ds.getAccelDataRate()) {
 81    case LSM6DS_RATE_SHUTDOWN:
 82      Serial.println("0 Hz");
 83      break;
 84    case LSM6DS_RATE_12_5_HZ:
 85      Serial.println("12.5 Hz");
 86      break;
 87    case LSM6DS_RATE_26_HZ:
 88      Serial.println("26 Hz");
 89      break;
 90    case LSM6DS_RATE_52_HZ:
 91      Serial.println("52 Hz");
 92      break;
 93    case LSM6DS_RATE_104_HZ:
 94      Serial.println("104 Hz");
 95      break;
 96    case LSM6DS_RATE_208_HZ:
 97      Serial.println("208 Hz");
 98      break;
 99    case LSM6DS_RATE_416_HZ:
100      Serial.println("416 Hz");
101      break;
102    case LSM6DS_RATE_833_HZ:
103      Serial.println("833 Hz");
104      break;
105    case LSM6DS_RATE_1_66K_HZ:
106      Serial.println("1.66 KHz");
107      break;
108    case LSM6DS_RATE_3_33K_HZ:
109      Serial.println("3.33 KHz");
110      break;
111    case LSM6DS_RATE_6_66K_HZ:
112      Serial.println("6.66 KHz");
113      break;
114    }
115  
116    // lsm6ds.setGyroRange(LSM6DS_GYRO_RANGE_250_DPS );
117    Serial.print("Gyro range set to: ");
118    switch (lsm6ds.getGyroRange()) {
119    case LSM6DS_GYRO_RANGE_125_DPS:
120      Serial.println("125 degrees/s");
121      break;
122    case LSM6DS_GYRO_RANGE_250_DPS:
123      Serial.println("250 degrees/s");
124      break;
125    case LSM6DS_GYRO_RANGE_500_DPS:
126      Serial.println("500 degrees/s");
127      break;
128    case LSM6DS_GYRO_RANGE_1000_DPS:
129      Serial.println("1000 degrees/s");
130      break;
131    case LSM6DS_GYRO_RANGE_2000_DPS:
132      Serial.println("2000 degrees/s");
133      break;
134    case ISM330DHCX_GYRO_RANGE_4000_DPS:
135      Serial.println("4000 degrees/s");
136      break;
137    }
138    // lsm6ds.setGyroDataRate(LSM6DS_RATE_12_5_HZ);
139    Serial.print("Gyro data rate set to: ");
140    switch (lsm6ds.getGyroDataRate()) {
141    case LSM6DS_RATE_SHUTDOWN:
142      Serial.println("0 Hz");
143      break;
144    case LSM6DS_RATE_12_5_HZ:
145      Serial.println("12.5 Hz");
146      break;
147    case LSM6DS_RATE_26_HZ:
148      Serial.println("26 Hz");
149      break;
150    case LSM6DS_RATE_52_HZ:
151      Serial.println("52 Hz");
152      break;
153    case LSM6DS_RATE_104_HZ:
154      Serial.println("104 Hz");
155      break;
156    case LSM6DS_RATE_208_HZ:
157      Serial.println("208 Hz");
158      break;
159    case LSM6DS_RATE_416_HZ:
160      Serial.println("416 Hz");
161      break;
162    case LSM6DS_RATE_833_HZ:
163      Serial.println("833 Hz");
164      break;
165    case LSM6DS_RATE_1_66K_HZ:
166      Serial.println("1.66 KHz");
167      break;
168    case LSM6DS_RATE_3_33K_HZ:
169      Serial.println("3.33 KHz");
170      break;
171    case LSM6DS_RATE_6_66K_HZ:
172      Serial.println("6.66 KHz");
173      break;
174    }
175  
176    lis3mdl.setDataRate(LIS3MDL_DATARATE_155_HZ);
177    // You can check the datarate by looking at the frequency of the DRDY pin
178    Serial.print("Magnetometer data rate set to: ");
179    switch (lis3mdl.getDataRate()) {
180      case LIS3MDL_DATARATE_0_625_HZ: Serial.println("0.625 Hz"); break;
181      case LIS3MDL_DATARATE_1_25_HZ: Serial.println("1.25 Hz"); break;
182      case LIS3MDL_DATARATE_2_5_HZ: Serial.println("2.5 Hz"); break;
183      case LIS3MDL_DATARATE_5_HZ: Serial.println("5 Hz"); break;
184      case LIS3MDL_DATARATE_10_HZ: Serial.println("10 Hz"); break;
185      case LIS3MDL_DATARATE_20_HZ: Serial.println("20 Hz"); break;
186      case LIS3MDL_DATARATE_40_HZ: Serial.println("40 Hz"); break;
187      case LIS3MDL_DATARATE_80_HZ: Serial.println("80 Hz"); break;
188      case LIS3MDL_DATARATE_155_HZ: Serial.println("155 Hz"); break;
189      case LIS3MDL_DATARATE_300_HZ: Serial.println("300 Hz"); break;
190      case LIS3MDL_DATARATE_560_HZ: Serial.println("560 Hz"); break;
191      case LIS3MDL_DATARATE_1000_HZ: Serial.println("1000 Hz"); break;
192    }
193  
194    lis3mdl.setRange(LIS3MDL_RANGE_4_GAUSS);
195    Serial.print("Range set to: ");
196    switch (lis3mdl.getRange()) {
197      case LIS3MDL_RANGE_4_GAUSS: Serial.println("+-4 gauss"); break;
198      case LIS3MDL_RANGE_8_GAUSS: Serial.println("+-8 gauss"); break;
199      case LIS3MDL_RANGE_12_GAUSS: Serial.println("+-12 gauss"); break;
200      case LIS3MDL_RANGE_16_GAUSS: Serial.println("+-16 gauss"); break;
201    }
202  
203    lis3mdl.setPerformanceMode(LIS3MDL_MEDIUMMODE);
204    Serial.print("Magnetometer performance mode set to: ");
205    switch (lis3mdl.getPerformanceMode()) {
206      case LIS3MDL_LOWPOWERMODE: Serial.println("Low"); break;
207      case LIS3MDL_MEDIUMMODE: Serial.println("Medium"); break;
208      case LIS3MDL_HIGHMODE: Serial.println("High"); break;
209      case LIS3MDL_ULTRAHIGHMODE: Serial.println("Ultra-High"); break;
210    }
211  
212    lis3mdl.setOperationMode(LIS3MDL_CONTINUOUSMODE);
213    Serial.print("Magnetometer operation mode set to: ");
214    // Single shot mode will complete conversion and go into power down
215    switch (lis3mdl.getOperationMode()) {
216      case LIS3MDL_CONTINUOUSMODE: Serial.println("Continuous"); break;
217      case LIS3MDL_SINGLEMODE: Serial.println("Single mode"); break;
218      case LIS3MDL_POWERDOWNMODE: Serial.println("Power-down"); break;
219    }
220  
221    lis3mdl.setIntThreshold(500);
222    lis3mdl.configInterrupt(false, false, true, // enable z axis
223                            true, // polarity
224                            false, // don't latch
225                            true); // enabled!
226  
227  }
228  
229  void loop() {
230  
231    sensors_event_t accel, gyro, mag, temp;
232  
233    //  /* Get new normalized sensor events */
234    lsm6ds.getEvent(&accel, &gyro, &temp);
235    lis3mdl.getEvent(&mag);
236  
237    /* Display the results (acceleration is measured in m/s^2) */
238    Serial.print("\t\tAccel X: ");
239    Serial.print(accel.acceleration.x, 4);
240    Serial.print(" \tY: ");
241    Serial.print(accel.acceleration.y, 4);
242    Serial.print(" \tZ: ");
243    Serial.print(accel.acceleration.z, 4);
244    Serial.println(" \tm/s^2 ");
245  
246    /* Display the results (rotation is measured in rad/s) */
247    Serial.print("\t\tGyro  X: ");
248    Serial.print(gyro.gyro.x, 4);
249    Serial.print(" \tY: ");
250    Serial.print(gyro.gyro.y, 4);
251    Serial.print(" \tZ: ");
252    Serial.print(gyro.gyro.z, 4);
253    Serial.println(" \tradians/s ");
254  
255    /* Display the results (magnetic field is measured in uTesla) */
256    Serial.print(" \t\tMag   X: ");
257    Serial.print(mag.magnetic.x, 4);
258    Serial.print(" \tY: ");
259    Serial.print(mag.magnetic.y, 4);
260    Serial.print(" \tZ: ");
261    Serial.print(mag.magnetic.z, 4);
262    Serial.println(" \tuTesla ");
263  
264    Serial.print("\t\tTemp   :\t\t\t\t\t");
265    Serial.print(temp.temperature);
266    Serial.println(" \tdeg C");
267    Serial.println();
268    delay(1000);
269  
270  }