树莓派3B ROS环境下MPU6050 Remote I/O Error(错误121)解决问询
解决MPU6050 Remote I/O Error问题(树莓派3B + ROS)
硬件排查(优先处理,LED不亮大概率是硬件问题)
- 确认I2C总线启用:执行
sudo raspi-config,进入Interface Options -> I2C选择启用,重启树莓派后,用i2cdetect -y 1扫描总线,查看是否有0x68设备(MPU6050默认地址)。如果扫不到,说明硬件连接存在问题。 - 供电检查:MPU6050必须接3.3V电压,禁止接5V(部分模块可能兼容但稳定性极差)。用万用表测量VCC引脚是否有3.3V输出,检查VCC和GND的焊接点是否牢固,有无虚焊、短路情况。
- 引脚连接验证:SDA接树莓派GPIO2(引脚3),SCL接GPIO3(引脚5),确认引脚没有接反,焊接点无松动。
- 模块故障排除:更换一块已知正常的MPU6050模块测试,排除模块本身损坏的可能。
软件配置调整
- 权限问题:访问I2C设备需要root权限,运行ROS节点时加
sudo前缀,比如sudo roslaunch your_package your_launch_file.launch;或者永久授权:执行sudo usermod -aG i2c pi,重启后普通用户即可访问I2C总线。 - 更换SMBus库:树莓派3B使用
smbus2比原生smbus更稳定,安装sudo pip install smbus2,然后将代码中的import smbus改为import smbus2 as smbus。
代码优化与修复
- 唤醒MPU6050:默认情况下MPU6050处于睡眠模式(
PWR_MGMT_1寄存器默认值为0x40),代码中当前设置为1(选择X轴陀螺仪为时钟源),改为0强制唤醒模块:# 原代码 bus.write_byte_data(Device_Address, PWR_MGMT_1, 1) # 修改为 bus.write_byte_data(Device_Address, PWR_MGMT_1, 0) - 添加异常捕获:在I2C读写代码中加入错误处理,避免直接崩溃并输出详细错误信息:
def read_raw_data(addr): try: high = bus.read_byte_data(Device_Address, addr) low = bus.read_byte_data(Device_Address, addr+1) value = ((high << 8) | low) if(value > 32768): value = value - 65536 return value except IOError as e: rospy.logerr("I2C读取错误: %s", str(e)) return 0 def MPU_Init(): try: bus.write_byte_data(Device_Address, SMPLRT_DIV, 7) bus.write_byte_data(Device_Address, PWR_MGMT_1, 0) bus.write_byte_data(Device_Address, CONFIG, 0) bus.write_byte_data(Device_Address, GYRO_CONFIG, 24) bus.write_byte_data(Device_Address, INT_ENABLE, 1) except IOError as e: rospy.logerr("MPU初始化I2C错误: %s", str(e)) rospy.signal_shutdown("初始化失败")
内容的提问来源于stack exchange,提问作者José Santos
相关产品推荐
相关产品推荐

