소스 뷰어
import smbus
import math
import time
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
def read_byte(adr):
return bus.read_byte_data(address, adr)
def read_word(adr):
high = bus.read_byte_data(address, adr)
low = bus.read_byte_data(address, adr + 1)
val = (high << 8) + low
return val
def read_word_2c(adr):
val = read_word(adr)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
def dist(a, b):
return math.sqrt((a*a) + (b*b))
def get_x_rotation(x, y, z):
radians = math.atan2(y, dist(x, z))
return math.degrees(radians)
def get_y_rotation(x, y, z):
radians = math.atan2(x, dist(y, z))
return -math.degrees(radians)
bus = smbus.SMBus(1)
address = 0x68
bus.write_byte_data(address, power_mgmt_1, 0)
count = 0
while 1 :
count += 1
print( f"Count: {count:d}" )
print( f"Gyroscope data" )
print( "-"*14 )
gyro_xout = read_word_2c(0x43)
gyro_yout = read_word_2c(0x45)
gyro_zout = read_word_2c(0x47)
gyro_xout_scaled = gyro_xout/131
gyro_yout_scaled = gyro_yout/131
gyro_zout_scaled = gyro_zout/131
print( f"X out: \t {gyro_xout} \t scaled: \t {gyro_xout_scaled}" )
print( f"Y out: \t {gyro_yout} \t scaled: \t {gyro_yout_scaled}" )
print( f"Z out: \t {gyro_zout} \t scaled: \t {gyro_zout_scaled}" )
print()
print( "Accelerometer data" )
print( "-"*14 )
accel_xout = read_word_2c(0x3b)
accel_yout = read_word_2c(0x3d)
accel_zout = read_word_2c(0x3f)
accel_xout_scaled = accel_xout / 16384.0
accel_yout_scaled = accel_yout / 16384.0
accel_zout_scaled = accel_zout / 16384.0
print( f"X accel out: \t {accel_xout} \t scaled: \t {accel_xout_scaled}" )
print( f"Y accel out: \t {accel_yout} \t scaled: \t {accel_yout_scaled}" )
print( f"Z accel out: \t {accel_zout} \t scaled: \t {accel_zout_scaled}" )
print()
print( "-"*14 )
x_rotation = get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
y_rotation = get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
print( f"X rotation: \t {x_rotation}" )
print( f"Y rotation: \t {y_rotation}" )
print()
time.sleep(1)
pass