树莓派IIC读取陀螺仪JY901数据

本文介绍了如何使用树莓派的IIC接口,通过Python3读取JY901陀螺仪的数据。在硬件正确连接后,通过i2cdetect命令检测设备,并根据JY901的说明书找到寄存器地址,实现了多个JY901同时工作的数据读取。文章提供了异常处理的简单概述,旨在帮助初学者理解和应用IIC通信方式。
摘要由CSDN通过智能技术生成

基本描述:9轴姿态角度传感器广泛用于物联网开发,其中JY901陀螺仪由于自带卡尔曼动态滤波算法便作为了我硬件开发的选择。JY901陀螺仪基本可以在各个平台上进行数据的读取(如arduino、stm32、树莓派、上位机等),但由于JY901的官方只提供了树莓派串口通信的读取方式,而未提供树莓派IIC通信的读取方式。为了实现树莓派上多个JY901陀螺仪的同时运作,本方案决定采用使用IIC通信方式,用Python3进行数据的读取。

第一步:硬件连接

将JY901陀螺仪对应的VCC、SDA、SCL、GND与树莓派进行连接

第二步:

使用i2cdetect命令侦测是否成功接入I2C的设备:

sudo i2cdetect -y 1
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

查看该地址下的设备寄存器信息

i2cdump -y 1 0x51
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 1e 06 02 00 00 00 f8 1b fe 00 00 00 00 00    ..???...???.....
10: 00 00 00 0
好的,下面是STM32通过IIC读取MPU6050陀螺仪芯片数据的核心程序: 首先需要定义IIC初始化函数和IIC读取函数: ```c void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void IIC_Start(void) { SDA_H; SCL_H; delay_us(5); SDA_L; delay_us(5); SCL_L; } void IIC_Stop(void) { SDA_L; SCL_H; delay_us(5); SDA_H; delay_us(5); } void IIC_Send_Byte(uint8_t txd) { uint8_t i; for (i = 0; i < 8; i++) { if ((txd & 0x80) >> 7) SDA_H; else SDA_L; txd <<= 1; SCL_H; delay_us(5); SCL_L; delay_us(5); } } uint8_t IIC_Read_Byte(unsigned char ack) { uint8_t i, receive = 0; SDA_H; for (i = 0; i < 8; i++) { SCL_H; delay_us(5); receive <<= 1; if (SDA_READ) receive++; SCL_L; delay_us(5); } if (ack) IIC_Ack(); else IIC_NAck(); return receive; } void IIC_Ack(void) { SDA_L; SCL_H; delay_us(5); SCL_L; delay_us(5); SDA_H; } void IIC_NAck(void) { SDA_H; SCL_H; delay_us(5); SCL_L; delay_us(5); } ``` 接下来,是MPU6050的初始化函数和读取数据函数: ```c void MPU6050_Init(void) { IIC_Start(); //起始信号 IIC_Send_Byte(MPU6050_ADDR); //发送设备地址+写信号 IIC_Send_Byte(0x6B); //内部寄存器地址 IIC_Send_Byte(0x00); //发送数据,内部寄存器初始化为0 IIC_Stop(); //结束信号 delay_ms(10); } void MPU6050_ReadData(void) { int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; IIC_Start(); //起始信号 IIC_Send_Byte(MPU6050_ADDR); //发送设备地址+写信号 IIC_Send_Byte(0x3B); //发送内部寄存器地址,开始读取加速度传感器数据 IIC_Start(); //起始信号 IIC_Send_Byte(MPU6050_ADDR + 1); //发送设备地址+读信号 AcX = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取加速度X轴高8位和低8位 AcY = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取加速度Y轴高8位和低8位 AcZ = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取加速度Z轴高8位和低8位 Tmp = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取温度传感器高8位和低8位 GyX = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取陀螺仪X轴高8位和低8位 GyY = IIC_Read_Byte(1) << 8 | IIC_Read_Byte(1); //读取陀螺仪Y轴高8位和低8位 GyZ = IIC_Read_Byte(0) << 8 | IIC_Read_Byte(0); //读取陀螺仪Z轴高8位和低8位,最后一位NACK IIC_Stop(); //结束信号 } ``` 以上就是STM32通过IIC读取MPU6050陀螺仪芯片数据的核心程序。需要注意的是,程序中的一些宏定义和函数调用需要根据具体的开发板和编译环境进行适当修改。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值