diff --git a/IMU/main/Kconfig.projbuild b/IMU/main/Kconfig.projbuild index 49e9426..e7812d6 100755 --- a/IMU/main/Kconfig.projbuild +++ b/IMU/main/Kconfig.projbuild @@ -1,7 +1,8 @@ -menu "Example Configuration" +menu "ESP32 IMU Project Configuration" orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps" + menu "I2C Master Configuration" config I2C_MASTER_SCL int "SCL GPIO Num" range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX @@ -21,22 +22,20 @@ menu "Example Configuration" default 400000 help I2C Speed of Master device. + endmenu - config WIFI_SSID - string "WiFi SSID" - default "YourNetworkName" + config ENV_MQTT_ENABLED + bool "Enable MQTT Communication" + default y help - SSID of WiFi network to connect to. - - config WIFI_PASSWORD - string "WiFi Password" - default "YourPassword" - help - Password of WiFi network to connect to. + Enable this option to use MQTT for communication. + If disabled, communication will use usb uart connection. + menu "MQTT Configuration" + depends on ENV_MQTT_ENABLED config MQTT_BROKER_URI string "MQTT Broker URI" - default "mqtt://192.168.178.26:1883" + default "mqtt://192.168.4.2:1883" help URI of the MQTT broker to connect to. @@ -45,23 +44,43 @@ menu "Example Configuration" default "esp32/imu" help MQTT topic to publish IMU data to. + endmenu + menu "WiFi Access Point Configuration" + depends on ENV_MQTT_ENABLED config WIFI_AP_MODE bool "Enable WiFi AP Mode" - default n + default y help Enable this option to start the device in Access Point mode. If disabled, the device will start in Station mode. + config WIFI_SSID + string "WiFi SSID" + default "YourNetworkName" + depends on !WIFI_AP_MODE + help + SSID of WiFi network to connect to. + + config WIFI_PASSWORD + string "WiFi Password" + default "YourPassword" + depends on !WIFI_AP_MODE + help + Password of WiFi network to connect to. + config WIFI_AP_SSID string "WiFi AP SSID" default "ESP32_IMU_AP" + depends on WIFI_AP_MODE help SSID of the WiFi Access Point when in AP mode. config WIFI_AP_PASSWORD string "WiFi AP Password" default "esp32imuap" + depends on WIFI_AP_MODE help Password of the WiFi Access Point when in AP mode. + endmenu endmenu diff --git a/IMU/main/mpu6886.c b/IMU/main/mpu6886.c index 39db089..c9853b2 100644 --- a/IMU/main/mpu6886.c +++ b/IMU/main/mpu6886.c @@ -2,8 +2,8 @@ #include -// New: initialise WiFi in either STA or AP mode. Pass ap_mode=true to start an Access Point. -static void wifi_init(bool ap_mode) +#ifdef CONFIG_ENV_MQTT_ENABLED +static void wifi_init() { ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); @@ -12,54 +12,41 @@ static void wifi_init(bool ap_mode) wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - if (ap_mode) { - esp_netif_create_default_wifi_ap(); +#ifdef CONFIG_WIFI_AP_MODE + esp_netif_create_default_wifi_ap(); - wifi_config_t wifi_config = { 0 }; - strncpy((char *)wifi_config.ap.ssid, CONFIG_WIFI_AP_SSID, sizeof(wifi_config.ap.ssid)); - wifi_config.ap.ssid_len = strlen(CONFIG_WIFI_AP_SSID); - strncpy((char *)wifi_config.ap.password, CONFIG_WIFI_AP_PASSWORD, sizeof(wifi_config.ap.password)); - wifi_config.ap.max_connection = 4; - if (strlen(CONFIG_WIFI_AP_PASSWORD) == 0) { - wifi_config.ap.authmode = WIFI_AUTH_OPEN; - } else { - wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK; - } - - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config)); - ESP_ERROR_CHECK(esp_wifi_start()); - ESP_LOGI("WIFI", "AP started SSID:%s", CONFIG_WIFI_AP_SSID); + wifi_config_t wifi_config = { 0 }; + strncpy((char*)wifi_config.ap.ssid, CONFIG_WIFI_AP_SSID, sizeof(wifi_config.ap.ssid)); + wifi_config.ap.ssid_len = strlen(CONFIG_WIFI_AP_SSID); + strncpy((char*)wifi_config.ap.password, CONFIG_WIFI_AP_PASSWORD, sizeof(wifi_config.ap.password)); + wifi_config.ap.max_connection = 4; + if (strlen(CONFIG_WIFI_AP_PASSWORD) == 0) { + wifi_config.ap.authmode = WIFI_AUTH_OPEN; } else { - esp_netif_create_default_wifi_sta(); - - wifi_config_t wifi_config = { - .sta = { - .ssid = CONFIG_WIFI_SSID, - .password = CONFIG_WIFI_PASSWORD, - }, - }; - - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); - ESP_ERROR_CHECK(esp_wifi_start()); - ESP_ERROR_CHECK(esp_wifi_connect()); - ESP_LOGI("WIFI", "STA started, connecting to: %s", CONFIG_WIFI_SSID); + wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK; } -} + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + ESP_LOGI("WIFI", "AP started SSID:%s", CONFIG_WIFI_AP_SSID); +#else + esp_netif_create_default_wifi_sta(); -static esp_err_t mpu6886_write_byte(mpu6886_t *dev, uint8_t reg, uint8_t data) { - uint8_t tx[2] = { reg, data }; - return i2c_master_write_to_device(dev->i2c_port, dev->address, tx, sizeof(tx), pdMS_TO_TICKS(100)); -} + wifi_config_t wifi_config = { + .sta = { + .ssid = CONFIG_WIFI_SSID, + .password = CONFIG_WIFI_PASSWORD, + }, + }; -static esp_err_t mpu6886_read_bytes(mpu6886_t *dev, uint8_t reg, uint8_t *data, size_t len) { - return i2c_master_write_read_device(dev->i2c_port, dev->address, ®, 1, data, len, pdMS_TO_TICKS(100)); -} + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + ESP_ERROR_CHECK(esp_wifi_connect()); + ESP_LOGI("WIFI", "STA started, connecting to: %s", CONFIG_WIFI_SSID); -static int16_t bytes_to_int16(uint8_t high, uint8_t low) { - return (int16_t)((high << 8) | low); +#endif } static void mqtt_app_start(void) @@ -75,9 +62,22 @@ static void mqtt_app_start(void) } esp_mqtt_client_start(s_mqtt_client); } +#endif // CONFIG_ENV_MQTT_ENABLED -// new: detect accel/gyro full-scale selections and set divisors accordingly -static esp_err_t mpu6886_update_sensitivity(mpu6886_t *dev) +static esp_err_t mpu6886_write_byte(mpu6886_t* dev, uint8_t reg, uint8_t data) { + uint8_t tx[2] = { reg, data }; + return i2c_master_write_to_device(dev->i2c_port, dev->address, tx, sizeof(tx), pdMS_TO_TICKS(100)); +} + +static esp_err_t mpu6886_read_bytes(mpu6886_t* dev, uint8_t reg, uint8_t* data, size_t len) { + return i2c_master_write_read_device(dev->i2c_port, dev->address, ®, 1, data, len, pdMS_TO_TICKS(100)); +} + +static int16_t bytes_to_int16(uint8_t high, uint8_t low) { + return (int16_t)((high << 8) | low); +} + +static esp_err_t mpu6886_update_sensitivity(mpu6886_t* dev) { uint8_t aconf = 0, gconf = 0; esp_err_t err; @@ -123,7 +123,7 @@ static esp_err_t i2c_master_init(i2c_port_t i2c_num, gpio_num_t sda_io, gpio_num return i2c_driver_install(i2c_num, I2C_MODE_MASTER, 0, 0, 0); } -esp_err_t mpu6886_init(mpu6886_t *dev, i2c_port_t i2c_port) { +esp_err_t mpu6886_init(mpu6886_t* dev, i2c_port_t i2c_port) { dev->i2c_port = i2c_port; dev->address = MPU6886_ADDR; @@ -146,8 +146,8 @@ esp_err_t mpu6886_init(mpu6886_t *dev, i2c_port_t i2c_port) { mpu6886_write_byte(dev, MPU6886_ACCEL_CONFIG, 0x00); mpu6886_write_byte(dev, MPU6886_GYRO_CONFIG, 0x00); - dev->gyro_offset = (vec3_t){0, 0, 0}; - dev->accel_offset = (vec3_t){0, 0, 0}; + dev->gyro_offset = (vec3_t) { 0, 0, 0 }; + dev->accel_offset = (vec3_t) { 0, 0, 0 }; // detect actual sensitivities from device registers and set divisors if (mpu6886_update_sensitivity(dev) != ESP_OK) { @@ -159,7 +159,7 @@ esp_err_t mpu6886_init(mpu6886_t *dev, i2c_port_t i2c_port) { return ESP_OK; } -esp_err_t mpu6886_read_accel(mpu6886_t *dev, vec3_t *accel) { +esp_err_t mpu6886_read_accel(mpu6886_t* dev, vec3_t* accel) { uint8_t buf[6]; esp_err_t ret = mpu6886_read_bytes(dev, MPU6886_ACCEL_XOUT_H, buf, 6); if (ret != ESP_OK) return ret; @@ -171,7 +171,7 @@ esp_err_t mpu6886_read_accel(mpu6886_t *dev, vec3_t *accel) { return ESP_OK; } -esp_err_t mpu6886_read_gyro(mpu6886_t *dev, vec3_t *gyro) { +esp_err_t mpu6886_read_gyro(mpu6886_t* dev, vec3_t* gyro) { uint8_t buf[6]; esp_err_t ret = mpu6886_read_bytes(dev, MPU6886_GYRO_XOUT_H, buf, 6); if (ret != ESP_OK) return ret; @@ -182,7 +182,7 @@ esp_err_t mpu6886_read_gyro(mpu6886_t *dev, vec3_t *gyro) { return ESP_OK; } -esp_err_t mpu6886_read_temp(mpu6886_t *dev, float *temp) { +esp_err_t mpu6886_read_temp(mpu6886_t* dev, float* temp) { static uint8_t buf[2]; esp_err_t ret = mpu6886_read_bytes(dev, MPU6886_TEMP_OUT_H, buf, 2); if (ret != ESP_OK) return ret; @@ -192,8 +192,8 @@ esp_err_t mpu6886_read_temp(mpu6886_t *dev, float *temp) { return ESP_OK; } -esp_err_t mpu6886_calibrate_gyro(mpu6886_t *dev, int samples, int delay_ms) { - vec3_t sum = {0, 0, 0}, g; +esp_err_t mpu6886_calibrate_gyro(mpu6886_t* dev, int samples, int delay_ms) { + vec3_t sum = { 0, 0, 0 }, g; for (int i = 0; i < samples; i++) { if (mpu6886_read_gyro(dev, &g) != ESP_OK) return ESP_FAIL; sum.x += g.x; @@ -207,11 +207,11 @@ esp_err_t mpu6886_calibrate_gyro(mpu6886_t *dev, int samples, int delay_ms) { return ESP_OK; } -esp_err_t mpu6886_calibrate_accel(mpu6886_t *dev, int samples, int delay_ms) +esp_err_t mpu6886_calibrate_accel(mpu6886_t* dev, int samples, int delay_ms) { // Calibrate accelerometer offsets while the device is stationary. // The function will detect the device full-scale and compute offsets in m/s^2. - vec3_t sum = {0, 0, 0}, a; + vec3_t sum = { 0, 0, 0 }, a; for (int i = 0; i < samples; i++) { if (mpu6886_read_accel(dev, &a) != ESP_OK) { return ESP_FAIL; @@ -244,28 +244,24 @@ void app_main(void) } - // Start WiFi: set CONFIG_WIFI_AP_MODE in sdkconfig to build in AP mode, - // otherwise the default is STA mode. You can also call wifi_init(true) - // or wifi_init(false) directly to toggle at runtime. -#ifdef CONFIG_WIFI_AP_MODE - wifi_init(true); -#else - wifi_init(false); +#ifdef CONFIG_ENV_MQTT_ENABLED + wifi_init(); + // Start MQTT client (will retry until network is available) + mqtt_app_start(); #endif + mpu6886_t mpu; mpu.i2c_port = I2C_NUM_0; mpu.address = MPU6886_ADDR; esp_err_t ret = mpu6886_init(&mpu, I2C_NUM_0); if (ret != ESP_OK) { - // Handle initialization error ESP_LOGE("MPU6886", "init failed"); return; } - // Start MQTT client (will retry until network is available) - mqtt_app_start(); + mpu6886_calibrate_gyro(&mpu, 100, 10); mpu6886_calibrate_accel(&mpu, 100, 10); @@ -276,17 +272,13 @@ void app_main(void) mpu6886_read_accel(&mpu, &accel); mpu6886_read_gyro(&mpu, &gyro); mpu6886_read_temp(&mpu, &temp); - // ESP_LOGI("MPU6886", "Accel: X=%8.2f Y=%8.2f Z=%8.2f m/s² | Gyro: X=%8.2f Y=%8.2f Z=%8.2f rad/s | Temp: %8.2f °C", - // accel.x, accel.y, accel.z, gyro.x, gyro.y, gyro.z, temp); - // printf("aX=%8.2f aY=%8.2f aZ=%8.2f m/s² | gX=%8.2f gY=%8.2f gZ=%8.2f rad/s | Temp: %8.2f °C\n", - // accel.x, accel.y, accel.z, gyro.x, gyro.y, gyro.z, temp); +#ifndef CONFIG_ENV_MQTT_ENABLED printf("{\"accel\":{\"x\":%8.3f,\"y\":%8.3f,\"z\":%8.3f},\"gyro\":{\"x\":%8.3f,\"y\":%8.3f,\"z\":%8.3f},\"Temp\":%8.2f}\n", - accel.x, accel.y, accel.z, - gyro.x, gyro.y, gyro.z, - temp); - - // Publish readings as JSON over MQTT if client available + accel.x, accel.y, accel.z, + gyro.x, gyro.y, gyro.z, + temp); +#else if (s_mqtt_client != NULL) { char payload[256]; int n = snprintf(payload, sizeof(payload), @@ -301,6 +293,7 @@ void app_main(void) ESP_LOGW("MQTT", "payload truncated or encoding error"); } } +#endif vTaskDelay(pdMS_TO_TICKS(500)); } } diff --git a/IMU/sdkconfig b/IMU/sdkconfig index ba2dde6..129d42a 100644 --- a/IMU/sdkconfig +++ b/IMU/sdkconfig @@ -433,21 +433,38 @@ CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table # -# Example Configuration +# ESP32 IMU Project Configuration # CONFIG_ENV_GPIO_RANGE_MIN=0 CONFIG_ENV_GPIO_RANGE_MAX=39 CONFIG_ENV_GPIO_IN_RANGE_MAX=39 CONFIG_ENV_GPIO_OUT_RANGE_MAX=33 + +# +# I2C Master Configuration +# CONFIG_I2C_MASTER_SCL=22 CONFIG_I2C_MASTER_SDA=21 CONFIG_I2C_MASTER_FREQUENCY=100000 +# end of I2C Master Configuration + +CONFIG_ENV_MQTT_ENABLED=y + +# +# MQTT Configuration +# CONFIG_MQTT_BROKER_URI="mqtt://192.168.4.2:1883" CONFIG_MQTT_TOPIC="esp32/imu" +# end of MQTT Configuration + +# +# WiFi Access Point Configuration +# CONFIG_WIFI_AP_MODE=y CONFIG_WIFI_AP_SSID="ESP32_IMU_AP" CONFIG_WIFI_AP_PASSWORD="esp32imuap" -# end of Example Configuration +# end of WiFi Access Point Configuration +# end of ESP32 IMU Project Configuration # # Compiler options diff --git a/IMU/sdkconfig.old b/IMU/sdkconfig.old index ae4b2c3..7c78ed8 100644 --- a/IMU/sdkconfig.old +++ b/IMU/sdkconfig.old @@ -433,21 +433,38 @@ CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table # -# Example Configuration +# ESP32 IMU Project Configuration # CONFIG_ENV_GPIO_RANGE_MIN=0 CONFIG_ENV_GPIO_RANGE_MAX=39 CONFIG_ENV_GPIO_IN_RANGE_MAX=39 CONFIG_ENV_GPIO_OUT_RANGE_MAX=33 + +# +# I2C Master Configuration +# CONFIG_I2C_MASTER_SCL=22 CONFIG_I2C_MASTER_SDA=21 CONFIG_I2C_MASTER_FREQUENCY=100000 -CONFIG_MQTT_BROKER_URI="mqtt://192.168.178.200:1883" +# end of I2C Master Configuration + +CONFIG_ENV_MQTT_ENABLED=y + +# +# MQTT Configuration +# +CONFIG_MQTT_BROKER_URI="mqtt://192.168.4.2:1883" CONFIG_MQTT_TOPIC="esp32/imu" +# end of MQTT Configuration + +# +# WiFi Access Point Configuration +# CONFIG_WIFI_AP_MODE=y CONFIG_WIFI_AP_SSID="ESP32_IMU_AP" CONFIG_WIFI_AP_PASSWORD="esp32imuap" -# end of Example Configuration +# end of WiFi Access Point Configuration +# end of ESP32 IMU Project Configuration # # Compiler options