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