20 16.0f / 32768.0f, 32.0f / 32768.0f, 64.0f / 32768.0f, 128.0f / 32768.0f,
21 256.0f / 32768.0f, 512.0f / 32768.0f, 1024.0f / 32768.0f, 2048.0f / 32768.0f,
25 MotionComponent::setup();
29 if (!this->
read_byte(QMI8658_REG_WHO_AM_I, &who_am_i)) {
30 ESP_LOGE(TAG,
"Failed to read chip ID - check wiring / address");
34 if (who_am_i != QMI8658_WHO_AM_I_VALUE) {
35 ESP_LOGE(TAG,
"Wrong chip ID: 0x%02X (expected 0x%02X)", who_am_i, QMI8658_WHO_AM_I_VALUE);
41 if (!this->
write_byte(QMI8658_REG_RESET, QMI8658_RESET_CMD)) {
48 if (!this->
write_byte(QMI8658_REG_CTRL1, QMI8658_CTRL1_VALUE)) {
49 this->
mark_failed(LOG_STR(
"Failed to write REG_CTRL1"));
55 this->
mark_failed(LOG_STR(
"Failed to write REG_CTRL2"));
61 this->
mark_failed(LOG_STR(
"Failed to write REG_CTRL3"));
66 if (!this->
write_byte(QMI8658_REG_CTRL5, 0x00)) {
67 this->
mark_failed(LOG_STR(
"Failed to write REG_CTRL5"));
73 if (!this->
write_byte(QMI8658_REG_CTRL7, QMI8658_CTRL7_ACC_EN | QMI8658_CTRL7_GYR_EN)) {
74 this->
mark_failed(LOG_STR(
"Failed to write REG_CTRL7"));
78 ESP_LOGCONFIG(TAG,
"QMI8658 initialised successfully");
103 uint8_t raw_data[REG_READ_LEN];
104 if (!this->
read_bytes(QMI8658_REG_TEMP_L, raw_data, REG_READ_LEN)) {
105 ESP_LOGW(TAG,
"Failed to read IMU data");
111 int16_t raw_x =
encode_uint16(raw_data[ACC_OFFS + 1], raw_data[ACC_OFFS + 0]);
112 int16_t raw_y =
encode_uint16(raw_data[ACC_OFFS + 3], raw_data[ACC_OFFS + 2]);
113 int16_t raw_z =
encode_uint16(raw_data[ACC_OFFS + 5], raw_data[ACC_OFFS + 4]);
114 ESP_LOGV(TAG,
"Read raw accel data: %d, %d, %d", raw_x, raw_y, raw_z);
115 data.acceleration[motion::X_AXIS] = raw_x * scale;
116 data.acceleration[motion::Y_AXIS] = raw_y * scale;
117 data.acceleration[motion::Z_AXIS] = raw_z * scale;
120 raw_x =
encode_uint16(raw_data[GYR_OFFS + 1], raw_data[GYR_OFFS + 0]);
121 raw_y =
encode_uint16(raw_data[GYR_OFFS + 3], raw_data[GYR_OFFS + 2]);
122 raw_z =
encode_uint16(raw_data[GYR_OFFS + 5], raw_data[GYR_OFFS + 4]);
123 ESP_LOGV(TAG,
"Read raw gyro data: %d, %d, %d", raw_x, raw_y, raw_z);
124 data.angular_rate[motion::X_AXIS] = raw_x * scale;
125 data.angular_rate[motion::Y_AXIS] = raw_y * scale;
126 data.angular_rate[motion::Z_AXIS] = raw_z * scale;
131 int16_t raw_t = (int16_t) ((raw_data[TEMP_OFFS + 1] << 8) | raw_data[TEMP_OFFS + 0]);