You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spydian/lib/gyro.py

64 lines
1.6 KiB
Python

# !/usr/bin/python
import smbus
import math
# Register
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
bus = smbus.SMBus(1)
address = 0x68
bus.write_byte_data(address, power_mgmt_1, 0)
def read_byte(reg):
return bus.read_byte_data(address, reg)
def read_word(reg):
h = bus.read_byte_data(address, reg)
l = bus.read_byte_data(address, reg + 1)
value = (h << 8) + l
return value
def read_word_2c(reg):
val = read_word(reg)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
def dist(a, b):
return math.sqrt((a * a) + (b * b))
def get_y_rotation(x, y, z):
radians = math.atan2(x, dist(y, z))
return -math.degrees(radians)
def get_x_rotation(x, y, z):
radians = math.atan2(y, dist(x, z))
return math.degrees(radians)
def getAllOut():
acceleration_xout = read_word_2c(0x3b)
acceleration_yout = read_word_2c(0x3d)
acceleration_zout = read_word_2c(0x3f)
acceleration_xout_scaled = round(acceleration_xout / 16384.0, 3)
acceleration_yout_scaled = round(acceleration_yout / 16384.0, 3)
acceleration_zout_scaled = round(acceleration_zout / 16384.0, 3)
x_rotation = round(
get_x_rotation(acceleration_xout_scaled, acceleration_yout_scaled, acceleration_zout_scaled), 0)
y_rotation = round(
get_y_rotation(acceleration_xout_scaled, acceleration_yout_scaled, acceleration_zout_scaled), 0)
return {'acc': [acceleration_xout, acceleration_yout, acceleration_zout],
'acc_sca': [acceleration_xout_scaled, acceleration_yout_scaled, acceleration_zout_scaled],
'rot': [x_rotation, y_rotation]}