INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
23.01.2019, 22:01
Beitrag #1
Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
Ich habe gerade einen Drehgeber aus einem Experimentierkasten ausprobiert, der ziemlich genau wie ein Iduino SE055 aussieht.

Den Code für die Abfrage habe ich einem etwas komplizierteren Beispiel entnommen und modifiziert.

Im Prinzip wird die fallende Flanke am des CLK-Signals am (Nano-)Pin D2 per Interrupt abgefragt. Ist das DT-Signal an D3 dann Low, dreht der Geber gerade in die eine Richtung, ist es High, in die andere.

Leider "verliert" der Geber ziemlich viele Schritte.

Ich kann auch sehen, daß er bei kontinuierlicher Drehung in eine Richtung hin- und herspringende Werte liefert.

Ich habe mal ein Bild des Serial Plotters angehängt: Ich habe erst eine Weile in die eine Richtung gedreht, dann wieder zurück in die andere. Als der Positionswert wieder auf Null zurückkehrte, stand der Geber noch eine Raste vor der Null.

Was ich schon probiert habe:

- Unterschiedliche Längen für das Entprell-Delay.
- Meine Variante der Abfrage und den Original-Code aus dem Beispiel (den ich nicht ganz verstanden habe, der aber auch nicht richtig funktioniert.)

Ich habe beim googeln schon gemerkt, daß diese Drehgeber keinen tollen Ruf haben, aber einige Leute sagen, daß sie gut funktionieren, wenn man sie mit der richtigen Software per Interrupt abfragt.

Mach ich mit meinem Code noch etwas falsch, oder ist es jetzt wirklich die Hardware, die mir irgendwie Probleme macht?

Original-Code (nur die Interrupt-Routine):

Code:
// Interrupt routine runs if CLK goes from HIGH to LOW
void isr ()  {
  delay(4);  // delay for Debouncing
  if (digitalRead(PinCLK))
    rotationdirection= digitalRead(PinDT);
  else
    rotationdirection= !digitalRead(PinDT);
  TurnDetected = true;
}


Mein Code (gesamtes Sketch):

Code:
volatile boolean TurnDetected;  // need volatile for Interrupts
volatile boolean rotationdirection;  // CW or CCW rotation

int RotaryPosition = 0;

const int PinCLK=2;   // Generating interrupts using CLK signal
const int PinDT=3;    // Reading DT signal
const int PinSW=4;    // Reading Push Button switch

long lastmillis = 0;

// Interrupt routine runs if CLK goes from HIGH to LOW
void readRotarySwitch ()  {
  delay(20);  // delay for Debouncing
  if (digitalRead(PinDT))
    rotationdirection= true;
  else
    rotationdirection= false;
  TurnDetected = true;
}

