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.

Diagrama rotulado de uma placa adaptadora da IMU MPU-6050 (placa GY-521): uma PCB roxa com o chip MPU-6050 e componentes passivos no centro, um indicador dos eixos X/Y/Z mostrando as três direções de medição e um conector de 8 pinos (VCC, GND, SCL, SDA, XDA, XCL, AD0, INT) na parte inferior.
Um giroscópio e um acelerômetro em um único chip detectam rotação e inclinação em torno dos três eixos, lidas por I²C. Baixar SVG

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.

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

Referências