大家好,关于有些新手们买了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,就可以执行了。
运行成功图附上:



