Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Erste Schritte mit dem IMU (6 DOF) Bewegungssensor

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Inertial Measurement Unit (IMU) (6 Grad Freiheit)
× 1

Über dieses Projekt

Heute werden wir den besten verfügbaren IMU-Sensor (Inertia Measurement Unit) untersuchen und herausfinden, wie er mit einem Arduino verbunden werden kann. Später in unserem nächsten Tutorial werden wir versuchen, die Bewegungserkennung in 3D zu visualisieren.

Das IMU-Sensormodul, das wir verwenden werden, ist um einen MPU-6050-Sensor zentriert.

Die MPU-6050-Geräte kombinieren ein 3-Achsen-Gyroskop und ein 3-Achsen-Beschleunigungsmesser auf demselben Siliziumchip, zusammen mit einem integrierten Digital Motion Processor™ (DMP™) , das komplexe 6-Achsen-MotionFusion-Algorithmen verarbeitet.

Diese MotionTracking-Geräte wurden für die Anforderungen von Smartphones, Tablets und tragbaren Sensoren mit geringem Stromverbrauch, geringen Kosten und hoher Leistung entwickelt.

Materialien, die Sie benötigen:

HARDWARE:

1) Arduino UNO

2) MPU 6050-Sensor

3) Drähte verbinden

SOFTWARE: Arduino-IDE

Kommunikationsprotokoll: Dieser IMU-Sensor kommuniziert mit dem Arduino über das I2C-Busprotokoll.

Sie können an Beschleunigungsmessern und Gyroskopen separat arbeiten, aber sie sind nicht so genau wie dieses kombinierte Modul.

Kommen wir nun zum Schaltplan und dem Anschlussprofil.

Informationen zum Anschluss finden Sie in einer dieser beiden Abbildungen unten.

Wenn Sie Probleme mit den obigen Zahlen haben, keine Panik ..... 

Gehen Sie das Anschluss-Pin-Profil unten durch:

Verbinden Sie 5 V [IMU MPU-6050] mit VCC [ARDUINO] 

Verbinden SDA [IMU MPU-6050] mit Analog IN (A4) [ARDUINO] 

Verbinden Sie SCL [IMU MPU-6050] mit Analog IN (A5) [ARDUINO] 

Verbinden Sie GND [IMU MPU-6050] mit GND [ARDUINO]

Verbinden Sie INTPIN [IMU MPU-6050] mit Pin 2 (digitaler PWM-Pin) [ARDUINO]

Wenn Ihr MPU 6050-Modul einen 5V-Pin hat, können Sie es an den 5V-Pin Ihres Arduino anschließen. Andernfalls müssen Sie es an den 3,3-V-Pin anschließen, um Überspannungsprobleme zu vermeiden.

Nachdem wir nun die Hardware eingerichtet haben, ist es an der Zeit, den Arduino zu programmieren.

Um die MPU 6050 zu testen, klicken Sie zunächst auf diesen Link und laden Sie die Arduino-Bibliothek für MPU 6050 herunter. Es gibt einen Zip-Ordner namens "MPU6050.zip". Laden Sie den Ordner herunter und extrahieren Sie seinen Inhalt. Kopieren Sie danach den Bibliotheksordner "MPU6050" und fügen Sie ihn in den Bibliotheksordner von Arduino ein. Das heißt, Sie müssen zu dem Ort gehen, an dem der Ordner "Bibliotheken" von Arduino vorhanden ist, und dann einfach diesen Ordner "MPU6050" darin einfügen.

Als nächstes müssen Sie eine andere Bibliothek namens "I2Cdev.zip" herunterladen (falls nicht zuvor installiert) und auf die gleiche Weise wie die vorherige in die Arduino-Bibliothek einfügen.

Jetzt haben wir im Ordner "Bibliotheken" von Arduino zwei neue Entitäten. (Abb:8 )

