RK3568 android11 调试陀螺仪模块 MPU6500

一,MPU6500功能介绍

1.简介

MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动数据。这些数据包括加速度和角速度,分别对应于x, y, z轴。

MPU6500的接口类型包括I2C和SPI,支持数字输出。它可以通过I2C或SPI接口与单片机或其他电子设备进行通信,以获取设备的状态和数据。此外,MPU6500还支持SPI通信模式,这使得其在某些应用中更为灵活。

2.性能与应用

性能方面,MPU6500具有较高的功耗效率和较小的封装尺寸,实现了业内领先的消费类陀螺仪性能。它还在加速计噪声、偏置和灵敏度方面进行了重大改进,进一步提升了其实用性和可靠性。

MPU6500被广泛应用于多种应用程序中,如飞控系统、机器人、可穿戴设备等,特别是在需要高精度运动数据的场合。例如,有报道提到,大疆精灵3的飞控IMU就是采用了InvenSense的MPU6500芯片,显示出其在实际应用中的广泛适用性和良好性能。

总的来说,MPU6500是一款功能强大且性价比高的MEMS运动跟踪设备,适用于各种需要精确运动数据的应用场景。
在这里插入图片描述


二,dts配置

pmu6500通过I2C与CPU连接,使用I2C触摸的接口(VCC,GND,SCL,SDA,INT)。
在这里插入图片描述