void setup()
{

  pinMode(PinCLK,INPUT);
  pinMode(PinDT,INPUT);  
  pinMode(PinSW,INPUT);
  
  digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
  attachInterrupt (digitalPinToInterrupt (PinCLK), readRotarySwitch, FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO

  Serial.begin (9600);
  Serial.println ("Begin");

  lastmillis = millis ();
}


void loop()
{

  if (millis () > lastmillis + 100)
  {
    Serial.println (RotaryPosition); // Serial.print ("\t"); Serial.println (0);
    lastmillis = millis ();
  }

  if (digitalRead (PinSW) == 0)
    RotaryPosition = 0;

  //Serial.print (digitalRead(PinCLK)); Serial.print ("\t"); Serial.println (digitalRead(PinDT) + 2);
  if (TurnDetected)
  {
    RotaryPosition+= rotationdirection?-1:1;
    TurnDetected = false;
  }
  
}


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 22:50
Beitrag #2
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
Hallo,
ja diese Drehgeber können einen ganz schön ins schwitzen bringen...
Weil eigentlich mußt du bei jeder Flanke des Taktsignals also sowohl bei der steigenden als auch fallenden Flanke einen Interrupt (CHANGE) auslösen und dann den Pegel von dem anderen Signal abfragen um alles zu erfassen. ABER da sich hier durch den Programmablauf Reaktionszeiten auftun ist die CPU wohl nicht immer in der Lage jede Flanke zu erfassen und abzuarbeiten. Das Problem ist nichts Neues.
Deswegen haben wir das vor 40 Jahren schon per Hardware gelöst....doch das macht heute auch keiner mehr.
Aber heute gibt es Libraries wo diese Drehgeber einlesen... sich mal danach...
Mir persönlich sind da die 3-kanaligen Drehgeber lieber...6 Zeilen Code und der Geber ist eingelesen ohne das was prellt.
Den gab es auch mal mit nur 0,5mm Tastenweg der mir lieber ist...
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 22:52
Beitrag #3
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
Ich habe vor einigen Wochen ein Video zu diesem Thema gemacht ( Rotary Encoder und andere Dinge ). Die Dinger prellen und produzieren dadurch Fehler. Mit der passenden Library bekommt man aber durchaus brauchbare Resultate.

Gruss
René
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2019, 00:16 (Dieser Beitrag wurde zuletzt bearbeitet: 24.01.2019 00:28 von Arduinero.)
Beitrag #4
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
(23.01.2019 22:52)Der Hobbyelektroniker schrieb:  Ich habe vor einigen Wochen ein Video zu diesem Thema gemacht ( Rotary Encoder und andere Dinge ). Die Dinger prellen und produzieren dadurch Fehler. Mit der passenden Library bekommt man aber durchaus brauchbare Resultate.

Vielen Dank, das war sehr vorausschauend von Dir! ;-)

Dein Video über das 20-Dollar-Oszilloskop war schon mal sehr hilfreich für mich. Ich habe die etwas luxuriösere Variante als Fertiggerät gekauft, und sie kam mit einer Bauanleitung (sinnlos), aber dafür ohne Handbuch (schmerzlich vermißt). Jetzt, wo ich von Dir gelernt habe, daß manche Knöpfe Superkräfte entwickeln, wenn man sie zwei Sekunden festhält, eröffnen sich ganz neue Horizonte! :-D Und ich hab nur kurz reingeguckt in das Video bisher ...

https://www.youtube.com/watch?v=kZqnVsk-PWI

Allerdings zeigt mir das Oszilloskop saubere Schaltvorgänge ohne Prellen, was mich ein bißchen verblüfft. In Deinem Video sah das ja ganz erschreckend aus. (Was ich überhaupt nicht verstanden habe, ist, warum war das Prellen bei Dir am rechten Ende der Pulse orientiert war.)

Ich muß mal sehen, ob ich die von Dir verwendete bessere Library auch finde, und was sie bei mir macht ... vielen Dank für die Tips genau zur richtigen Zeit!

(23.01.2019 22:50)Bitklopfer schrieb:  Weil eigentlich mußt du bei jeder Flanke des Taktsignals also sowohl bei der steigenden als auch fallenden Flanke einen Interrupt (CHANGE) auslösen und dann den Pegel von dem anderen Signal abfragen um alles zu erfassen. ABER da sich hier durch den Programmablauf Reaktionszeiten auftun ist die CPU wohl nicht immer in der Lage jede Flanke zu erfassen und abzuarbeiten.

Auf CHANGE zu reagieren, wäre mit der Interrupt-Routine ja ohne weiteres möglich. Aber gewinne ich damit etwas? Die Flanken müssen ja immer paarig auftreten. (Mal ausprobieren.)

(23.01.2019 22:50)Bitklopfer schrieb:  Das Problem ist nichts Neues.
Deswegen haben wir das vor 40 Jahren schon per Hardware gelöst....doch das macht heute auch keiner mehr.

Vor längeren Jahren habe ich mal einen Atari-Trackball aus der 8-Bit-Ära an den PC angeschlossen - schon der hatte keine Hardware zur Richtungsbestimmung mehr. (Wenn ich mich richtig erinnere ... ich hab schon böse danebengelegen bei technischen Details :-)

(23.01.2019 22:50)Bitklopfer schrieb:  Mir persönlich sind da die 3-kanaligen Drehgeber lieber...6 Zeilen Code und der Geber ist eingelesen ohne das was prellt.

Ist der durch die drei Kanäle prinzipbedingt besser, oder haben einfach die Schalter eine bessere Qualität?

