Componente · Sensor
MPU-6050 IMU
O MPU-6050 é uma IMU de seis eixos que mede inclinação, rotação e aceleração por I²C, permitindo que um robô se equilibre e vire com precisão.
O que é
O MPU-6050 é a maneira como um robô sente o próprio movimento. É uma unidade de medida inercial de seis eixos—um giroscópio e um acelerômetro em um único chip—que informa como o robô está inclinado, com que rapidez está girando e como está acelerando. Enquanto um sensor ultrassônico observa o mundo à sua frente, uma IMU olha para dentro, para o próprio corpo do robô, que é exatamente o que um robô autoequilibrado ou um navegador por estimativa de posição precisa.
Como funciona
Dentro há dois sensores. O acelerômetro mede aceleração linear nos eixos X, Y e Z—em repouso, isso é apenas gravidade, que informa ao robô qual direção é para baixo (sua inclinação). O giroscópio mede a rapidez com que o robô gira em torno de cada eixo. Você lê ambos por I²C (SCL/SDA).
Nenhum sensor é suficiente sozinho: integre o giroscópio para obter um ângulo e ele derivará lentamente; confie apenas no acelerômetro e ele ficará ruidoso sempre que o robô se mover. A solução é a fusão de sensores—combine as medições para que o acelerômetro corrija a deriva do giroscópio e o giroscópio suavize o ruído do acelerômetro. Essa técnica é exatamente o que o guia sobre ruído, viés e filtragem de sensores aborda.
Quando usar
Use um MPU-6050 quando um robô precisar conhecer a própria orientação ou movimento:
- Robôs autoequilibrados — o ângulo de inclinação que a malha de controle tenta manter em zero.
- Orientação e navegação por estimativa — detecção de curvas para melhorar a odometria entre leituras dos encoders.
- Detecção de movimento / gestos — reagir a ser levantado, inclinado ou sacudido.
Para medir a distância até objetos (paredes, obstáculos), use um sensor de distância como o HC-SR04 ou o VL53L0X—uma IMU detecta o robô, não o mundo.
Conexões e armadilhas
- I²C, 3,3–5 V. A maioria das placas adaptadoras (a GY-521 roxa) tem regulador; portanto, 5 V serve. O chip puro é de apenas 3,3 V.
- Filtre as leituras do giroscópio e do acelerômetro—não controle o robô com uma leitura bruta. Uma única amostra do acelerômetro em movimento é inutilizável como ângulo de inclinação.
- A guinada deriva sem magnetômetro; use o MPU-6050 para arfagem e rolagem e para curvas de curta duração, não para obter uma orientação absoluta de bússola.
- Mantenha-o rígido e nivelado; um sensor solto acrescenta vibração que o filtro não consegue remover.
Pinagem
A placa adaptadora roxa GY-521 é a placa que quase todo mundo quer dizer com “MPU-6050”. São oito pinos, dos quais quatro normalmente ficam desconectados.
| Pino | Nome | O que faz | Normalmente |
|---|---|---|---|
| 1 | VCC | Alimentação. O regulador da placa aceita 3,3–5 V; o chip puro é de apenas 3,3 V | 5 V em um Uno, 3,3 V em um ESP32 |
| 2 | GND | Massa, compartilhada com o microcontrolador | Conectado |
| 3 | SCL | Relógio I²C | A5 em um Uno |
| 4 | SDA | Dados I²C | A4 em um Uno |
| 5 | XDA | Dados I²C auxiliares — para um magnetômetro que o MPU lê por você | Deixado aberto |
| 6 | XCL | Relógio I²C auxiliar | Deixado aberto |
| 7 | AD0 | Seleção de endereço. Baixo (padrão) = 0x68, alto = 0x69 |
Deixado aberto ou ligado ao nível alto para um segundo sensor |
| 8 | INT | Saída de interrupção — dispara quando os dados estão prontos, quando há movimento ou queda livre | Deixado aberto, até você querer parar de consultar |
AD0 é o pino que torna possível usar dois MPU-6050 no mesmo barramento, e é a razão pela qual a colisão de endereços tem aqui uma solução simples que a maioria dos sensores não oferece.
Conexão com um Arduino
| MPU-6050 | Arduino Uno | ESP32 | Observação |
|---|---|---|---|
| VCC | 5 V | 3,3 V | O regulador integrado lida com as duas tensões |
| GND | GND | GND | Precisa ter massa comum com todo o restante |
| SCL | A5 | GPIO 22 | Não adicione resistores de pull-up externos — a placa já tem 2,2 kΩ |
| SDA | A4 | GPIO 21 | O mesmo |
| AD0 | — | — | Ligue-o à VCC somente para um segundo sensor |
Há uma sutileza que vale conhecer em um Arduino de 5 V. Os resistores de pull-up da GY-521 estão conectados à trilha regulada de 3,3 V, portanto as linhas I²C ficam ociosas em 3,3 V, não 5 V. Um ATmega328P lê HIGH acima de 0,6 × Vcc = 3,0 V; portanto, 3,3 V supera o limiar—mas por apenas 0,3 V. Funciona de forma confiável na prática e é uma das razões pelas quais um trecho I²C longo ou ruidoso se comporta mal nesta placa antes de se comportar mal em outra placa de 5 V.
Leitura: os registradores que importam
Você pode controlar este sensor com uma biblioteca e nunca ver um registrador, mas quatro deles explicam quase todos os problemas que as pessoas encontram.
| Registrador | Endereço | Por que importa |
|---|---|---|
PWR_MGMT_1 |
0x6B |
O chip inicializa dormindo. Escreva 0 aqui ou toda leitura será zero |
WHO_AM_I |
0x75 |
Retorna 0x68 — a maneira mais rápida de confirmar que a ligação está correta |
GYRO_CONFIG |
0x1B |
Faixa de escala plena: ±250, ±500, ±1000, ±2000 °/s |
ACCEL_CONFIG |
0x1C |
Faixa de escala plena: ±2, ±4, ±8, ±16 g |
ACCEL_XOUT_H |
0x3B |
Início de 14 bytes: 6 de aceleração, 2 de temperatura, 6 de giroscópio — leia tudo em uma rajada |
Os dois registradores de configuração definem o fator de escala pelo qual se divide as contagens brutas, e um valor incorreto é a causa mais comum de “meus ângulos estão quatro vezes maiores do que deveriam”:
| Configuração de faixa | LSB do giroscópio por °/s | Configuração de faixa | LSB do acelerômetro por g |
|---|---|---|---|
| ±250 °/s (padrão) | 131 | ±2 g (padrão) | 16384 |
| ±500 °/s | 65,5 | ±4 g | 8192 |
| ±1000 °/s | 32,8 | ±8 g | 4096 |
| ±2000 °/s | 16,4 | ±16 g | 2048 |
Escolha a faixa menor que não saturar. Um robô autoequilibrado raramente excede ±250 °/s, e a faixa estreita oferece quatro vezes a resolução de ±1000 °/s sem custo adicional.
Código mínimo funcional
Sem biblioteca—este é o código inteiro, e vale executá-lo uma vez para saber o que a biblioteca está fazendo por você.
#include <Wire.h>
const uint8_t MPU = 0x68; // 0x69 if AD0 is tied high
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1
Wire.write(0); // wake up — the chip boots asleep
Wire.endTransmission(true);
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // ACCEL_XOUT_H
Wire.endTransmission(false); // repeated start, do not release the bus
Wire.requestFrom(MPU, (uint8_t)14);
int16_t ax = Wire.read() << 8 | Wire.read();
int16_t ay = Wire.read() << 8 | Wire.read();
int16_t az = Wire.read() << 8 | Wire.read();
Wire.read(); Wire.read(); // temperature, discarded here
int16_t gx = Wire.read() << 8 | Wire.read();
int16_t gy = Wire.read() << 8 | Wire.read();
int16_t gz = Wire.read() << 8 | Wire.read();
// Default ranges: +/-2 g and +/-250 deg/s
float pitch = atan2(ax, sqrt((float)ay * ay + (float)az * az)) * 57.2958f;
float rateY = gy / 131.0f; // deg/s
Serial.print(pitch); Serial.print(' '); Serial.println(rateY);
delay(20);
}
Duas coisas que este código deliberadamente não faz: ele nunca combina as medições dos dois sensores e nunca subtrai um viés. As duas etapas vêm a seguir.
Calibração: as vinte linhas que mais importam
Em repouso, um giroscópio não lê zero. Ele lê um pequeno desvio quase constante e, como você integra o giroscópio para obter um ângulo, esse desvio se integra e gera um erro que cresce continuamente. Um viés de apenas 2 °/s sem correção produz 120° de deriva após um minuto.
Calcule a média de algumas centenas de amostras com o sensor completamente parado e subtraia:
long sum = 0;
for (int i = 0; i < 500; i++) { sum += readGyroY(); delay(3); }
const float gyroBias = sum / 500.0f; // subtract from every later reading
Três observações práticas que a folha de dados não informa:
- Faça a cada ligamento, não apenas uma vez. O viés do giroscópio varia com a temperatura, e um robô que está funcionando há dez minutos não é o mesmo robô que você calibrou a frio.
- “Parado” significa parado. Uma calibração feita enquanto alguém se apoia na mesa grava esse movimento permanentemente no viés.
- O acelerômetro precisa de uma referência de nível, não de zero. Ele deve ler 1 g no eixo que aponta para baixo. Se ler 0,97 g, esse é o erro de escala, e ele aparecerá como um ângulo de inclinação sistematicamente alguns graus fora do valor correto.
Por que um sensor nunca basta
Os dois sensores falham de maneiras exatamente opostas, e é isso que faz a fusão funcionar tão bem.
| Acelerômetro | Giroscópio | |
|---|---|---|
| Mede | Aceleração linear — em repouso, gravidade | Taxa de rotação |
| Fornece inclinação por | Trigonometria no vetor de gravidade | Integração da taxa ao longo do tempo |
| Curto prazo | Ruidoso — cada solavanco e vibração também é aceleração | Excelente, suave e responsivo |
| Longo prazo | Correto em média — a gravidade não deriva | Deriva sem limite à medida que o viés é integrado |
| Falha quando | O robô acelera, então “para baixo” deixa de ser para baixo | Sempre, lentamente |
Um filtro complementar combina as características vantajosas de cada sensor—confia no giroscópio no curto prazo e deixa o acelerômetro corrigir lentamente a estimativa em direção ao valor real:
angle = 0.98f * (angle + rate * dt) + 0.02f * accelAngle;
Esse 0,98 define a frequência de cruzamento. Um valor maior atribui mais peso ao giroscópio por mais tempo, o que produz uma estimativa mais suave, mas com mais deriva; um valor menor dá mais peso ao ruído do acelerômetro. O tutorial do filtro complementar explica como escolher esse valor conscientemente, em vez de por tentativa.
Solução de problemas
| Sintoma | Causa provável | Solução |
|---|---|---|
| Toda leitura é exatamente 0 | O chip ainda está dormindo | Escreva 0 em PWR_MGMT_1 (0x6B) depois de Wire.begin() |
| O verificador de barramento não encontra nada | Endereço de 8 bits da folha de dados | O 0xD0 da folha de dados é 0x68 deslocado à esquerda—use 0x68 |
| Dois sensores, mas apenas um aparece | Ambos estão no endereço padrão | Ligue o AD0 de uma placa à VCC para que ela responda em 0x69 |
| Os ângulos estão 4× ou 8× maiores do que deveriam | O fator de escala não corresponde à faixa configurada | Ajuste o divisor a GYRO_CONFIG/ACCEL_CONFIG |
| O ângulo deriva continuamente, mesmo em repouso | Viés do giroscópio não calibrado | Calcule a média de 500 amostras parado na inicialização e subtraia |
| A inclinação salta durante a condução | Uso do ângulo bruto do acelerômetro | Combine as medições com o giroscópio; o “para baixo” de um robô em movimento não é para baixo |
| As leituras congelam após algum tempo | Barramento I²C travado | Verifique os resistores de pull-up; adicione uma rotina de recuperação que gere nove pulsos em SCL |
| A orientação gira lentamente sem parar | A guinada não tem referência absoluta | Esperado—a guinada precisa de um magnetômetro ou de outra fonte absoluta |
| Ruído acima de cerca de 1 kHz de vibração | Suporte rígido transmitindo a vibração dos motores | Monte o sensor com isolamento; ative o DLPF integrado via CONFIG (0x1A) |
MPU-6050 ou uma opção mais nova?
O MPU-6050 chegou ao fim de vida no fabricante e ainda é a IMU mais amplamente usada na robótica hobby, porque é barata, está documentada em todo lugar e é suportada por todas as bibliotecas.
| Componente | Eixos | Diferença notável | Escolha quando |
|---|---|---|---|
| MPU-6050 | 6 | O padrão; enorme quantidade de código de exemplo | Aprendizado, equilíbrio e qualquer primeiro projeto com IMU |
| MPU-9250 | 9 | Acrescenta um magnetômetro; portanto, a guinada tem uma referência absoluta | Você precisa de uma orientação de bússola, não apenas de uma taxa de giro |
| ICM-20948 | 9 | O sucessor do MPU-9250 atualmente em produção | Projetos novos que precisam de nove eixos e disponibilidade de longo prazo |
| BNO055 | 9 | Faz a fusão no chip e fornece a orientação diretamente | Você quer obter um ângulo sem escrever um filtro—por várias vezes o preço |
| LSM6DS3 | 6 | Moderno, em produção e com menos ruído | Uma substituição direta quando o fornecimento do MPU-6050 acabar |
O resumo honesto: se o seu robô precisa de arfagem e rolagem—que é o que o equilíbrio exige— o MPU-6050 é totalmente suficiente, e vale a pena implementar a fusão. Se ele precisa de orientação absoluta, nenhuma quantidade de filtramento obterá isso de seis eixos; você precisa de um magnetômetro.
Explore o grafo
Usado nestas montagens
Projetos, caminhos de aprendizagem e simuladores que incluem MPU-6050 IMU.
- ProjetoConstrua um micromouse para resolver labirintos
- ProjetoConstrua um robô autoequilibrador com MPU6050 e PID
- ProjetoConstrua um robô Mecanum que se desloca lateralmente
- ProjetoConstrua um rover GPS de pontos de passagem que dirige sozinho
- Caminho de aprendizagemAcionamento holonômico: mover-se de lado sem girar
- Caminho de aprendizagemFundamentos de eletrônica de robôs: roteiro de aprendizagem
- Caminho de aprendizagemPlanejamento de caminhos e mapeamento: do flood fill ao SLAM
Perguntas
Perguntas frequentes sobre MPU-6050 IMU
O que é o sensor MPU-6050?
O MPU-6050 é uma unidade de medida inercial (IMU) de seis eixos em uma pequena placa adaptadora. Ele combina um giroscópio de três eixos e um acelerômetro de três eixos, permitindo que um robô detecte como está inclinado, com que rapidez está girando e como está acelerando—tudo lido pelo barramento I²C.
Como funciona o MPU-6050?
Há dois sensores dentro. O acelerômetro mede aceleração linear—em repouso, isso é apenas gravidade, que informa ao robô qual direção é para baixo (sua inclinação). O giroscópio mede a taxa de rotação em torno de cada eixo. Você lê ambos por I²C e combina as medições para obter uma orientação estável que nenhum dos dois sensores fornece sozinho.
Para que serve o MPU-6050?
Para detectar o próprio movimento do robô—manter um robô autoequilibrado ereto, estimar a orientação, melhorar a odometria entre leituras dos encoders e detectar que o robô foi inclinado, levantado ou sacudido. Ele detecta o próprio robô, não o mundo ao redor, portanto complementa um sensor de distância em vez de substituí-lo.
Como calibro um MPU-6050?
Em repouso, o giroscópio e o acelerômetro apresentam pequenos desvios diferentes de zero. Calibre calculando a média de algumas centenas de amostras enquanto o sensor está completamente parado e subtraia esses desvios de cada leitura. O giroscópio precisa especialmente desse procedimento—um viés não calibrado faz o ângulo estimado derivar mais rapidamente.
Como conecto um MPU-6050 a um ESP32 ou Arduino?
Por I²C—conecte SDA e SCL aos pinos I²C da placa, além de alimentação e massa. A placa adaptadora roxa GY-521 tem regulador; portanto, funciona com 3,3 V em um ESP32 ou 5 V em um Arduino Uno. Uma biblioteca então lê os registradores do giroscópio e do acelerômetro para você.
Leitura complementar