Integration eines externen Rotary Encoders mit Arduino

Hallo zusammen,. Ich möchte die Signale des Encoders (A und B) mit einem Arduino nachbilden. Der Raspberry Pi liest die Encoder-Signale und soll diese dann an den Arduino weitergeben, der die Signale physisch nachbildet.

Hallo,

die Encoderdaten kommen Seriell vom Raspi zum Arduino?
Du musst die Kommunikation, also das Übertragungsprotokoll, dafür passend schreiben. Richtungsangabe und Absolutwert übertragen sollte doch ausreichend sein.
Funktioniert das schon?
Wenn du diese Werte hast, was möchtest daran weitergehend interpretieren?
Der Absolutwert gibt die aktuell Position an und die Richtung die der letzten Änderung.
Kannst auch noch die relative Position mit übertragen wenn das notwendig sein sollte.

Hallo,
mit ist da noch nicht ganz klar was Du vorhast.? Der Encoder ist am Pi angeschlossen und der Winkel wird serial als absoluter Wert (bzw. Position) an den Arduino übertragen. Der soll nun daraus wieder die Encodersignale A und B über Ausgänge bilden.

Die Frequenz des Encoders wird doch so lediglich durch die Abtastrate der Seriellen Schnittstelle akualisiert. Wenn der Encoder steht müssten die Signale statisch sein . Man musste die Änderung zum letzten eingelesen Wert irgendwie codieren.

Ich denke das wird so nix. Zapfe Dir die Signale A u B direkt am Encoder ab und mach damit was immer Du willst.

Hallo,

du möchtest die A/B Signale wiederherstellen? Das wird schwierig. Du müßtest nach jedem Hardware Reset eine Referenz haben die sagt, bspw. Zero ist A/B gleich 0/0 oder 1/0 usw. Dann ist die Frage werden auf Raspi Seite die Encoderwerte mittels Rastsprünge verändert?

Meine Idee wäre, du überträgst nicht die Absolutwerte allein, du überträgst die A/B Werte direkt. Oder alles zusammen. Dann hättest du immer einen gültigen Datensatz je Übertragung aus Absolutwert, A/B Signal und was sonst noch wichtig ist.

Hallo,

wie gesagt, entweder überträgst du die A/B Signal direkt, dann musst du nichts umrechnen.
Oder du hast eine Referenz das Encoderwert 0 bspw. A/B = Phasensignal 0/0 entspricht.
Dann kannst du mittels Modulo Rechnung aller 4 Gruppen wiederholt die Phasenlage von A/B interpretieren.

Encoderwert 0 ... A/B = Phasensignal 0/0
Encoderwert 1 ... A/B = Phasensignal 1/0
Encoderwert 2 ... A/B = Phasensignal 1/1
Encoderwert 3 ... A/B = Phasensignal 0/1
Encoderwert 4 ... A/B = Phasensignal 0/0 ... entspricht wieder 0
Encoderwert 5 ... A/B = Phasensignal 1/0 ... entspricht wieder 1
Encoderwert 6 ... A/B = Phasensignal 1/1 ... entspricht wieder 2
usw.

Hallo,
ich hab da jetzt mal drüber nachgedacht :wink: und das was jetzt kommt ist ein bischen ins Blaue gedacht.

Vor einer Weile gab's hier eine Thema " Encoder Signale simulieren". Ich hab das nicht verfolgt. Aber da wird man was finden um A/B Signale mit einer festgelegten Zeitabfolge zu erzeugen.
Es gibt für die beiden Signale A/B insgesamt 4 Statuszustände @Doc_Arduino hat sie noch mal aufgeschrieben. Die müsen also in einer bestimmten zeitlichen Abfolge erzeugt werden. Etwas vereinfacht gesagt , zeitliche Abfolge entspricht dabei der Geschwindigkeit. Die Anzahl der Flankenwechsel entspricht der Position die man mit einem Zähler erstellt.

Encoder Signale beinhalten also zwei pysikalische Informationen Position und Geschwindigkeit. Wenn Du nun nur die Positonen zu zwei Zeitpunkten hast dann kannst Du daraus die Zeitdifferenz berechnen und für diese Zeit die Differenz der beiden Positionen. Du konntest also für x ms A/B signale erzeugen bis die Pos erreicht ist. Dazu musst Du dann natürlich die aktuelle Position der erzeugten Signale und die Richtung für die Erzeugung der Signale berücksichtigen.

Wie gesagt ob das ein gangbarere Weg sein könnte ??? es könnte ein Ansatz sein.

Gruß Heinz

Da liegt der Gedankenfehler.
Die beiden Encodersignale enthalten als Information nur die 4 Teilinformationen zu 1 Schritt. Wie viele Schritte schon abgelaufen sind ist unbekannt. und damit ist Absolutposition och nicht bekannt.
Die Geschwindigkeit ist damit allerdings indirekt bekannt, wenn du die Zeit zwischen den Signalwechseln und die Information "Weg pro Signalwechsel" verrechnest.

Ich denke du bekommst einen Soll-Wert über die Serielle Schnittstelle rein.

Dann versucht der Ist-Wert sich dem Soll anzunähern und taktet dabei die Phasen raus.

Vielleicht hilft dir das:

1 Like

Hallo,

du musst lernen wie man debugt. Du musst verstehen was dein Code macht. Sonst fragst du nach jeder neuen Zeile die nicht funktioniert.

void setup() {
  Serial.begin(9600); // Start der seriellen Kommunikation
}

void loop() {
  if (Serial.available() > 0) {
    String receivedString = Serial.readStringUntil('\n'); // Ganze Zeile lesen
    Serial.print("Received string: ");
    Serial.print(receivedString);
    
    // Versuchen Sie, den String in eine Ganzzahl umzuwandeln
    const int newValue = receivedString.toInt();

    // Berechnen Sie die aktuelle Phase (0 bis 3)
    const int phase = newValue % 4;
    Serial.print(" phase: "); Serial.print(phase);
    Serial.println('\n');
  }
}

Das ist aber noch lange nicht fertig. Wie gesagt, ich würde die A/B Signale direkt übertragen. Oder meinetwegen "kodiert" mit Werten zwischen 0 und 3 oder 1 und 4. Dann bleibt die Zuordnung konsistent ohne Referenzprobleme, ohne Umwandlungsprobleme usw.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.