树莓派+JY901陀螺仪使用笔记

树莓派-JY901陀螺仪的使用

参考: https://blog.csdn.net/APP852045932/article/details/87995972

注意: IIC地址根据硬件可能不同. 如我的是0X50

JY901类的代码:

import smbus
import time


class JY901:
    def __init__(self, iic_ins, iic_addr=0x50) -> None:
        self.iic_addr = iic_addr
        self.iic_ins = iic_ins

        self.angle_zero_x = 0
        self.angle_zero_y = 0
        self.angle_zero_z = 0

    def read(self) -> dict:
        return {"ANGLE": self._read_angle(), "ACC": self._read_acc(), "GYRO": self._read_gyro()}

    def reset_angle(self) -> None:
        self.angle_zero_x, self.angle_zero_y, self.angle_zero_z = self._read_angle()

    def _read_acc(self) -> tuple:
        return self._read_value(0x34, 16*9.8), self._read_value(0x35, 16*9.8), self._read_value(0x36, 16*9.8)

    def _read_gyro(self) -> tuple:
        return self._read_value(0x37, 2000), self._read_value(0x38, 2000), self._read_value(0x39, 2000)

    def _read_angle(self) -> tuple:
        return self._read_value(0x3d, 180) - self.angle_zero_x, self._read_value(0x3e, 180) - self.angle_zero_y, self._read_value(0x3f, 180) - self.angle_zero_z

    def _read_value(self, cmd: int, constant: float) -> float:
        value = self.iic_ins.read_i2c_block_data(self.iic_addr, cmd, 2)
        value = (value[1] << 8 | value[0]) / 32768 * constant
        if value >= constant:
            value -= 2 * constant
        return value


if __name__ == "__main__":
    jy901 = JY901(smbus.SMBus(1))
    jy901.reset_angle()
    while True:
        print(jy901.read()["ANGLE"])
        time.sleep(0.1)

对于_read_value方法的解释:
value = self.iic_ins.read_i2c_block_data(self.iic_addr, cmd, 2): 向iic_addr(此处即0X50)写入控制字cmd (看数据手册),然后读取2个字节.
这个方法返回数组, 一个元素为一个字节, 格式为十进制无符号整数.

value = (value[1] << 8 | value[0]) / 32768 * constant将读到的两个字节:

  • 读出的两个数表示一个16bit数的前8bit和后8bit. 通过移位运算+或运算把它合成为一个整数.
  • / 32768: 32768 = 2 15 32768 = 2^{15} 32768=215. 对于有符号16bit整数, 范围为 [ − 32768 , 32767 ] [-32768, 32767] [32768,32767]. 将其范围缩放为 [ − 1 , 1 ] [-1, 1] [1,1]. 注: 溢出为负可在之后处理.
  • * constant: 更具数据手册, 找出最大值表示的物理量用标准单位代表的值.
if value >= constant:
    value -= 2 * constant

: 溢出为负的处理

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]中提到的信息,JY61是一个六轴姿态角度传感器,其中包含了陀螺仪加速度计MPU6050和稳压电路。它可以通过串口输出陀螺仪的测量数据。根据引用\[2\]中提到的信息,陀螺仪可以测量三轴的加速度、角速度和角度。 要使用JY61驱动陀螺仪转动90°,你可以通过读取陀螺仪的角度数据来实现。首先,你需要连接JY61到你的控制系统,确保供电电压和通信方式正确设置。然后,通过串口读取JY61输出的角度数据。 具体步骤如下: 1. 将JY61连接到你的控制系统,确保供电电压和通信方式正确设置。 2. 使用串口通信协议与JY61进行通信,读取陀螺仪的角度数据。 3. 在控制系统中编写代码,使陀螺仪旋转到目标角度。可以使用PID控制算法来实现精确的角度控制。 4. 监测陀螺仪的角度数据,直到达到目标角度为止。 需要注意的是,具体的代码实现和控制方法可能因你使用的控制系统而有所不同。你需要根据你的控制系统和编程语言来编写相应的代码。 总结起来,要使用JY61驱动陀螺仪转动90°,你需要连接JY61到你的控制系统,并通过读取陀螺仪的角度数据来实现精确的角度控制。 #### 引用[.reference_title] - *1* *3* [Arduino毕业设计——基于Arduino+PID+AI的自动驾驶小车控制系统设计与实现(毕业论文+程序源码)——自动...](https://blog.csdn.net/m0_66238867/article/details/131063729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JY61说明书](https://blog.csdn.net/hyjicon/article/details/114316183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值