(十四)树莓派3B+ wiringPi库的使用--硬件IIC驱动MPU6050

使用之前

在使用树莓派3B+和wiringPi之前希望你已经熟读了和他们相关的文档。
http://wiringpi.com/reference/i2c-library/

  1. 树莓派3B+的引脚图
    在这里插入图片描述
    这张图可以清晰的查看每个引脚的功能。
  2. mpu6050模块电路图
    在这里插入图片描述
    模块外观:
    在这里插入图片描述
    模块的资料地址:http://pan.baidu.com/share/link?shareid=2384903480&uk=1900861665
  3. 我是用的树莓派第一组IIC接口,也就是排针的第3引脚SDA.1接MPU6050模块SDA引脚,牌证第5引脚SCL.1接MPU6050模块的SCL引脚。MPU6050模块的AD0接地。

开启树莓派IIC接口

  1. ssh方式登录树莓派;
  2. 执行sudo su 切换成root用户,如果你是root用户登录,请忽略这一步;
  3. 执行raspi-config,出现如下界面,键盘上下键选择第5个,然后按回车键进入;
    在这里插入图片描述
  4. 继续按键盘上下键,还是第5个,进入IIC;
    在这里插入图片描述
    这里大家可以发现还可以设置其他接口,摄像头,SSH,VNC,SPI,串口等。
  5. 选择
    在这里插入图片描述
    由于之前我已经设置过,且设置成了中文,所以显示是这样的。这里我们按键盘的左右键切换,然后按回车键确定即可。
    当然还可以是直接进入树莓派的桌面去设置。设置完了之后为了保险起见,我们重启sudo reboot一下树莓派。

检查电路连接是否正常

上面我已经说了电路的连接了。下面要做的就是检查电路是否连接正常。

  1. 执行gpio i2cdetect,出现如下效果说明电路连接正常;
    在这里插入图片描述
    这里我们看见了一个68,这个68就是我们的mpu6050的器件地址。关于IIC总线的知识请大家自行百度学习。
  2. 为什么是68呢?这个就需要看数据手册了。
    在这里插入图片描述
    我们事先把模块的AD0接地了,所以b1101000就是68了,这里68应该是十六进制的,也就是0x68。
    这里也说了MPU6050的IIC总线的最大速度是400kHz。
  3. 读取数据,执行i2cdump -y 1 0x68
    在这里插入图片描述
    这里通过终端命令就已经读取到了MPU6050里面寄存器的数据了。
    关于MPU6050的相关寄存器,上面的资料地址里面有数据手册说明。

代码实现

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

//****************************************
// 定义MPU6050内部地址
//****************************************
#define	SMPLRT_DIV		0x19	//陀螺仪采样率,典型值:0x07(125Hz)
#define	CONFIG			0x1A	//低通滤波频率,典型值:0x06(5Hz)
#define	GYRO_CONFIG		0x1B	//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define	ACCEL_CONFIG	0x1C	//加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define	ACCEL_XOUT_H	0x3B
#define	ACCEL_XOUT_L	0x3C
#define	ACCEL_YOUT_H	0x3D
#define	ACCEL_YOUT_L	0x3E
#define	ACCEL_ZOUT_H	0x3F
#define	ACCEL_ZOUT_L	0x40
#define	TEMP_OUT_H		0x41
#define	TEMP_OUT_L		0x42
#define	GYRO_XOUT_H		0x43
#define	GYRO_XOUT_L		0x44	
#define	GYRO_YOUT_H		0x45
#define	GYRO_YOUT_L		0x46
#define	GYRO_ZOUT_H		0x47
#define	GYRO_ZOUT_L		0x48
#define	PWR_MGMT_1		0x6B	//电源管理,典型值:0x00(正常启用)
#define	WHO_AM_I		0x75	//IIC地址寄存器(默认数值0x68,只读)
#define	SlaveAddress	0x68	//MPU6050器件地址

int fd;

// 初始化 mpu6050
void initMPU6050(){
    wiringPiSetup () ;
    fd = wiringPiI2CSetup (SlaveAddress);  
    if (fd >= 0) { // fd 为负数,说明IIC连接失败
        printf("fd = %d\n",fd);
        wiringPiI2CWriteReg8(fd,PWR_MGMT_1,0x00); // 开启温度检测 关闭休眠
        wiringPiI2CWriteReg8(fd,SMPLRT_DIV, 0x07);
        wiringPiI2CWriteReg8(fd,CONFIG, 0x06);
        wiringPiI2CWriteReg8(fd,GYRO_CONFIG, 0x18);
        wiringPiI2CWriteReg8(fd,ACCEL_CONFIG, 0x01);
    }
    else {
        printf("IIC初始化失败");
    }
}
// 读取制定寄存器中的数据
int getData(int reg_address){
   return (wiringPiI2CReadReg8(fd,reg_address) << 8) + wiringPiI2CReadReg8(fd,reg_address + 1);
}


int main (void)
{ 
    initMPU6050();
    for(;;){
        printf("ACCEL_XOUT_data = %d\n",getData(ACCEL_XOUT_H));
        printf("ACCEL_YOUT_data = %d\n",getData(ACCEL_YOUT_H));
        printf("ACCEL_ZOUT_data = %d\n",getData(ACCEL_ZOUT_H));

        printf("GYRO_XOUT_data = %d\n",getData(GYRO_XOUT_H));
        printf("GYRO_YOUT_data = %d\n",getData(GYRO_YOUT_H));
        printf("GYRO_DOUT_data = %d\n",getData(GYRO_ZOUT_H));
		
		// 这里温度计算公式 还没找到具体的出处,百度的,不可靠
        printf("TEMP_OUT_data = %f\n",((double)getData(TEMP_OUT_H)/340 + 36.53)); 
        delay(5000); // 间隔5秒 打印一次数据
    }
	return 0 ;
}

wiringpi相关函数说明

  1. int wiringPiI2CSetup (int devId) ;
    使用给定的设备标识符初始化I2C系统。如果返回负值,则说明初始化失败。
  2. int wiringPiI2CWriteReg8 (int fd, int reg, int data) ;
    往指定的器件fd的寄存器地址reg写入数据data
  3. int wiringPiI2CReadReg8 (int fd, int reg) ;
    从指定的器件fd的寄存器地址reg读取数据。
    上面的2和3是8位器件的操作方式,还有16位器件的操作方式。
    关于MPU6050的相关寄存器说明,这个看数据手册是最准确的。

最后

其实使用wiringpi库区操作IIC并不难,简单的驱动MPU6050并读取数据也不难。难的是怎么使用MPU6050去一些东西。网上很多四轴飞行器和两轮自平衡小车里面都有使用这个。

已标记关键词 清除标记
概要介绍: 本课程主要是介绍并实战一款java中间件~redisson,介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势。本课程的目标就在于带领各位小伙伴一起学习、攻克redisson,更好地巩固自己的核心竞争力,而至于跳槽涨薪,自然不在话下!&nbsp; 课程内容: 说起redisson,可能大伙儿不是很熟悉,但如果说起redis,想必肯定很多人都晓得。没错,这家伙字如其名,它就是架设在redis基础上的一款综合性的、新型的中间件,号称是java企业级应用开发中正确使用redis的姿势/客户端实例。 它是架设在redis基础之上,但拥有的功能却远远多于原生Redis 所提供的,比如分布式对象、分布式集合体系、分布式锁以及分布式服务调度等一系列具有分布式特性的对象实例… 而这些东西debug将在本门课程进行淋漓尽致的介绍并实战,除此之外,我们将基于spring boot2.0搭建的多模块项目实战典型的应用场景:对象存储、数据字典、短信发送、实时/定时邮件发送、布隆过滤器、限流组件、分布式服务调度....课程大纲如下所示: 下面罗列一下比较典型的核心技术栈及其实际业务场景的实战,如下图所示为redisson基于订阅-发布模式的核心技术~主题Topic的实际业务场景,即实时发送邮件: 而下图则是基于“多值映射MultiMap”数据结构实战实现的关于“数据字典”的缓存管理: 除此之外,我们还讲解了可以与分布式服务调度中间件dubbo相媲美的功能:分布式远程服务调度,在课程中我们动手搭建了两个项目,用于分别充当“生产者”与“消费者”角色,最终通过redisson的“服务调度组件”实现服务与服务之间、接口与接口之间的调用!&nbsp; 课程收益: (1)认识并掌握redisson为何物、常见的几种典型数据结构-分布式对象、集合、服务的应用及其典型应用场景的实战; (2)掌握如何基于spring boot2.0整合redisson搭建企业级多模块项目,并以此为奠基,实战企业级应用系统中常见的业务场景,巩固相应的技术栈! (3)站在项目管理与技术精进的角度,掌握对于给定的功能模块进行业务流程图的绘制、分析、模块划分、代码实战与性能测试和改进,提高编码能力与其他软实力; (4)对于Java微服务、分布式、spring boot精进者而言,学完本课程,不仅可以巩固提高中间件的实战能力,其典型的应用场景更有助于面试、助力相关知识点的扫盲! 如下图所示: 关键字:Spring Boot,Redis,缓存穿透,缓存击穿,缓存雪崩,红包系统,Mybatis,高并发,多线程并发编程,发送邮件,列表List,集合Set,排行榜,有序集合SortedSet,哈希Hash ,进阶实战,面试,微服务、分布式 适用人群:redisson学习者,分布式中间件实战者,微服务学习者,java学习者,spring boot进阶实战者,redis进阶实战者
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页