Go Down

Topic: Größere Anzahl Schritte drehen (Read 125 times) previous topic - next topic

HeCh

Apr 23, 2019, 07:08 am Last Edit: Apr 23, 2019, 07:09 am by HeCh
Hallo Zusammen,

folgende Situation: Motor soll bei korrekt eingegebenen PIN Code auf einen Endschalter fahren. Dies funktioniert auch bereits. Ist der Endschalter nun betätigt, soll der Motor bei erneuter korrekter Eingabe des PINs eine Gewisse Anzahl an Umdrehungen (ca. 130) zurückdrehen.

Leider komme ich hier mit den Zahlenwerten von int nicht mehr aus. Bin daher testweise schon auf long gegangen. Brachte auch keinen Erfolg. Auch wenn ich die zugehörige Bibliothek stepper.h auch auf long geändert habe.

Habe den Code dann nochmal wieder etwas abgewandelt, auch leider ohne Erfolg. Kann mir jemand helfen wie ich den Arduino zu einer größeren Umdrehungszahl bringe?

Code: [Select]
/*
#include <Stepper.h> // stepper Bibliothek einbinden
#include <Keypad.h> // keypad Bibliothek einbinden

#define STEPS  200 // Anzahl Motorsteps
long  Steps2Take; 
 

const byte PINLENGTH = 4; // Zeichenzahl Pincode
char pinCode[PINLENGTH+1] = {'0','8','1','5'}; // Pincode festlegen
 

char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};

// Achtung, Keypad ist nicht vollständig an Arduino angeschlossen. Buchstaben werden nicht uebertragen!

const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //Eingaenge verbunden zu den Zeilenausgaengen des Keypads
byte colPins[COLS] = {5, 4, 3, 1}; //Eingaenge verbunden zu den Spaltenausgaengen des Keypads
int Endschalter = 13; // Eingangspin Endschalter
int grueneLED = A5; // Ausgangspin grueneLED
int roteLED = A4; // Ausgangspin roteLED
 

Stepper stepper(STEPS, 10, 12, 11, 13); // Ausgaenge zum Schrittmotor

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
 
void setup(){
  Serial.begin(9600);
  pinMode(Endschalter, INPUT_PULLUP); // Defiintion Endschalter
  pinMode(grueneLED, OUTPUT); // grueneLED als Ausgang
  pinMode(roteLED, OUTPUT); // roteLED als Ausgang
}
 
void loop(){

// Wenn Endschalter geschaltet, leuchtet die rote LED. Ansonsten die gruene LED.

if (digitalRead(Endschalter) == 1) {
    digitalWrite(grueneLED, LOW);
    digitalWrite(roteLED, HIGH);
  }
else{
  digitalWrite(grueneLED, HIGH);
  digitalWrite(roteLED, LOW);
  }   

// Abfrage und Auswertung Keypad 

  char customKey = customKeypad.getKey();
 
  if (customKey) {

    if ((int(customKey) >= 48) && (int(customKey) <= 57)){
      addToKeyBuffer(customKey);
    }

    else if (customKey == '#') {
      checkKey();
    }
    else if (customKey == '*') {
    Serial.print(digitalRead(Endschalter));
    Serial.print(" > ");
    }
  }
}
 
void addToKeyBuffer(char inkey) {
  Serial.print(inkey);
  Serial.print(" > ");
  for (int i=1; i<PINLENGTH; i++) {
    keyBuffer[i-1] = keyBuffer[i];
  }
  // in ganz rechter Stelle die letzte Ziffer speichern
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}
 
void checkKey() {
  if (strcmp(keyBuffer, pinCode) == 0) {
    Serial.println("CORRECT");
    pinCorrect();
  }
  else {
    Serial.println("WRONG!");
    pinWrong();
  }

  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-';
  }
}

// Bei richtigem PIN und gedruecktem Endschalter drehe angegebene Schrittzahl in negative Richtung, ansonsten werden 10 Schritte in positiver Richtung gefahren und erneut geprueft (while-Schleife)
 
void pinCorrect() {         
  if (digitalRead(Endschalter) == 1) {
    stepper.setSpeed(1000); //Max seems to be 1000
                      Steps2Take  =  -32769;  // Rotate CCW, 1600 = eine Umdrehung laut Augenmaß
                      stepper.step(Steps2Take);
                      delay(100);       
  }
  else{
      while(digitalRead(Endschalter) == 0){
    stepper.setSpeed(1000); //Max seems to be 1000
                      Steps2Take  =  10;  // Rotate CCW
                      stepper.step(Steps2Take);
  }
                      delay(100);       
  }
}
 
void pinWrong() {
  stepper.setSpeed(1000);
                      Steps2Take  =  0;  // Rotate CCW
                      stepper.step(Steps2Take);
                      delay(100);
                     
 
}

gregorss

Leider komme ich hier mit den Zahlenwerten von int nicht mehr aus.
Du redest von 130 Umdrehungen. Wieso sollte 130 nicht in ein int passen?

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

HeCh

Weil ich ja in meinem Code die Schrittzahl eingebe.
Laut Augenmaß sind 1600 Schritte eine Umdrehung. 1600 x 130 = 208000 Schritte

Oder gibt es die Möglichkeit zu sagen, dass eine Umdrehung 1600 Schritte sind und dann mit der Anzahl der Umdrehungen zu arbeiten?

gregorss

Weil ich ja in meinem Code die Schrittzahl eingebe.
Laut Augenmaß sind 1600 Schritte eine Umdrehung. 1600 x 130 = 208000 Schritte

Oder gibt es die Möglichkeit zu sagen, dass eine Umdrehung 1600 Schritte sind und dann mit der Anzahl der Umdrehungen zu arbeiten?
Naja .. Du könntest etwas programmieren, das eine Umdrehung ausführt - das wird dann halt 130 mal aufgerufen. Oder Du benutzt keine Achtel(?)schritte.

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

uwefed

Das ist ein lustiger Code.

so kompliziert kann man 0,1s warten:
Code: [Select]
void pinWrong() {
  stepper.setSpeed(1000);
                      Steps2Take  =  0;  // Rotate CCW
                      stepper.step(Steps2Take);
                      delay(100);
                     
 
}
man dreht 0 Schritte und wartet dann.

Quote
Motor soll bei korrekt eingegebenen PIN Code auf einen Endschalter fahren.
Nein, das macht Dein Code nicht. er kontrolliert ob der Endschalter betätigt/ncht betätigt ist und dreht dann stur den Motor.
Code: [Select]
if (digitalRead(Endschalter) == 1) {
    stepper.setSpeed(1000); //Max seems to be 1000
                      Steps2Take  =  -32769;  // Rotate CCW, 1600 = eine Umdrehung laut Augenmaß
                      stepper.step(Steps2Take);
                      delay(100);       
  }

Wenn Du bis zum Endschalter drehen lassen willst dann mußt Du den Endschalter auch dauernd kontrllieren.

Go Up