AccelStepper .

Funciones básicas:

En mis practicas siempre utilizo el uso de drivers tipo Pololu o serie TMC22xx

AccelStepper stepper(1, STEP, DIR));

Esta libreria incluye

MultiStepper.h

Utilice la clase MultiStepper para administrar varios steppers y hacer que todos se muevan a la misma posición al mismo tiempo para el movimiento lineal 2d (o 3d).

  • moveTo ( position ) – Definir el movimiento del motor hasta una posición en una referencia absoluta.
  • move( steps ) – Definir el movimiento del motor hasta una posición en una referencia relativa.Dentro del loop hara que el motor no se pare.
  • runSpeed()-implementa una velocidad constante establecida por la llamada más reciente a setSpeed()
  • run() – Actualización y ejecución del movimiento en cada iteración del bucle.
  • setSpeed() -Establece la velocidad constante deseada para usar con runSpeed() .
  • runSpeedToPosition() – Ejecuta runSpeed() a menos que se alcance la posición de destino. Esta función debe llamarse a menudo como runSpeed() o run() . Dará paso al motor si se requiere un paso a la velocidad actualmente seleccionada a menos que se haya alcanzado la posición objetivo. No implementa aceleraciones.
  • runToNewPosition()– (long-position)-Mueve el motor (con aceleración/desaceleración) a la nueva posición de destino y se bloquea hasta que está en la posición. No use esto en bucles de eventos, ya que bloquea
  • stop()-Establece una nueva posición de destino que hace que el stepper se detenga lo más rápido posible, utilizando los parámetros actuales de velocidad y aceleración.

Mientras se ejecuta el movimiento podemos obtener información del sistema durante su transcurso con los siguientes métodos.

Ejemplo con < setCurrentPosition()>

Ejemplo de hacer “homing” en el eje Z: mientras el limite fin de carrera permanezca cerrado, el motor ascendera hasta que se abra el interruptor, momento en que establecerá como valor absoluto de posición (-2000 pasos), para luego desplazarse en sentido contrario hasta la posición definida como “0” a una distancia de 2000 pasos( 5 mm). A partir de aqui usaremos solo posiciones positivas hasta la minima altura requerida.

 // Homing stepperZ
  while (digitalRead(limitZ) != 1) {
    stepperZ.setSpeed(-3000);
    stepperZ.runSpeed();
    stepperZ.setCurrentPosition(-2000);} // When limit switch pressed set position to 0 steps
    delay(20);
   stepperZ.moveTo(0);
  while (stepperZ.currentPosition() != 0) {
    stepperZ.run();}
 

Despues de homing podriamos mover arriba y abajo el eje Z con solo usar:

stepperZ.moveTo(x);
  while (stepperZ.currentPosition() != x) {//x> 0 <longitud eje
    stepperZ.run();}

targetPosition();

Dada una posición “z” en numero de pasos que va a ser la posición “target”, por el monitor serie vamos a ver los valores que va tomando “z”

