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
Pins am Drehregler (Rotary Encoder)
06.03.2015, 12:22 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2015 12:25 von facebraker.)
Beitrag #25
RE: Pins am Drehregler (Rotary Encoder)
Guten Morgen,

Ich habe den Encoder mal angeschlossen, ohne Interrupt erst einmal:

im ersten Bild A ist an 3, B an 4 und C ist auf Ground.

Hier der Code:

Code:
#include <Arduino.h>

/* Read Quadrature Encoder
  * Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.
  *
  * Sketch by max wolf / www.meso.net
  * v. 0.1 - very basic functions - mw 20061220
  *
  */
uint32_t elaptime, savetime;


int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
float encoder0Pos = 0;
float incVal=0;
int encoder0PinALast = HIGH;
int n = HIGH;

void setup() {
   pinMode (encoder0PinA,INPUT);
   digitalWrite(encoder0PinA, HIGH); // Pull Up Widerstand aktivieren
   pinMode (encoder0PinB,INPUT);
   digitalWrite(encoder0PinB, HIGH); // Pull Up Widerstand aktivieren
   Serial.begin (9600);
   savetime=0;
   Serial.println("Hello World");
}

void loop() {
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == HIGH) && (n == LOW)) {
     elaptime=millis()-savetime;

     Serial.print("letzte: ");
     Serial.print(savetime);
     Serial.print("  ");
     Serial.print("Jetzt: ");
     Serial.print(millis());
     Serial.print("  ");
     Serial.print("Elapt:");
     Serial.print(elaptime);
     Serial.print("  ");


     if (digitalRead(encoder0PinB) == HIGH) {
       if (elaptime>=1000) {incVal+=0.01;
            delay(50);
       }
       else if (elaptime <=500) incVal+=0.1;
       else if (elaptime <=100) incVal+=1;
       else if (elaptime <=50) incVal+=10;

       encoder0Pos+=incVal;
       //Serial.print("GUZ");
       Serial.print("  ");
       Serial.print("Inkrwert: ");
       Serial.print("  ");
       Serial.print(incVal);
       incVal=0;
       delay(10);
     } else {
       if (elaptime>=1000) {incVal-=0.01;
            delay(50);
       }

       else if (elaptime <=500) incVal-=0.1;
       else if (elaptime <=100) incVal-=1;
       else if (elaptime <=50) incVal-=10;

       encoder0Pos-=incVal;
       //Serial.print("IUZ");
       Serial.print("  ");
       Serial.print("Inkrwert: ");
       Serial.print("  ");
       Serial.print(incVal);
       incVal=0;

       delay(10);
     }
     Serial.print("  ");
     Serial.print("Anzwert:");
     Serial.println (encoder0Pos);
     //Serial.print ("/");
     savetime=millis();
   }
   encoder0PinALast = n;

}

Ich habe das Problem, selbst wenn ich bei Elaptime < als 50 bin kommt niemals der Inkrementwert 10??
Aber warum ich hier im Forum schreibe, irgendwie erkennt er nicht, dass ich auch Rückwärts drehe, ich habe nun mal Quick & Dirty direkt angeklemmt mit einen Software Pullup :

Code:
pinMode (encoder0PinA,INPUT);
   digitalWrite(encoder0PinA, HIGH); // Pull Up Widerstand aktivieren

Kann es daran liegen, dass das ergebnis ich sag mal so, so verwaschen ist:

Zitat:letzte: 2866 Jetzt: 2878 Elapt:12 Inkrwert: 0.10 Anzwert:0.11
letzte: 2896 Jetzt: 3006 Elapt:110 Inkrwert: 0.10 Anzwert:0.21
letzte: 3018 Jetzt: 3035 Elapt:2 Inkrwert: 0.10 Anzwert:0.31
letzte: 3086 Jetzt: 3107 Elapt:9 Inkrwert: 0.10 Anzwert:0.41
letzte: 3159 Jetzt: 3262 Elapt:103 Inkrwert: 0.10 Anzwert:0.51
letzte: 3274 Jetzt: 3295 Elapt:20 Inkrwert: -0.10 Anzwert:0.61
letzte: 3344 Jetzt: 4496 Elapt:1151 Inkrwert: 0.01 Anzwert:0.62
letzte: 4557 Jetzt: 4749 Elapt:191 Inkrwert: 0.10 Anzwert:0.72
letzte: 4760 Jetzt: 4978 Elapt:218 Inkrwert: 0.10 Anzwert:0.82
letzte: 4990 Jetzt: 5009 Elapt:19 Inkrwert: -0.10 Anzwert:0.92
letzte: 5060 Jetzt: 5208 Elapt:148 Inkrwert: 0.10 Anzwert:1.02
letzte: 5220 Jetzt: 5245 Elapt:25 Inkrwert: -0.10 Anzwert:1.12
letzte: 5289 Jetzt: 5339 Elapt:50 Inkrwert: 0.10 Anzwert:1.22
letzte: 5363 Jetzt: 5386 Elapt:6 Inkrwert: -0.10 Anzwert:1.32
letzte: 5438 Jetzt: 5533 Elapt:95 Inkrwert: 0.10 Anzwert:1.42
letzte: 5544 Jetzt: 5706 Elapt:162 Inkrwert: 0.10 Anzwert:1.52
letzte: 5718 Jetzt: 5745 Elapt:26 Inkrwert: -0.10 Anzwert:1.62
letzte: 5788 Jetzt: 5934 Elapt:146 Inkrwert: 0.10 Anzwert:1.72
letzte: 5945 Jetzt: 5984 Elapt:38 Inkrwert: -0.10 Anzwert:1.82
letzte: 6016 Jetzt: 6093 Elapt:77 Inkrwert: 0.10 Anzwert:1.92
letzte: 6106 Jetzt: 6122 Elapt:16 Inkrwert: -0.10 Anzwert:2.02
letzte: 6174 Jetzt: 6219 Elapt:45 Inkrwert: 0.10 Anzwert:2.12
letzte: 6248 Jetzt: 6341 Elapt:93 Inkrwert: 0.10 Anzwert:2.22
letzte: 6352 Jetzt: 6478 Elapt:126 Inkrwert: 0.10 Anzwert:2.32
letzte: 6490 Jetzt: 6520 Elapt:30 Inkrwert: -0.10 Anzwert:2.42

Wie gesagt ich drehe nur vorwärts und dann tauchen immer mal negative Inkrementwert auf, also ob der sensor die falsche Richtung erkennt.
Verbessert sich das mit einen Pulldown-Widerstand und die Sache gegen 5V zu schalten und warum läuft das Ding nicht rückwärts, hier bei dem Beispiel, drehe ich Rückwärts:

Zitat:letzte: 0 Jetzt: 3166 Elapt:3166 Inkrwert: -0.01 Anzwert:0.01
letzte: 3227 Jetzt: 3567 Elapt:340 Inkrwert: -0.10 Anzwert:0.11
letzte: 3579 Jetzt: 3622 Elapt:42 Inkrwert: 0.10 Anzwert:0.21
letzte: 3649 Jetzt: 4066 Elapt:417 Inkrwert: -0.10 Anzwert:0.31
letzte: 4078 Jetzt: 4502 Elapt:424 Inkrwert: -0.10 Anzwert:0.41
letzte: 4513 Jetzt: 4870 Elapt:357 Inkrwert: -0.10 Anzwert:0.51
letzte: 4882 Jetzt: 4927 Elapt:45 Inkrwert: 0.10 Anzwert:0.61
letzte: 4952 Jetzt: 5215 Elapt:262 Inkrwert: -0.10 Anzwert:0.71
letzte: 5226 Jetzt: 5276 Elapt:50 Inkrwert: 0.10 Anzwert:0.81
letzte: 5297 Jetzt: 5581 Elapt:284 Inkrwert: -0.10 Anzwert:0.91
letzte: 5593 Jetzt: 5628 Elapt:35 Inkrwert: 0.10 Anzwert:1.01
letzte: 5663 Jetzt: 5897 Elapt:233 Inkrwert: -0.10 Anzwert:1.11
letzte: 5908 Jetzt: 6265 Elapt:357 Inkrwert: -0.10 Anzwert:1.21
letzte: 6277 Jetzt: 6311 Elapt:34 Inkrwert: 0.10 Anzwert:1.31
letzte: 6347 Jetzt: 6535 Elapt:187 Inkrwert: -0.10 Anzwert:1.41
letzte: 6546 Jetzt: 6602 Elapt:56 Inkrwert: 0.10 Anzwert:1.51
letzte: 6617 Jetzt: 6893 Elapt:276 Inkrwert: -0.10 Anzwert:1.61
letzte: 6904 Jetzt: 8033 Elapt:1128 Inkrwert: -0.01 Anzwert:1.62
letzte: 8094 Jetzt: 8374 Elapt:279 Inkrwert: -0.10 Anzwert:1.72
letzte: 8385 Jetzt: 8403 Elapt:18 Inkrwert: 0.10 Anzwert:1.82
letzte: 8456 Jetzt: 14456 Elapt:5999 Inkrwert: -0.01 Anzwert:1.83
letzte: 14518 Jetzt: 15410 Elapt:891 Inkrwert: 0.00 Anzwert:1.83
letzte: 15421 Jetzt: 15441 Elapt:4 Inkrwert: 0.10 Anzwert:1.93
letzte: 15494 Jetzt: 18169 Elapt:2675 Inkrwert: -0.01 Anzwert:1.94
letzte: 18231 Jetzt: 18451 Elapt:219 Inkrwert: -0.10 Anzwert:2.04
letzte: 18462 Jetzt: 18484 Elapt:6 Inkrwert: 0.10 Anzwert:2.14
letzte: 18535 Jetzt: 18735 Elapt:199 Inkrwert: -0.10 Anzwert:2.24
letzte: 18746 Jetzt: 18767 Elapt:8 Inkrwert: 0.10 Anzwert:2.34
letzte: 18820 Jetzt: 18941 Elapt:121 Inkrwert: -0.10 Anzwert:2.44
letzte: 18954 Jetzt: 19097 Elapt:143 Inkrwert: -0.10 Anzwert:2.54
letzte: 19109 Jetzt: 19131 Elapt:1 Inkrwert: 0.10 Anzwert:2.64
letzte: 19182 Jetzt: 19329 Elapt:146 Inkrwert: -0.10 Anzwert:2.74
letzte: 19340 Jetzt: 19361 Elapt:15 Inkrwert: 0.10 Anzwert:2.84
letzte: 19415 Jetzt: 19504 Elapt:89 Inkrwert: -0.10 Anzwert:2.94
letzte: 19516 Jetzt: 19543 Elapt:27 Inkrwert: 0.10 Anzwert:3.04
letzte: 19589 Jetzt: 19701 Elapt:111 Inkrwert: -0.10 Anzwert:3.14

