Arduino mit Encoder !!!

Hallo Zusammen,

Mit folgendem Programm macht der Motor einen Schritt bei einem Schritt vom Encoder und nun möchte ich dass der Motor eine ganze Umdrehung macht bei einem SChritt vom Encoder

was kann ich im Programm ändern um die gewünschte Funktion zu erfüllen ?

Vielen Dank

 #include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 
// defines pins numbers
 #define stepPin 3 
 #define dirPin  10
 #define outputA 8
 #define outputB 9
 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 
}
void loop() {
  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     if (counter >=30 ) {
      counter =0;
     }
     
     lcd.clear();
     lcd.print("Position: ");
     lcd.print(int(angle*(-1.8)));
     lcd.print("deg"); 
     lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}
void rotateCW() {
 digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000);   
}

was kann ich im Programm ändern um die gewünschte Funktion zu erfüllen ?

Du machst einen Schritt, möchtest aber 200 Schritte machen.
Was musst du dafür tun?

Antwort: 200 Schritte machen.


Meine Hellseherischen Fähigkeiten sehen schon die nächste Frage:

Warum läuft der Motor so rappelig?

Antwort:

Weil du keine Beschleunigungsrampen verwendest.
Probiere es mit der Accelstepper Lib

Hallo Combie,

ja klar habe das in der Funktion reingefügt aber hats nicht geklappt

Is klar....

Dir ist schon klar, dass ich nicht sehe, welchen Bock du da schießt ....
Oder?

Und was "nicht klappt" kann ich auch nicht sehen.

habe das in der Funktion reingefügt

Wie hast du das gemacht? (Zeige die geänderte Funktion)
Du musst auch auf Hochladen klicken :wink:

aber hats nicht geklappt

Was hat sich durch die andere Funktion geändert?

Zur Schönheit: Die Variable angle würde ich entfernen...

Hallo,

wir machen uns das mal ganz einfach und bauen die Funktion rotate um mit Parameterübergabe. Der Nachteil der Einfachheit ist, dass rotate während ihrer Abarbeitung die loop blockiert. Ob das stört weiß ich nicht.

Edit: nochmal geändert wegen der LCD Anzeige. Zwar alles noch nicht optimal, dafür einfach gehalten.

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// pins numbers
const byte stepPin = 3;
const byte dirPin  = 10;
const byte outputA = 8;
const byte outputB = 9;
bool aState;
bool aLastState;

void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode (outputA, INPUT);
  pinMode (outputB, INPUT);

  aLastState = digitalRead(outputA);
  lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
void loop() {
  aState = digitalRead(outputA);

  if (aState != aLastState) {
    if (digitalRead(outputB) != aState) {
      rotate(200, LOW);   // CW
    }
    else {
      rotate(200, HIGH);  // CCW
    }
  }
  aLastState = aState;
}

void rotate(unsigned int count, byte dir) {
  byte angle = 0;
  float step = 0;
  if (dir) step = -1.8;
  else step = 1.8;
  
  digitalWrite(dirPin, dir);
  
  for (unsigned int i=0; i<count; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
    
    lcd.setCursor(0,0);
    lcd.print("Pos: ");
    lcd.print(int(angle * step));
    lcd.print("deg ");
    angle++;
  }
}