void loop(){
String Rx=Serial1.readStringUntil('\n');
   
 
  while((Rx).indexOf("z-")!=-1) {
  delay(250);
 z+=1000; if (z>=60000){z=60000;}
 
  break;}
  while((Rx).indexOf("z+")!=-1) {
  delay(250);
 z-=1000; if (z<=0){z=0;}
int t=stepperZ.targetPosition();
stepperZ.moveTo(z);
 while (stepperZ.currentPosition() != z){
         stepperZ.run();}
Serial.println(t)
}

Observaciones

Vamos a ver cuan importante es el uso de < stepper.currentPositión()> para entender como poner en marcha y parar nuestros motores. Podemos monitorizarlo siempre como <println(stepper.currentPosition())>.Como norma general,cada vez que giremos uno de nuestros motores vamos a tener que utilizar la expresión:

while (stepper.currentPosition() != x){stepper.run()}

Siendo x la posición en pasos expresada como:

stepper.moveTo(x);

Con las expresiónes: < stepper.setSpeed(X):stepper.runSpeed();>tambien podremos hacer girar los motores indefinidadmente, por eso suele ir dentro de una restricción “while”, por ejemplo:

while (digitalRead(limitY) != 1) {
    stepperY.setSpeed(-4000);
    stepperY.runSpeed();

Otros casos:

Aqui el motor del eje X comenzara a moverse hasta que llegue a 5000 pasos y se parara.


void loop(){
  while (stepperX.currentPosition()>=5000);{
stepperX.setSpeed (3000);stepperX.runSpeed();}
 Serial.println(stepperX.currentPosition()); }

..

Podemos ver cierta contradicción al pensar que el motor va a girar con la condición anidada comparativa, esto es cuando el valor de <stepperX.currentPosition()>=5000, sin embargo es al contrario, mientras sea menor va a girar,parandose en 4999 pasos

//en este caso se parará cuando llegue a 3999 pasos:
void loop() {

  while (stepperX.currentPosition()>=5000);{
stepperX.moveTo(4000);stepperX.run();}
 Serial.println(stepperX.currentPosition()); 

// en este caso no se movera:
void loop() {
 t=stepperX.currentPosition();

  while (stepperX.currentPosition()>=0);{//el mismo caso con <=0
stepperX.moveTo(4000);stepperX.run();}
 Serial.println(t);

  En este caso se movera en sentido contraio hasta -3999
void loop() {

  while (stepperX.currentPosition()>=1);{//tambien valido para <=-1
stepperX.moveTo(-4000);stepperX.run();}
 Serial.println(stepperX.currentPosition()); 

Ejemplo <parada tan rapido comos sea posible>

void loop()
{    
  stepper.moveTo(500);
  while (stepper.currentPosition() != 300) // Full speed up to 300
    stepper.run();
  stepper.stop(); // Stop as fast as possible: sets new target
  stepper.runToPosition(); 
  // Now stopped after quickstop
 
  // Now go backwards
  stepper.moveTo(-500);
  while (stepper.currentPosition() != 0) // Full speed basck to 0
    stepper.run();
  stepper.stop(); // Stop as fast as possible: sets new target
  stepper.runToPosition(); 
  // Now stopped after quickstop
 
}

<MultiStepper.h>

MultiStepper puede manejar hasta 10 steppers como un grupo

Esta clase puede manejar múltiples AccelSteppers (hasta MULTISTEPPER_MAX_STEPPERS = 10),

y hacer que todos se muevan a las posiciones seleccionadas a tal velocidad (constante) que todos lleguen a su posición de destino al mismo tiempo. Esto se puede usar para admitir dispositivos con múltiples motores paso a paso en, digamos, varios ejes para provocar un movimiento diagonal lineal. Adecuado para su uso con plotters XY, camas planas, impresoras 3D, etc. para obtener un movimiento lineal en línea recta entre posiciones arbitrarias 2d (o 3d o …).

Precaución: solo se admite el movimiento paso a paso de velocidad constante: no se admite la aceleración ni la desaceleración. Todos los steppers manejados por MultiStepper caminarán a una velocidad constante a su objetivo (aunque quizás diferentes velocidades para cada paso).

Ejemplo <MultiStepper.h>con cuatro steppers de un robot scara

#include <Arduino.h>

#include <AccelStepper.h>
#include <MultiStepper.h>
#include <Servo.h>
#include <math.h>

#define limitX 11
#define limitY 10
#define limitPhi 9
#define limitZ A3

// Define the stepper motors and the pins the will use



AccelStepper stepperX(AccelStepper (1, 2, 5));
AccelStepper stepperY(AccelStepper(1, 3, 6));
AccelStepper stepperPhi(AccelStepper (1, 4, 7));
AccelStepper stepperZ(AccelStepper (1, 12, 13));
MultiStepper steppers;



Servo grip;  // create servo object to control a servo


double L1 = 228; // L1 = 228mm
double L2 = 136.5; // L2 = 136.5mm
double theta1, theta2, phi,g,x,y, z;


const float theta1StepbyDegrees =  177.7777777;
const float theta2StepbyDegrees =  142.2222222;
const float phiStepbyDegrees = 35.56;
const float zStepbymm = 400;


void setup() {
  Serial1.begin(115200);
  Serial.begin(9600);

  pinMode(limitX, INPUT_PULLUP);
  pinMode(limitY, INPUT_PULLUP);
  pinMode(limitPhi, INPUT_PULLUP);
  pinMode(limitZ, INPUT_PULLUP);
  
steppers.addStepper(stepperX);
  steppers.addStepper(stepperY);
 steppers.addStepper(stepperPhi);
  steppers.addStepper(stepperZ);



  // stepper motors max speed
  stepperX.setMaxSpeed(1000);
  stepperX.setAcceleration(3000);
  stepperY.setMaxSpeed(1000);
    stepperY.setAcceleration(3000);
  stepperPhi.setMaxSpeed(1000);
  stepperPhi.setAcceleration(3000);
  stepperZ.setMaxSpeed(1000);
  stepperZ.setAcceleration(3000);

  grip.attach(A0);
   grip.write(g);
 z=0;
}

void loop() {
 long positions[4]; // Array of desired stepper positions
  
 positions[0] = 2000;
  positions[1] = 2000;
   positions[2] = 1400;
   positions[3] = 2000;
  steppers.moveTo(positions);
  steppers.runSpeedToPosition(); // Blocks until all are in position
  delay(1000);
  
  // Move to a different coordinate
  positions[0] = 10;
  positions[1] = 20;
  positions[2] = 10;
  positions[3] = 20;
  steppers.moveTo(positions);
  steppers.runSpeedToPosition(); // Blocks until all are in position
  delay(1000);
}


  

Nuevo ejemplo de dos motores trabajando juntos:

#include <Arduino.h>

#include <AccelStepper.h>
#include <Servo.h>
#include <math.h>

#define limitX 11
#define limitY 10
#define limitPhi 9
#define limitZ A3

// Define the stepper motors and the pins the will use
AccelStepper stepperX(1, 2, 5); // (Type:driver, STEP, DIR)
AccelStepper stepperY(1, 3, 6);
AccelStepper stepperPhi(1, 4, 7);
AccelStepper stepperZ(1, 12, 13);

Servo grip;  // create servo object to control a servo


double L1 = 228; // L1 = 228mm
double L2 = 136.5; // L2 = 136.5mm
double theta1, theta2, phi,g,x,y, z;


const float theta1StepbyDegrees =  177.7777777;
const float theta2StepbyDegrees =  142.2222222;
const float phiStepbyDegrees = 35.56;
const float zStepbymm = 400;


void setup() {
  Serial1.begin(115200);
  Serial.begin(9600);

  pinMode(limitX, INPUT_PULLUP);
  pinMode(limitY, INPUT_PULLUP);
  pinMode(limitPhi, INPUT_PULLUP);
  pinMode(limitZ, INPUT_PULLUP);

  // stepper motors max speed
  stepperX.setMaxSpeed(6000);
  stepperX.setAcceleration(3000);
  stepperY.setMaxSpeed(3000);
    stepperY.setAcceleration(3000);
  stepperPhi.setMaxSpeed(6000);
  stepperPhi.setAcceleration(3000);
  stepperZ.setMaxSpeed(3000);
  stepperZ.setAcceleration(3000);

  grip.attach(A0);
   grip.write(g);
 z=0;
}

void loop() {
String Rx=Serial1.readStringUntil('\n');
   Serial.println(z);
 
  while((Rx).indexOf("z-")!=-1) {
  delay(250);
 z+=1000; if (z>=60000){z=60000;}
 
  break;}
  while((Rx).indexOf("z+")!=-1) {
  delay(250);
 z-=1000; if (z>=0){z=0;}
 
  break;}
   stepperZ.moveTo(z);
    stepperY.moveTo(z);
   while ((stepperZ.currentPosition() != z)&&(stepperY.currentPosition() != z)) {
    stepperY.run();
         stepperZ.run();}
        
   
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »