valore .currentPosition() errato

Buongiorno a tutti, possiedo un Arudino Mega 2560 e sto cercando di creare uno sketch per un braccio cartesiano a due assi con un NEMA 34 per l'asse orrizzontale e un NEMA 23 per quello verticale.
Si sta utilizzando la libreria AccelStepper.h (link library AccelStepper: AccelStepper Class Reference)

L'asse orizzontale non crea problemi, mentre quello verticale riscontro dei valori anomali quando leggo la sua posizione corrente. Tralasciando il motore X, ad ogni ciclo porto l'asse verticale (motore Z) ad una posizione molto bassa (la home o punto 0 l'ho in alto quindi vado ad una posizione negativa), dove prima o poi entrerà in contatto con una pila di vaschette di plastica: quando avverrà un sensore induttivo posizionato sul braccio tramite una molla invierà un segnale all'arduino il quale, in ordine,

  • stopperà il motore verticale
  • si salverà la posizione Y corrente in cui ha toccato la vaschetta, tramite la funzione steppermotor.currentPosition();
  • dirà falsamente che è arrivato alla posizione prefissata (poichè uso la funzione moveTo)
  • dalla posizione Y ritornerà in alto per continuare il ciclo

La questione è che la funzione currentPosition() a grandi velocità di volta in volta incrementa invece di diminuire. Infatti il braccio ad ogni ciclo aggancia una vaschetta quindi di volta in volta si troverà ad un posizione più bassa. Invece con velocità e accelerazione discrete la funzione restituirà un valore normalmente che decrementa. PERCHE'? :confused: :confused:

Ecco la porzione di codice incriminata:

....

//-------------------- 2 MOVIMENTO ------------------------------------------------------------------------------
  if(stepperX.distanceToGo() == 0 && pos == 2){
    stepperZ.moveTo(-1810);
    stepperZ.setMaxSpeed(velz);
    stepperZ.setAcceleration(accz);
    pos = 3;
  }
//----------------------- LETTURA SENSORE VASCHETTA -------------------------------------------------------------
  if(digitalRead(VASCHETTA) == 0 && pos == 3){
    digitalWrite(vuoto, LOW);
    digitalWrite(vuoto2, HIGH);
    stepperZ.stop();
    y = stepperY.currentPosition();
    stepperY.setCurrentPosition(-1810);
    pos = 4; 
  }
  if(pos == 4 && stepperY.distanceToGo() == 0){
    stepperY.setCurrentPosition(y);
    pos = 5;
  }

....

[AGGIORNAMENTO]

Ho messo al posto delle vaschette un ostacolo fisso in modo che l'asse verticale sia stoppato fisicamente da qualcosa in modo preciso e costante. Ad ogni modo il sensore entrando in funzione, procede alla serie di istruzioni sopra esposte.
Mi aspettavo che la variabile, dove di volta in volta vado a salvare il valore restituito da currentPosition(), risultasse fissa ad un preciso numero o comunque poco distante, e invece il valore INCREMENTA in modo semi-casuale.

UP

Se io do una posizione ad uno stepper motor, è una posizione teorica perché qualsiasi ostacolo che lo ferma non viene riconosciuto come nel caso di un motore con encoder.
D'accordo, io gli do 100 passi e lui "in teoria" dovrebbe muoversi di 100 step, ma se lo fermo come fa la logica a sapere che l'ho fermato?

Negli stepper motors può "immaginarlo" se c'è un aumento anomalo dell'assorbimento.

Nei motori con encoder, invece, do 100 passi e mi aspetto di leggerli sull'encoder. Se ciò non accade significa che non c'è mai arrivato e lo segnalo...