Klicken Sie nun auf die Arduino-IDE und sehen Sie, ob diese neuen Bibliotheken sichtbar sind (Abb (9). 

Bevor Sie diese Bibliotheken in Ihren Sketch aufnehmen, müssen Sie den Code für MPU6050 abrufen. Siehe Abb. (10)

(Datei> Beispiele> MPU6050> Beispiele> MPU6050_DMP6). Klicken Sie auf diese "MPU6050_DMP6"-Datei.

Als nächstes binden Sie die Bibliotheken "I2Cdev" und "MPU6050" in diese Skizze ein [Abb (11)].

Nachdem Sie alle Schritte befolgt haben, KOMPILIEREN Sie die Skizze [Abb (12)].

Jetzt bleibt der letzte Schritt...

Wenn Sie feststellen, dass unten rechts in diesem Fenster die Meldung "Arduino/Genuino Uno on COM1" steht, überprüfen Sie, ob sie richtig ist. Wenn nicht, siehe [Abb (14)]. Klicken Sie jetzt nicht auf den Serial Monitor. Gehen Sie erst nach dem Hochladen der Skizze [wie in Abb. (13)] zu den nächsten Schritten.

Sie müssen jedes Mal sicherstellen, dass der richtige Port zugewiesen ist, wenn Sie Ihr Arduino anschließen.

Verwirrt mit diesem neuen Fenster?? Nun, das ist Ihr Ausgabebildschirm. Technisch gesehen nennen wir es den Serial Monitor. Dort lesen wir unsere Werte von verschiedenen Sensoren aus.

SCHRITT:       Tools> Serial Monitor     oder    Tastenkombination (Strg + Umschalt + M) 

Wenn beim Hochladen der Skizze Probleme auftreten, obwohl Sie die richtigen Ports ausgewählt haben. Klicken Sie auf diesen Link (für Windows-Nutzer). Für Mac-Benutzer siehe das Handbuch. Linux-Benutzer finden auf dieser Webseite eine Anleitung.

Öffnen Sie nach dem Hochladen des Codes den seriellen Monitor und ändern Sie die „Baudrate“ auf 115200. Wenn Sie andere Baudraten auswählen, werden Müllkommentare angezeigt, da diese nicht synchron sind. HINWEIS: 8MHz oder langsamere Host-Prozessoren, wie der Teensy @ 3.3v oder der Ardunio Pro Mini mit 3.3v, können diese Baudrate nicht zuverlässig verarbeiten, da das Baud-Timing zu falsch auf die Prozessor-Ticks ausgerichtet ist. In diesen Fällen müssen Sie 38400 oder langsamer verwenden oder eine externe separate Quarzlösung für den UART-Timer verwenden.

Wenn Sie diese Anweisung „Initializing I2C devices…“ nicht auf Ihrem Bildschirm sehen, drücken Sie die RESET-Taste. Es sollte jetzt funktionieren. [Abb. (15)]


WISSENSWERTES>>> Sie sehen eine Zeile mit der Aufschrift „Sende ein beliebiges Zeichen, um mit der DMP-Programmierung und -Demo zu beginnen:“ Was ist DMP?

Ans: DMP steht für Digital Motion Processing . Die MPU 6050 des Invense verfügt über einen eingebauten Bewegungsprozessor. Es verarbeitet die Werte des Beschleunigungsmessers und des Gyroskops, um uns genaue 3D-Werte zu liefern; d.h. Yaw, Pitch and Roll. [Abb (16)]


WISSENSWERTES>>> Wir haben gesehen, dass die Kommunikation zwischen Sensor und Arduino auf dem I2C-Bus-Protokoll basiert. Ebenso haben wir in dieses Projekt auch eine I2C-Bibliothek eingebunden. Weißt du, wofür I2C steht?

Ans: Der I2C-Bus besteht physikalisch aus 2 aktiven Drähten und einem Erdungsanschluss. Die aktiven Leitungen, genannt SDA und SCL , sind beide bidirektional. SDA ist die Serial DAta-Leitung und SCL ist die Serial Clock-Leitung. Jedes an den Bus angeschlossene Gerät hat seine eigene eindeutige Adresse, egal ob MCU, LCD-Treiber, Speicher oder ASIC. Jeder dieser Chips kann je nach Funktionalität als Empfänger und/oder Sender fungieren. Offensichtlich ist ein LCD-Treiber nur ein Empfänger, während ein Speicher- oder E/A-Chip sowohl Sender als auch Empfänger sein kann. Der I2C-Bus ist ein Multi-Master-Bus. Dies bedeutet, dass mehr als ein IC, der eine Datenübertragung initiieren kann, daran angeschlossen werden kann. Die I2C-Protokollspezifikation besagt, dass der IC, der eine Datenübertragung auf dem Bus initiiert, als Bus-Master betrachtet wird. Folglich gelten alle anderen ICs zu dieser Zeit als Bus-Slaves. Ebenso ist der MPU-Sensor der Bus-Slave.


Visualisiere die Bewegung in 3D in meinem nächsten Tutorial. Klicken Sie hier




Code

  • Arduino-Code für MPU-Sensor
Arduino-Code für MPU-SensorArduino
*/// I2Cdev und MPU6050 müssen als Bibliotheken installiert sein, sonst müssen die .cpp/.h-Dateien// für beide Klassen im Include-Pfad Ihres Projekts sein#include "I2Cdev.h"#include "MPU6050_6Axis_MotionApps20 .h"//#include "MPU6050.h" // nicht erforderlich bei Verwendung von MotionApps include-Datei // Arduino Wire-Bibliothek ist erforderlich, wenn I2Cdev I2CDEV_ARDUINO_WIRE-Implementierung// in I2Cdev.h verwendet wird #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include "Wire .h"#endif// Standard-I2C-Adresse der Klasse ist 0x68// spezifische I2C-Adressen können hier als Parameter übergeben werden // AD0 low =0x68 (Standard für SparkFun Breakout und InvenSense Evaluation Board) // AD0 high =0x69MPU6050 mpu;/ /MPU6050 mpu(0x69); // <-- verwenden für AD0 hoch/* ========================================================================HINWEIS:Zusätzlich zum Anschluss 3,3 V, GND, SDA und SCL, Diese Skizze hängt davon ab, dass der INT-Pin des MPU-6050 mit dem externen Interrupt #0-Pin des Arduino verbunden ist. Beim Arduino Uno und Mega 2560 ist dies der digitale I/O-Pin 2. * ========================================================================*//* =======================================================================HINWEIS:Arduino v1.0.1 mit dem Leonardo-Board erzeugt einen Kompilierungsfehler, wenn Serial.write (buf, len) verwendet wird. Die Ausgabe von Teapot verwendet diese Methode. Die Lösung erfordert eine Modifikation der Arduino USBAPI.h-Datei, die zum Glück einfach, aber nervig ist. Dies wird in der nächsten IDE-Version behoben. Weitere Informationen finden Sie unter diesen Links:http://arduino.cc/forum/index.php/topic,109987.0.html http://code.google.com/p/arduino/issues/detail?id=958 * =======================================================================*/// kommentieren Sie "OUTPUT_READABLE_QUATERNION", wenn Sie die tatsächlichen// Quaternion-Komponenten in a [w, x, y, z]. aus dem FIFO.// Beachten Sie, dass Euler-Winkel unter Gimbal-Lock leiden (weitere Informationen finden Sie unter// http://en.wikipedia.org/wiki/Gimbal_lock)//#define OUTPUT_READABLE_EULER// Kommentieren Sie "OUTPUT_READABLE_YAWPITCHROLL", wenn Sie möchten um die Gier-/// Nick-/Rollwinkel (in Grad) zu sehen, die aus den Quaternionen berechnet werden, die // vom FIFO kommen. Beachten Sie, dass dies auch Gravitationsvektorberechnungen erfordert. // Beachten Sie auch, dass Gier-/Neigungs-/Rollwinkel unter einer Gimbal-Verriegelung leiden (für// weitere Informationen siehe:http://en.wikipedia.org/wiki/Gimbal_lock)#define OUTPUT_READABLE_YAWPITCHROLL/ / entkommentieren Sie "OUTPUT_READABLE_REALACCEL", wenn Sie die Beschleunigung // Komponenten mit entfernter Schwerkraft sehen möchten. Dieses Beschleunigungsreferenzsystem ist nicht orientierungskompensiert, daher ist +X immer +X gemäß dem // Sensor, nur ohne die Auswirkungen der Schwerkraft. Wenn Sie möchten, dass die Beschleunigung// zur Orientierung kompensiert wird, verwenden Sie stattdessen OUTPUT_READABLE_WORLDACCEL.//#define OUTPUT_READABLE_REALACCEL// Kommentieren Sie "OUTPUT_READABLE_WORLDACCEL", wenn Sie die Beschleunigung// Komponenten mit entfernter Schwerkraft und angepasst an den Weltrahmen von// Referenz (Gier ist relativ zur Ausgangsorientierung, da hier kein Magnetometer // vorhanden ist). Könnte in einigen Fällen sehr praktisch sein.//#define OUTPUT_READABLE_WORLDACCEL// Kommentieren Sie "OUTPUT_TEAPOT", wenn Sie eine Ausgabe wünschen, die dem // Format entspricht, das für die InvenSense-Teekannen-Demo verwendet wird //#define OUTPUT_TEAPOT#define LED_PIN 13 // (Arduino ist 13 , Teensy ist 11, Teensy++ ist 6)bool blinkState =false; // MPU-Steuerung/Status varsbool dmpReady =false; // auf true setzen, wenn DMP-Init erfolgreich waruint8_t mpuIntStatus; // hält das aktuelle Interrupt-Statusbyte von MPUuint8_t devStatus; // Status nach jeder Geräteoperation zurückgeben (0 =Erfolg, !0 =Fehler)uint16_t packetSize; // erwartete DMP-Paketgröße (Standard ist 42 Byte)uint16_t fifoCount; // Anzahl aller Bytes, die sich derzeit in FIFouint8_t befinden fifoBuffer[64]; // FIFO-Speicherpuffer // Orientierung/Bewegung varsQuaternion q; // [w, x, y, z] Quaternion-ContainerVectorInt16 aa; // [x, y, z] BeschleunigungssensormessungenVectorInt16 aaReal; // [x, y, z] schwerkraftfreie BeschleunigungssensormessungenVectorInt16 aaWorld; // [x, y, z] Weltbild-Beschleunigungssensor-MessungenVectorFloat Gravitation; // [x, y, z] Schwerkraftvektorfloat euler[3]; // [psi, theta, phi] Eulerwinkel containerfloat ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll Container und Gravitationsvektor // Paketstruktur für InvenSense Teekanne demouint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };// ==============================================================// ===UNTERBRECHUNGSERKENNUNGSROUTINE ===// ==============================================================flüchtig bool mpuInterrupt =false; // zeigt an, ob der MPU-Interrupt-Pin Highvoid geworden ist dmpDataReady () { mpuInterrupt =true;} // ================================================================// ===ERSTEINRICHTUNG ===// ==============================================================void setup() { // I2C-Bus beitreten (die I2Cdev-Bibliothek macht dies nicht automatisch) #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400kHz I2C Takt (200kHz wenn CPU 8MHz ist) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // Initialisieren der seriellen Kommunikation // (115200 ausgewählt, weil es für die Ausgabe der Teapot-Demo erforderlich ist, aber es liegt // wirklich an Ihnen, abhängig von Ihrem Projekt) Serial.begin(115200); while (!Seriell); // auf Leonardo-Aufzählung warten, andere fahren sofort fort // HINWEIS:8MHz oder langsamere Host-Prozessoren, wie der Teensy @ 3.3v oder Ardunio // Pro Mini, die mit 3.3v laufen, können diese Baudrate aufgrund // des Baud-Timings nicht zuverlässig verarbeiten zu falsch mit Prozessor-Ticks ausgerichtet sein. Sie müssen in diesen Fällen // 38400 oder langsamer verwenden oder eine externe separate // Kristalllösung für den UART-Timer verwenden. // Gerät initialisieren Serial.println (F ("Initialisieren von I2C-Geräten ...")); mpu.initialize(); // Verbindung überprüfen Serial.println (F ("Geräteverbindungen testen ...")); Serial.println (mpu.testConnection () ? F ("MPU6050-Verbindung erfolgreich"):F ("MPU6050-Verbindung fehlgeschlagen")); // warten, bis Serial.println (F("\nSende ein beliebiges Zeichen, um mit der DMP-Programmierung und Demo zu beginnen:")); while (Serial.available() &&Serial.read()); // Puffer leeren while (!Serial.available()); // auf Daten warten während (Serial.available () &&Serial.read (); // Puffer wieder leeren // DMP laden und konfigurieren Serial.println (F ("Initializing DMP ...")); devStatus =mpu.dmpInitialize(); // Geben Sie hier Ihre eigenen Gyro-Offsets an, skaliert für die minimale Empfindlichkeit mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 Werkseinstellung für meinen Testchip // Stellen Sie sicher, dass es funktioniert (gibt 0 zurück, wenn ja) if (devStatus ==0) { // DMP einschalten, jetzt, da es bereit ist Serial.println (F ("DMP aktivieren. ..")); mpu.setDMPEnabled(true); // Arduino-Interrupt-Erkennung aktivieren Serial.println (F ("Aktivieren der Interrupt-Erkennung (Arduino externer Interrupt 0) ...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus(); // Setzen Sie unser DMP-Ready-Flag, damit die Hauptfunktion loop () weiß, dass es in Ordnung ist, sie zu verwenden Serial.println (F ("DMP ready! Waiting for first Interrupt ...")); dmpReady =wahr; // Erwartete DMP-Paketgröße für späteren Vergleich abrufen packetSize =mpu.dmpGetFIFOPacketSize(); } else { // FEHLER! // 1 =anfängliches Laden des Speichers fehlgeschlagen // 2 =DMP-Konfigurationsupdates fehlgeschlagen // (wenn es kaputt geht, ist der Code normalerweise 1) Serial.print (F ("DMP-Initialisierung fehlgeschlagen (code")); Serial. print(devStatus); Serial.println(F(")")); } // LED für Ausgang konfigurieren PinMode (LED_PIN, OUTPUT);} // ==============================================================// ===HAUPTPROGRAMMSCHLEIFE ===// ==============================================================void loop() { // Wenn die Programmierung fehlgeschlagen ist, versuchen Sie nichts zu tun if (!dmpReady) return; // auf MPU-Interrupt oder zusätzliche Pakete warten, die verfügbar sind while (!mpuInterrupt &&fifoCount  1 Paket verfügbar ist // (dadurch können wir sofort mehr lesen, ohne auf einen Interrupt zu warten) fifoCount -=packetSize; #ifdef OUTPUT_READABLE_QUATERNION // Quaternion-Werte in einfacher Matrixform anzeigen: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 // Euler-Winkel in Grad anzeigen 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 // Euler-Winkel in Grad anzeigen 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 // Anzeige der tatsächlichen Beschleunigung, angepasst um die Schwerkraft zu entfernen mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetAccel(&aa, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity); Serial.print ( "areal \ t"); Serial.print (aaReal.x); Serial.print("\t"); Serial.print (aaReal.y); Serial.print("\t"); Serial.println (aaReal.z); #endif #ifdef OUTPUT_READABLE_WORLDACCEL // Anzeige der anfänglichen Weltrahmenbeschleunigung, angepasst, um die Schwerkraft zu entfernen // und basierend auf der bekannten Ausrichtung von Quaternion gedreht 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 // Anzeige von Quaternion-Werten im InvenSense Teapot-Demoformat:teapotPacket[2] =fifoBuffer[0]; teapotPacket[3] =fifoBuffer[1]; TeekannePacket[4] =fifoBuffer[4]; TeekannePacket[5] =fifoBuffer[5]; TeekannePacket[6] =fifoBuffer[8]; TeekannePacket[7] =fifoBuffer[9]; TeekannePacket[8] =fifoBuffer[12]; TeekannePacket[9] =fifoBuffer[13]; Serial.write (TeekannePacket, 14); TeekannePaket[11]++; // packetCount, Schleife absichtlich bei 0xFF #endif // LED blinken, um Aktivität anzuzeigen blinkState =!blinkState; digitalWrite (LED_PIN, blinkState); }}

Schaltpläne


Herstellungsprozess

  1. Linienverfolgungssensor mit RPi
  2. Umgebungssensor-API mit einem RPi
  3. Bewegungssensor mit Raspberry Pi
  4. Raspberry Pi GPIO mit PIR-Bewegungssensor:Bestes Tutorial
  5. Anbindung des PIR-Bewegungssensors HC-SR501 an Raspberry Pi
  6. Erste Schritte mit TJBot
  7. Erste Schritte mit dem RAK 831 Lora Gateway und RPi3
  8. Erste Schritte mit dem RAK831 LoRa Gateway und RPi3
  9. Erste Schritte mit KI im Versicherungswesen:Ein Einführungsleitfaden
  10. Arduino-Tutorial 01:Erste Schritte