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 命令相当于分别运行以下几个命令:
- 清除 build 文件夹 (idf.py fullclean)
- 移除 sdkconfig 文件 (mv sdkconfig sdkconfig.old)
- 根据选择的“目标”芯片配置项目 (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
效果
平放输出:
[0;32mI (277) cpu_start: Starting scheduler on PRO CPU.[0m
[0;32mI (0) cpu_start: Starting scheduler on APP CPU.[0m
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[0m
[0;32mI (327) cpu_start: Starting scheduler on PRO CPU.[0m
[0;32mI (0) cpu_start: Starting scheduler on APP CPU.[0m
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!