Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Introdução ao sensor de movimento IMU (6 DOF)

Componentes e suprimentos

Arduino UNO
× 1
Unidade de medição inercial (IMU) (6 graus de liberdade)
× 1

Sobre este projeto


Hoje vamos estudar sobre o melhor sensor IMU (Inertia Measurement Unit) disponível e descobrir como ele pode ser conectado a um Arduino. Mais tarde, em nosso próximo tutorial, devemos tentar visualizar o sensor de movimento em 3D.

O módulo sensor IMU que usaremos é centralizado em torno de um sensor MPU-6050.

Os dispositivos MPU-6050 combinam um giroscópio de 3 eixos e um acelerômetro de 3 eixos na mesma matriz de silício, junto com um Digital Motion Processor ™ (DMP ™) integrado , que processa algoritmos MotionFusion complexos de 6 eixos.

Esses dispositivos MotionTracking são projetados para os requisitos de baixo consumo de energia, baixo custo e alto desempenho de smartphones, tablets e sensores vestíveis.

Coisas que você precisa:

HARDWARE:

1) Arduino UNO

2) Sensor MPU 6050

3) Conectando fios

SOFTWARE: IDE Arduino

Protocolo de Comunicação: Este sensor IMU se comunica com o Arduino usando o protocolo de barramento I2C.

Você pode trabalhar com acelerômetros e giroscópios separadamente, mas eles não são tão precisos quanto este módulo combinado.

Agora, vamos prosseguir para o diagrama de fiação e o perfil de conexão.

Consulte qualquer uma dessas 2 figuras abaixo para conexão.

Se você estiver enfrentando problemas com os números acima, não entre em pânico ...

Vá até o perfil do pino de conexão abaixo:

Conecte 5 V [IMU MPU-6050] ao VCC [ARDUINO]

Conecte o SDA [IMU MPU-6050] ao Analog IN (A4) [ARDUINO]

Conecte o SCL [IMU MPU-6050] ao Analog IN (A5) [ARDUINO]

Conecte GND [IMU MPU-6050] a GND [ARDUINO]

Conecte INTPIN [IMU MPU-6050] ao pino 2 (pino PWM digital) [ARDUINO]

Aqui, se o seu módulo MPU 6050 tiver um pino de 5 V, você pode conectá-lo ao pino de 5 V do seu arduino. Caso contrário, você terá que conectá-lo ao pino de 3,3 V para evitar problemas de sobretensão.

Agora que configuramos o hardware, é hora de programar o Arduino.

Em primeiro lugar, para testar o MPU 6050, clique neste link e baixe a biblioteca do arduino para MPU 6050. Há uma pasta zip chamada "MPU6050.zip". Baixe a pasta e extraia seu conteúdo. Após fazer isso, copie a pasta da biblioteca "MPU6050" e cole-a dentro da pasta da biblioteca do Arduino. Ou seja, você deve ir até o local onde está a pasta "libraries" do Arduino e, a seguir, basta colar esta pasta "MPU6050" dentro dela.

Em seguida, você precisa fazer o download de outra biblioteca, chamada "I2Cdev.zip" (se não estiver instalada anteriormente) e colá-la dentro da biblioteca do Arduino da mesma forma que a anterior.

Portanto, agora, na pasta "libraries" do Arduino, temos duas novas entidades. (Fig:8)

Agora, clique no IDE arduino e veja se essas novas bibliotecas estão visíveis (Fig (9).

Antes de incluir essas bibliotecas em seu esboço, você precisa buscar o código para MPU6050. Consulte a Fig (10)

(Arquivo> Exemplos> MPU6050> Exemplos> MPU6050_DMP6). Clique neste arquivo "MPU6050_DMP6".

Em seguida, inclua as bibliotecas "I2Cdev" e "MPU6050" neste esboço [Fig (11)].

Após ter seguido todos os passos, COMPILAR o esboço [Fig (12)].

Agora, a etapa final continua ...

Se você notar que abaixo do canto direito desta janela, a mensagem diz "Arduino / Genuino Uno em COM1", certifique-se de que está correto. Caso contrário, consulte [Fig (14)]. Não clique em Serial Monitor agora. Somente após fazer o upload do sketch [como na Fig (13)], vá para as próximas etapas.

Você deve garantir que a porta correta seja atribuída sempre que conectar seu Arduino.

Ficou confuso com essa nova janela ?? Bem, essa é a sua tela de saída. Tecnicamente falando, nós o chamamos de Monitor Serial. É onde lemos nossos valores de diferentes sensores.

ETAPA:Ferramentas> Monitor serial ou tecla de atalho (Ctrl + Shift + M)

Se você enfrentar problemas com o upload do esboço, mesmo que tenha selecionado as portas corretas. Clique neste link (para usuários do Windows). Para usuários de Mac, consulte o guia. Os usuários do Linux consultam esta página da web para orientação.

Depois de enviar o código, abra o monitor serial e altere a "taxa de transmissão" para 115200. Se você selecionar qualquer outra taxa de transmissão, verá comentários inúteis porque eles não estarão sincronizados. NOTA: Processadores host de 8 MHz ou mais lentos, como Teensy @ 3.3v ou Ardunio Pro Mini rodando a 3.3v, não podem lidar com esta taxa de transmissão de forma confiável devido ao tempo de transmissão estar muito desalinhado com os tiques do processador. Você deve usar 38400 ou mais lento nesses casos, ou usar algum tipo de solução de cristal externo separado para o temporizador UART.

Se você não vir esta declaração "Inicializando dispositivos I2C ..." na tela, pressione o botão RESET. Deve funcionar agora. [Fig (15)]




KNOWLEDGECORNER>> Você verá uma linha dizendo “Envie qualquer caractere para iniciar a programação e demonstração DMP:” O que é DMP ??

Resp: DMP significa Processamento de Movimento Digital . O MPU 6050 do Invense possui um processador de movimento embutido. Ele processa os valores do acelerômetro e do giroscópio para nos fornecer valores 3D precisos; ou seja, Yaw, Pitch and Roll. [Fig (16)]




KNOWLEDGECORNER>> Vimos que a comunicação entre o sensor e o arduino é baseada no protocolo I2C Bus. Da mesma forma, também incluímos uma biblioteca I2C neste projeto. você sabe, o que significa I2C?

Resp: O barramento I2C consiste fisicamente em 2 fios ativos e uma conexão de aterramento. Os fios ativos, chamados de SDA e SCL , são bidirecionais. SDA é a linha Serial DAta e SCL é a linha Serial CLock. Cada dispositivo conectado ao barramento tem seu próprio endereço exclusivo, não importa se é um MCU, driver de LCD, memória ou ASIC. Cada um desses chips pode atuar como receptor e / ou transmissor, dependendo da funcionalidade. Obviamente, um driver LCD é apenas um receptor, enquanto um chip de memória ou I / O pode ser transmissor e receptor. O barramento I2C é um barramento multimestre. Isso significa que mais de um IC capaz de iniciar uma transferência de dados pode ser conectado a ele. A especificação do protocolo I2C afirma que o IC que inicia uma transferência de dados no barramento é considerado o barramento mestre. Consequentemente, naquele momento, todos os outros ICs são considerados Bus Slaves. Como os bus master são geralmente microcontroladores, aqui, por exemplo, o bus master é ArduinoUno. Da mesma forma, o sensor MPU é o Bus Slave.




Visualize o movimento em 3D no meu próximo tutorial. Clique aqui













Código

  • código Arduino para sensor MPU
Código Arduino para sensor MPU Arduino
 * /// I2Cdev e MPU6050 devem ser instalados como bibliotecas, ou então os arquivos .cpp / .h // para ambas as classes devem estar no caminho de inclusão de seu projeto # include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20 .h "// # include" MPU6050.h "// não é necessário se usar MotionApps include file // A biblioteca Arduino Wire é necessária se a implementação I2Cdev I2CDEV_ARDUINO_WIRE // for usada em I2Cdev.h # if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include" .h "# endif // o endereço I2C padrão da classe é 0x68 // endereços I2C específicos podem ser passados ​​como um parâmetro aqui // AD0 baixo =0x68 (padrão para quebra de SparkFun e placa de avaliação InvenSense) // AD0 alto =0x69MPU6050 mpu; / / MPU6050 mpu (0x69); // <- use para AD0 high / * =================================================================================NOTA:Além da conexão 3.3v, GND, SDA e SCL, este esboço depende do pino INT do MPU-6050 sendo conectado ao pino de interrupção externa nº 0 do Arduino. No Arduino Uno e no Mega 2560, é o pino 2 de E / S digital. * ===================================================================================* // * =================================================================================NOTA:Arduino v1.0.1 com a placa Leonardo gera um erro de compilação ao usar Serial.write (buf, len). A saída do bule usa esse método. A solução requer uma modificação no arquivo Arduino USBAPI.h, que felizmente é simples, mas irritante. Isso será corrigido na próxima versão do IDE. Para obter mais informações, consulte estes links:http://arduino.cc/forum/index.php/topic,109987.0.html http://code.google.com/p/arduino/issues/detail?id=958 * =====================================================================================* /// descomente "OUTPUT_READABLE_QUATERNION" se quiser ver os // componentes reais do quaternion em um [w, x, y, z] formato (não é melhor para analisar // em um host remoto, como Processing ou algo assim) // # define OUTPUT_READABLE_QUATERNION // descomente "OUTPUT_READABLE_EULER" se você quiser ver ângulos de Euler // (em graus) calculados a partir dos quatérnios chegando do FIFO.// Observe que os ângulos de Euler sofrem de bloqueio do cardan (para obter mais informações, consulte // http://en.wikipedia.org/wiki/Gimbal_lock)//#define OUTPUT_READABLE_EULER // descomente "OUTPUT_READABLE_YAWPITCHROLL" se desejar para ver os ângulos de guinada /// pitch / roll (em graus) calculados a partir dos quatérnions vindos // do FIFO. Observe que isso também requer cálculos de vetor de gravidade.// Observe também que os ângulos de guinada / inclinação / rotação sofrem de bloqueio do cardan (para // mais informações, consulte:http://en.wikipedia.org/wiki/Gimbal_lock)#define OUTPUT_READABLE_YAWPITCHROLL / / descomente "OUTPUT_READABLE_REALACCEL" se quiser ver os componentes // de aceleração com a gravidade removida. Este referencial de aceleração // não é compensado pela orientação, então + X é sempre + X de acordo com o // sensor, apenas sem os efeitos da gravidade. Se você quiser a aceleração // compensada pela orientação, use OUTPUT_READABLE_WORLDACCEL em vez disso.//#define OUTPUT_READABLE_REALACCEL // descomente "OUTPUT_READABLE_WORLDACCEL" se quiser ver os componentes de aceleração // com a gravidade removida e ajustada para o quadro mundial de // referência (yaw é em relação à orientação inicial, uma vez que nenhum magnetômetro // está presente neste caso). Pode ser muito útil em alguns casos.//#define OUTPUT_READABLE_WORLDACCEL // descomente "OUTPUT_TEAPOT" se você quiser uma saída que corresponda ao // formato usado para a demonstração do bule InvenSense // # define OUTPUT_TEAPOT # define LED_PIN 13 // (Arduino é 13 , Teensy é 11, Teensy ++ é 6) bool blinkState =false; // controle / status MPU varsbool dmpReady =false; // define verdadeiro se a inicialização DMP foi bem-sucedidauint8_t mpuIntStatus; // mantém o byte de status de interrupção real de MPUuint8_t devStatus; // retorna o status após cada operação do dispositivo (0 =sucesso,! 0 =erro) uint16_t packetSize; // tamanho do pacote DMP esperado (o padrão é 42 bytes) uint16_t fifoCount; // contagem de todos os bytes atualmente em FIFOuint8_t fifoBuffer [64]; // buffer de armazenamento FIFO // orientação / movimento varsQuaternion q; // [w, x, y, z] quaternion containerVectorInt16 aa; // [x, y, z] medições do sensor de aceleraçãoVectorInt16 aaReal; // [x, y, z] medições do sensor de aceleração sem gravidadeVectorInt16 aaWorld; // [x, y, z] medições do sensor de aceleração de quadro mundialVectorFloat gravity; // [x, y, z] vetor de gravidadefloat euler [3]; // [psi, theta, phi] recipiente do ângulo de Eulerfloat ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container e vetor de gravidade // estrutura de pacote para bule de chá InvenSense demouint8_t teapotPacket [14] ={'$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\ r', '\ n'}; // ==========================================================================// ===ROTINA DE DETECÇÃO DE INTERRUPÇÃO ===// ========================================================================volátil bool mpuInterrupt =false; // indica se o pino de interrupção de MPU foi alto e evite dmpDataReady () {mpuInterrupt =true;} // ==========================================================================// ===CONFIGURAÇÃO INICIAL ===// ========================================================================void setup () {// junta-se ao barramento I2C (a biblioteca I2Cdev não faz isso automaticamente) #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin (); TWBR =24; // Clock I2C de 400kHz (200kHz se CPU for 8MHz) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire ::setup (400, true); #endif // inicializar a comunicação serial // (115200 escolhido porque é necessário para a saída do Teapot Demo, mas // realmente depende de você dependendo do seu projeto) Serial.begin (115200); while (! Serial); // aguarde a enumeração de Leonardo, outros continuam imediatamente // NOTA:processadores host de 8 MHz ou mais lentos, como Teensy @ 3.3v ou Ardunio // Pro Mini rodando em 3.3v, não podem lidar com esta taxa de baud de forma confiável devido ao // tempo de baud sendo muito desalinhado com os tiques do processador. Você deve usar // 38400 ou mais lento nesses casos, ou usar algum tipo de solução de cristal // separada externa para o temporizador UART. // inicializa o dispositivo Serial.println (F ("Inicializando dispositivos I2C ...")); mpu.initialize (); // verificar a conexão Serial.println (F ("Testing device connections ...")); Serial.println (mpu.testConnection ()? F ("MPU6050 conexão bem-sucedida"):F ("MPU6050 conexão falhou")); // aguarde Serial.println (F ("\ nEnvie qualquer caractere para iniciar a programação DMP e a demonstração:")); while (Serial.available () &&Serial.read ()); // buffer vazio while (! Serial.available ()); // espera pelos dados enquanto (Serial.available () &&Serial.read ()); // esvaziar o buffer novamente // carregar e configurar o DMP Serial.println (F ("Inicializando DMP ...")); devStatus =mpu.dmpInitialize (); // forneça seus próprios offsets de giroscópio aqui, escalonados para sensibilidade mínima mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); // 1688 padrão de fábrica para meu chip de teste // certifique-se de que funcionou (retorna 0 em caso afirmativo) if (devStatus ==0) {// liga o DMP, agora que está pronto Serial.println (F ("Ativando DMP. .. ")); mpu.setDMPEnabled (true); // habilita a detecção de interrupção do Arduino Serial.println (F ("Habilitando a detecção de interrupção (interrupção externa do Arduino 0) ...")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus (); // define nosso sinalizador DMP Ready para que a função loop () principal saiba que está tudo bem em usá-lo Serial.println (F ("DMP pronto! Aguardando a primeira interrupção ...")); dmpReady =true; // obtém o tamanho do pacote DMP esperado para comparação posterior packetSize =mpu.dmpGetFIFOPacketSize (); } else {// ERROR! // 1 =falha no carregamento inicial da memória // 2 =falha nas atualizações de configuração do DMP // (se houver falha, normalmente o código será 1) Serial.print (F ("Falha na inicialização do DMP (código")); Serial. imprimir (devStatus); Serial.println (F (")")); } // configurar LED para saída pinMode (LED_PIN, OUTPUT);} // ========================================================================// ===PROGRAMA PRINCIPAL LOOP ===// ========================================================================void loop () {// se a programação falhou, não tente fazer nada se (! dmpReady) return; // aguarde a interrupção do MPU ou pacote (s) extra (s) disponíveis enquanto (! mpuInterrupt &&fifoCount  1 pacote disponível // (isso nos permite ler imediatamente mais sem esperar por uma interrupção) fifoCount - =packetSize; #ifdef OUTPUT_READABLE_QUATERNION // exibe os valores do quatérnion na forma de matriz fácil:w x y z mpu.dmpGetQuaternion (&q, fifoBuffer); Serial.print ("quat \ t"); Serial.print (q.w); Serial.print ("\ t"); Serial.print (q.x); Serial.print ("\ t"); Serial.print (q.y); Serial.print ("\ t"); Serial.println (q.z); #endif #ifdef OUTPUT_READABLE_EULER // exibe ângulos de Euler em graus mpu.dmpGetQuaternion (&q, fifoBuffer); mpu.dmpGetEuler (euler, &q); Serial.print ("euler \ t"); Serial.print (euler [0] * 180 / M_PI); Serial.print ("\ t"); Serial.print (euler [1] * 180 / M_PI); Serial.print ("\ t"); Serial.println (euler [2] * 180 / M_PI); #endif #ifdef OUTPUT_READABLE_YAWPITCHROLL // exibe ângulos de Euler em graus mpu.dmpGetQuaternion (&q, fifoBuffer); mpu.dmpGetGravity (&gravity, &q); mpu.dmpGetYawPitchRoll (ypr, &q, &gravity); Serial.print ("ypr \ t"); Serial.print (ypr [0] * 180 / M_PI); Serial.print ("\ t"); Serial.print (ypr [1] * 180 / M_PI); Serial.print ("\ t"); Serial.println (ypr [2] * 180 / M_PI); #endif #ifdef OUTPUT_READABLE_REALACCEL // exibe a aceleração real, ajustada para remover a gravidade mpu.dmpGetQuaternion (&q, fifoBuffer); mpu.dmpGetAccel (&aa, fifoBuffer); mpu.dmpGetGravity (&gravity, &q); mpu.dmpGetLinearAccel (&aaReal, &aa, &gravity); Serial.print ("área \ t"); Serial.print (aaReal.x); Serial.print ("\ t"); Serial.print (aaReal.y); Serial.print ("\ t"); Serial.println (aaReal.z); #endif #ifdef OUTPUT_READABLE_WORLDACCEL // exibe a aceleração do quadro mundial inicial, ajustada para remover a gravidade // e girada com base na orientação conhecida do quaternion mpu.dmpGetQuaternion (&q, fifoBuffer); mpu.dmpGetAccel (&aa, fifoBuffer); mpu.dmpGetGravity (&gravity, &q); mpu.dmpGetLinearAccel (&aaReal, &aa, &gravity); mpu.dmpGetLinearAccelInWorld (&aaWorld, &aaReal, &q); Serial.print ("aworld \ t"); Serial.print (aaWorld.x); Serial.print ("\ t"); Serial.print (aaWorld.y); Serial.print ("\ t"); Serial.println (aaWorld.z); #endif #ifdef OUTPUT_TEAPOT // exibe os valores do quaternion no formato de demonstração do InvenSense Teapot:teapotPacket [2] =fifoBuffer [0]; teapotPacket [3] =fifoBuffer [1]; teapotPacket [4] =fifoBuffer [4]; teapotPacket [5] =fifoBuffer [5]; teapotPacket [6] =fifoBuffer [8]; teapotPacket [7] =fifoBuffer [9]; teapotPacket [8] =fifoBuffer [12]; teapotPacket [9] =fifoBuffer [13]; Serial.write (teapotPacket, 14); teapotPacket [11] ++; // packetCount, loops em 0xFF propositalmente #endif // LED piscando para indicar atividade blinkState =! blinkState; digitalWrite (LED_PIN, blinkState); }} 

Esquemas


Processo de manufatura

  1. Sensor de rastreamento de linha com RPi
  2. API do sensor ambiental com um RPi
  3. Sensor de movimento usando Raspberry Pi
  4. Raspberry Pi GPIO com sensor de movimento PIR:Melhor tutorial
  5. Interface do sensor de movimento HC-SR501 PIR com Raspberry Pi
  6. Introdução ao TJBot
  7. Introdução ao RAK 831 Lora Gateway e RPi3
  8. Primeiros passos com o RAK831 LoRa Gateway e RPi3
  9. Introdução à IA em seguros:um guia introdutório
  10. Arduino Tutorial 01:Começando