MPU6050 no Banana Pi em Python

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:

Banana PI M1 pinout
Banana PI M1 pinout
  • 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