Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Onderdelen en Benodigdheden

Onderdeel Aantal Opmerkingen
Arduino UNO 1
Inertial Measurement Unit (IMU) (6 graden vrijheid) 1 MPU-6050 sensor

Over Dit Project

Vandaag bestuderen we de beste beschikbare IMU (Inertiële Meet Unit) sensor en ontdekken hoe we deze met een Arduino kunnen koppelen. In een volgende tutorial zullen we de bewegingssensing in 3D visualiseren.

De IMU-sensormodule die we gebruiken is gebaseerd op de MPU-6050 sensor.

De MPU-6050 combineert een 3-as gyroscoop en een 3-as versnellingsmeter op dezelfde silicium-die, samen met een onboard Digital Motion Processor™ (DMP™) die complexe 6-as MotionFusion-algoritmes verwerkt.

Deze MotionTracking-apparaten zijn ontworpen voor de lage stroomverbruik, lage kosten en hoge prestaties van smartphones, tablets en wearables.

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Benodigde Hardware

  1. Arduino UNO
  2. MPU-6050 sensor
  3. Aansluitleidingen
Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Software

Arduino IDE

Communicatieprotocol

Deze IMU-sensor communiceert met de Arduino via het I2C-busprotocol.

Je kunt versnellingsmeters en gyroscopen apart gebruiken, maar ze zijn niet zo nauwkeurig als deze gecombineerde module.

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Aansluitschema

Raadpleeg een van de twee figuren hieronder voor de verbindingen.

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)
Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Mocht je problemen hebben met de bovenstaande figuren, geen panic. Ga door de onderstaande pin-verbindingen:

  • 5V [IMU MPU-6050] → VCC [ARDUINO]
  • SDA [IMU MPU-6050] → Analog IN (A4) [ARDUINO]
  • SCL [IMU MPU-6050] → Analog IN (A5) [ARDUINO]
  • GND [IMU MPU-6050] → GND [ARDUINO]
  • INTPIN [IMU MPU-6050] → Pin 2 (Digital PWM pin) [ARDUINO]
Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)
Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Let op: als je MPU-6050 module een 5V pin heeft, verbind dan met de 5V van de Arduino. Anders sluit je het aan op 3.3V om overspanning te voorkomen.

Programmeren van de Arduino

  1. Download de Arduino-bibliotheek voor MPU-6050 (MPU6050.zip). Pak uit en kopieer de map "MPU6050" naar de Arduino libraries-map.
  2. Download ook de "I2Cdev.zip" bibliotheek (indien nog niet geïnstalleerd) en plaats deze op dezelfde manier in de libraries-map.
  3. Open de Arduino IDE en controleer of de bibliotheken zichtbaar zijn (Bestand → Voorbeelden → MPU6050 → Examples → MPU6050_DMP6).
  4. Open het bestand MPU6050_DMP6 en voeg de bibliotheken I2Cdev en MPU6050 toe aan de sketch.
  5. Compileer de sketch.
  6. Controleer of de juiste COM-poort is geselecteerd (Hulpmiddelen → Poort).
  7. Upload de sketch naar de Arduino.
  8. Open de Seriële Monitor (Ctrl+Shift+M) en stel de baudrate in op 115200. (Opmerking: 8MHz of langzamere processoren zoals Teensy @ 3.3V of Arduino Pro Mini @ 3.3V kunnen deze baudrate niet betrouwbaar aan; gebruik dan 38400 of lager.)
  9. Als je "Initializing I2C devices…" niet ziet, druk op de RESET-knop.

Kennishoek: Wat is DMP?

DMP staat voor Digital Motion Processing. De InvenSense MPU-6050 heeft een ingebouwde bewegingsprocessor die de waarden van de versnellingsmeter en gyroscoop verwerkt om nauwkeurige 3D-waarden te geven: Yaw, Pitch en Roll.

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Kennishoek: Wat is I2C?

I2C (Inter-Integrated Circuit) is een seriële bus met twee actieve draden (SDA = Serial Data, SCL = Serial Clock) en een ground-verbinding. Elk apparaat op de bus heeft een uniek adres. De bus is multi-master: meerdere IC's kunnen de bus initieren. De Arduino fungeert als Bus Master, de MPU-sensor als Bus Slave.

