栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

(Rockpi 4b使用心得),Python的smbus模块,mpu6050等模块的使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(Rockpi 4b使用心得),Python的smbus模块,mpu6050等模块的使用

大家好,关于有些新手们买了rockpi4b,或者使用过树莓派的在转rockpi4b的过程中,使用Python中的smbus模块会遇到很多错误,而Python又因为其中的语法特别简单的关系,所以受到了众多程序员的拥戴,而这篇文章主要讲的是使用rockpi4b的时候,和树莓派之间又有什么不同。本人也是在学习rockpi4b的使用,我是没有用过树莓派的经历的,所以我遇到的一些问题都是新手能遇到的问题,所以大家收藏加关注,总有一天你会用到的。。。。。

接线方式:

相信大家和我一样,一开始的时候使用看到rockpi4b和树莓派4b的gpio引脚图长的十分的相似,但是仔细对比一下,又会有一些不同:

 其实在使用的时候,树莓派4b中的很多教程都会交过一个指令就是:

sudo i2cdetect -y 1

 这个指令其实意思是搜索i2c里的1通道里设备占用情况,就比如树莓派以ElectronicWings官网里的接线方式连接了mpu6050以后,执行sudo i2cdetect -y 1,就可以查看到自己的的设备地址就是0x68。在萌新们毫不知情下,如果一模一样的照搬了树莓派4b的接线方式以及代码。就会报很多意义不明的错,导致萌新一直在四处找这个报错怎么修,甚至不惜挂梯子上外网也无济于事。

其实这不是配置的错,是代码里查询的是1通道的设备,但是同样的接线方式rockpi4b接线的是7通道,所以无论如何都无法运行的。

运行代码:

ElectronicWings官网里给的mpu6050与树莓派连接运行的代码是:

Python

'''
        Read Gyro and Accelerometer by Interfacing Raspberry Pi with MPU6050 using Python
	http://www.electronicwings.com
'''
import smbus			#import SMBus module of I2C
from time import sleep          #import

#some MPU6050 Registers and their Address
PWR_MGMT_1   = 0x6B
SMPLRT_DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
INT_ENABLE   = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H  = 0x43
GYRO_YOUT_H  = 0x45
GYRO_ZOUT_H  = 0x47


def MPU_Init():
	#write to sample rate register
	bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)
	
	#Write to power management register
	bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)
	
	#Write to Configuration register
	bus.write_byte_data(Device_Address, CONFIG, 0)
	
	#Write to Gyro configuration register
	bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
	
	#Write to interrupt enable register
	bus.write_byte_data(Device_Address, INT_ENABLE, 1)

def read_raw_data(addr):
	#Accelero and Gyro value are 16-bit
        high = bus.read_byte_data(Device_Address, addr)
        low = bus.read_byte_data(Device_Address, addr+1)
    
        #concatenate higher and lower value
        value = ((high << 8) | low)
        
        #to get signed value from mpu6050
        if(value > 32768):
                value = value - 65536
        return value


bus = smbus.SMBus(1) 	# or bus = smbus.SMBus(0) for older version boards
Device_Address = 0x68   # MPU6050 device address

MPU_Init()

print (" Reading Data of Gyroscope and Accelerometer")

while True:
	
	#Read Accelerometer raw value
	acc_x = read_raw_data(ACCEL_XOUT_H)
	acc_y = read_raw_data(ACCEL_YOUT_H)
	acc_z = read_raw_data(ACCEL_ZOUT_H)
	
	#Read Gyroscope raw value
	gyro_x = read_raw_data(GYRO_XOUT_H)
	gyro_y = read_raw_data(GYRO_YOUT_H)
	gyro_z = read_raw_data(GYRO_ZOUT_H)
	
	#Full scale range +/- 250 degree/C as per sensitivity scale factor
	Ax = acc_x/16384.0
	Ay = acc_y/16384.0
	Az = acc_z/16384.0
	
	Gx = gyro_x/131.0
	Gy = gyro_y/131.0
	Gz = gyro_z/131.0
	

	print ("Gx=%.2f" %Gx, u'u00b0'+ "/s", "tGy=%.2f" %Gy, u'u00b0'+ "/s", "tGz=%.2f" %Gz, u'u00b0'+ "/s", "tAx=%.2f g" %Ax, "tAy=%.2f g" %Ay, "tAz=%.2f g" %Az) 	
	sleep(1)

官网如下:MPU6050 (Accelerometer+Gyroscope) Interfacing with Raspberry Pi |..

 

解决方案:

对照树莓派的引脚发现,这个接线方式是接在了i2c中的1通道上,所以用官网给的代码实际上在rockpi4b上运行是会报错的,而且还会因为报错的奇奇怪怪的原因去百度、谷歌搜索很长时间都没有结果。因为程序中里查询的通道是1通道,所以在树莓派上可以运行成功,但是在rockpi不行。

解决方法一:

依照rockpi4b官网的引脚图把i2c接线至正确的地方,然后运行代码不用修改,就可以正常运行了。但是我又发现,rockpi4b里根本就没有1通道的i2c,所以只能自己修改i2c通道的名字,把7通道修改成1通道,具体如何做的看别的教程,而我也是用了方法二。

解决方法二:

方法二将代码中的i2c通道修改成正确的地方,这样也可以正常运行。

那么如何确定mpu6050所在的通道呢?查看rockpi4b的引脚图就可以发现,按照树莓派的接线方式,我们是把mpu陀螺仪接线在了7通道,所以运行一下i2cdetect指令

sudo i2cdetect -y 7

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

果不其然,最终确定接线是接在了7通道。

然后修改代码:

就是在52行里的:

//bus = smbus.SMBus(1)
bus = smbus.SMBus(7)

这一行代码其实就是修改通道的代码,把数字1修改成7,就可以执行了。 

运行成功图附上:

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019088.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号