Wegmessung mit einem Winkelencoder

Hallo liebe Gemeinde,

versuche grade folgendes Projekt zu lösen:

Ich würde gerne mit einer Messrolle mit einem Durchmesser von 151,2mm eine Wegstrecke abmessen :) . Mein Encoder hat bei einer Umdrehung 226.19 Impule gezählt.

Jetzt meine Rechnung:

151,2mm Durchmesser * Pi = 475,0088092mm Umpfang

475,0088092mm / durch die Auflösung des Encoders (226.19) = 2,1000

Was bedeuten würde Ein impuls wären 0.2mm Weg.

Ich habe mir schonmal die Encoder librari heruntergeladen.Damit zählt er wenigstens schonmal. So nun muss ich aber ja jeden Impuls ob vor oder zurück mal 2,1 nehmen. wie stelle ich das am besten an?? Zudem sollte das ganze noch auf nem Display abzulesen sein.Und mann sollte den Zähler auch noch auf 0 setzen können.noch besser wäre es jedoch wenn der Referenzpunkt verschiebbar wäre und man einen änderbare wert im Programm eintragen könnte. z.b man drückt Referenz und im Display stehen schon 200mm und der zähler zählt von dortaus weiter.

Bedanke mich schonmal für jede Hilfe.

Bin für jeden Tipp Dankbar

Kurzer Zwischenbericht. Ist ja schon mal en anfang :slight_smile:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


int reset=2;
#include <Encoder.h>

Encoder myEnc(5, 6);
void setup()
{
  
  pinMode(reset, INPUT);
  lcd.begin(16, 2);
  lcd.clear();
  
  digitalWrite(reset, HIGH);
  lcd.setCursor(2,0);
  lcd.print("Wegmesssystem");
  lcd.setCursor(1,1);
  lcd.print ("System Startet");
  delay (8500);
  lcd.clear();
  
  
}  


void loop()
{
long oldPosition  = -999;
{
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lcd.setCursor(1,0);
    lcd.print ("Wegstrecke in mm");
     lcd.setCursor(0,1);
    lcd.print (newPosition);
  }

}
if (reset == HIGH) {
   lcd.clear();
      lcd.setCursor(3,0);
  lcd.print("Reset");
  lcd.setCursor(0,1);
  lcd.print ("Loslassen");
}
}

Verbessung Nr:2

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


int reset=2;
int x;
int z;
#include <Encoder.h>

Encoder myEnc(5, 6);
void setup()
{
  
  pinMode(reset, INPUT);
  lcd.begin(16, 2);
  lcd.clear();
  
  digitalWrite(reset, HIGH);
  lcd.setCursor(2,0);
  lcd.print("Wegmesssystem");
  lcd.setCursor(1,1);
  lcd.print ("System Startet");
  delay (8500);
  lcd.clear();
  
  
}  


void loop()
{
long oldPosition  = -999;
{
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    x = (newPosition);
    z = x * 2.1;
    lcd.setCursor(0,0);
    lcd.print ("Wegstrecke in mm");
    lcd.setCursor(0,1);
    lcd.print  (z);
  }

}
if (reset == HIGH) {
   lcd.clear();
      lcd.setCursor(3,0);
  lcd.print("Reset");
  lcd.setCursor(0,1);
  lcd.print ("Loslassen");
}
}

Interessanter wäre es, welchen Encoder du für diese Messung überhaupt nimmst, und ob es derzeit bereits Abweichungen zwischen schnellen und langsamen Umdrehungen gibt. Die Encoder Libary ist für mechanische Encoder nicht empfehlenswert.

Desweiteren ist die Variable z falsch deklariert, webnn sie einen float Wert annehmen soll. float würde ich hier überhaupt nicht nutzen. Du gibts oben "Was bedeuten würde Ein impuls wären 0.2mm Weg." an. Warum nicht die Anzahl der Imulse mit 0.2mm bzw. mit 20 multiplizieren?

Der Encoder ist ein Magnetkodiertes Winkelmesssysteme der Firma Balluff mit 0,1 mm Auflösung.

Koregiere mich wenn ich net en Denkfehler hab aber wenn ich doch den Wert so multipliziere sehe ich doch die Nachkommerstellen nicht mehr???

Grade verwiert :cold_sweat:

226.19 Impulse pro Umdrehung ist eine höchst kuriose Zahl. der punkt in der ZAhl ist ein Komma oder was?

Der Encoder ist ein Magnetkodiertes Winkelmesssysteme der Firma Balluff mit 0,1 mm Auflösung.

Hast Du Modell und technische daten?
Grüße Uwe

Modell

http://asset.balluff.com/std.lang.all/pdf/datasheet/r-/de/Datasheet_BML003U_212497_GER-de.pdf Also bei 226,19 ergibt sich aus folgender Rechnung

Das Abnehmerrad heit einen Durchmesser von 72mm .

Diesen Durchmesser mal Pi = 226.1946711mm am Umfang und auf deisem Weg hat er eine Auflösung von 0,1mm ( Hab auch nochmal bei Balluff nachgefragt und mir das so bestätigen lassen)

Hallo Kreidler,

einen Geber mit 226,19 Impulse pro Umdrehung ist nicht möglich. Es geht immer nur eine ganze Zahl! Außerdem ist 226 oder 227 Impulse pro Umdrehung kein Standard.

Standardauflösungen von Gebern sind z.B. 100, 128, 200, 256, 512, 1000, 1024, 2000,... Impulse pro Umdrehung.

Wenn Dein Arduino immerhin schon Impulse zählen kann, kannst Du ja einfach mal die komplette Rechnungsfunktion entfernen und einfach nur die Impulse zählen und ausgeben. Das Rad 10 Umdrehungen drehen und dann einfach das Ergebnis durch 10 teilen. Eine Umdrehung allein ist zu ungenau. Ein paar Grad zu wenig gedreht und schon passt das Ergebins überhaupt nicht.

Bei meiner Anwendung mit einem Drehgeber werden je die steigende und die fallende Flanke von Spur A und B gezählt. Also da mein Geber 2048 Impulse pro Umdrehung liefert, zeigt der bei mir 8192 Impulse pro Umdrehung.