Arduino: Wheel Encoders (Rotary Encoders)

Wheel-Encoder in der 4WD Roboter Platform

Meine 4WD Robotor Platform wurde mit zwei sogenannten Drehimpulsgeber (Wheel Encoder, auch Rotary Encoder) geliefert. Mit diesen Encodern kann man feststellen, um wie viel sich die Räder gedreht haben. Letztlich ist es damit also möglich aus der gefahrenen Strecke den Standort des Roboters zu bestimmen.

Soweit ich es einschätzen kann, ist der Schlupf der Reifen beim Wenden der Platform nicht genau reproduzierbar. Letztlich geben die Encoder also wohl nur zuverlässige Positionsdaten, bis die Platform zum ersten Mal gewendet wurde. Aber wenn man schon solche Sensoren an den Rädern hat, dann möchte man natürlich auch wissen, wie man deren Daten auslesen kann.

Die in der 4WD-Platform verwendeten Wheel Encoder (SEN0038) liefern ein digitales Signal, das ich auf die beiden Interrupt-Eingänge des Arduino (Digital Pin 2 und Digital Pin 3) gelegt habe. In den entsprechenden Interrupt Service Routinen (ISR) kann dann aus der Drehrichtung des Motors der aktuelle Fahrweg berechnet werden.

Bei einem Durchmesser der Räder von 65 Millimeter ergibt sich ein Umfang von etwa 204,2 Millimeter. Der Wheel-Encoder hat eine Auflösung von 20 PPR (points per revolution). Jeder Pegelwechsel beim Encoder entspricht also etwa einem Fahrweg von einem Zentimeter. Die Drehrichtung kann von den beschriebenen Encodern nicht bestimmt werden. Sie ergibt sich deshalb aus der Drehrichtung des Motors.

Hier ein kleiner Arduino-Sketch, in dem ich auf komplizierte weitergehende Berechnungen verzichte. Es werden einfach die Pegeländerungen von zwei Inkrementalgebern gezählt und über die serielle Schnittstelle ausgegeben.

— schnipp —

/*
 * Simple example of analysis of the 4WD Platform wheel encoder
 *
 * Die Dateleitungen (grün) der Encoder gehören in Digital-Pin 2 und 3
 * Die Richtung ergibt sich aus der Motordrehrichtung
 *
 * Version: 0.1 2011.01.05
 * Copyleft: 2011 Heiner Otterstedt
 * Weblinks: http://www.hobby-werkstatt-blog.de/
 */
volatile int cnt0 = 0;
volatile int cnt1 = 0;

void setup()
{ attachInterrupt(0, doCount0, CHANGE);
  attachInterrupt(1, doCount1, CHANGE);
  Serial.begin(9600);
}

void loop()
{ Serial.print(cnt0);
  Serial.print(" - ");
  Serial.println(cnt1);
  delay(1000);
}

// Dummy interrupt functions
void doCount0() { cnt0++;  }
void doCount1() { cnt1++;  }

— schnapp —

Siehe auch:


Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>