Manual
do
Maker
.
com
O MPU6050 é um sensor que contém giroscópio, acelerômetro e um termômetro na mesma board. É um dispositivo de alta precisão e baixo custo, com bibliotecas consolidadas para Arduino.
O barramento de comunicação é I²C, interfaceando com o Arduino através dos pinos SDA e SCL, como pode ser visto no wiring.
O nível lógico é 3.3v, mas a board tem um regulador de tensão e alguns resistores de 2k2, 10k, etc. Desse modo, a interface com o Arduino é transparente, podendo ser conectado a 5v sem problemas, sem divisores de tensão ou buffers não-inversores. De verdade, prefira alimentá-lo com 5v, uma vez que ele tem um regulador de tensão; garanta tensão e corrente adequada e sem perda.
O consumo é menor do que um LED, portanto também não é necessário fazer alimentação externa por conta de corrente.
O pino INT (o último, como pode ser visto em wiring) é utilizado para avisar ao Arduino quando o dado está pronto para leitura (dado esse, bufferizado pelo MPU6050).
Esse módulo conta com um recurso chamado DMP, que combina os dados raw do sensor e executa cálculos complexos que feitos diretamente no sketch do Arduino seria chato e entediante. O legal é que esse recurso não era amplamente divulgado pelo fornecedor, mas com a expertise da comunidade e generosidade deles, hoje podemos utilizar esse recurso e ter um sofrimento de moderado à nulo. Para concluir, o DMP tem internamente um recurso de auto-calibragem que vem bem a calhar.
Utilizando seu próprio barramento, você pode interconectá-lo a mais um módulo, mas nada impede que você utilize outros pinos do Arduino ou um multiplexador, ou seja, limites existem, mas dificilmente você os atingirá em seus projetos domésticos. Ainda, você pode interconectar uma búsola a esses pinos extras e ter 9 eixos, coisa que não imagino o quão preciso seria, mas estou me segurando pra não comprar uma pra testar.
Se você ainda não tem, já passou da hora de ter um. Foi com essa belezinha que fiz o robô de auto-balanço utilizando PID (Proporcional Integral Derivativa). O dispositivo você pode comprar com nosso parceiro Fulltronic.
Estou utilizando essa do Jeff. Clique em Download do lado direito da página do GitHub, depois extraia-a em qualquer diretório. Depois copie o diretório Arduino/MPU6050 para o diretório libraries do da sua IDE de desenvolvimento do Arduino. Proceda do mesmo modo com o diretório I2CDev e então, se a IDE já estiver aberta, feche o programa e reabra-o.
A conexão com o dispositivo é bastante simples como você pode reparar na imagem. Clicando na imagem você a verá ampliada e poderá notar mais detalhadamente. o grande problema que vejo é realmente em relação ao posicionamento para calibrá-lo devido à solda dos pinos, mas a solução pode ser prendê-lo ao canto da mesa como fiz, ou então apoiá-lo sobre um palito de sorvete, ou até mesmo palitos de dente, o importante é que realmente fique o mais nivelado possível. De qualquer modo, a calibragem pode ser feita quando bem queira e se preferir, pode inicialmente testar o dispositivo sem maiores preocupações nesse primeiro momento.
A primeira coisa a fazer obviamente é calibrar o sensor. Isso é fundamental, e para maior acuidade, certifique-se de que o dispositivo esteja o mais próximo possível de 0, colocando-o na superfície mais plana que encontrar. Eu utilizei o Smart Tools no meu Android para validar a superfície utilizada para calibrar o MPU6050. Além disso, soldei os pinos previamente e para mantê-lo devidamente alinhado após isso, fui obrigado a prendê-lo com fita adesiva à borda da mesa, deixando seus pinos de fora (outros meios seriam válidos, fiz o que estava mais à mão).
Fiz uma solda bonitinha, bem bonita. Me deu até orgulho! 48 horas depois de testar com Arduino UNO, Leonardo, trocar protoboard, retirar buffer não inversor CD4050, trocar até os cabos, colocar resistor de pull-up, usar 3.3v e 5v do Arduino, regulador de tensão com fonte de alimentação externa e enfim, testar todas as bibliotecas e versões de bibliotecas nas versões de IDE 1.6.5 e 1.6.6 nas últimas 2 versões do Linux Mint e não obter sucesso, optei por usar um scanner de i2c que encontrei pesquisando por alguma idéia para solucionar o problema (e viva o Google). O código não é meu, é simples, limpo e funcional, experimente-o se estiver com problemas também:
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices foundn");
else
Serial.println("donen");
delay(5000); // wait 5 seconds for next scan
}
E então, após abrir o terminal serial e ver a mensagem de "dispositivo não encontrado", cheguei a triste conclusão de que realmente, o giroscópio está com algum defeito. Por outro lado, cheguei à feliz conclusão de que o problema não era eu.
Comprei 2, portanto o que fiz imediatamente com o segundo foi não ter o cuidado que tive com o primeiro; o apoiei sobre a protoboard e encaixei os jumpers sem solda. Então puxei com a mão, pressionando-o contra os jumpers até que o LED dele se acendesse. Após isso, com a outra mão abri o terminal serial novamente para executar o scanner e voilá! Lá estava ele, 0x68.
O que dizer a respeito? Bem, os dispositivos vieram na embalagem anti-estática, mas não estavam lacrados. Comprei mais 2 mas agora com outro vendedor. Não estou acusando nem ele, nem eu, só que como tive essa desventura, optei por aliar-me a outra fonte de energia universal que não esse vendedor, depois passo o link do próximo MPU6050, caso ambos estejam lacrados e funcionarem no teste. E sim, já fiz a solda e o teste, agora tenho tudo funcionando com a segunda peça da primeira compra.
Depois de ter certificado o funcionamento do dispositivo, você pode abrir o exemplo disponível na IDE de desenvolvimento - cujo exemplo você terá após instalar a biblioteca supracitada. Use o MPU6050_DMP6. Valores deverão ser exibidos na tela e esses valores serão necessário para fazer os offsets para sua aplicação.
Enfim, o propósito desse post é justamente ser um adendo referencial ao post que ainda virá (suspense poético), porque não quero escrever nenhum post tedioso mas também não quero deixar escapar detalhes. Ainda assim, espero que consiga ter satisfeito de alguma forma sua necessidade de uma boa leitura!
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.