Kann sein dass ich wieder mist baue aber ich kann es mir nicht erklären :-(

ZWISCHENLÖSUNG:

ja wenn ich den Wert einen negativen Wert subtrahiere kann es nicht stimmen , habe jetzt gesagt
Code:
encoder0Pos+=incVal;
Da stimmt es beim zurückdrehen.

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 12:37
Beitrag #26
RE: Pins am Drehregler (Rotary Encoder)
warum probierst du es nicht erstmal mit einer Software, die nachweislich funktioniert, bevor du eigene Lösungen entwickeln willst?

http://www.meinduino.de/drehencoder.shtml
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 12:39 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2015 13:10 von facebraker.)
Beitrag #27
RE: Pins am Drehregler (Rotary Encoder)
ZWISCHENLÖSUNG 2"

Ich habe bei den Bedingungen Mist gebaut, 5 ist kleiner als 50 aber auch kleiner als 100 und somit greif der 100ms Zweig Idea

Ich habe es so gelöst:

Code:
if (elaptime>=1000) {incVal+=0.01;
            delay(50);
       }
       else if (elaptime <=500 && elaptime > 100) incVal+=0.1;
       else if (elaptime <=100 && elaptime > 50) incVal+=1;
       else if (elaptime <=50) incVal+=10;

Ist aber immernoch die Frage nach dem negativen Sprüngen, oder rückwärtsgedreht nach den Positiven sprüngen?

Gruß Alex

Hallo HaWe,

ich habe das Beispiel direkt von Arduino:

Arduino Rotary Encoder

Und dachte mir fängst du mal ganz einfach an, dein Beispiel habe ich noch nicht 100%tig verstanden und fällt mir schwer die Zeitmessung für die Drehgeschwindigkeit einzubauen, wie ich vor habe.

Ähnlich der Button, bloß jetzt mit den Drehencoder.

Meinst du ich kann meine Probleme mit deinen Beispiel abfangen?

Danke!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 14:33 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2015 14:33 von tito-t.)
Beitrag #28
RE: Pins am Drehregler (Rotary Encoder)
ich blicke jetzt deinen Code nicht ganz, und mit den Timern oder Interrupts kenne ich mich nicht aus, aber dir ist schon klar, dass Dreh-Geschwindigkeiten (positiv und negativ) mit entsprechenden (positiven und negativen) Wert-Änderungen verbunden werden müssen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 14:49
Beitrag #29
RE: Pins am Drehregler (Rotary Encoder)
Hallo Tito,

ja das ist klar, soweit habe ich die Missstände auch korrigieren können.

Ich habe den einfachen Code von Arduino genommen:

Code:
/* Read Quadrature Encoder
  * Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.
  *
  * Sketch by max wolf / www.meso.net
  * v. 0.1 - very basic functions - mw 20061220
  *
  */  


int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {
   pinMode (encoder0PinA,INPUT);
   pinMode (encoder0PinB,INPUT);
   Serial.begin (9600);
}

void loop() {
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
     } else {
       encoder0Pos++;
     }
     Serial.print (encoder0Pos);
     Serial.print ("/");
   }
   encoder0PinALast = n;
}


Soweit so gut, der Timer ist nichts anderes als, dass ich bei jeder Änderung ob positiv oder negativ messe wieviel Zeit seit der letzten Änderung vergangen ist.

Damit merke ich wie schnell der Drehencoder gedreht wird, ist zwischen den einzelnen Rastungen wenig Zeit vergangen >50ms erhöhe ich den Wert um 10.0,
ist zwischen 50 und 100ms vergangen erhöhe ich um 1.0 , zwischen 100 und 500ms wird um 0.1 erhöht und länger als 1000ms oder 1s wird um 0.01 erhöht.

Soweit alles klar, aber ich habe z.Zt. so Verwaschungen drin, obwohl ich vorwärts drehe, zieht er ab, da siehst du in den letzen Post wo da im Listing ausreisser sind. Ich vermute schrottige Hardware am Encoder und die Frage wie ich es abfangen kann und ob es an meinen Software-Pullup liegt ob ich mit richtigen Widerständen besser fahre.

Hier noch einmal der bis jetzt laufende Code, er zählt richtig und dreht bis auf die Ausreißer in die richtig Richtung:

Code:
#include <Arduino.h>

/* Read Quadrature Encoder
  * Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.
  *
  * Sketch by max wolf / www.meso.net
  * v. 0.1 - very basic functions - mw 20061220
  *
  */
uint32_t elaptime, savetime;


int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
float encoder0Pos = 0;
float incVal=0;
int encoder0PinALast = HIGH;
int n = HIGH;

void setup() {
   pinMode (encoder0PinA,INPUT);
   digitalWrite(encoder0PinA, HIGH); // Pull Up Widerstand aktivieren
   pinMode (encoder0PinB,INPUT);
   digitalWrite(encoder0PinB, HIGH); // Pull Up Widerstand aktivieren
   Serial.begin (9600);
   savetime=0;
   Serial.println("Hello World");
}

void loop() {
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == HIGH) && (n == LOW)) {
     elaptime=millis()-savetime;

     Serial.print("letzte: ");
     Serial.print(savetime);
     Serial.print("  ");
     Serial.print("Jetzt: ");
     Serial.print(millis());
     Serial.print("  ");
     Serial.print("Elapt:");
     Serial.print(elaptime);
     Serial.print("  ");


     if (digitalRead(encoder0PinB) == HIGH) {
       if (elaptime>=1000) {incVal+=0.01;
            delay(50);
       }
       else if (elaptime <=500 && elaptime > 100) incVal+=0.1;
       else if (elaptime <=100 && elaptime > 50) incVal+=1;
       else if (elaptime <=50) incVal+=10;

       encoder0Pos+=incVal;
       //Serial.print("GUZ");
       Serial.print("  ");
       Serial.print("Inkrwert: ");
       Serial.print("  ");
       Serial.print(incVal);
       incVal=0;
       delay(10);
     } else {
       if (elaptime>=1000) {incVal-=0.01;
            delay(50);
       }

       else if (elaptime <=500 && elaptime > 100) incVal-=0.1;
       else if (elaptime <=100 && elaptime > 50) incVal-=1;
       else if (elaptime <=50 ) incVal-=10;

       encoder0Pos+=incVal;
       //Serial.print("IUZ");
       Serial.print("  ");
       Serial.print("Inkrwert: ");
       Serial.print("  ");
       Serial.print(incVal);
       incVal=0;

       delay(10);
     }
     Serial.print("  ");
     Serial.print("Anzwert:");
     Serial.println (encoder0Pos);
     //Serial.print ("/");
     savetime=millis();
   }
   encoder0PinALast = n;

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 14:58 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2015 14:58 von tito-t.)
Beitrag #30
RE: Pins am Drehregler (Rotary Encoder)
ok, wie gesagt, ich verstehe deinen Code nicht.
Zeit ist auf der einen Seite für mich auch nicht ab und zu negativ, sondern immer positiv. Warum du eine Zeitmesung als Basis nimmst ist mir auch völlig schleierhaft, ich würde nicht die Zeit als Basis nehmen sondern die Drehgeschwindigkeit der Encoder unter Berücksichtigung ihrer Drehrichtung. Aber vielleicht geht es mit deinem Ansatz ja auch und der Fehler liegt woanders, keine Ahnung Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 15:15
Beitrag #31
RE: Pins am Drehregler (Rotary Encoder)
(06.03.2015 14:58)tito-t schrieb:  Warum du eine Zeitmesung als Basis nimmst ist mir auch völlig schleierhaft, ich würde nicht die Zeit als Basis nehmen sondern die Drehgeschwindigkeit der Encoder unter Berücksichtigung ihrer Drehrichtung. Aber vielleicht geht es mit deinem Ansatz ja auch und der Fehler liegt woanders, keine Ahnung Smile

Hallo Tito, ich würde auch lieber die Drehgeschwindigkeit des Encoders nutzen, aber woher bekomme ich den?

Übertrieben habe ich ja keinen Wert, der mir vom Encoder geliefert wird welcher die Drehgeschwindigkeit beinhaltet.

In welcher Zeit werden die 22° des Kreises geschafft, 22°=Weg pro Zeit (die ich messe) ergibt die Geschwindigkeit.

Die Zeit ist immer POSITIV im zusammenhang mit der Drehrichtig , ziehe ich ab oder addiere ich einen Wert dazu der sin abhängigkeit der Geschwindigkeit unterschiedlich hoch ist.

Wenn ich 1/16 oder 22° im Uhrzeigersinn in weniger als 50ms drehe, addiere ich 10.0, brauche ich für die 1/16 oder 22° eine Zeit von 400ms addiere ich 0.1, brauche ich länger als 1 Sekunde addiere ich 0.01.

Ich hoffe jetzt wird es ein bisschen klarer!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.03.2015, 15:34 (Dieser Beitrag wurde zuletzt bearbeitet: 06.03.2015 15:38 von tito-t.)
Beitrag #32
RE: Pins am Drehregler (Rotary Encoder)
zur Drehgeschwindigkeit: hatte das Hawe nicht gepostet?
Differenz des aktuellen und des vorherigen Encoderwertes, geteilt durch die verstrichene Zeit ?
allerdings, wie gesagt, anschließend auch die Drehrichtung beachten für inc oder dec.

Alo in festen Intervallen (50ms oder 100ms o.ä.) Encoderwerte auslesen und dann daraus die Drehgeschwindigkeit berechnen. Bei negativer Drehrichtung ergibt sich dann automatisch auch eine negative Drehgeschwindigkeit.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Uno gehen zwei digital Pins nicht edlosijagen 15 595 07.07.2016 19:22
Letzter Beitrag: Bitklopfer
  mehr PWM Pins WIMunios 8 1.121 20.03.2016 00:19
Letzter Beitrag: hotsystems
  Welche Pins für Software Serial BennIY 1 506 27.01.2016 23:02
Letzter Beitrag: hotsystems
  Mit Rotary Encoder Tastatur simulieren? noxx 9 1.484 17.11.2015 17:18
Letzter Beitrag: Binatone
  Wie viele PINs werden für LCD 2x16 benötigt? torsten_156 4 1.342 05.02.2015 09:11
Letzter Beitrag: xuino
  Belastbarkeit des +5Volt Pins Kyrill 2 1.259 16.01.2015 06:33
Letzter Beitrag: Kyrill
  I²C Pins "verlegen" Marcel5291 2 1.226 18.11.2014 15:18
Letzter Beitrag: rkuehle
  Frage zu motorshield und PINs torsten_156 9 4.918 27.10.2014 15:53
Letzter Beitrag: torsten_156
  Arduino Due: pins mit 5V ?? pins 22-24, 50-53? HaWe 1 1.894 27.10.2014 13:19
Letzter Beitrag: Bitklopfer
  LCD Shield & 4Kanal Relais Shield gleiche Pins hannes77 3 1.676 04.06.2014 00:25
Letzter Beitrag: ArduTux

Gehe zu:


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