Encoder-Signal für ein Messgerät Simulieren

Hallo Community,

ich bin neu in diesem bereich und arbeite derzeit an einem Projekt, bei dem ich ein Encoder-Messgerät mit einem Arduino Uno testen möchte. Das Messgerät verfügt über einen 7-poligen Sensorstecker und soll eine simulierten Strecke von 200 mm messen.

Die spezifischen Anforderungen sind wie folgt:

  • Sensorstecker: 7-polig
  • Simulierte Strecke: 200 mm
  • Arduino Uno als Steuerung
  • Auflösung des simulierten Drehgebers: 0,5 digit/mm

Meine Frage ist, wie kann ich das Arduino-Programm gestalten, um sicherzustellen, dass das Messgerät ordnungsgemäß funktioniert und die simulierten 200 mm mit einer Auflösung von 0,5 digit/mm misst? Gibt es besondere Überlegungen hinsichtlich der Programmierung oder des Anschlusses des Messgeräts an den Arduino Uno? ChatGPT hat mir leider auch nicht helfen können.

Hier der bisherige stand

"// Pin-Belegung
const int channelAPin = 2; // gelb
const int channelBPin = 3; // grün
const int groundPin = 1; // ground (-Pin ist auch Ground)
const int powerPin = 4; // +5V

// Encoder erstellen
Encoder myEncoder(channelAPin, channelBPin);

void setup() {
pinMode(groundPin, OUTPUT);
pinMode(powerPin, OUTPUT);

digitalWrite(groundPin, LOW); // Ground aktivieren
digitalWrite(powerPin, HIGH); // +5V aktivieren

Serial.begin(9600);
}

void loop() {
// Simulierte Strecke von 200mm
float simulatedDistance = 200.0; // in mm

// Auflösung des Drehgebers (0,5 digit/mm)
float resolution = 0.5; // digit/mm

// Berechnung der Anzahl der Impulse
int numberOfTicks = simulatedDistance / resolution;

// Ausgabe der Anzahl der Impulse
Serial.print("Anzahl der Impulse: ");
Serial.println(numberOfTicks);

// Simulation der Drehbewegung
for (int i = 0; i < numberOfTicks; i++) {
int encoderValue = myEncoder.read();
// Hier könntest du den Encoder-Wert an dein Messgerät weitergeben
// (Beachte: In der Praxis wäre dies nicht notwendig, da der Encoder die Werte automatisch generiert)
}

delay(1000); // Wartezeit für die Ausgabe (kann angepasst werden)
}"

Ich freue mich über jegliche Hilfe oder Anregungen, die ihr zu diesem Thema habt. Vielen Dank im Voraus für eure Unterstützung!

Beste Grüße,
Philipp

Wie man dieses Forum benutzt - bitte lesen


Hmm... das kann ja alles sein... Hast du ein Datenblatt zu der Belegung und dem Protokoll?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Wozu brauchst du einen Encoder? Ich dachte der soll simuliert werden.

Der will aus dem Drehencoder eine Simulation für einen mit Getriebe machen.
So hab ich das zumindest verstanden.

Bei 200mm und einer Auflösung von 0,5digit / mm macht das vermutlich 400 Rasten.
Jetzt ist die Frage, was das Messgerät erwartet....
Ein Encodersignal oder schon was aufbereitetes?

Bisher hatte das Messgerät sein Signal von dem Drehgeber bekommen.
Im Messgerät selber gibt es die Funktion "Geber Test" (wenn ich am Seil vom Drehgeber gezogen habe, hat mir das Messgerät die Strecke des rausgezogenem Seil gezeigt). Genaue Informationen über das Messgerät haben ich leider nicht, ich konnte nur meinen Drehgeber an ein Oszilloskop anschließen und testen. Die daten werden ganz normal im Encoder-Signal übertragen.

Diesen Drehgeber möchte ich simulieren.

Sieht von den Bezeichern aus wie ein optischer Rotary Encoder.

Du müsstest mal raussuchen ob CH-A und CH-B "open-drain" oder "push-pull" benutzt.

Eine Idee zum Simulieren eines Encoders hab ich hier gepostet: Hilfe: Von Gray-Code auf Encoder (Takt A, Takt B)! - #27 by Rintin

Hallo,

was willst Du da anschließen ?

Ich gehe mal davon aus das das Messgerät eine eigene Stromversorgung hat und im Normalfall die 5V für den Encoder zur Verfügung stellt.

Das Messgerät hat einen Anschluss für GND =0V den musst Du mit dem GND vom Arduino verbinden. Der Arduino bekommt zunächst mal seine Spannung über USB.

