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'?
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;
}
....