Este documento dá indicações em como aceder ao acelerometro e giroscópio MPU6050 (com o endereço x68) usando o python no Banana Pi M1.
Ligações ao MPU6050
Ligue o MPU6050 ao Banana Pi conforme os pinos exibidos na imagem abaixo e de acordo com esquema que se lhe segue:

- bpi 5V > mpu VCC
- bpi GND > mpu GND
- bpi SCL > mpu SCL
- bpi SDA > mpu SDA
Não tem problema de dpp no nível lógico (o BPI é de 3.3) pois a dpp no pino SDA do MPU6050 é sempre 3.3V, mesmo que a alimentação seja de 5V.
Instalação dos pacotes necessários e eventuais configurações
Se o i2c não estiver configurado nem o pacote de ferramentas i2c estiver instalado então deve proceder à sua instalação e eventual configuração.
Verifique que existem bus i2c com o seguinte comando:
ls -lisa /dev/i2c*
Instale o pacote de ferramentas i2c
apt install i2c-tools
Verifique os bus i2c disponíveis com o comando:
i2cdetect -l
Seguidamente experimentar cada um dos bus disponíveis (indicados no ecran conforme imagem abaixo) e verificar se o endereço do MPU6050 é exibido com o seguinte comando (trocar o 2, pelo numero do bus a testar):
i2cdetect -y 2
Se o MPU6050 for detectado será exibido o endereço 69 na tabela gerada pelo comando (conforme imagem abaixo).

Se existir algum problema e para maiores informações sobre esta parte da configuração do Banana Pi consultar o artigo I2C no Banana PI.
Instalação dos pacotes para exploração i2c em python e python3
apt install build-essential libssl-dev libffi-dev python3-dev python3-smbus apt install python-dev python-smbus
A instalação do Python3 Virtual Environment é opcional, e é efectuada com o seguinte comando:
apt install -y python3-venv
O ambiente virtual permite experimentar vários projectos usando diversas configurações do python.
Não consegui colocar a funcionar o exemplo de comunicação com o MPU6050 dentro de um ambiente virtual.
Programas de exploração do MPU6050 em Python
Os programas de exploração do MPU6050 em Python que listo aqui foram recolhidos na web e os endereços das fontes são indicados no final do documento.
Nota importante: os programas em python são exigentes com a indentação.
MPU6050 em Python – Programa 1
mpu6050-1.py
import smbus
import time
bus = smbus.SMBus(2)
bus.write_byte_data(0x68, 0x6b, 0)
while True:
gyro_data = bus.read_i2c_block_data(0x68, 0x43, 6)
accel_data = bus.read_i2c_block_data(0x68, 0x3b, 6)
gyro_x = ((gyro_data[0] << 8) + gyro_data[1])
gyro_y = ((gyro_data[2] << 8) + gyro_data[3])
gyro_z = ((gyro_data[4] << 8) + gyro_data[5])
accel_x = ((accel_data[0] << 8) + accel_data[1])
accel_y = ((accel_data[2] << 8) + accel_data[3])
accel_z = ((accel_data[4] << 8) + accel_data[5])
print('gyro: x=%05d, y=%05d, z=%05d \t\t accel: x=%05d, y=%05d, z=%05d'%(gyro_x,gyro_y,gyro_z,accel_x,accel_y,accel_z))
time.sleep(1)
Output do programa 1

MPU6050 em Python – Programa 2
mpu6050-2.py
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_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)
bus = smbus.SMBus(2)
address = 0x68
while True:
print ("gyro data")
print ("---------")
gyro_xout = read_word_2c(0x43)
gyro_yout = read_word_2c(0x45)
gyro_zout = read_word_2c(0x47)
print ("gyro_xout: ", gyro_xout, " scaled: ", (gyro_xout / 131))
print ("gyro_yout: ", gyro_yout, " scaled: ", (gyro_yout / 131))
print ("gyro_zout: ", gyro_zout, " scaled: ", (gyro_zout / 131))
print
print ("accelerometer data")
print ("------------------")
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 ("accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled)
print ("accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled)
print ("accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled)
print ("x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))
print ("y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))
time.sleep(1)
Output do programa 2

Fontes:
http://forum.banana-pi.org/t/bpi-m2-berry-use-gy-521-six-axis-attitude-sensor/5376
