extract mpu

This commit is contained in:
sfja 2026-03-28 16:53:27 +01:00
parent 336df77969
commit da33911aa3
6 changed files with 111 additions and 59 deletions

View File

@ -1,5 +1,5 @@
idf_component_register(
SRCS skateboard.c wifi.c
SRCS skateboard.c app_wifi.c app_mpu.c
PRIV_REQUIRES nvs_flash esp_wifi
INCLUDE_DIRS ".")

71
skateboard/main/app_mpu.c Normal file
View File

@ -0,0 +1,71 @@
#include "app_mpu.h"
#include "esp_log.h"
#include "mpu6050.h"
extern const char* TAG;
#ifdef CONFIG_MPU6050_I2C_ADDRESS_LOW
#define MPU6050_I2C_ADDRESS MPU6050_I2C_ADDRESS_LOW
#else
#define MPU6050_I2C_ADDRESS MPU6050_I2C_ADDRESS_HIGH
#endif
#define MPU6050_SDA_GPIO CONFIG_MPU6050_SDA_GPIO
#define MPU6050_SCL_GPIO CONFIG_MPU6050_SCL_GPIO
void app_mpu_init(AppMpu* mpu)
{
ESP_ERROR_CHECK(i2cdev_init());
ESP_ERROR_CHECK(mpu6050_init_desc(
&mpu->dev, MPU6050_I2C_ADDRESS, 0, MPU6050_SDA_GPIO, MPU6050_SCL_GPIO));
ESP_LOGI(TAG,
"Initializing MPU6050 device. Address: 0x%02x, SDA %d, SCL: %d",
MPU6050_I2C_ADDRESS,
MPU6050_SDA_GPIO,
MPU6050_SCL_GPIO);
int retries = 0;
while (true) {
esp_err_t res = i2c_dev_probe(&mpu->dev.i2c_dev, I2C_DEV_WRITE);
if (res == ESP_OK) {
ESP_LOGI(TAG, "Found MPU6050 device");
break;
}
if (retries >= 5) {
ESP_ERROR_CHECK(res);
}
ESP_LOGE(TAG, "MPU6050 not found. Retrying (%d/%d)", retries + 1, 5);
retries += 1;
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_ERROR_CHECK(mpu6050_init(&mpu->dev));
ESP_LOGI(TAG, "MPU6050 acceleration range: %d", mpu->dev.ranges.accel);
ESP_LOGI(TAG, "MPU6050 gyroscope range: %d", mpu->dev.ranges.gyro);
}
void app_mpu_read_acceleration(AppMpu* mpu, float* x, float* y, float* z)
{
mpu6050_acceleration_t acceleration = { 0 };
ESP_ERROR_CHECK(mpu6050_get_acceleration(&mpu->dev, &acceleration));
*x = acceleration.x;
*y = acceleration.y;
*z = acceleration.z;
}
void app_mpu_read_rotation(AppMpu* mpu, float* x, float* y, float* z)
{
mpu6050_rotation_t rotation = { 0 };
ESP_ERROR_CHECK(mpu6050_get_rotation(&mpu->dev, &rotation));
*x = rotation.x;
*y = rotation.y;
*z = rotation.z;
}
void app_mpu_read_temperature(AppMpu* mpu, float* degree_celsius)
{
ESP_ERROR_CHECK(mpu6050_get_temperature(&mpu->dev, degree_celsius));
}

12
skateboard/main/app_mpu.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include "mpu6050.h"
typedef struct AppMpu {
mpu6050_dev_t dev;
} AppMpu;
void app_mpu_init(AppMpu* mpu);
void app_mpu_read_acceleration(AppMpu* mpu, float* x, float* y, float* z);
void app_mpu_read_rotation(AppMpu* mpu, float* x, float* y, float* z);
void app_mpu_read_temperature(AppMpu* mpu, float* degree_celsius);

View File

@ -1,4 +1,4 @@
#include "wifi.h"
#include "app_wifi.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "freertos/idf_additions.h"

View File

@ -1,25 +1,17 @@
#include "app_mpu.h"
#include "app_wifi.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "freertos/idf_additions.h"
#include "i2cdev.h"
#include "mpu6050.h"
#include "nvs_flash.h"
#include "wifi.h"
#include <stdbool.h>
const char* TAG = "skateboard";
#ifdef CONFIG_MPU6050_I2C_ADDRESS_LOW
#define MPU6050_I2C_ADDRESS MPU6050_I2C_ADDRESS_LOW
#else
#define MPU6050_I2C_ADDRESS MPU6050_I2C_ADDRESS_HIGH
#endif
#define MPU6050_SDA_GPIO CONFIG_MPU6050_SDA_GPIO
#define MPU6050_SCL_GPIO CONFIG_MPU6050_SCL_GPIO
typedef struct App {
AppWifi wifi;
AppMpu mpu;
} App;
void app_main(void)
@ -43,60 +35,37 @@ void app_main(void)
};
app_wifi_init(&app.wifi);
ESP_ERROR_CHECK(i2cdev_init());
mpu6050_dev_t mpu = { 0 };
ESP_ERROR_CHECK(mpu6050_init_desc(
&mpu, MPU6050_I2C_ADDRESS, 0, MPU6050_SDA_GPIO, MPU6050_SCL_GPIO));
ESP_LOGI(TAG,
"Initializing MPU6050 device. Address: 0x%02x, SDA %d, SCL: %d",
MPU6050_I2C_ADDRESS,
MPU6050_SDA_GPIO,
MPU6050_SCL_GPIO);
while (true) {
esp_err_t res = i2c_dev_probe(&mpu.i2c_dev, I2C_DEV_WRITE);
if (res == ESP_OK) {
ESP_LOGI(TAG, "Found MPU6050 device");
break;
}
ESP_LOGE(TAG, "MPU6050 not found");
vTaskDelay(pdMS_TO_TICKS(1000));
}
ESP_ERROR_CHECK(mpu6050_init(&mpu));
ESP_LOGI(TAG, "Acceleration range: %d", mpu.ranges.accel);
ESP_LOGI(TAG, "Gyroscope range: %d", mpu.ranges.gyro);
app_mpu_init(&app.mpu);
ESP_LOGI(TAG, "Initialized");
ESP_LOGI(TAG, "Free memory: %" PRIu32 " bytes", esp_get_free_heap_size());
while (true) {
float accel_x;
float accel_y;
float accel_z;
app_mpu_read_acceleration(&app.mpu, &accel_x, &accel_y, &accel_z);
float rotation_x;
float rotation_y;
float rotation_z;
app_mpu_read_rotation(&app.mpu, &rotation_x, &rotation_y, &rotation_z);
float temp;
mpu6050_acceleration_t accel = { 0 };
mpu6050_rotation_t rotation = { 0 };
ESP_ERROR_CHECK(mpu6050_get_temperature(&mpu, &temp));
ESP_ERROR_CHECK(mpu6050_get_motion(&mpu, &accel, &rotation));
app_mpu_read_temperature(&app.mpu, &temp);
ESP_LOGI(TAG,
"******************************************************************"
"****");
ESP_LOGI(TAG,
"Acceleration: x=%.4f y=%.4f z=%.4f",
accel.x,
accel.y,
accel.z);
ESP_LOGI(TAG,
"Rotation: x=%.4f y=%.4f z=%.4f",
rotation.x,
rotation.y,
rotation.z);
ESP_LOGI(TAG, "Temperature: %.1f", temp);
"Acceleration: x=% 7.2f y=% 7.2f z=% 7.2f "
"Rotation: x=% 7.1f y=% 7.1f z=% 7.1f "
"Temperature: % 2.1f",
accel_x,
accel_y,
accel_z,
rotation_x,
rotation_y,
rotation_z,
temp);
vTaskDelay(pdMS_TO_TICKS(100));
vTaskDelay(pdMS_TO_TICKS(200));
}
}