TK1(Linux)下通过I2C控制AM2320温湿度传感器和MPU6050加速度传感器(二)

2023-05-16

    做好相关准备后,我们关注的焦点在于怎么控制对应的I2C设备文件。Linux下一切皆文件,控制I2C设备也是通过控制对应的文件来实现的,下面是打开I2C文件过程。

bool MPU6050::openMPU6050()
{
   char fileNameBuffer[32];
   sprintf(fileNameBuffer,"/dev/i2c-%d", kI2CBus);
   kI2CFileDescriptor = open(fileNameBuffer, O_RDWR);
   if (kI2CFileDescriptor < 0) {
       // Could not open the file
      error = errno ;
      return false ;
   }
   //set slave address
   if (ioctl(kI2CFileDescriptor, I2C_SLAVE, kI2CAddress) < 0) {
       // Could not open the device on the bus
       error = errno ;
       return false ;
   }
   return true ;
}
    其中kI2CBus是前面提到过的序号,kI2CFileDescriptor是对应的文件描述符。用ioctl来配置对应的从机地址。第二个参数I2C_SLAVE在<linux/i2c-dev.h>头文件下定义,用于绑定第三个从机地址。完成openMPU6050操作后,就可以通过read,write等函数来读写从机寄存器了。

int MPU6050::i2cwrite(uchar writeAddr, uchar writeValue) {
    int toReturn = i2c_smbus_write_byte_data(kI2CFileDescriptor, writeAddr, writeValue);
    if (toReturn < 0) {
        printf("MPU6050 Write error: %d",errno) ;
        error = errno ;
        toReturn = -1 ;
    }
    return toReturn ;

}
uchar MPU6050::i2cread(uchar writeAddr){
	uchar res = i2c_smbus_read_byte_data(kI2CFileDescriptor, writeAddr);
    if (res < 0) {
        printf("MPU6050 Read error: %d",errno) ;
        error = errno ;
        res = -1 ;
    }
    return res ;
}
    上面是两个关于I2C读写的方法。i2c_smbus_write_byte_data是在kI2CFileDescriptor所指示I2C文件中在writeAddr地址写writeValue数据,也就是给从机寄存器写数据;i2c_smbus_read_byte_data函数则是在指定地址读取数据。i2c_smbus相关函数还有很多,这里不一一列举。

    对于MPU6050来说,操作I2C比较容易,无非是配置参数(指定寄存器写数据),读数据(指定寄存器读数据)。例如初始化initMPU6050:(PWR_MGMT_1等参数均是自己宏定义的)

i2cwrite(PWR_MGMT_1, 0x00);	//解除休眠状态
i2cwrite(SMPLRT_DIV, 0x07); //陀螺仪采样率,典型值:0x07(125Hz)
i2cwrite(CONFIG, 0x06);		//低通滤波频率,典型值:0x06(5Hz)
i2cwrite(GYRO_CONFIG, 0x18);//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
i2cwrite(ACCEL_CONFIG, 0x01);//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)

    从MPU6050读数据:Linux下short是2字节16位

short MPU6050::readData(uchar readAddr){
	char h,l; 
	h=i2cread(readAddr);		
	l=i2cread(readAddr+1);
	return (h<<8)+l;   //合成数据
	
}

    用户操作时只需要

    MPU6050 *acc = new MPU6050();
	
    int err = acc->openMPU6050();
    if (err < 0){
        printf("Error: %d", acc->error);
    } 
    else {
        printf("MPU6050 Device Address: 0x%02X\n",acc->kI2CAddress) ;
        acc->initMPU6050();
	x = acc->readData(ACCEL_XOUT_H);
	y = acc->readData(ACCEL_YOUT_H);
	z = acc->readData(ACCEL_ZOUT_H);
    }
    注意:这里得出的值并不是真实的重力值,而是灵敏度。要得到正确值还需要进行转换。下图是测出来x、y、z轴的灵敏度

如果设置ACCEL_CONFIG是 0x01的话,查表可知满量程是2G, LSB灵敏度是16384


  
i2cwrite(ACCEL_CONFIG, 0x01);//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)



上图的AFS_SEL实际上是ACCEL_CONFIG的第3,4位,从二进制的00~11分别代表设置加速度的满量程单位为2g~16G。