ich würde Dir noch einen Taster vorschlagen mit dem Du den Vorgang starten kannst.
Du musst eine bestimmte Anzahl von Impulsen auf die beiden Eingänge A und B des Messgerätes geben. Und das in der zeitlichen Abfolge wie dargestellt.

A B
1 0
1 1
0 1
0 0

das geht am einfachsten mit einer Schrittkette (Ablaufsteuerung) Dabei spielt es keine Rolle wie schnell die Schrittkette abäuft. Damit Du das erst mal testen kannst empfehle ich dir erst mal eine Wartezeit von ein paar 100 ms zwischen zwei Schritten. Die Zustände kannst Du auch erst mal auf zwei LED´s legen oder im Monitor anzeigen lassen. Wenn es dann im Prinzip läuft kannst Du die Wartezeit verringern und so die "Geschwindigkeit" verändern. Die Richtung kannst Du ändern in dem Du die beiden Ausgänge vertauschst.

Nach einigem herum probieren und mit Hilfe von perplexity.ai habe ich endlich einen funktionsfähigen Code, der mir ein Encoder-Signal gibt, welches langsam und konstant im Messgerät hoch zählt. Ich bedanke mich für eure Unterstützung.

Hier noch das Programm falls jemand ein ähnliches Problem hat:

// Encoder-Simulation mit einem 7-poligen Stecker

// Pins für die Encoder-Signale
const int pinEncoderA = 2;
const int pinEncoderB = 3;

// Aktuelle Position des Encoders
float position = 0.0; // Als Gleitkommazahl definieren

// Schrittweite für die Position
const float step = 0.5; // Als Gleitkommazahl definieren

void setup() {
  // Pins für die Encoder-Signale als OUTPUT definieren
  pinMode(pinEncoderA, OUTPUT);
  pinMode(pinEncoderB, OUTPUT);
}

void loop() {
  // Encoder-Signale setzen
  digitalWrite(pinEncoderA, HIGH);
  digitalWrite(pinEncoderB, LOW);
  delay(1000); // Verzögerung für die Signalfrequenz
  digitalWrite(pinEncoderA, LOW);
  digitalWrite(pinEncoderB, HIGH);
  delay(1000); // Verzögerung für die Signalfrequenz

  // Position des Encoders aktualisieren
  position += step;
}

Hallo,
Hast ja jetzt schon was gefunden, dennoch hier meine Vorschlag mit einer Schrittkette. Geschwindigkeit und Anzahl der Impulse kannst Du vorgeben. Du kannst das ja noch auf Deine physikalischen Größen umrechnen.


const byte pinA = 8;
const byte pinB = 9;
const byte pinbtn = 3; // Taster Start Verbindung nach GND

// Einstellung Vorgaben 
int maxcount = 100;// Vorgabe Anzahl der Impulse
const uint32_t wartezeit = 10; //

uint32_t altzeit;
int count;
bool lastbtn;

enum ablauf {warte = 0, eins, zwei, drei, vier};
ablauf zustand = warte;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinbtn, INPUT_PULLUP);

  digitalWrite(pinA, LOW);
  digitalWrite(pinB, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:

  switch (zustand) {
    case warte:
      if (!digitalRead(pinbtn) == true && lastbtn == false) {
        lastbtn = true;
        altzeit = millis();
        zustand = eins;
        count = 0;
      }
      lastbtn = !digitalRead(pinbtn);
      break;

    case eins:
      if ( millis() - altzeit > wartezeit) {
        altzeit = millis();
        count++;
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        zustand = zwei;
        Serial.print("\n count ");Serial.print (count);
        Serial.print(" 10");
      }
      break;

    case zwei:
      if ( millis() - altzeit > wartezeit) {
        altzeit = millis();
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, HIGH);
        zustand = drei;
        Serial.print(" 11");
      }
      break;

    case drei:
      if ( millis() - altzeit > wartezeit) {
        altzeit = millis();
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        zustand = vier;
        Serial.print(" 01");
      }
      break;

    case vier:
      if ( millis() - altzeit > wartezeit) {
        altzeit = millis();
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, LOW);
        Serial.print(" 00");
        if (count >= maxcount)zustand = warte;
        else zustand = eins;
      }
      break;
  }
}

Nachtrag : Fehler im code beseitigt

@Rentner müsstest du nicht in der Statemachine nicht auch mal pinB schreiben?

Hallo,
ups!!
danke für den Hinweis, habs geändert.
Das kommt davon wenn man die Zeilen kopiert. Hätte besser doch mal zwei LED´s dran gehängt

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