Hola, buenos días.
Espero que todos estén bien de salud en estos días de confinamiento;(.
Estoy trabajando en un proyecto en el que necesito coordinar distintos steppers. Estoy utilizando la librería AccelStepper.h que me facilita mucho la programación.
Estoy intentando gestionar las llamadas a la función 'stepper.moveTo(x)' de distintos steppers para que tengan un desfase controlado mediante delays, pero no el sketch no responde como yo quiero.
En lugar de activarme el stepper2 a los 3 segundos, el programa espera 3 segundos y luego me activa las funciones stepper1.moveTo(200) y stepper2.moveTo(200) simultaneamente.
if (serialData == ('3')) {
Serial.println("HAS ENVIAT ORDRE 3");
stepper1.moveTo(200);
delay(3000);
stepper2.moveTo(200);
}
Este es el código completo con el que estoy trabajando:
// Shows how to run three Steppers at once with varying speeds
//
// Requires the Adafruit_Motorshield v2 library
// https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library
// And AccelStepper with AFMotor support
// https://github.com/adafruit/AccelStepper
// This tutorial is for Adafruit Motorshield v2 only!
// Will not work with v1 shields
#include <AccelStepper.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
char serialData;
Adafruit_MotorShield AFMSbot(0x64); // Rightmost jumper closed
Adafruit_MotorShield AFMStop(0x60); // Default address, no jumpers
// Connect two steppers with 200 steps per revolution (1.8 degree)
// to the top shield
Adafruit_StepperMotor *myStepper1 = AFMStop.getStepper(200, 1);
Adafruit_StepperMotor *myStepper3 = AFMStop.getStepper(200, 2);
// Connect one stepper with 200 steps per revolution (1.8 degree)
// to the bottom shield
Adafruit_StepperMotor *myStepper2 = AFMSbot.getStepper(200, 2);
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {
myStepper1->onestep(FORWARD, DOUBLE);
}
void backwardstep1() {
myStepper1->onestep(BACKWARD, DOUBLE);
}
// wrappers for the second motor!
void forwardstep2() {
myStepper2->onestep(FORWARD, DOUBLE);
}
void backwardstep2() {
myStepper2->onestep(BACKWARD, DOUBLE);
}
// wrappers for the third motor!
void forwardstep3() {
myStepper3->onestep(FORWARD, DOUBLE);
}
void backwardstep3() {
myStepper3->onestep(BACKWARD, DOUBLE);
}
// Now we'll wrap the 3 steppers in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
AccelStepper stepper3(forwardstep3, backwardstep3);
void setup()
{
Serial.begin(9600);
AFMSbot.begin(); // Start the bottom shield
AFMStop.begin(); // Start the top shield
serialData = (char)(('0'));
stepper1.setMaxSpeed(1000.0);
stepper1.setAcceleration(100.0);
stepper1.moveTo(0);
stepper2.setMaxSpeed(1000.0);
stepper2.setAcceleration(100.0);
stepper2.moveTo(0);
stepper3.setMaxSpeed(200.0);
stepper3.setAcceleration(100.0);
stepper3.moveTo(0);
}
void loop()
{
if (Serial.available()) {
serialData = (Serial.read());
if (serialData == ('0')) {
Serial.println("HAS ENVIAT ORDRE 0");
stepper1.moveTo(0);
stepper2.moveTo(0);
}
if (serialData == ('1')) {
Serial.println("HAS ENVIAT ORDRE 1");
stepper1.moveTo(50);
stepper2.moveTo(50);
}
if (serialData == ('2')) {
Serial.println("HAS ENVIAT ORDRE 2");
stepper1.moveTo(50);
stepper2.moveTo(-50);
}
if (serialData == ('3')) {
Serial.println("HAS ENVIAT ORDRE 3");
stepper1.moveTo(200);
delay(3000);
stepper2.moveTo(200);
}
}
if((contador==5)&&(serialData == ('1'))){
stepper1.moveTo(0);
stepper2.moveTo(0);
}
// Change direction at the limits
if (stepper1.distanceToGo() == 0){
stepper1.moveTo(-stepper1.currentPosition());
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
if (stepper3.distanceToGo() == 0)
stepper3.moveTo(-stepper3.currentPosition());
stepper1.run();
stepper2.run();
stepper3.run();
}
Espero que me podáis ayudar y/o proponer alguna solución.
Gracias por delante y paciencia para tod@s.