esp32笔记[3]-mpu6050


 ██████╗ ███████╗██████╗ ██╗   ██╗███████╗
██╔═══██╗██╔════╝██╔══██╗╚██╗ ██╔╝██╔════╝
██║   ██║███████╗██████╔╝ ╚████╔╝ █████╗  
██║▄▄ ██║╚════██║██╔══██╗  ╚██╔╝  ██╔══╝  
╚██████╔╝███████║██████╔╝   ██║   ███████╗
 ╚══▀▀═╝ ╚══════╝╚═════╝    ╚═╝   ╚══════╝
                                          

保命声明:笔者代码能力有限,若行文中有错漏之处欢迎大家指出。

mpu6050简介

MPU-6050 是6轴运动处理传感器,它集成了 3 轴MEMS陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP。使用它就是为了得到待测物体(如四轴飞行器、平衡小车)x、y、z轴的倾角(俯仰角Pitch、翻滚角Roll、偏航角Yaw)。我们通过 I2C 读取到 MPU6050 的六个数据(三轴加速度 AD 值、三轴角速度 AD 值)经过姿态融合后就可以得到 Pitch、Roll、Yaw角。同时mpu6050还可提供温度数据(-40 ~ +85°C,±1)

MPU6050属于MEMS器件,性能会受温度的影响,也就是所谓的温飘。当在温度变化较大的环境中使用时,需要进行温度补偿,或者使IMU保持恒温(参看大疆上的应用),否则计算出来的角度会慢慢漂移。
初始化完了之后,就可以从数据的寄存器中读取数据了。每个数据占两个字节,所以将高位左移八位,然后低位或操作,就可得到原始数据。在main函数中调用这个函数,就可以得到数据了!!

mpu6050坐标系:

mpu6050的寄存器地址:

  • 电源管理寄存器1(0X6B)
  • 陀螺仪配置寄存器(0X1B)
  • 加速度传感器配置寄存器(0X1C)
  • FIFO使能寄存器(0X23)
  • 陀螺仪采样率分频寄存器(0X19)
  • 配置寄存器(0X1A)
  • 电源管理寄存器2(0X6C)
  • 加速度传感器数据输出寄存器(0X3B~0X40)
  • 陀螺仪数据输出寄存器(0X43~0X48)
  • 温度传感器数据输出寄存器(0X41~0X42)

esp-idf新建工程

工程包含要素:

  • CMakeLists.txt
  • Makefile
  • sdkconfig
  • partitions.csv

您可以从 ESP-IDF 中 examples 目录下的 get- started/hello_world 工程开始。
将 get-started/hello_world 工程复制至您本地的 ~/esp 目录下:
进入项目目录,进行menuconfig(工程配置),

cd 目录
export IDF_TARGET="esp32s3"
idf.py set-target esp32s3
idf.py menuconfig
idf.py menuconfig --help
idf.py build

运行 idf.py set-target 命令将清除 build 文件夹的内容,并重新生成一个 sdkconfig 文 件。之前的 sdkconfig 将另存为 sdkconfig.old。
注解: 运行 idf.py set-target 命令相当于分别运行以下几个命令:

  1. 清除 build 文件夹 (idf.py fullclean)
  2. 移除 sdkconfig 文件 (mv sdkconfig sdkconfig.old)
  3. 根据选择的“目标”芯片配置项目 (idf.py -DIDF_TARGET=esp32 reconfigure)
    您也可以将要用的IDF_TARGET设置为环境变量,比如:export IDF_TARGET=esp32s2;或设置为 CMake 变量,比如将 -DIDF_TARGET=esp32s2 以参数形式传递给 CMake 或 idf.py。如果您大多数时间 仅使用一款芯片,则将 IDF_TARGET 配置为环境变量比较方便。
    运行以上命令可以编译应用程序和所有 ESP-IDF 组件,接着生成 bootloader、分区表和应用程序二进制 文件。
    勾选 flash 选项将自动编译并烧录工程,因此无需再运行 idf.py build。
    esptool.py 通过使 USB 转串口转接器芯片(如 FTDI 或 CP210x)的 DTR 和 RTS 控制线生效来自动 复位 ESP32-S3。DTR 和 RTS 控制线又连接到 ESP32-S3 的 GPIO0 和 CHIP_PU (EN) 管脚上,因此 DTR 和 RTS 的电压电平变化会使 ESP32-S3 进入固 件下载模式。

ESP-IDF 构建系统用“组件”的概念“封装”了 CMake,并提供了很多帮助函数来自动将这些组件集成 到项目构建当中。
然而,“组件”概念的背后是一个完整的 CMake 构建系统,因此可以制作纯 CMake 组件。

add_library(json STATIC
cJSON/cJSON.c
cJSON/cJSON_Utils.c)
target_include_directories(json PUBLIC cJSON)

导入库:

# 注册组件 idf_component_register(...)
# 设置 `foo` 项目中的一些 CMake 变量,以控制 `foo` 的构建过程 set(FOO_BUILD_STATIC OFF)
set(FOO_BUILD_TESTS OFF)
# 创建并导入第三方库目标 add_subdirectory(foo)
# 将 `foo` 目标公开链接至 `main` 组件 target_link_libraries(main PUBLIC foo)