&i2c1 {status = "okay";mpu6500_acc: mpu_acc@68 {compatible = "mpu6500_acc";// 与mpu6500_acc.c定义匹配reg = <0x68>;irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_RISING>;//中断脚irq_enable = <0>;poll_delay_ms = <30>;type = <SENSOR_TYPE_ACCEL>;//传感器类型layout = <5>;};mpu6500_gyro: mpu_gyro@68 {compatible = "mpu6500_gyro";//与mpu6500_gyro.c定义匹配reg = <0x68>;poll_delay_ms = <30>;type = <SENSOR_TYPE_GYROSCOPE>;//传感器类型layout = <5>;};
};

三,驱动文件配置

1.源程序

kernel/drivers/input/sensors/accel/mpu6500_acc.c
kernel/drivers/input/sensors/gyro/mpu6500_gyro.c

mpu6500_acc.c是g-sensor驱动用来系统转屏,另外一个mpu6500_gyro.c是陀螺仪驱动。

2.内核中加载驱动

CONFIG_MPU6500_ACC=y
CONFIG_GYRO_MPU6500=y

3.内核日志信息

编译内核烧录镜可看到以下打印日志,则说明驱动加载成功并识别到设备。

rk3568:/ # dmesg | grep mpu6500
[    2.792117] gsensor_mpu6500 1-0068: sensor_register_device: mpu6500_acc, id = 29
[    2.792143] i2c i2c-1: sensor_probe: mpu6500_acc,00000000271b25e0
[    2.792190] gsensor_mpu6500 1-0068: sensor_chip_init:mpu6500_acc:devid=0x0,ops=0x000000007868205c
[    2.988057] gsensor_mpu6500 1-0068: sensor_irq_init:use polling,delay=30 ms
[    2.988177] gsensor_mpu6500 1-0068: sensor_misc_device_register:miscdevice: mma8452_daemon
[    2.988188] gsensor_mpu6500 1-0068: sensor_probe:initialized ok,sensor name:mpu6500_acc,type:2,id=29\x0a
[    5.148660] gyro_mpu6500 1-0068-1: sensor_register_device: mpu6500_gyro, id = 58
[    5.148676] i2c i2c-1: sensor_probe: mpu6500_gyro,0000000057dfc117
[    5.148703] gyro_mpu6500 1-0068-1: sensor_chip_init:mpu6500_gyro:devid=0x0,ops=0x000000000c6bf3bd
[    5.231839] gyro_mpu6500 1-0068-1: sensor_irq_init:use polling,delay=30 ms
[    5.232065] gyro_mpu6500 1-0068-1: sensor_misc_device_register:miscdevice: gyrosensor
[    5.232090] gyro_mpu6500 1-0068-1: sensor_probe:initialized ok,sensor name:mpu6500_gyro,type:4,id=58\x0a
[   26.143380] gsensor_mpu6500 1-0068: set sensor poll time to 66ms
[   26.227813] gsensor_mpu6500 1-0068: sensor on: starting poll sensor data 62ms

四,系统配置

1.Android 中的 sensor 相关宏配置

需要修改Android编译设备配置,添加加速度计和陀螺仪的支持。
BoardConfig.mk中:

BOARD_GRAVITY_SENSOR_SUPPORT := true
BOARD_COMPASS_SENSOR_SUPPORT := false
BOARD_GYROSCOPE_SENSOR_SUPPORT := true
BOARD_PROXIMITY_SENSOR_SUPPORT := false
BOARD_LIGHT_SENSOR_SUPPORT := false
BOARD_PRESSURE_SENSOR_SUPPORT := false
BOARD_TEMPERATURE_SENSOR_SUPPORT := false
BOARD_USB_HOST_SUPPORT := true

支持哪些类型的 sensor,如果没有,要配置成 false,否则 vts 和 cts 测试会失败。

2.启用自动旋转功能,加速度计旋转功能

frameworks/base/core/res/res/values/config.xml:
<bool name="config_supportAutoRotation">true</bool>frameworks/base/packages/SettingsProvider/res/values/defaults.xml:
<bool name="def_accelerometer_rotation">true</bool>

3.编译烧录

编译固件烧录后,正常情况下MPU-6500已经调试完成,进入系统打开设置--显示--自动旋转屏幕,此时转动陀螺仪,系统方向会跟随陀螺仪的方向转动。

加速度和陀螺仪测试:
使用Sensor Sense软件来测试传感器的数据:
在这里插入图片描述
重力变化测试,翻转传感器模块,可看到重力曲线随之变化。


五,调试

1.查看input设备

cat /proc/bus/input/devices

在这里插入图片描述

2.Gsensor 和 gyro 的校准

命令行校准方法,保持机器水平静止放置,输入以下命令校准:

#Gsensor
echo 1 > /sys/class/sensor_class/accel_calibration
#GYRO
echo 1 > /sys/class/sensor_class/gyro_calibration

查看校准值:

cat /sys/class/sensor_class/accel_calibration
cat /sys/class/sensor_class/gyro_calibration

如果无法查看校准值,则说明校准失败,可以打印 kernel log 确定失败原因。校准成功后,校准的值会保存到 nand 或 emmc 的 vendor storage 里面,不会被擦除,开机自动生效。


六,遇到的问题

1.方向不对

理论上x,y,z 3个轴的数据都在± 9.8之间变化。机器完全平放的状态x,y轴接近0,z轴接近9.8。
如果发现方向不对,可以在驱动文件mpu6500_acc.c中交换x,y,z 3个轴的数据。

static int gsensor_report_value(struct i2c_client *client, struct sensor_axis *axis)
{struct sensor_private_data *sensor =(struct sensor_private_data *) i2c_get_clientdata(client);if (sensor->status_cur == SENSOR_ON) {/* Report acceleration sensor information */input_report_abs(sensor->input_dev, ABS_X, axis->x);input_report_abs(sensor->input_dev, ABS_Y, axis->y);input_report_abs(sensor->input_dev, ABS_Z, axis->z);input_sync(sensor->input_dev);}return 0;}
  1. 这段代码是一个函数gyro_report_value,用于向输入子系统报告陀螺仪(gyroscope)传感器的数值。

函数接受两个参数:一个是指向i2c_client结构的指针client,另一个是指向sensor_axis结构的指针axis,sensor_axis结构可能包含了三轴的数值(x、y、z)。
函数通过i2c_get_clientdata(client)获取与i2c_client结构相关联的私有数据结构sensor_private_data的指针sensor。
函数检查sensor结构中的status_cur字段是否等于SENSOR_ON。如果当前传感器状态为开启状态,就会执行以下操作:
a. 使用input_report_rel函数向输入设备报告陀螺仪的x轴数值,并将其存储在ABS_RX中。
b. 使用input_report_rel函数向输入设备报告陀螺仪的y轴数值,并将其存储在ABS_RY中。
c. 使用input_report_rel函数向输入设备报告陀螺仪的z轴数值,并将其存储在ABS_RZ中。
最后,调用input_sync函数将所有报告的输入事件同步到输入设备。

  1. 例如要将X轴和Z轴数据对换后再进行input上报,可以在调用input_report_rel函数之前交换axis->x和axis->z的值。
static int gyro_report_value(struct i2c_client *client, struct sensor_axis *axis)
{struct sensor_private_data *sensor = (struct sensor_private_data *)i2c_get_clientdata(client);if (sensor->status_cur == SENSOR_ON) {/* Swap X and Z axis values */int temp = axis->x;axis->x = axis->z;axis->z = temp;/* Report gyro sensor information with swapped X and Z axis values */input_report_rel(sensor->input_dev, ABS_RX, axis->x);input_report_rel(sensor->input_dev, ABS_RY, axis->y);input_report_rel(sensor->input_dev, ABS_RZ, axis->z);input_sync(sensor->input_dev);}return 0;
}

这样就实现了将X轴和Z轴数据对换后再进行input上报的功能。

2.luncher主界面不旋转

在luncher主界面下不能旋转,但在其他应用中可以旋转(比如“资源管理器”“设置”“计算器”)。
可参考如下修改:

$SDK/frameworks/base# git diff
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 970e63b11f37..398e1ea3c6df 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -570,7 +570,7 @@<!-- If true, the screen can be rotated via the accelerometer in all 4rotations as the default behavior. -->
-    <bool name="config_allowAllRotations">false</bool>
+    <bool name="config_allowAllRotations">true</bool><!-- If true, the direction rotation is applied to get to an application's requestedorientation is reversed.  Normally, the model is that landscape is

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab|基于Logistic函数负荷需求响应

目录 1 基于Logistic函数的负荷转移率模型 2 程序示例 3 效果图 4 下载链接 负荷需求响应模型种类较多&#xff0c;有电价型和激励型等类型&#xff0c;本次和大家分享一个基于Logistic函数的负荷转移率模型&#xff0c;该模型属于电价型&#xff0c;由于该方法使用的较少&a…

亿道信息发布两款升级款全加固笔记本电脑

2022年5月19日&#xff0c;加固手持终端。加固平板电脑、加固笔记本电脑专业设计商和制造商&#xff0c;以及加固型移动计算机软硬件整体定制解决方案提供商亿道信息&#xff0c;宣布对其两款广受欢迎的加固笔记本电脑产品EM-X14U和EM-X15U进行重大升级。新发布的两款升级款全加…

《TCP/IP详解 卷一》第10章 UDP 和 IP 分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…

Docker将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

基于React低代码平台开发:构建高效、灵活的应用新范式

文章目录 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 随着数字化转型的深入&…

内核中的Kconfig文件

Kconfig解析 编译内核时用于配置的Kconfig文件 以内核中的ttyprintk.c为例&#xff0c;其位于/kernel-sources/dirver/char/ttyprintk.c 如何将其编译进内核&#xff1f; 在char目录下有Kconfig文件&#xff0c;其中有如下内容 tristate 表示该模块可以选择 Y N M(以.ko形…

华为od机试C卷-最长表达式求值

1 题目描述 提取字符串中的最长合法简单数学表达式子串&#xff0c;字符串长度最长的&#xff0c;并计算表达式的值&#xff0c;如果没有返回0。简单数学表达式只能包含以下内容0-9 数字&#xff0c;符号* 说明: 1.所有数字&#xff0c;计算结果都不超过 long 2.如果有多个长…

递归实现n的k次方(C语言)

编写一个函数实现n的k次方&#xff0c;使用递归实现。 下面来说一下思路 5的3次方&#xff1a;就是5*(5的3-1次方) 7的4次方&#xff1a;就是7*&#xff08;7的4-1次方&#xff09; 以此类推 n的k次方就是&#xff1a;n* n的&#xff08;k-1&#xff09;次方 int Func(int n,…

HOOPS Communicator对3D大模型轻量化加载与渲染的4种解决方案

今天给大家介绍一些关于3D Web轻量化引擎HOOPS Commuicator的关键概念&#xff0c;这些概念可以帮您在HOOPS Communicator流缓存服务器之上更好地构建您自己的模型流服务器。如果您是有大型数据集&#xff0c;那么&#xff0c;使用流缓存服务器可以极大地帮助您最大限度地减少内…

Unity-PDF分割器(iTextSharp)

PDF分割器 Unity-PDF分割器前言核心思路解决过程一、Unity安装iTextSharp二、运行时计算将要生成文件的大小三、分割核心代码四、使用StandaloneFileBrowser五、其他的一些脚本六、游戏界面主体的构建MainWindowWarningPanel & FinishPanel By-Round Moon Unity-PDF分割器 …

基于主从模式的Reactor的仿muduo网络库

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目录 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

谷歌浏览器打开,图片糊了

现象&#xff08;问题&#xff09;&#xff1a;早上开机&#xff0c;打开谷歌浏览器发现里面的所有图片相关的都糊了&#xff0c;离谱&#xff01; 查阅一番资料后发现&#xff1a; 谷歌浏览器的硬件加速模式被打开了 解决&#xff1a; 打开谷歌浏览器->设置->系统->…

【C++从练气到飞升】01---C++入门

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 推荐 前言 什么是C C的发展史 &#x1f4cb;命名空间 命名空间定义 命名空间使用 命名空间的嵌套 std命名空间的使用 &#…

编译 qsqlmysql.dll QMYSQL driver not loaded

Qt 连接MySQL数据库&#xff0c;没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图&#xff1a; 安装环境为 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源码&#xff09; 我的安装地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…

2023年下半年教师资格证考试《教育知识与能力》(中学)题

3.李老师在初二选择了人数、性别比例、学习成绩、教材各方面情况相同的两个班进行教学&#xff0c;对其中一班采用讲授法&#xff0c;对另一个班采用自学辅导法&#xff0c;经过一个阶段的教学后进行测验&#xff0c;以比较两种方法教学效果&#xff0c;李老师采用的方法属于&a…

基于yolov5的飞机蒙皮缺陷检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的飞机蒙皮缺陷检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的飞机蒙皮缺陷检测系统是在pytorch框架下实现的&#xff0c;这是一个完…

js【详解】自动类型转换

运算符 Symbol 数字 会报错 Cannot convert a Symbol value to a number Symbol 字符串 会报错 Cannot convert a Symbol value to a string 存在对象&#xff0c;数组&#xff0c;函数时 对象&#xff0c;数组&#xff0c;函数会先执行其 toString() 方法&#xff0c;…

用CSS实现一个扇形

用CSS实现扇形的思路和三角形基本一致&#xff0c;就是多了一个圆角的样式&#xff0c;实现一个90的扇形&#xff1a; div{border: 100px solid transparent;width: 0;heigt: 0;border-radius: 100px;border-top-color: red; }

【c++】list模拟实现

list的接口 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zjw {template<class T>struct listnode {listnode* <T>_next;listnode* <T>_prev;T _data;listnode(const T& x T()):_prev(nulllptr…