|
| 1 | +/* |
| 2 | + * @Description(CN): |
| 3 | + * 基于Arduino_DriveBus库的LSM6DSL陀螺仪例程 |
| 4 | + * 以下是使用该款芯片需要注意的几个点: |
| 5 | + * 1. LSM6DSL在过高的性能模式下采集数据时数据波动可能会较大 |
| 6 | + * 2. LSM6DSL直接读取数据时,在过低性能模式下直接读取速率时候建议做个延时,否则读取数据将会失败 |
| 7 | + * 3. LSM6DSL使用时候需要进行校正,校正时请将设备正放并静止,校正顺序从陀螺仪传感器到加速度传感器 |
| 8 | + * |
| 9 | + * @Description(EN): |
| 10 | + * LSM6DSL chip routine based on Arduino_DriveBus library |
| 11 | + * Here are a few points to note when using this chip: |
| 12 | + * 1.When collecting data in high-performance mode, LSM6DSL may experience significant data fluctuations. |
| 13 | + * 2.When directly reading data from LSM6DSL, it is recommended to introduce a delay in the read rate in |
| 14 | + * low-performance mode to avoid data reading failures. |
| 15 | + * 3.Calibration is required when using LSM6DSL. During calibration, ensure the device is placed upright |
| 16 | + * and stationary. The calibration sequence should start from the gyroscope sensor to the accelerometer sensor. |
| 17 | + * |
| 18 | + * @version: V1.0.0 |
| 19 | + * @Author: Xk_w |
| 20 | + * @Date: 2024-02-20 17:13:03 |
| 21 | + * @LastEditors: Xk_w |
| 22 | + * @LastEditTime: 2024-02-24 17:52:16 |
| 23 | + * @License: GPL 3.0 |
| 24 | + */ |
| 25 | +#include "Arduino_DriveBus_Library.h" |
| 26 | +#include <math.h> |
| 27 | + |
| 28 | +static size_t CycleTime1 = 0; |
| 29 | +static size_t CycleTime2 = 0; |
| 30 | + |
| 31 | +std::shared_ptr<Arduino_IIC_DriveBus> IIC_Bus = |
| 32 | + std::make_shared<Arduino_HWIIC>(IIC_SDA, IIC_SCL, &Wire); |
| 33 | + |
| 34 | +std::unique_ptr<Arduino_IIC> LSM6DSL(new Arduino_LSM6DSL(IIC_Bus, LSM6DSL_DEVICE_ADDRESS, |
| 35 | + DRIVEBUS_DEFAULT_VALUE, DRIVEBUS_DEFAULT_VALUE)); |
| 36 | + |
| 37 | +void setup() |
| 38 | +{ |
| 39 | + Serial.begin(115200); |
| 40 | + Serial.println("Ciallo"); |
| 41 | + |
| 42 | + // pinMode(LSM6DSL_IIC_ADDRESS_MODE, OUTPUT); |
| 43 | + // digitalWrite(LSM6DSL_IIC_ADDRESS_MODE, LOW); // 设置LSM6DSL的IIC地址为0x6A |
| 44 | + |
| 45 | + while (LSM6DSL->begin() == false) |
| 46 | + { |
| 47 | + Serial.println("LSM6DSL initialization fail"); |
| 48 | + delay(2000); |
| 49 | + } |
| 50 | + Serial.println("LSM6DSL initialization successfully"); |
| 51 | + |
| 52 | + // 设置加速度传感器性能模式为高性能模式 |
| 53 | + LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_ACCELERATION_POWER_MODE, |
| 54 | + LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_DEVICE_HIGH_POWER); |
| 55 | + // 设置加速度传感器灵敏度为 ±16g |
| 56 | + LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_ACCELERATION_SENSITIVITY, |
| 57 | + 16); |
| 58 | + |
| 59 | + // 设置陀螺仪传感器性能模式为高性能模式 |
| 60 | + LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_GYROSCOPE_POWER_MODE, |
| 61 | + LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_DEVICE_HIGH_POWER); |
| 62 | + // 设置陀螺仪传感器灵敏度为 ±2000dps |
| 63 | + LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_GYROSCOPE_SENSITIVITY, |
| 64 | + 2000); |
| 65 | + |
| 66 | + Serial.printf("\nStart calibrating the gyroscope and accelerometer\n"); |
| 67 | + delay(1000); |
| 68 | + // 将器件静止后再校正陀螺仪传感器 |
| 69 | + while (LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_GYROSCOPE_CORRECTION, |
| 70 | + 100) == false) |
| 71 | + { |
| 72 | + Serial.printf("\nLSM6DSL gyroscope correction fail\n"); |
| 73 | + Serial.printf("Please ensure that the device is in a stationary state!\n\n"); |
| 74 | + delay(1000); |
| 75 | + } |
| 76 | + Serial.printf("LSM6DSL gyroscope correction successfully\n"); |
| 77 | + // 将器件正放静止后再校正加速度传感器 |
| 78 | + // 最好在陀螺仪校正后立即进行加速度校正 |
| 79 | + while (LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_ACCELERATION_CORRECTION, |
| 80 | + 100) == false) |
| 81 | + { |
| 82 | + Serial.printf("\nLSM6DSL acceleration correction fail\n"); |
| 83 | + Serial.printf("Please ensure that the device is in a stationary state!\n\n"); |
| 84 | + delay(1000); |
| 85 | + } |
| 86 | + Serial.printf("LSM6DSL acceleration correction successfully\n\n"); |
| 87 | + delay(1000); |
| 88 | + |
| 89 | + // FIFO ON |
| 90 | + // // 设置设备FIFO性能模式为高性能模式 |
| 91 | + // LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_FIFO_POWER_MODE, |
| 92 | + // LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_DEVICE_HIGH_POWER); |
| 93 | + // // 设置设备FIFO工作模式为Bypass模式 |
| 94 | + // LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_FIFO_WORK_MODE, |
| 95 | + // LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_FIFO_BYPASS); |
| 96 | + // // 设置设备FIFO获取数据类型为加速度和陀螺仪传感器的数据 |
| 97 | + // LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_FIFO_DATA_TYPE, |
| 98 | + // LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_FIFO_DATA_ACCELERATION_GYROSCOPE); |
| 99 | + // // 设置加速度传感器的FIFO的抽取因子为1 |
| 100 | + // LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_FIFO_ACCELERATION_FACTOR, |
| 101 | + // 1); |
| 102 | + // // 设置陀螺仪传感器的FIFO的抽取因子为1 |
| 103 | + // LSM6DSL->IIC_Write_Device_Value(LSM6DSL->Arduino_IIC_IMU::Device_Value::IMU_FIFO_GYROSCOPE_FACTOR, |
| 104 | + // 1); |
| 105 | +} |
| 106 | +void loop() |
| 107 | +{ |
| 108 | + // if (millis() > CycleTime1) |
| 109 | + // { |
| 110 | + // Serial.printf("--------------------LSM6DSL--------------------\n"); |
| 111 | + // Serial.printf("System running time: %d\n\n", (uint32_t)millis() / 1000); |
| 112 | + // Serial.printf("IIC_Bus.use_count(): %d\n\n", (int32_t)IIC_Bus.use_count()); |
| 113 | + |
| 114 | + // Serial.printf("ID: %#X \n", (int32_t)LSM6DSL->IIC_Read_Device_ID()); |
| 115 | + |
| 116 | + // // 只有在启动加速度或陀螺仪的时候才能查看设备温度 |
| 117 | + // Serial.printf("IMU Device Temperature: %.3f ^C \n", |
| 118 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_TEMPERATURE_VALUE)); |
| 119 | + |
| 120 | + // Serial.printf("--------------------LSM6DSL--------------------\n"); |
| 121 | + // CycleTime1 = millis() + 5000; |
| 122 | + // } |
| 123 | + |
| 124 | + if (millis() > CycleTime2) |
| 125 | + { |
| 126 | + // FIFO OFF |
| 127 | + // Arduino-IDE Serial Plotter |
| 128 | + // IMU Acceleration |
| 129 | + // 单位mg |
| 130 | + // Serial.printf("%.6f,%.6f", (float)-1200, (float)1200); |
| 131 | + // Serial.printf(",%.6f", |
| 132 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_X_SIGNED)); |
| 133 | + // delay(5); |
| 134 | + // Serial.printf(",%.6f", |
| 135 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_Y_SIGNED)); |
| 136 | + // delay(5); |
| 137 | + // Serial.printf(",%.6f", |
| 138 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_Z_SIGNED)); |
| 139 | + // delay(5); |
| 140 | + // Serial.printf("\n"); |
| 141 | + |
| 142 | + // g单位转化为m/s²单位 |
| 143 | + // 将加速度计(g)的值乘以9.81即可将其转换为米每秒的平方 |
| 144 | + // Serial.printf("%.6f,%.6f", (float)-12, (float)12); |
| 145 | + // Serial.printf(",%.6f", |
| 146 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_X_SIGNED) / 1000 * 9.81); |
| 147 | + // delay(5); |
| 148 | + // Serial.printf(",%.6f", |
| 149 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_Y_SIGNED) / 1000 * 9.81); |
| 150 | + // delay(5); |
| 151 | + // Serial.printf(",%.6f", |
| 152 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_ACCELERATION_Z_SIGNED) / 1000 * 9.81); |
| 153 | + // delay(5); |
| 154 | + // Serial.printf("\n"); |
| 155 | + |
| 156 | + // IMU Gyroscope |
| 157 | + // 单位dps/s |
| 158 | + // Serial.printf("%.6f,%.6f", (float)-2000, (float)2000); |
| 159 | + // Serial.printf(",%.6f", |
| 160 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_X_SIGNED) / 1000); |
| 161 | + // delay(5); |
| 162 | + // Serial.printf(",%.6f", |
| 163 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_Y_SIGNED) / 1000); |
| 164 | + // delay(5); |
| 165 | + // Serial.printf(",%.6f", |
| 166 | + // LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_Z_SIGNED) / 1000); |
| 167 | + // delay(5); |
| 168 | + // Serial.printf("\n"); |
| 169 | + |
| 170 | + // dps/s单位转化为rad/s单位 |
| 171 | + // 一圈等于360度或2π弧度 每秒转的度数需要乘以 π/180 来转换为弧度每秒 |
| 172 | + Serial.printf("%.6f,%.6f", (float)-10, (float)10); |
| 173 | + Serial.printf(",%.6f", |
| 174 | + (acos(-1) / 180) * LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_X_SIGNED) / 1000); |
| 175 | + delay(10); |
| 176 | + Serial.printf(",%.6f", |
| 177 | + (acos(-1) / 180) * LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_Y_SIGNED) / 1000); |
| 178 | + delay(10); |
| 179 | + Serial.printf(",%.6f\n", |
| 180 | + (acos(-1) / 180) * LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_GYROSCOPE_Z_SIGNED) / 1000); |
| 181 | + delay(10); |
| 182 | + |
| 183 | + // FIFO ON |
| 184 | + // // 重启FIFO清除FIFO缓存中的数据 |
| 185 | + // LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_FIFO_WORK_MODE, |
| 186 | + // LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_FIFO_BYPASS); |
| 187 | + // LSM6DSL->IIC_Write_Device_State(LSM6DSL->Arduino_IIC_IMU::Device::IMU_FIFO_WORK_MODE, |
| 188 | + // LSM6DSL->Arduino_IIC_IMU::Device_Mode::IMU_FIFO_NORMAL); |
| 189 | + |
| 190 | + // // DATA_PATTERN 范围为0-1023 |
| 191 | + // Serial.printf("%d ", |
| 192 | + // (int16_t)LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_FIFO_DATA_PATTERN)); |
| 193 | + // for (int i = 0; i < 1024; i++) |
| 194 | + // { |
| 195 | + // Serial.printf("%d ", |
| 196 | + // (int16_t)LSM6DSL->IIC_Read_Device_Value(LSM6DSL->Arduino_IIC_IMU::Value_Information::IMU_FIFO_DATA)); |
| 197 | + // } |
| 198 | + // Serial.printf("\n"); |
| 199 | + |
| 200 | + CycleTime2 = millis() + 50; |
| 201 | + } |
| 202 | +} |
0 commit comments