每当使用 ESP-IDF 构建系统时,CMake 变量 ESP_PLATFORM 都会被设置为 1。如果要在通用的 CMake 代码加入IDF特定的代码时,可以采用if (ESP_PLATFORM)的形式加以分隔。

测试

关键代码

main.c

/*
编码:UTF-8
标准:C99
mpu6050
*/
/*开始include*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "mpu6050.h"

/*结束include*/

/*开始define*/
#define __ESP32_S3
#define uint8_t unsigned char
#define uint16_t unsigned int
//#define I2C_MASTER_SCL  18//SCL->IO17(在I2C.h文件中定义)
//#define I2C_MASTER_SDA  17//SDA->IO16
/*结束define*/

/*开始全局变量*/
_xyz_f_st Gyro_deg = {0.0, 0.0, 0.0};//mpu6050姿态
_xyz_f_st Acc_mmss = {0.0, 0.0, 0.0};
_xyz_f_st Gyro = {0.0, 0.0, 0.0};
_xyz_f_st Acc = {0.0, 0.0, 0.0};
mpu6050_acceleration_t accel = {//加速度
		.accel_x = 0,
		.accel_y = 0,
		.accel_z = 0,
	};
mpu6050_rotation_t gyro = {//陀螺仪
		.gyro_x = 0,
		.gyro_y = 0,
		.gyro_z = 0,
	};
/*结束全局变量*/

/*开始函数声明*/
void Main_init(void);//主函数初始化
void Main_loop(void);//主函数循环
/*结束函数声明*/

/*主函数*/
void app_main(void){
    Main_init();
    //进入freeRTOS循环

    {//获取mpu6050数据
	mpu6050_get_motion(&accel, &gyro);
    printf("mpu6050 ax:%d;ay:%d;az:%d\n", accel.accel_x, accel.accel_y, accel.accel_z);
    /*陀螺仪转换到角度(度)*/
    Gyro_deg.x = gyro.gyro_x * 0.0610361f; //  /65535 * 4000; +-2000度
    Gyro_deg.y = gyro.gyro_y * 0.0610361f;
    Gyro_deg.z = gyro.gyro_z * 0.0610361f;
    /*加速度计转换到毫米每平方秒*/
    Acc_mmss.x = accel.accel_x * 2.392615f; //   /65535 * 16*9800; +-8G
    Acc_mmss.y = accel.accel_y * 2.392615f;
    Acc_mmss.z = accel.accel_z * 2.392615f;
    printf("mpu6050 ax:%7.2f;ay:%7.2f;az:%7.2f\n", Acc_mmss.x, Acc_mmss.y, Acc_mmss.z);
    printf("mpu6050 gx:%7.2f;gy:%7.2f;gz:%7.2f\n", Gyro_deg.x, Gyro_deg.y, Gyro_deg.z);
    }

    printf("Entered freeRTOS!\n");
    fflush(stdout);//重定向输出
}

/*开始函数本体*/
/*
功能:初始化
*/
void Main_init(void){
    //初始化i2c
    bsp_i2c_master_init();
    //初始化mpu6050
    mpu6050_init();
    printf("mpu6050 connection:%d\n",mpu6050_test_connection());
    printf("mpu6050 tag:%c\n",*mpu6050_get_tag());
}

编译&烧录

cd ESP32_S3_Screen_ksdiy
alias esp-idf='docker run --rm --privileged -v $PWD:/project -w /project -it espressif/idf:v4.4 bash -c'
esp-idf "cd /project/proj_mpu6050 && idf.py set-target esp32s3 && idf.py build"
#擦除原有程序(改成自己的串口号,可能要sudo)
ls /dev/cu*
esptoo.py -h
esptool.py --chip auto --port /dev/cu.usbmodem143301 erase_flash
#烧入bin文件(注意匹配你的 bin文件名、串口号、flash大小与速率、传输波特率等)
cd ./proj_mpu6050/build
esptool.py --chip auto --port /dev/cu.usbmodem143301 -b 921600 --before=default_reset --after=hard_reset write_flash --flash_mode qio --flash_freq 40m --flash_size 8MB 0x0000 bootloader/bootloader.bin 0x10000 proj_mpu6050.bin 0x8000 partition_table/partition-table.bin

效果

平放输出:

I (277) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
6050_ID:0X34mpu6050 connection:1
mpu6050 tag:M
mpu6050 ax:75;ay:-194;az:4249
mpu6050 ax: 179.45;ay:-464.17;az:10166.22
mpu6050 gx:   1.83;gy:   0.49;gz:  -1.95
Entered freeRTOS!

竖放输出:

configuration
I (327) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
6050_ID:0X34mpu6050 connection:1
mpu6050 tag:M
mpu6050 ax:77;ay:-4172;az:423
mpu6050 ax: 184.23;ay:-9981.99;az:1012.08
mpu6050 gx:  -4.33;gy:   0.85;gz:  -1.89
Entered freeRTOS!

posted @ 2023-01-31 18:22  qsBye  阅读(937)  评论(0编辑  收藏  举报