Hallo,
ich habe eine Fräse, mit der ich Macroaufnahmen von kleinen Objekten machen möchte. Die Kamera ist an der Z-Achse befestigt. Der Abstand der Kamera zum Objekt soll immer gleich sein. Dafür habe ich einen Sharp IR GP2D120 (4-30 cm) neben der Kamera montiert und zum Aufnahmebereich ausgerichtet.
Der Code der Z-Achse alleine funktioniert. Der Code um allgemein die Achsen ohne Delay zu bewegen funktioniert nun auch. Ich bin aber nicht sicher wie ich die beiden zusammenfüge.
Die Bewegung der X- und Y-Achse verläuft unabhängig von Z. Wenn ich mit Switch case arbeite, werden bestimmte Wege abgefahren und jede Bewegungsänderung bekommt ein eigenes Case. Die Z-Achse muß aber Case-Übergreifend bewegt werden.
So wie der Code nun aussieht, bewegen sich die X- und Y- Achsen und auch die Z-Achse. Die Z-Achse reagiert zufriedenstellend auf die Messwerte. Aber X- und Y-Achsen laufen extrem reduziert. Die Bewegung ist mit dem Auge fast nicht wahr zu nehmen. Ich habe zum Spass den unteren Codebereich, der Sensordaten und Umsetzung in Z-Achsenbewegung beinhaltet, Zeile für Zeile einkopiert und die Fräse jedesmal angefahren. Die Serial.print-Zeilen sind das Problem. Je mehr Serial.print-Zeilen um so langsamer laufen X- und Z-Achse. :o
Hat jemand eine Idee?
#include <Arduino.h>
int dirPin_X = 5;
int stepperPin_X = 2;
int dirPin_Y = 6;
int stepperPin_Y = 3;
int dirPin_Z = 7;
int stepperPin_Z = 4;
unsigned long move_x =1000;
unsigned long move_y =1000;
unsigned long move_z =200;
unsigned long interval;
//sensor
int sensorPin = A5;
int Distance = 0;
int sollAbstand = 104; //Abstand des Sensors zum Objekt; Kameraabstand dann 90mmm zum Objekt
void setup()
{
Serial.begin (9600);
pinMode(dirPin_X, OUTPUT);
pinMode(stepperPin_X, OUTPUT);
pinMode(dirPin_Y, OUTPUT);
pinMode(stepperPin_Y, OUTPUT);
pinMode(dirPin_Z, OUTPUT);
pinMode(stepperPin_Z, OUTPUT);
}
void step_1(boolean dir, int steps) // Einstellungen für die Z-Achse
{
digitalWrite(dirPin_Z,dir);
delay(50);
for(int i=0;i<steps;i++)
{
digitalWrite(stepperPin_Z, HIGH);
delayMicroseconds(600);
digitalWrite(stepperPin_Z, LOW);
delayMicroseconds (600);
}
}
void loop()
{
static unsigned long lastMillis = 0;
unsigned long currentMillis = millis();
static byte step = 1;
if(currentMillis - lastMillis >= interval)
{
lastMillis = currentMillis;
if (++step ==3) step =1;
}
switch (step)
{
case 1:
digitalWrite(dirPin_X, 1);
digitalWrite(stepperPin_X, 1);
delayMicroseconds(500);
digitalWrite(stepperPin_X, 0);
delayMicroseconds(500);
interval = move_x;
break;
case 2:
digitalWrite(dirPin_Y, 1);
digitalWrite(stepperPin_Y, 1);
delayMicroseconds(2000);
digitalWrite(stepperPin_Y, 0);
delayMicroseconds(2000);
interval = move_y;
break;
}
--------------------//////////////-------------------
// der untere Bereich umfasst die Messdaten
//des Sharpsensors und die Übergabe an die Z-Achse
// die Serial.print Zeilen haben Einfluß auf die Geschwindigkeit der X- und Y-Achse
// je mehr Zeilen um so langamer die X- und Y-Achse
Distance = analogRead(sensorPin);
Serial.print("Messwert: "); Serial.print(Distance); Serial.print(" ");
int DistanceConverted = (207600 / (Distance-11))/10;
DistanceConverted = constrain(DistanceConverted, 50, 150);
Serial.print("abs. Abstand: "); Serial.print(DistanceConverted); Serial.print("mm ");
Serial.print("rel. Abstand: "); Serial.print(DistanceConverted - sollAbstand); Serial.println(" mm");
if (DistanceConverted == 50)
{
step_1(true,0);
}
else if (DistanceConverted == 150)
{
step_1(true,0);
}
else if (DistanceConverted > 104)
{
step_1(true,300);
}
else if (DistanceConverted < 104)
{
step_1(false,300);
}
}