Danke für die schnelle Antwort!
Das Programm vor den Anpassungen der zusätzlichen Schritte ist das:
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <MobaTools.h>
//--- Pin-Belegungen
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Pin-Belegung für LCD
const int puls = 9, direct = 8; //Pin-Belegung für Motor
const int bremse = 6; //Pin-Belegung für Bremse
const int referenzSensor = 7; //Pin-Belegung für Referenzsensor
const int saegeSensor = 10; //Pin-Belegung für Sägemotor
const int schraubstockSensor = 11; //Pin-Belegung für Schraubstock
const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = {A0, A1, A2, A3}; //Pin-Belegung für Keypad (1-4, von links nach rechts)
byte colPins[COLS] = {A4, A5, 12, 13}; //Pin-Belegung für Keypad (5-8, von links nach rechts)
//--- Konstanten
const int stepsUmdrehung = 1600; //Anzahl Schritte pro Umdrehung
const float lengthPerStep = 0.11f; //Länge pro Schritt
const float referenz = 3105.53f; //Referenzposition nach der Referenzfahrt
const float extraLaenge = 5; //Extra-Länge bei der Schleifenfahrt
const float motorSpeed = 1200;
//--- ab hier Programm ---
int mode = 0;
char eingabe[16];
long stelle = 0;
float laengeEingabe = 0;
float difLaenge = 0;
float pos = 0;
char posAnzeige[16];
long stepsNeeded = 0;
float actualStepsNeeded = 0;
boolean saegeOff;
MoToStepper myStepper( stepsUmdrehung, STEPDIR );
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
char keys[ROWS][COLS] = { //Zu entsprechende Tasten vom Keypad (* wurde bereits mit . ausgetauscht)
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'}
};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
pinMode(bremse, OUTPUT);
pinMode(referenzSensor, INPUT);
pinMode(saegeSensor, INPUT);
pinMode(schraubstockSensor, INPUT);
myStepper.attach( puls, direct );
lcd.begin(16, 2);
lcd.print("Referenzfahrt");
myStepper.setSpeed(motorSpeed);
myStepper.setRampLen(0);
referenzfahrt();
myStepper.setSpeed(motorSpeed);
myStepper.setRampLen(200);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
mode = 1;
}
void loop() {
char key = keypad.getKey();
if (digitalRead(saegeSensor) == LOW) {
saegeOff = true;
}
if (digitalRead(saegeSensor) == HIGH && mode != 4 && saegeOff) { //Freifahrt
saegeOff = false;
mode = 4;
lcd.clear();
lcd.print("Freifahrt");
digitalWrite(bremse, HIGH);
myStepper.doSteps(-100);
while (myStepper.moving() );
digitalWrite(bremse, LOW);
}
if (digitalRead(schraubstockSensor) == HIGH && mode == 4 && mode != 5) { //Zurückfahren
mode = 5;
lcd.clear();
lcd.print("Zurückfahren");
digitalWrite(bremse, HIGH);
myStepper.doSteps(100);
while (myStepper.moving() );
digitalWrite(bremse, LOW);
dtostrf(pos, 6, 1, posAnzeige);
lcd.clear();
lcd.print("Position:");
lcd.setCursor(0, 1);
lcd.print(posAnzeige);
mode = 3;
}
if (mode == 1 && key != '\0') {
if (key != 'A' && key != 'B' && key != 'C' && key != 'D' && key != '#' && stelle < 15) {
lcd.print(key);
eingabe[stelle] = key;
stelle++;
}
if (key == 'B') {
dtostrf(pos, 6, 1, posAnzeige);
lcd.clear();
lcd.print("Position:");
lcd.setCursor(0, 1);
lcd.print(posAnzeige);
delay (2000);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
if (key == '#' && stelle > 0) {
eingabe[stelle] = NULL;
stelle--;
lcd.setCursor(stelle,1);
lcd.print(' ');
lcd.setCursor(stelle,1);
}
if (key == 'D' && stelle > 0) {
laengeEingabe = atof(eingabe);
if (laengeEingabe < 400 || laengeEingabe > 3100) {
lcd.clear();
lcd.print("Nur 400 - 3100");
delay (2000);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
else {
difLaenge = pos - laengeEingabe;
mode = 2;
}
}
}
if (mode == 2) {
if (difLaenge > 0) {
stepsNeeded = lengthToStepsLong(difLaenge);
actualStepsNeeded = lengthToStepsFloat(difLaenge);
digitalWrite(bremse, HIGH);
myStepper.doSteps(stepsNeeded);
while (myStepper.moving() );
digitalWrite(bremse, LOW);
pos = pos - stepsToLength(actualStepsNeeded);
}
if (difLaenge < 0) {
stepsNeeded = lengthToStepsLong(-difLaenge);
actualStepsNeeded = lengthToStepsFloat(-difLaenge);
long extraSteps = lengthToStepsLong(extraLaenge);
digitalWrite(bremse, HIGH);
myStepper.doSteps(-(stepsNeeded + 50));
while (myStepper.moving() );
myStepper.doSteps(50);
while (myStepper.moving() );
digitalWrite(bremse, LOW);
pos = pos + stepsToLength(actualStepsNeeded);
}
dtostrf(pos, 6, 1, posAnzeige);
lcd.clear();
lcd.print("Position:");
lcd.setCursor(0, 1);
lcd.print(posAnzeige);
mode = 3;
}
if (mode == 3 && key == 'A') {
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
}
void referenzfahrt() {
myStepper.setSpeed(50);
digitalWrite(bremse, HIGH);
myStepper.doSteps(100);
while ( myStepper.moving() );
myStepper.setSpeed(motorSpeed);
myStepper.rotate(-1);
while (digitalRead( referenzSensor ) == LOW);
myStepper.rotate(0);
while ( myStepper.moving() );
myStepper.doSteps(-200);
while ( myStepper.moving() );
myStepper.setSpeed(50);
myStepper.rotate(1);
while (digitalRead( referenzSensor ) == LOW);
myStepper.rotate(0);
while ( myStepper.moving() );
digitalWrite(bremse, LOW);
myStepper.setZero();
pos = referenz;
}
long lengthToStepsLong(float laenge) {
long steps = laenge / lengthPerStep;
return steps;
}
long lengthToStepsFloat(float laenge) {
float difLaenge = laenge / lengthPerStep;
return difLaenge;
}
float stepsToLength(long steps) {
float laenge = steps * lengthPerStep;
return laenge;
}
Das Problem wird bei der Freifahrt und Zurückfahrt deutlich. Wenn er 100 Schritte vor- und dann wieder zurückfährt, ist er nicht an der gleichen Stelle.
Die Bremse steht zwar mit drinne (wo selbstverständlich dann noch ein delay hinzukommen müsste), ist aber im Moment noch nicht verbaut, hat also keine Auswirkungen.