Inhaltsverzeichnis:

Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden? - Gunook
Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden? - Gunook

Video: Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden? - Gunook

Video: Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden? - Gunook
Video: Accelerometer und IMU; Gesten, Teil 1 2024, November
Anonim
Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden?
Eine Möglichkeit, eine Trägheitsmesseinheit zu verwenden?

Der Kontext:

Ich baue zum Spaß einen Roboter, den ich autonom in einem Haus bewegen möchte.

Es ist eine lange Arbeit und ich arbeite Schritt für Schritt.

Ich habe bereits 2 instructables zu diesem Thema veröffentlicht:

  • eine über die Herstellung eines Rad-Encoders
  • eine über WLAN-Verbindung

Mein Roboter wird mit Hilfe meines selbstgebauten Radencoders von 2 DC-Motoren angetrieben.

Ich verbessere derzeit die Bewegungssteuerung und habe einige Zeit mit Gyroskop, Beschleunigungsmesser und IMU verbracht. Diese Erfahrung möchte ich gerne teilen.

Sie möchten mehr über die Lokalisierung erfahren? Hier ist ein Artikel darüber, wie man künstliche Intelligenz und Ultraschall kombiniert, um den Roboter zu lokalisieren

Schritt 1: Warum eine Trägheitsmesseinheit verwenden?

Warum eine Trägheitsmesseinheit verwenden?
Warum eine Trägheitsmesseinheit verwenden?

Warum habe ich also eine IMU verwendet?

Der erste Grund war, dass, wenn der Rad-Encoder präzise genug ist, um eine gerade Bewegung zu kontrollieren, ich selbst nach dem Tuning keine Genauigkeit für die Drehung von weniger als +- 5 Grad erreichen konnte, und das ist nicht genug.

Also habe ich 2 verschiedene Sensoren ausprobiert. Zuerst verwende ich ein Magnetometer (LSM303D). Das Prinzip war einfach: Vor der Drehung die Nordausrichtung ermitteln, das Ziel berechnen und die Bewegung anpassen, bis das Ziel erreicht ist. Es war etwas besser als mit dem Encoder, aber mit zu viel Dispersion. Danach habe ich versucht, ein Gyroskop (L3GD20) zu verwenden. Das Prinzip bestand darin, nur die vom Sensor gelieferte Rotationsgeschwindigkeit zu integrieren, um die Rotation zu berechnen. Und es hat gut funktioniert. Ich konnte die Rotation bei +- 1 Grad kontrollieren.

Trotzdem war ich neugierig, einige IMU auszuprobieren. Ich wähle eine BNO055-Komponente. Ich habe einige Zeit damit verbracht, diese IMU zu verstehen und zu testen. Am Ende habe ich mich aus folgenden Gründen für diesen Sensor entschieden

  • Ich kann die Rotation genauso gut steuern wie mit dem L3GD20
  • Ich kann eine leichte Drehung erkennen, wenn ich mich geradeaus bewege
  • Ich benötige eine Nordorientierung für die Roboterlokalisierung und die Kompasskalibrierung des BNO055 ist sehr einfach

Schritt 2: Wie verwende ich BNO055 für die 2D-Lokalisierung?

Wie verwende ich BNO055 für die 2D-Lokalisierung?
Wie verwende ich BNO055 für die 2D-Lokalisierung?

BNO055 IMU ist ein intelligenter 9-Achsen-Sensor von Bosch, der absolute Orientierung bieten kann.

Das Datenblatt bietet eine vollständige Dokumentation. Es ist eine High-Tech-Komponente, es ist ein ziemlich komplexes Produkt, und ich habe einige Stunden damit verbracht, zu lernen, wie es funktioniert und verschiedene Möglichkeiten auszuprobieren, es zu verwenden.

Ich denke, es könnte nützlich sein, diese Erfahrung zu teilen.

Zuerst habe ich die Adafruit-Bibliothek verwendet, die ein gutes Werkzeug zum Kalibrieren und Entdecken des Sensors bietet.

Am Ende und nach vielen Tests habe ich mich dafür entschieden

  • Verwenden Sie die Adafruit-Bibliothek nur zum Speichern der Kalibrierung
  • Verwenden Sie 3 aller möglichen Modi von BNO055 (NDOF, IMU, Compss)
  • Widmen Sie einen Arduino Nano, um die Lokalisierung basierend auf BNO055-Messungen zu berechnen