Für die spätere Verwendung hatte ich ohnehin etwas anderes angepeilt, etwa den von Chopp im anderen Subforum vorgeschlagenen:

https://www.ebay.de/itm/Drehgeber-Encode...1ne~:rk:28Tonguef:0

Den aus dem Experimentierkasten wollte ich eigentlich nur verwenden, um das Prinzip zu verstehen. Und vielleicht als Eingabegerät für einen elektronischen Würfel ... schwungvolles Drehen ist vielleicht näher am Werfen von altmodischen Würfeln als das langweilige Drücken eines Tasters. Da käme es dann auf Prellen oder verlorene Schritte nicht so an! :-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2019, 01:06
Beitrag #5
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
(23.01.2019 22:52)Der Hobbyelektroniker schrieb:  Ich habe vor einigen Wochen ein Video zu diesem Thema gemacht ( Rotary Encoder und andere Dinge ). Die Dinger prellen und produzieren dadurch Fehler. Mit der passenden Library bekommt man aber durchaus brauchbare Resultate.

Gruss
René

Hallo,
toller Video und Super erklärt wie das mit den Encodern funktioniert.
Allerdings wundert es mich im Nachhinein auch das die Preller auf deinem Oszi erst dann auftauchen wenn der Signallevel eigentlich sich schon hätte beruhigt haben müßte. Auch vermisse ich einen Hinweis auf Pull-Up Widerstände etc. klar beim Arduino kann man auch mit INPUT_PULLUP arbeiten. Aber diese Info vermisse ich da im Video.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2019, 01:43
Beitrag #6
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
(23.01.2019 22:50)Bitklopfer schrieb:  Weil eigentlich mußt du bei jeder Flanke des Taktsignals also sowohl bei der steigenden als auch fallenden Flanke einen Interrupt (CHANGE) auslösen und dann den Pegel von dem anderen Signal abfragen um alles zu erfassen.

Das scheint der entscheidende Tip gewesen zu sein! :-)

Ich habe den Code entsprechend geändert, und es fühlt sich jetzt ziemlich solide an.

Ich kriege jetzt zwei logische Schritte pro fühlbarer Rastung.

Keine Schritte in Gegenrichtung mehr, und ich habe gerade ein paarmal 360° linksrum und ein paarmal 360° rechtsrum gedreht und bin auf genau den erwarteten Endwert und dann wieder auf Null zurück gekommen.

Hier die geänderten Code-Abschnitte:

Code:
// Interrupt routine runs if CLK changes
void readRotarySwitch ()  {
  delay(20);  // delay for Debouncing
  if (digitalRead(PinDT))
    rotationdirection= true;
  else
    rotationdirection= false;

  if (digitalRead(PinCLK))
    rotationdirection= !rotationdirection;
  TurnDetected = true;
}

void setup()
{

  pinMode(PinCLK,INPUT);
  pinMode(PinDT,INPUT);  
  pinMode(PinSW,INPUT);
  
  digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
  attachInterrupt (digitalPinToInterrupt (PinCLK), readRotarySwitch, CHANGE); // interrupt 0 always connected to pin 2 on Arduino UNO

  Serial.begin (9600);
  Serial.println ("Begin");

  lastmillis = millis ();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2019, 08:10
Beitrag #7
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
Zitat:müßte. Auch vermisse ich einen Hinweis auf Pull-Up Widerstände etc. klar beim Arduino kann man auch mit INPUT_PULLUP arbeiten. Aber diese Info vermisse ich da im Video.
lgbk

Der Pull-Up ist im Breakout-Board des Encoders eingebaut. So ist er weder in der Schaltung noch im Sketch zu sehen. Da hast du natürlich recht, ich hätte ihn erwähnen müssen, da ein fehlender Pull-Up ein sehr häufiger Anfängerfehler ist.
Das Prellen hängt vermutlich auch stark von der Qualität des Drehgebers ab. Das billige China - Teil war da nicht so optimal. Hardwaremässig hätte ich sicher mit einem Tiefpassfilter (einfaches RC-Glied) eine Verbesserung erreichen können.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2019, 09:04
Beitrag #8
RE: Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem?
(24.01.2019 00:16)Arduinero schrieb:  ....
(23.01.2019 22:50)Bitklopfer schrieb:  Weil eigentlich mußt du bei jeder Flanke des Taktsignals also sowohl bei der steigenden als auch fallenden Flanke einen Interrupt (CHANGE) auslösen und dann den Pegel von dem anderen Signal abfragen um alles zu erfassen. ABER da sich hier durch den Programmablauf Reaktionszeiten auftun ist die CPU wohl nicht immer in der Lage jede Flanke zu erfassen und abzuarbeiten.

Auf CHANGE zu reagieren, wäre mit der Interrupt-Routine ja ohne weiteres möglich. Aber gewinne ich damit etwas? Die Flanken müssen ja immer paarig auftreten. (Mal ausprobieren.)
Das CHANGE dient quasi dem entprellen, mehr nicht. Der Nebeneffekt ist aber wie du schon bemerkt hast das du pro Raste 2 Impulse bekommst...kann man dann zur Not auch wieder runterrechnen.

(24.01.2019 00:16)Arduinero schrieb:  
(23.01.2019 22:50)Bitklopfer schrieb:  Das Problem ist nichts Neues.
Deswegen haben wir das vor 40 Jahren schon per Hardware gelöst....doch das macht heute auch keiner mehr.

Vor längeren Jahren habe ich mal einen Atari-Trackball aus der 8-Bit-Ära an den PC angeschlossen - schon der hatte keine Hardware zur Richtungsbestimmung mehr. (Wenn ich mich richtig erinnere ... ich hab schon böse danebengelegen bei technischen Details :-)
...ah kuck an, ich habe noch wo eine Atari Maus rumliegen wo nur die Zwei Inkrementalgeber mit ihren um 90° Phasenverschobenen Signalen herausgeführt sind...dazu habe ich ein Interface für den CP/M Computer gebaut.

(24.01.2019 00:16)Arduinero schrieb:  
(23.01.2019 22:50)Bitklopfer schrieb:  Mir persönlich sind da die 3-kanaligen Drehgeber lieber...6 Zeilen Code und der Geber ist eingelesen ohne das was prellt.

Ist der durch die drei Kanäle prinzipbedingt besser, oder haben einfach die Schalter eine bessere Qualität?
Vom Prinzip her ist das einfacher auszuwerten weil man braucht nur einmal erfassen wenn sich ein Kontakt schließt...danach kann der Prellen so lange er will aber das hat keinen Einfluss mehr auf die Verarbeitung.


Was mich noch interessiert, wie hast du die Drehgebersignale beschaltet... INPUT_PULLUP scheinst du für diese Signale nicht zu verwenden... hast du da externe 10K Puller genommen ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Problem mit UniversalTelegramBot edi_ying 8 247 09.02.2019 15:11
Letzter Beitrag: Tommy56
Question (Denk)Problem mit char array[] ? ManfredH 3 148 05.02.2019 12:01
Letzter Beitrag: ManfredH
  USB Problem mit Linux HeikeF 5 146 03.02.2019 17:04
Letzter Beitrag: Tommy56
  Steigenden und/oder Wert erkennen - wie macht man das? Gelegenheitsbastler 2 207 24.01.2019 11:52
Letzter Beitrag: Tommy56
  [Anfänger] Char Array Problem fp.blues2013 1 206 07.01.2019 13:06
Letzter Beitrag: Tommy56
  Problem beim Hochladen flint74 8 490 26.12.2018 19:26
Letzter Beitrag: Tommy56
  Alternativen zu Newping oder tone? Arduinero 3 398 23.12.2018 17:33
Letzter Beitrag: Tommy56
  Problem mit Displayanzeige LCD2004 bzw. nicht Richtig magnum1795 39 1.470 18.12.2018 08:15
Letzter Beitrag: magnum1795
Music MIDI Software optimieren solarmusic 6 371 22.11.2018 18:20
Letzter Beitrag: Tommy56
  Anfänger mit Problem/Gärtenbewässerungsprojekt Bommes 13 1.094 13.11.2018 20:17
Letzter Beitrag: fraju

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste