Quellcode zum Arduino Drehencoder auslesen (Projekt 29)

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

In diesem Artikel wird ergänzend zum Projekt 29 [[1]] der Quellcode für das Auslesen eines Drehencoders aufgezeigt.



#include <Encoder.h>

Encoder meinEnc(5,6)

long altePostion = -999; //Beispielwert

void setup()
{
 Serial.begin(9600);
}

void loop()
{
 long neuePostion = meinEnc.read();
 
 if(neuePosition != altePosition)
 {
   altePosition = neuePosition;
   Serial.println(neuePosition);

 }
}

Zu Beginn muss die Header-Datei "Encoder.h" inkludiert werden. Mithilfe dieser wird nun ein Objekt "meinEnc(5,6)" erstellt. Diesem werden die analogen Pins, an welche der Drehencoder angeschlossen wurde, übergeben. Im "void setup()" wird die Baudrate für das spätere anzeigen gesetzt. In der "void loop()" wird der zyklisch die neue Position des Drehencoders ausgelesen und mit dem alten Wert verglichen. Stimmen diese nicht überein wird der neue Wert gesetzt und anschließend ihm Terminal angezeigt.

Eine zweite Möglichkeit einen Encoder einzulesen kann wie folgt stattfinden:

/* Drehencoder */
#define ENC_A 14 //Analogpin 0
#define ENC_B 15 //Analogpin 1
#define ENC_PORT PINC
 
void setup()
{
  /* Setup Encoder pins als Ausgabe */
  pinMode(ENC_A, INPUT);
  digitalWrite(ENC_A, HIGH);
  pinMode(ENC_B, INPUT);
  digitalWrite(ENC_B, HIGH);
  Serial.begin (9600);     //bei einer nicht zutreffenden Inkrementierung sollte die Baudrate erhöht werden
  Serial.println("Start");
}
 
void loop()
{
 static uint8_t counter = 0;      //Dieser Wert wird über den Encoder verändert
 int8_t tmpdata;
 /**/
  tmpdata = read_encoder();
  if( tmpdata ) {
    Serial.print("Counter value: ");
    Serial.println(counter, DEC);
    counter += tmpdata;
  }
}
 

/* Gibt den geänderten Zustand wieder (-1,0,1) */
int8_t read_encoder()
{
  static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
  static uint8_t old_AB = 0;

  old_AB <<= 2;           //merkt sich den vorherigen Zustand
  old_AB |= ( ENC_PORT & 0x03 );  //fügt den aktuellen Zustand hinzu
  return ( enc_states[( old_AB & 0x0f )]);
}
}

Im Prinzip ist der zweite Quellausschnitt ähnlich dem oberen, allerdings bedient sich dieser nicht einer Bibliothek, was die Sketchgröße relativ klein hält. Weiterhin ist die Funkion "read_encoder()" hier am wichtigsten. Zuerst findet eine Inialisierung von "enc_states[]" und "old_AB", wobei "enc_states[]" die möglichen Zustände besitzt und "old_AB" den vorherigen Zustand. Abschließend erfolgt die Zuweisung des aktuellen Wertes. Dieser wird dann mit return wiedergegeben.