因此有转换公式:加速度值 = 灵敏度值/16384  (量程2G情况下)

同理,角速度也是一样的。下一节介绍AM2320相关内容。

参考资料:

关于I2C_smbus函数讲解可以参考 https://blog.csdn.net/mcgrady_tracy/article/details/50970717

I2C的类构成参考自https://github.com/jetsonhacks/JHLEDBackpack.git



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TK1(Linux)下通过I2C控制AM2320温湿度传感器和MPU6050加速度传感器(二) 的相关文章

  • 查看并关闭占用端口

    查看占用端口 sudo lsof i 8888 关闭占用端口 sudo kill 9 2558243
  • 从水果连连看到两条序列比对

    一 序列比对 Sequence Alignment 序列比对 xff08 sequence alignment xff09 xff0c 目前是生物信息学的基本研究方法 算法类似于连连看 xff0c 规则是上下两个水果一样 xff0c 就可以
  • Nginx 配置详解

    Nginx 配置 文章目录 Nginx 配置文件结构全局配置events 配置http 配置server 配置 Rewrite一 地址重写 xff0c 地址转发 xff0c 重定向二 URL 重写语法 xff1a 使用 xff1a 三 if
  • 趣谈网络协议(一)

    一般来说 xff0c 网上的购物 都是基于应用层的Http协议 那么在这一层协议书我们包装了什么呢 xff0c 请看下图 一 应用层 Http头 http1 1 POST URL 正文格式 content type 长度 content l
  • JS 中 Json 数据的快速排序

    主要方法 span class token comment 升序排列 span span class token keyword function span span class token function up span span cl
  • 生物信息学导师推荐(持续更新)

    本系列会持续更新 xff0c 帮助大家找到更适合自己的导师 xff0c 注意排名不分先后 xff0c 接下来我们开始介绍 xff1a 陈润生 单位 xff1a 中国科学院生物物理研究所 方向 xff1a 长非编码RNA以及编码小肽的系统发现
  • Python 中变量的多种复制方法(常规拷贝,浅拷贝,深拷贝)

    常规拷贝 大家常用的变量复制方法 xff0c 用 61 就行 但是 xff01 但是 xff01 但是 xff01 在我们复制字典和列表时会和我们预想的不一致 接下来 xff0c 做个小实验 常规拷贝在原始变量 x 的改变后 xff0c 因
  • 图解机器学习:分类模型性能评估指标

    人间出现一种怪病 xff0c 患病人群平时正常 xff0c 但偶尔暴饮暴食 xff0c 这种病从外观和现有医学手段无法分辨 为了应对疫情 xff0c 准备派齐天大圣去下界了解情况 事先神官从人间挑选了一些健康人和患病者来对大圣的业务能力进行
  • 数据库涉及大量数据查询时的注意事项

    避免频繁连接和关闭数据库 xff0c 这样会导致IO访问次数太频繁 设计表时要建立适当的索引 xff0c 尤其要在 where 及 order by 涉及的列上建立索引 避免全表扫描 xff0c 以下情况会导致放弃索引直接进行全部扫描 避免
  • axios 使用详解

    一 安装 cnpm install axios 二 使用 三种写法 span class token comment 第一种写法 span axios span class token punctuation span span class
  • 生物序列比对的几种应用场景(图文)

    今天和大家讨论几种序列比对的应用场景 xff0c 当然只是抛转引玉 xff0c 如果小伙伴有其他应用场景 xff0c 欢迎讨论 一 物种 基因的进化 二 基因组学 2 1 比较基因组学揭示保守区 2 2 比较基因组学揭示功能元件 例如上图的
  • 图解机器学习之回归模型性能评估指标

    一个房价预测的任务 xff0c 老板说你看看这个模型咋样 xff1f 我们先绘制一个坐标轴 xff1a Y 轴为房价 xff0c X 轴为年份 将过去房价数据绘制为绿色 xff0c 回归模型绘制为蓝色 关键问题是 xff0c 怎么知道这个模
  • Chrome 将 http 域名自动跳转 https 的解决方案

    问题来源 使用 Chrome 内核浏览器 xff0c 包括 Google Chrome xff0c edge xff0c 360浏览器等 为了安全在访问同一域名时 xff0c 只要访问过带有 https 域名 xff0c 如果再使用http
  • 一文读懂相分离(图文详解)

    目录 什么是相分离 xff1f 相分离的原理 相分离的分子功能 生物信息中的相分离 一 什么是相分离 xff1f 相分离 phase separation 本身是一个物理化学概念 xff0c 二元或多元混合物会在一定的条件下分离为不同的相
  • g++: 内部错误:Killed (程序 cc1plus)

    这个原因是内存不足 xff0c 在linux下增加临时swap空间 step 1 sudo dd if 61 dev zero of 61 home swap bs 61 64M count 61 16 注释 xff1a of 61 hom
  • React 开发 | 样式模块化

    1 使用 ES6 实现样式模块化 xff0c 避免样式冲突 index module css span class token punctuation span title span class token punctuation span
  • React 开发 | 父子组件间通信

    文章目录 一 省流二 父传子例子三 子传父例子 一 省流 父组件 gt 子组件 xff1a 通过 props 传递 子组件 gt 父组件 xff1a 通过 props 传递 xff0c 但是父组件需要提取给子组件传递一个预定义的函数 二 父
  • React 开发 | 常用 Hooks

    useState 作用 用于函数式组件操作 state xff0c 类似于类组件的 setState 写法 xff1a state setState 61 useState initValue state xff1a 状态变量名setSta
  • React 项目部署后,页面404解决

    解决方法一 xff1a Nginx 配置 span class token punctuation span listen span class token number 80 span span class token punctuati
  • 一文读懂 UniProt 数据库(2023 最新版)

    一 UniProt 数据库介绍 Uniprot xff08 Universal Protein xff09 是包含蛋白质序列 xff0c 功能信息 xff0c 研究论文索引的蛋白质数据库 xff0c 整合了包括EBI xff08 Europ

随机推荐

  • 理解泛型调用和函数调用签名

    这里通过五个示例逐步理解泛型调用和函数调用签名 span class token comment 64 Author Zheng Lei 64 Email baimoc 64 163 com 64 Date 2023 01 18 16 29
  • 图解统计学 10 | 贝叶斯公式与全概率公式

    文章目录 概率联合概率条件概率全概率公式贝叶斯公式 过年了 xff0c 作为水果店老板的我们 xff0c 一共进了三种水果 xff0c 其中 xff1a 西瓜 xff1a 50个 香蕉 xff1a 30个 橙子 xff1a 20个 为了方便
  • 中断处理流程

    大家都说在中断处理函数中不能调度 xff0c 或者说睡眠 这到底为什么 xff1f 下面看中断处理的过程 xff0c 从中是否能找到原因 中断发生后会调到 irq svc xff1a align 5 irq svc svc entry ir
  • ROS Publishers

    ROS的发布者 在python语言中 xff0c ROS发布者定义格式如下 xff1a pub1 61 rospy Publisher topic name message type queue size 61 size topic nam
  • 用已有镜像创建容器

    背景 想编译一套针对arm架构上CPU的keepalived xff0c 现有条件是 xff0c 有一套arm的CPU xff0c 上面已经安装了centos7 xff0c 为了不影响本身系统的环境 xff0c 所以想着创建一个容器来隔离环
  • Ubuntu 18.04生命周期现被扩展至10年

    为更好的与刚被蓝色巨人 IBM 收购的红帽展开竞争 xff0c Ubuntu 18 04 LTS长期支持版周期被扩展至整整10年 正常情况下 Ubuntu LTS 长期支持版的生命周期都是五年 xff0c 即在五年内这些版本都会持续提供安全
  • 卡尔曼滤波(Kalman filtering)小结

    最近项目用到了kalman滤波 xff0c 本博文简单介绍下卡尔曼滤波器的概念 原理和应用 xff0c 做个小结 概念 卡尔曼滤波 xff08 Kalman filtering xff09 一种利用线性系统状态方程 xff0c 通过系统输入
  • Cmake:编写CMakeLists.txt文件编译C/C++程序

    1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件
  • 官方免费的正版Xshell,人人都可以马上拥有

    找个 Xshell 咋就这么费劲 可以说 Xshell 是 Windows 平台下最好的第三方终端软件了 xff0c 程序员必备 但是屏幕前的你 xff0c 搜索下载 Xshell xff0c 都是跳到奇怪的下载网站 有时候下载的也是免费试
  • 第2章 梅西法 阅读

    梅西法可以用于任何对象集合的排名 xff0c 但是一定要预先定义好成对比较数据 比如乒乓球赛 xff0c 成对比较数据就是两个人PK的结果 xff1b 网页排序 xff0c 成对比较数据可以是两个网页的流量 梅西法的主要思路是构造一个最小二
  • 我与算法的缘分

    六年前 xff0c 我完全不知道算法是什么东西 六年后 xff0c 我看到算法就两眼放光 六年的时间让我从算法小菜鸟蜕变成算法爱好者 大一上学期 xff0c 我对算法一点概念都没有 xff0c 当时老师让我们用伪代码写算法 xff0c 我基
  • EM算法 实例讲解

    第一次接触EM算法 xff0c 是在完成半隐马尔科夫算法大作业时 我先在网上下载了两份Baum Welch算法的代码 xff0c 通过复制粘贴 xff0c 修修补补 xff0c 用java实现了HMM算法 xff08 应用是韦小宝掷两种骰子
  • 机器学习漫谈

    机器学习漫谈 数据挖掘 机器学习项目一般包括四个关键部分 xff0c 分别是 xff0c 数据分析 xff0c 特征工程 xff0c 建立模型 xff0c 验证 1 数据分析 从广义上讲 xff0c 数据分析包括数据收集 xff0c 数据处
  • 2015年机器学习/数据挖掘面试总结

    2015年机器学习 数据挖掘面试总结 明年硕士毕业 xff0c 今年开始找工作 在北方呆的太久 xff0c 想回湿润的南方 第一站 xff08 3月份 xff09 xff0c 阿里数据挖掘实习生面试 个人觉得 xff0c 阿里的面试是最人性
  • 研究生和本科有什么不同?

    本科学了4年计算机 xff0c 研究生又学了2年计算机 xff0c 感觉两个阶段的生活学习还是挺不一样的 一 在同学间的交流方面 xff0c 大学生比研究生交流更频繁 xff0c 交友更广泛 初中高中时 xff0c 大家座位固定 xff0c
  • 网易游戏2016校园招聘数据挖掘研究员在线笔试题和答案

    刚做完网易在线笔试题 xff0c 感触最深的地方是 xff0c 虽然题目形式和ACM题目相似 xff0c 但是内容更偏向于实际应用 总共有四个题目 xff0c 第一个题目属于字符串匹配类型 xff0c 难度较低 xff0c 第二个题目是模拟
  • ModemManager 1.10发布

    导读ModemManager是FreeDesktop org项目 xff0c 用于控制类似于NetworkManager进行网络连接的移动宽带设备 连接 上周 xff0c ModemManager 1 10被悄悄地作为最新的功能发布 Mod
  • C++程序设计陷阱读书笔记(一)

    差不多有三年没系统地温习C 43 43 程序设计了 xff0c 但面试官问起这方面的知识时 xff0c 我有种恍然隔世的感觉 年龄越大越难静下心来读完一本专业书 xff0c 越学心越浮躁 将所看所思记录下来能稍微提高一下学习效率 下面是我读
  • TK1(Linux)下通过I2C控制AM2320温湿度传感器和MPU6050加速度传感器(一)

    在TK1上有6条I2C总线可用 xff0c 这里只具体介绍两条常用的GEN1 I2C和 GEN2 I2C xff1a 其他的I2C使用方法类似 xff0c 就不一一赘述 GEN1 I2C引脚电压1 8V xff0c dev下的设备名是 i2
  • TK1(Linux)下通过I2C控制AM2320温湿度传感器和MPU6050加速度传感器(二)

    做好相关准备后 xff0c 我们关注的焦点在于怎么控制对应的I2C设备文件 Linux下一切皆文件 xff0c 控制I2C设备也是通过控制对应的文件来实现的 xff0c 下面是打开I2C文件过程 bool MPU6050 openMPU60