int steppers[][4] = {{2,3,4,5},{8,9,10,11}}; float perTurn = 15*2*3.1415926; int stepsPerTurn = 2048; float perStep = perTurn/stepsPerTurn; float x = 0; float y = 0; int steps[] = {0,0}; float r[] = {1414.2, 1414.2}; // Aktuelle Radien float t[] = {1414.2, 1414.2}; // Target Radien float px[] = {0,0}; // Aktuelle Position void step(int s, int d) { digitalWrite(steppers[s][steps[s]], LOW); steps[s]=(steps[s]+4+d)%4; r[s]+=perStep*d; digitalWrite(steppers[s][steps[s]], HIGH); /*Serial.print("r[0]="); Serial.print(r[0]); Serial.print(" r[1]="); Serial.println(r[1]);*/ } void stop() { for (int s=0; s<2; s++) { for (int p=0; p<4; p++) { digitalWrite(steppers[s][p], LOW); } } } void gotoPos(float gx, float gy) { int steps[2]; unsigned long dtime[2]; unsigned long ntime[2]; int dir[2]; t[0] = sqrt((1000+gx)*(1000+gx)+(1000-gy)*(1000-gy)); t[1] = sqrt((1000-gx)*(1000-gx)+(1000-gy)*(1000-gy)); /*Serial.print("Target t[0]="); Serial.print(t[0]); Serial.print(" t[1]="); Serial.print(t[1]); Serial.print(" for x="); Serial.print(gx); Serial.print(" y="); Serial.println(gy);*/ steps[0] = abs(t[0]-r[0])/perStep; steps[1] = abs(t[1]-r[1])/perStep; for (int s=0; s<2; s++) { if (t[s]>r[s]) { dir[s] = 1; } else { dir[s] = -1; } } /*Serial.print("steps[0]="); Serial.print(steps[0]); Serial.print(" steps[1]="); Serial.print(steps[1]); Serial.print(" dir[0]="); Serial.print(dir[0]); Serial.print(" dir[1]="); Serial.println(dir[1]);*/ if (steps[0]>steps[1]) { dtime[0]=5000; if (steps[1]>0) { dtime[1]=5000L*(long)steps[0]/steps[1]; } else { dtime[1] = 5000L*(long)steps[1]; } } else { dtime[1]=5000; if (steps[0]>0) { dtime[0]=5000L*(long)steps[1]/steps[0]; } else { dtime[0] = 5000L*(long)steps[1]; } } /*Serial.print("dtime[0]="); Serial.print(dtime[0]); Serial.print(" dtime[1]="); Serial.println(dtime[1]); */ ntime[0] = micros()+dtime[0]; ntime[1] = micros()+dtime[1]; while (steps[0]>0 && steps[1]>0) { for (int s=0; s<2; s++) { if (micros()>ntime[s]) { ntime[s]+=dtime[s]; step(s,dir[s]); steps[s]--; } } } px[0] = gx; px[1] = gy; /*Serial.print("r[0]="); Serial.print(r[0]); Serial.print(" r[1]="); Serial.print(r[1]); Serial.print(" now at x="); Serial.print(gx); Serial.print(" y="); Serial.println(gy);*/ } void approxTo(float gx, float gy) { float a = px[0]; float b = px[1]; float vx = gx-px[0]; float vy = gy-px[1]; float l = sqrt(vx*vx+vy*vy); int steps = (int)(l/2)+1; vx /= steps; vy /= steps; a+=vx; b+=vy; for (int i=0; i