Schritt 3: Hardware Point of Vue

Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue

BNO055 ist eine I2C-Komponente. Es braucht also Stromversorgung, SDA und SCL, um zu kommunizieren.

Achten Sie nur auf die Vdd-Spannung entsprechend dem von Ihnen gekauften Produkt. Der Bosch-Chip funktioniert im Bereich: 2,4 V bis 3,6 V und Sie können 3,3 V- und 5 V-Komponenten finden.

Die Verbindung zwischen Nano und BNO055 ist problemlos.

  • Der BNO055 wird vom Nano. angetrieben
  • SDA & SCL sind mit 2 x 2k Pull-Up-Widerständen verbunden.
  • 3 LED zur Diagnose am Nano angeschlossen (mit Widerständen)
  • 2 Anschlüsse, die verwendet werden, um den Modus nach dem Booten zu definieren
  • 1 Stecker in Richtung BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 Stecker zum Roboter/Mega (+9V, Gnd, sda, Scl, Pin11, Pin12)

Ein bisschen löten und das wars!

Schritt 4: Wie funktioniert es?

Wie funktioniert es ?
Wie funktioniert es ?

Aus kommunikativer Sicht:

  • Der Nano ist der I2C-Busmaster
  • Der Robot/Mega und der BNO055 sind I2C-Slaves
  • Der Nano liest permanent die BNO055-Register
  • Der Roboter/Mega gibt ein numerisches Signal aus, um das Wort vom Nano anzufordern

Aus rechnerischer Sicht: Der Nano in Kombination mit dem BNO055 liefert

  • Der Kompasskurs (zur Lokalisierung verwendet)
  • Ein relativer Kurs (wird verwendet, um Drehungen zu steuern)
  • Der absolute Kurs und die absolute Position (wird verwendet, um Bewegungen zu steuern)

Aus funktionaler Sicht: Der Nano:

  • verwaltet die BNO055-Kalibrierung
  • verwaltet die Parameter und Befehle des BNO055

Das Subsystem Nano & BNO055:

  • Berechnen Sie für jedes Roboterrad den absoluten Kurs und die Position (mit einem Skalierungsfaktor)
  • Berechnen des relativen Kurses während der Rotation des Roboters

Schritt 5: Die Architektur und Software

Die Architektur und Software
Die Architektur und Software

Die Hauptsoftware läuft auf einem Arduino Nano

  • Architektur basiert auf I2C-Kommunikation.
  • Ich habe mich für einen Nano entschieden, da der Atmega, auf dem der Roboter läuft, eher bereits geladen war und diese Architektur die Wiederverwendung an anderer Stelle am einfachsten macht.
  • Der Nano liest die BNO055-Register, berechnet und speichert Kurs und Lokalisierung in seinen eigenen Registern.
  • Der Arduino Atmega, der den Robotercode ausführt, sendet Rad-Encoder-Informationen an den Nano und liest die Überschriften und die Lokalisierung in den Nano-Registern.

Der Subsystem-Code (Nano) ist hier auf GitHub verfügbar

Das Adafruit-Kalibrierungstool, wenn hier auf GitHub (Kalibrierung wird auf eeproom gespeichert)

Schritt 6: Was habe ich gelernt?

Bezüglich I2C

Zuerst habe ich versucht, 2 Master (Arduino) und 1 Slave (Sensor) am selben Bus zu haben, aber am Ende ist es möglich und am einfachsten, nur den Nano als Master einzustellen und die GPIO-Verbindung zwischen den 2 Arduinos zu verwenden, um den Token anzufordern.

Zu BNO055 zur 2D-Orientierung

Ich kann mich auf 3 verschiedene Betriebsmodi konzentrieren: NDOF (Kombinationsgyroskop, Beschleunigungsmesser und Compas) wenn der Roboter im Leerlauf ist, IMU (Kombinationsgyroskop, Beschleunigungsmesser) wenn sich der Roboter bewegt und Kompass während der Lokalisierungsphase. Das Umschalten zwischen diesen Modi ist einfach und schnell.

Um die Codegröße zu reduzieren und die Möglichkeit zu behalten, den BNO055-Interrupt zur Erkennung von Kollisionen zu verwenden, ziehe ich es vor, die Adafruit-Bibliothek nicht zu verwenden und dies selbst zu tun.

Empfohlen: