Go Down

Topic: Zwei verschiedene Rotary Encoder (Read 307 times) previous topic - next topic

danja95

Hallo zusammen,

ich bin aktuell dabei vom meinem E46 das Bordmonitor umzubauen. Da sind leider zwei verschiende Rotary Encoder verbaut.

Ich habe es geschafft (c&p sei dank) die jeweils einzeln mit zwei verschiedene Sketches zu benutzen. Jedoch als ich versucht habe beide Scripts in eines zu legen und beide gleichzeitig versuche zu nutzen geht garnichts mehr. entweder das eine oder das andere.

Hier mein Code:
Code: [Select]
// vars for left rotary encoder
const int LencoderPinA = 2;
const int LencoderPinB = 3;
const int LclearButton = 8;
volatile unsigned int encoderPos = 0;
unsigned int lastReportedPos = 1;
static boolean rotating = false;
boolean A_set = false;     
boolean B_set = false;

// vars for right rotary encoder
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState; 

void setup() {
  // setup for LRE
  digitalWrite(LencoderPinA, HIGH);
  digitalWrite(LencoderPinB, HIGH);
  digitalWrite(LclearButton, HIGH);
  attachInterrupt(0, doEncoderA, CHANGE);
  attachInterrupt(1, doEncoderB, CHANGE);

  // setup for RRE
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  aLastState = digitalRead(outputA);
 
  // debug
  Serial.begin(9600);
}

void loop() {

  // loop for LRE
  rotating = true;
  if (lastReportedPos != encoderPos) {
    Serial.print("Index:");
    Serial.println(encoderPos, DEC);
    lastReportedPos = encoderPos;
  }
  if (digitalRead(LclearButton) == LOW )  {
    encoderPos = 0;
  }

  // loop for RRE
  aState = digitalRead(outputA);
   if (aState != aLastState){
     if (digitalRead(outputB) != aState) {
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   }
   aLastState = aState;
 
}

// Interrupt on A changing state
void doEncoderA(){
  if ( rotating ) delay (1);
  if( digitalRead(LencoderPinA) != A_set ) {
    A_set = !A_set;
    if ( A_set && !B_set )
      encoderPos += 1;
    rotating = false;
  }
}

// Interrupt on B changing state, same as A above
void doEncoderB(){
  if ( rotating ) delay (1);
  if( digitalRead(LencoderPinB) != B_set ) {
    B_set = !B_set;
    if( B_set && !A_set )
      encoderPos -= 1;
    rotating = false;
  }
}

Ich bin noch Beginner was die Arduino Seite angeht.

Kann mir bitte jemand helfen?

Gruß Daniel

postmaster-ino

Hi

Das delay(1) hat welchen Sinn und wird Das überhaupt so ausgeführt? (Theoretisch sind die Interrupts in der ISR gesperrt, womit auch der Timer für micros/millis/delay nicht mehr auslösen dürfte - Wer weiß Da Genaueres?)

Wo hast Du die beiden Sketche (Arduino=Sketch) her?
Warum zwei verschiedene Wege?
Worin unterscheiden sich die Encoder?
Einen EINGANG Output zu nennen, erhöht ebenfalls nicht den Lesekomfort des Sketch.
Der Encoder, Den Du pollst, hat externe PullUPs oder gibt selber HIGH/LOW aus?
(Meine 'RRE' ... was heißt RRE eigentlich?)
rotating benutzt Du wofür?

Wenn ich Deinen Sketch richtig interpretiere, nimmst Du eine Phase quasi als Clock, und die andere Phase als Signal - du reduzierst die Auflösung von 4 Impulse pro Rastpunkt auf 1 - warum?

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

danja95

Hi, ganz ehrlich der code war mehr c&p als eigenleistung :D

verschiedene wege, da ich so beide ansteuern konnte. beide brauche andere art und weise.

optisch und vom aufbau der platine.

RRE = R ight R otary E ncoder
LRE = L eft R otary E ndoder


HotSystems

Geht garnichts mehr, ist eine sehr aussagekräftige Information.
Daraus lässt sich nur leider kein Fehler ableiten.

Bitte teile uns doch mit, was noch geht und was nicht.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

danja95

Sobald ich den zweiten Rotary Encoder mit 5V versorge, kommt keine ausgabe mehr.

HotSystems

Sobald ich den zweiten Rotary Encoder mit 5V versorge, kommt keine ausgabe mehr.
Bessere Angaben hast du nicht ?

Hast du denn mit dem seriellen Monitor mal geprüft, an welcher Stelle die Ausgabe hängt ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

danja95

Hi,

wie im Post vorher gesagt, sobald ein zweiter Encoder mit 5V versorgt wird, kommt keine ausgabe mehr. entweder eins oder das andere.

postmaster-ino

Hi

Wenn Du nur den ersten Encoder angeschlossen hast, klappt's?

Da Du die Biester ja bereits LRE und RRE getauft hast, bleiben wir dabei.
Immer mit diesem Sketch, Der beide 'RE' verarbeitet:
LRE ohne RRE klappt? RRE elektrisch nicht verbunden und, wenn Du den Encoder aufgesteckt hast.
RRE ohne LRE klappt? RLE dito
Dann, wenn beide bestromt werden, bekommst Du welche Ausgaben?
Verteile in Deinem Sketch (außer in der ISR) weitere Serial.print - damit kannst Du sehen, wohin die Reise geht.

Versuche Dich in unsere Lage zu versetzen - 'klappt einzeln, wenn aber so und so 5V klappt nicht' ist nicht sonderlich erhellend.

MfG

anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

danja95

Hallo zusammen,

mein Frankenstein Code funktioniert doch. Mein Fehler:
Hatte die Ground Pins von RRE auf RST versehentlich gelegt....

Ich möchte mich dennoch bei allen herzlich für die angebotene hilfe bedanken.

Evtl, kann mir einer helfen den Code zu vereinfachern?

postmaster-ino

Hi

Ein fehlender GND an einem der Encoder kann aber nicht das Programm zu 'geht nichts' bringen - von dem Encoder bekommst Du einfach Nichts mit, egal was Du daran rumhantierst, aber sonst müsste das Programm weiter ablaufen.

Wie dem auch sei - schön, daß Es jetzt läuft und, daß Du Deinen gefundenen Fehler hier preis gibst - Das wird Nachfolgenden das Leben hoffentlich erleichtern.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

danja95

Ja Kinder weg vom RST Pin. Das ist nicht gut für euer Projekt :D

postmaster-ino

Oh sorry - hatte statt RES GND gelesen - DAS erklärt natürlich den Widerwillen des µC.


... geiler Fehler ...

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

HotSystems

Prima, dass du den Fehler gefunden hast.
Da hätten wir uns schwindelig gesucht. ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up