Visualisatie in 3D

Visualiseer de beweging in 3D in mijn volgende tutorial. Klik hier

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Code

Bestand: Arduino code for MPU sensor (Arduino)

// I2Cdev en MPU6050 moeten als bibliotheken geïnstalleerd zijn
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // niet nodig als MotionApps gebruikt wordt
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

MPU6050 mpu; // standaard I2C adres 0x68 (AD0 laag)
// MPU6050 mpu(0x69); // voor AD0 hoog

#define OUTPUT_READABLE_YAWPITCHROLL
#define LED_PIN 13

bool blinkState = false;
bool dmpReady = false;
uint8_t mpuIntStatus, devStatus;
uint16_t packetSize, fifoCount;
uint8_t fifoBuffer[64];

Quaternion q;
VectorInt16 aa, aaReal, aaWorld;
VectorFloat gravity;
float euler[3], ypr[3];
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }

void setup() {
  #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  Wire.begin();
  TWBR = 24; // 400kHz I2C clock
  #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
  Fastwire::setup(400, true);
  #endif

  Serial.begin(115200);
  while (!Serial); // wacht op Leonardo enumeratie

  Serial.println(F("Initializing I2C devices..."));
  mpu.initialize();
  Serial.println(F("Testing device connections..."));
  Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  Serial.println(F("\nSend any character to begin DMP programming and demo: "));
  while (Serial.available() && Serial.read()); // leeg buffer
  while (!Serial.available()); // wacht op data
  while (Serial.available() && Serial.read()); // leeg buffer

  Serial.println(F("Initializing DMP..."));
  devStatus = mpu.dmpInitialize();

  // Gyro offsets (voor min gevoeligheid)
  mpu.setXGyroOffset(220);
  mpu.setYGyroOffset(76);
  mpu.setZGyroOffset(-85);
  mpu.setZAccelOffset(1788); // 1688 fabrieksstandaard

  if (devStatus == 0) {
    Serial.println(F("Enabling DMP..."));
    mpu.setDMPEnabled(true);
    Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
    attachInterrupt(0, dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();
    Serial.println(F("DMP ready! Waiting for first interrupt..."));
    dmpReady = true;
    packetSize = mpu.dmpGetFIFOPacketSize();
  } else {
    Serial.print(F("DMP Initialization failed (code "));
    Serial.print(devStatus);
    Serial.println(F(")"));
  }
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  if (!dmpReady) return;

  while (!mpuInterrupt && fifoCount < packetSize) {
    // andere taken hier
  }

  mpuInterrupt = false;
  mpuIntStatus = mpu.getIntStatus();
  fifoCount = mpu.getFIFOCount();

  if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
    mpu.resetFIFO();
    Serial.println(F("FIFO overflow!"));
  } else if (mpuIntStatus & 0x02) {
    while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
    mpu.getFIFOBytes(fifoBuffer, packetSize);
    fifoCount -= packetSize;

    #ifdef OUTPUT_READABLE_YAWPITCHROLL
    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

    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
  }
}

Schema's

Aan de Slag met een 6-DOF IMU Bewegingssensor (MPU-6050)

Productieproces

  1. Lijnvolgsensor met Raspberry Pi – Simpele KY-033 deur/lijndetector
  2. Een robuuste temperatuur- en sensor-API bouwen op Raspberry Pi met de GY-91-module
  3. Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi
  4. Raspberry Pi GPIO onder de knie: Een PIR-bewegingsensor interfacen op B+/Model 2
  5. Hoe de HC‑SR501 PIR-bewegingsensor aan te sluiten, kalibreren en programmeren met een Raspberry Pi
  6. Aan de slag met TJBot: Bouw, Configureer en Stem-bedien Je Eigen AI-robot
  7. Stap-voor-stap Handleiding om een RAK 831 LoRa-gateway op Raspberry Pi 3 te Deployen
  8. Bouw een LoRa Gateway met de RAK831 Module op Raspberry Pi 3 – Stap-voor-Stap Gids
  9. Arduino Beginner Tutorial 01: Start met Je Eerste Project
  10. Ontdek de Eagle Group: Uw Partner voor Kwalitatieve Metaalproductie
  11. AI in verzekeringen: Een praktische startergids voor real-world implementatie