Inkrementalgeber (Radencoder)
Pololu Zumo 32u4 Library: Odometrie
Mit der Klasse Zumo32U4Encoders
werden die Methoden für den Motorencoder bereitgestellt.
Mit einem Inkrementalgeber (Rad-Encoder) kann man messen, wie weit sich die einzelnen Motoren zwischen zwei Messungen gedreht haben. Der Zumo 32u4 hat an jedem Motor einen Quadratur-Encoder, welcher mit jeweils einer magnetischen Scheibe an der Motorwelle und einem Hall-Effekt-Sensor auf dem Controllerboard des Zumo realisiert ist. Der Quadratur-Encoder hat eine Auflösung von 12 Schritten pro Umdrehung.
Da die Räder nicht direkt, sondern mit einem Getriebe mit der Motorwelle verbunden sind (Übersetzung 75.81:1), führt das zu einer Auflösung von Impulsen pro Radumdrehung (CPR - counts per revolution) oder ca. 0,128 mm zurückgelegter Strecke pro Impuls.
static int getCountsLeft()
Gibt die vom linken Encoder erkannte Anzahl von Impulses zurück. Die Zählung beginnt mit null. Ein positiver Rückgabewert entspricht einer Vorwärtsbewegung, ein negativer Wert einer Rückwärtsbewegung des Roboters.
Die Anazahl der Impulse werden als int
-Wert zurückgegeben. Überschreitet der Wert 32767
, springt er auf -32768
und zählt positiv weiter. Unterschreitet der Wert -32768
, springt er auf 32767
. Aus diesem Grund sollte darauf geachtete werden, dass die Encoderwerte regelmäßig abgefragt und zurückgesetzt werden.
Der Encoder wird durch einen Interrupt gesteuert, weshalb keine zusätzliche Funktion zum Bestimmen der Encoder-Impulse aufgerufen werden muss.
Beispiel
- 3pi+
- Zumo
// Zeigt die Encoder-Werte auf dem Display an
#include <Wire.h>
#include <Pololu3piPlus32U4.h>
using namespace Pololu3piPlus32U4;
Encoders encoders; // Encoder-Objekt deklarieren
OLED oled;
unsigned long lastDisplayTime = 0;
void setup() {
// bleibt leer
}
void loop() {
if ((millis() - lastDisplayTime) >= 100) {
int countsLeft = encoders.getCountsLeft(); // Aufruf der getCountsLeft() Methode
int countsRight = encoders.getCountsRight(); // Aufruf der getCountsLeft() Methode
oled.clear();
oled.print(countsLeft);
oled.gotoXY(0, 1);
oled.print(countsRight);
lastDisplayTime = millis();
}
}
// Zeigt die Encoder-Werte auf dem Display an
#include <Wire.h>
#include <Zumo32U4.h>
Zumo32U4Encoders encoders; // Encoder-Objekt deklarieren
Zumo32U4LCD lcd;
unsigned long lastDisplayTime = 0;
void setup() {
// bleibt leer
}
void loop() {
if ((millis() - lastDisplayTime) >= 100) {
int countsLeft = encoders.getCountsLeft(); // Aufruf der getCountsLeft() Methode
int countsRight = encoders.getCountsRight(); // Aufruf der getCountsLeft() Methode
lcd.clear();
lcd.print(countsLeft);
lcd.gotoXY(0, 1);
lcd.print(countsRight);
lastDisplayTime = millis();
}
}
static int getCountsRight()
Wie getCountsLeft()
nur für das rechte Rad.
static int getCountsAndResetLeft()
Verhält sich wie static int getCountsLeft()
, außer dass vor jeder Rückgabe des Wertes der Zähler auf Null gesetzt wird. Bei wiederkehrendem Aufruf von getCountsAndResetLeft()
wird also die Anzahl der Encoder-Impulse zwischen zwei Aufrufen zurückgegeben und ein ungewollter Überlauf des Zählwertes vermieden.
static int getCountsAndResetRight()
Wie getCountsAndResetRight()
nur für das rechte Rad.