Mein Paket … … ein Encoder

Heute kam mein Paket …

… mit einem Encoder. Ich habe ihn bei Reichelt bestellt (Dreh-Impuls-Geber STEC11B03 für 3,30 €).

Encoder01

Dieser Encoder hat 15 Rastungen pro Umdrehung. Es gibt 2 Leitungen mit zeitlich versetzten Impulsen. Wenn man sie auswertet, kann man erkennen, ob rechts oder links herum gedreht wird. In einer Anwendung kann man damit sehr einfach Stellwerte z.B. für Helligkeit, Farbe, Geschwindigkeit usw. erhöhen oder senken. Auch ein logarithmisches Verhalten kann einfach erzeugt werden, in dem man den Stellwert mit einem Faktor z.B. 1,2 multipliziert oder durch diese Zahl teilt. Das ist z.B. bei Helligkeit oder Lautstärke sinnvoll.

Der Encoder hat einen Taster, der durch Drücken des Drehknopfs geschlossen wird. Man kann beispielsweise durch den Taster die Funktion des Encoder umschalten  (Farbe -> Helligkeit -> Farbe …). Der jeweilige Einstellwert ändert sich nur, wenn der Knopf gedreht wird. Das ist sehr praktisch, weil man auch für mehrere Einstellungen mit einem Bedienknopf auskommt und den Knopf nicht loslassen muß.

Für Encoder gibt es im Netz mehrere Beispielprogramme und Libraries. Diese haben mir aber alle nicht gefallen, weil sie teilweise Interupts benutzen, nur eine Flanke 0->1 oder 1->0 auswerten oder mit ihren vielen IF–Abfragen zu umständlich sind. Ich habe eine einfache Auswerte-Routine in Form einer Klasse geschrieben, die beide Flanken ohne viel Aufwand auswertet. Hier das Coding meines Test-Programms :

//-----------------------------------------------------
// Begin class declaration encoder 
//-----------------------------------------------------

class encoder {
public:
  encoder(int Pin1, int Pin2);	//Constructor
  int read();
private:
  int _Pin1, _Pin2, _Val1, _Old_Val1, _Val2;
};

//-----------------------------------------------------

encoder::encoder(int Pin1, int Pin2) {
  _Pin1 = Pin1;
  _Pin2 = Pin2;
  digitalWrite(_Pin1,HIGH);
  digitalWrite(_Pin2,HIGH);
  _Old_Val1 = digitalRead(_Pin1);
}

//-----------------------------------------------------

int encoder::read(){
  int rc = 0;  
  _Val1 = digitalRead(_Pin1);
  _Val2 = digitalRead(_Pin2);
  if (_Val1 != _Old_Val1) {
    if (_Val1 == _Val2) rc = 1; 
    else rc = -1;
    _Old_Val1 = _Val1;
  }
  return rc;  
}

//-----------------------------------------------------
// End class declaration encoder 
//-----------------------------------------------------

encoder my_encoder(11,12);

int encoder_val;
int my_Value = 100;

//-----------------------------------------------------

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

//-----------------------------------------------------

void loop() {
  encoder_val = my_encoder.read();
  if (encoder_val != 0){
    my_Value += encoder_val;
    Serial.println(my_Value);
  }
  delay(10);       
}

Mit diesem Programm funktioniert der Encoder einwandfrei. Die internen Pullup-Widerstände werden aktivert, dadurch ist keine weitere externe Beschaltung notwendig.

Ich bin sehr zufrieden. Das Testprogramm zum download :

Hier meine Zusammenfassung :

Bauteil :            Encoder (Dreh-Impusgeber STEC11B03)
Lieferant :         Reichelt
Preis :               3,30 €
Lieferzeit :         wenige Tage
Versandkosten :  Pauschale 5,60 € (angemessen ich hatte noch andere Bauteile bestellt)
Bewertung :       bin sehr zufrieden

Hubert Baumgarten

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.