- O que é um acelerômetro e sensor giroscópico?
- MPU6050 Acelerômetro e Módulo Sensor Giroscópico
- Componentes necessários
- Diagrama de circuito
- Explicação de programação
O MPU6050 é um acelerômetro IC de 3 eixos e um giroscópio de 3 eixos combinados em uma unidade. Ele também abriga um sensor de temperatura e um DCM para realizar uma tarefa complexa. O MPU6050 é comumente usado na construção de Drones e outros robôs remotos, como um robô de auto-equilíbrio. Neste projeto iremos construir um transferidor digital usando MPU6050 e Arduino. Aqui, um servo motor é usado para exibir o ângulo em uma imagem do transferidor. O eixo do servo motor é conectado com uma agulha que girará na imagem do transferidor para indicar o ângulo que também é exibido em um display LCD 16x. Antes de entrar em detalhes, vamos aprender sobre o sensor de giroscópio.
O que é um acelerômetro e sensor giroscópico?
Um acelerômetro é usado para medir a aceleração. Na verdade, ele detecta a aceleração estática e dinâmica. Por exemplo, os telefones celulares usam o sensor acelerômetro para detectar se o celular está no modo paisagem ou no modo retrato. Anteriormente, usamos o acelerômetro com Arduino para construir muitos projetos como:
Um giroscópio é usado para medir a velocidade angular que usa a gravidade da Terra para determinar a orientação do objeto em movimento. A velocidade angular é a taxa de mudança da posição angular de um corpo em rotação.
Por exemplo, os celulares de hoje usam sensores giroscópicos para jogar jogos móveis de acordo com a orientação do telefone celular. Além disso, o fone de ouvido VR usa sensor de giroscópio para ter visualizações na orientação 360
Assim, enquanto o acelerômetro pode medir a aceleração linear, o giroscópio pode ajudar a encontrar a aceleração rotacional. Ao usar os dois sensores como módulos separados, torna-se difícil encontrar orientação, posição e velocidade. Mas, ao combinar os dois sensores, ele funciona como uma Unidade de Medição Inercial (IMU). Portanto, no módulo MPU6050, o acelerômetro e o giroscópio estão presentes em um único PCB para encontrar a orientação, posição e velocidade.
Formulários:
- Usado em Drones para controle de direção
- Robôs com equilíbrio automático
- Controle de braço robótico
- Sensor de inclinação
- Usado em telefones celulares, consoles de videogame
- Robôs Humanóides
- Usado em aeronaves, automóveis etc.
MPU6050 Acelerômetro e Módulo Sensor Giroscópico
O MPU6050 é um Micro Electro-Mechanical Systems (MEMS) que consiste em um acelerômetro de 3 eixos e um giroscópio de 3 eixos dentro dele. Também possui sensor de temperatura.
Ele pode medir:
- Aceleração
- Velocidade
- Orientação
- Deslocamento
- Temperatura
Este módulo também possui um processador de movimento digital (DMP) dentro dele, que é poderoso o suficiente para realizar cálculos complexos e, assim, liberar o trabalho para o microcontrolador.
O módulo também possui dois pinos auxiliares que podem ser usados para fazer a interface de módulos IIC externos, como um magnetômetro. Como o endereço IIC do módulo é configurável, mais de um sensor MPU6050 pode ser conectado a um microcontrolador usando o pino AD0.
Características e especificações:
- Fonte de alimentação: 3-5V
- Comunicação: protocolo I2C
- ADC de 16 bits integrado fornece alta precisão
- O DMP integrado fornece alto poder computacional
- Pode ser usado para fazer interface com outros dispositivos IIC, como magnetômetro
- Endereço IIC configurável
- Sensor de temperatura embutido
Pinagem de MPU6050:
Número do PIN | Nome do Pin | Usar |
1 | Vcc | Fornece energia para o módulo, pode ser de + 3V a + 5V. Normalmente, + 5V é usado |
2 | Terra | Conectado ao aterramento do sistema |
3 | Relógio serial (SCL) | Usado para fornecer pulso de clock para comunicação I2C |
4 | Dados seriais (SDA) | Usado para transferir dados por meio de comunicação I2C |
5 | Dados Seriais Auxiliares (XDA) | Pode ser usado para fazer interface com outros módulos I2C com MPU6050. É opcional |
6 | Relógio serial auxiliar (XCL) | Pode ser usado para fazer interface com outros módulos I2C com MPU6050. É opcional |
7 | AD0 | Se mais de um MPU6050 for usado em um único MCU, este pino pode ser usado para variar o endereço |
8 | Interromper (INT) | Pino de interrupção para indicar que os dados estão disponíveis para leitura pelo MCU. |
Anteriormente, usamos o MPU6050 com o Arduino para construir um robô e inclinômetro de auto-equilíbrio.
Componentes necessários
- Arduino UNO
- Módulo de giroscópio MPU6050
- Display LCD 16x2
- Potenciômetro 10k
- SG90-Servo Motor
- Imagem do transferidor
Diagrama de circuito
O diagrama de circuito para este transferidor DIY Arduino é fornecido abaixo:
Conexões de circuito entre Arduino UNO e MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Conexões de circuito entre Arduino UNO e servo motor:
Servo motor |
Arduino UNO |
VERMELHO (VCC) |
+ 5V |
LARANJA (PWM) |
9 |
MARROM (GND) |
GND |
Conexões de circuito entre Arduino UNO e LCD 16x2:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Para o PIN do centro do potenciômetro Para controlar o contraste do LCD |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
UMA |
+ 5V |
K |
GND |
Explicação de programação
Como de costume, o programa completo com um vídeo de demonstração é fornecido no final deste tutorial.
Aqui, o servo motor é conectado ao Arduino e seu eixo é projetado na imagem do transferidor indicando o ângulo do MPU6050 inclinado. A programação para este tutorial é simples. Vamos ver em detalhes.
Primeiro inclua todas as bibliotecas necessárias - biblioteca Servo Motor para usar Servo, biblioteca LCD para usar LCD e biblioteca Wire para usar comunicação I2C.
O MPU6050 usa comunicação I2C e, portanto, deve ser conectado apenas aos pinos I2C do Arduino. Portanto, a biblioteca Wire.h é usada para estabelecer a comunicação entre o Arduino UNO e o MPU6050. Anteriormente, fizemos a interface do MPU6050 com o Arduino e exibimos os valores das coordenadas x, y, z no LCD 16x2.
#incluir
Em seguida, defina os pinos RS, E, D4, D5, D6, D7 do display LCD que estão conectados ao Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Em seguida, o endereço I2C do MPU6050 é definido.
const int MPU_addr = 0x68;
Em seguida, inicialize o objeto myservo para usar a classe Servo e três variáveis para armazenar os valores dos eixos X, Y e Z.
Servo myservo; int16_t eixo_X, eixo_Y, eixo_Z;
O próximo valor mínimo e máximo é definido como 265 e 402 para medir o ângulo de 0 a 360.
int minVal = 265; int maxVal = 402;
void setup ():
Na função de configuração vazia , primeiro a comunicação I2C é iniciada e a transmissão com MPU6050 com endereço de 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Coloque o MPU6050 em Sleep Mode escrevendo 0x6B e então desperte-o escrevendo 0
Wire.write (0x6B); Wire.write (0);
Depois de ativar o MPU6050, encerre a transmissão
Wire.endTransmission (true);
Aqui, o pino PWM do servo motor é conectado ao pino 9 do Arduino UNO.
myservo.attach (9);
Assim que ligamos o circuito, o LCD exibe uma mensagem de boas-vindas e a limpa após 3 segundos
lcd.begin (16,2); // Define o LCD no modo 16X2 lcd.print ("CIRCUIT DIGEST"); atraso (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); atraso (3000); lcd.clear ();
void loop ():
Novamente, a comunicação I2C é iniciada com MPU6050.
Wire.beginTransmission (MPU_addr);
Então comece com o registro 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Agora o processo é reiniciado ao definir o fim da transmissão como falso, mas a conexão está ativa.
Wire.endTransmission (false);
Depois disso, agora solicite os dados dos 14 registros.
Wire.requestFrom (MPU_addr, 14, verdadeiro);
Agora, os valores de registro de eixo respeitados (x, y, z) são obtidos e armazenados nas variáveis axis_X, axis_Y, axis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Em seguida, mapeie esses valores de 265 a 402 como -90 a 90. Isso é feito para todos os três eixos.
int xAng = map (axis_X, minVal, maxVal, -90,90); int yAng = map (axis_Y, minVal, maxVal, -90,90); int zAng = map (axis_Z, minVal, maxVal, -90,90);
A fórmula para calcular o valor x em graus (0 a 360) é fornecida abaixo. Aqui, convertemos apenas x porque a rotação do servo motor é baseada no movimento do valor x.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
O valor do ângulo X, de 0 a 360 graus, é convertido em 0 a 180.
pos int = map (x, 0,180,0,180);
Em seguida, escreva o valor do ângulo para girar o servo na imagem do transferidor e imprima esses valores no display LCD de 16x2.
myservo.write (pos); lcd.setCursor (0,0); lcd.print ("ângulo"); lcd.setCursor (0,1); lcd.print (x); atraso (500); lcd.clear ();
Então é assim que o MPU6050 com Arduino pode ser usado para medir o ângulo. O código completo e o vídeo para este projeto são fornecidos abaixo.