stepper no da la vuelta completa

Buenos días a tod@s.
Primero que nada decirles que es mi primer skech, por llamarlo de alguna manera.
El caso es que quiero hacer el siguiente proyecto en un arduino nano pero no me sale y eso que hasta a mí me parece sencillo (pero soy muy garrulo).

Al pulsar un botón, darle un delay “X” y después se acciona un Nema 17 que girará “X” vueltas hacia un sentido y se para. Vuelve a haber otro delay y se activa un módulo relé que a su vez activa una bomba de agua (aquí, no sé si se puede activar directamente la bomba de agua desde el arduino, o tiene que pasar por el relé) se para el relé y por consiguiente la bomba de agua y se repite el delay ”X” y luego el Nema 17 gira las mismas vueltas que antes pero en sentido opuesto.
Para este proyecto estoy usando el siguiente material y todo esto está alimentado con una batería de 12V
Un pulsador con su resistencia en modo Pull Down (pulsas y enciende). PIN 2
Un motor Nema 17 (200 pasos por vuelta) y un driver DRV8825 con la instalación sacada de esta pagina: Manejar un motor stepper con un driver DRV8825 y Arduino | Carlini's Blog . El voltaje que me da a mi según esa página es de 0.46V por fase . PIN 3 dirección y PIN 4 pasos.
Un módulo relé conectado a una bomba de agua. PIN 5.
Pues bien, después de montar todo provisionalmente, le cargo el skech de esta pagina, el que pone conexion dos pins http://diymakers.es/mover-motores-paso-paso-con-arduino/ Y mi primera sorpresa es que solo se mueve un cuarto de vuelta escaso.
En el skech que he hecho también me pasa lo mismo.

#include <Stepper.h>                   // incluimos la libreria motor paso a paso

int MyStepper[2] = {3, 4}; //  [b]el numero 2 no se que quiere decir[/b]

Stepper stepper_MyStepper(200, 3, 4);  // le decimos los pasos necesarios para una vuelta(200)
                                       // y le adjudicamos los pines de direccion (3) y pasos (4)

void setup() {
  stepper_MyStepper.setSpeed(80); // definimos la velocidad del motor en rpm (80).
  pinMode(2, INPUT);              // declaramos el pulsador en el pin 2 como entrada
  pinMode(5, OUTPUT);             // declaramos el rele en el pin 5 como salida
}

void loop() {
  {

  if (digitalRead(2))             // al accionar el pulsador lee el pin digital 2
  {
  delay(2000);                    // espera el tiempo que se le indique, en este caso 2 segundos
  stepper_MyStepper.step(800);    // gira el motor el numero de vueltas indicado
  delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
  digitalWrite(5, HIGH);          // activa el rele que esta declarado en el pin 5
  delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
  digitalWrite(5, LOW);           // desactiva el rele que esta declarado en el pin 5
  delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
  stepper_MyStepper.step(-800);   // vuelve a girar el motor el numero de vueltas indicado pero en sentido contrario

    }

}
  

}

El codigo esta generado con Ardubloky

Si a un motor paso a paso o stepper le das este comando

stepper_MyStepper.step(800);

y no da la vuelta completa entonces completa la cantidad de pasos que te faltan paa que lo haga.

Delay no controla nada en lo que al motor respecta.

Si como dices luego tu motor es de 200 pasos y le das una orden para 800 pasos entonces dará 4 vueltas.

Repito:

Al pulsar un botón, darle un delay "X" y después se acciona un Nema 17 que girará "X" vueltas hacia un sentido

El delay no controla las vueltas, las vueltas las determina el numero que le pongas a

stepper_MyStepper.step(vueltas);

Hola surbyte.
Primero de todo darte las gracias por contestar, pero creo que igual no me he expresado bien, así que vamos por partes.

Primero y menos importante.
Ese delay que meto es para que haya un retardo desde que pulso el botón hasta que se pone en marcha el Nema. Están todos los delays en 2 segundos para probar que funciona correctamente pero luego tendré que adecuarlos a las circunstancias.

Al pulsar un botón, darle un delay "X" y después se acciona un Nema 17 que girará "X" vueltas hacia un sentido

Segundo y más importante.
Me he decidido por un motor paso a paso (Nema 17 en este caso) debido a la gran precisión que tienen este tipo de motores. Así, si yo le ordeno que de 3480 pasos en un sentido por que son justo los que me hacen falta, pues no quiero que de 3500. Es un ejemplo. Que después seguro que tendré que ponerle final de carrera por seguridad.
El problema radica en que si el motor, tal y como pone en las especificaciones es de 200 pasos por vuelta, este no lo cumple y no sé el por qué.

stepper_MyStepper.step(800);

Como tu bien dices aquí arriba el motor debería de dar 4 vueltas, pero el problema es ese, que con 800 pasos no llega a completar una vuelta, cuando debería dar 4. Y eso es lo que más me inquieta.

Tercero y también importante.

stepper_MyStepper.setSpeed(80); // definimos la velocidad del motor en rpm (80).

Tampoco va nada fino en el tema de la velocidad y tampoco se el porqué. Ya que a 80 rpm como esta en el skech va muy lento y como a saltos, igual que si fuese un segundero de un reloj pero mas rapido, pero si lo subo a 120 rpm ya me pierde los pasos, es como si se volviese loco.

Fallo del motor no es, por que he probado con 4 que tengo y además con un skech que encontré por ahí si hacia bien el giro completo y obedecía también bien a la velocidad. El tema es que ahora no lo encuentro por ningún sitio. Solo recuerdo que no usaba para nada la libreria "stepper" pero claro yo asi no se hacer el skech.

Lo dicho, gracias por contestar.

Lo primero que pensé cuando lei qu eno daba las vueltas que esperas fue microstepping y miro las especificaciones de tu driver y dice

Permite microstepping de hasta 1/32

O sea.. esta seteado con microstepping.

Si tu stepper es de 200 vueltas, mira cuanto recorre y lo que falta encuentra un multiplo potencia 2 y entonces tendras con que microstepping esta.
Entonces en lugar de 200 será 200*N

Y asunto resuelto. O mira en tu driver como ponerlo en un microstepping de tu agrado.

Pagina de Pololu

Busca
Step (and microstep) size

Segun esto estan en FULL STEP porque Mode0, Mode1 y Mode2 estan en LOW

The resolution (step size) selector inputs (MODE0, MODE1, and MODE2) enable selection from the six step resolutions according to the table below. All three selector inputs have internal 100kΩ pull-down resistors, so leaving these three microstep selection pins disconnected results in full-step mode. For the microstep modes to function correctly, the current limit must be set low enough (see below) so that current limiting gets engaged. Otherwise, the intermediate current levels will not be correctly maintained, and the motor will skip microsteps.

Tester entre GND y ModeX y verifica.

Si no estan a GND entonces encontraras el modo con el que debes multiplicar tus 200 pasos.

Hola de nuevo surbyte, y de nuevo gracias por contestar.

Decirte que el driver DRV8825 no tiene activados ningún tipo de micropasos, o sea que está a pasos completos. Menudo cazurro que soy con esto como para aventurarme con mas historias.

Este que te voy a colgar aquí debajo es el skech que te dije que funciona perfectamente(no es mio, es de una de las páginas que te puse ahí arriba, la de Carlini). Da la vuelta completa hacia un sentido (o sea los 200 pasos) tiene un retardo de 5 segundos y vuelve a dar otra vuelta completa en el otro sentido (otros 200 pasos a la inversa).

const int dirPin = 3;
const int stepPin = 4;
 
const int steps = 200;
int microPausa = 1000;

 
void setup() {
 pinMode(dirPin, OUTPUT);
 pinMode(stepPin, OUTPUT);
}
 
void loop() {
 digitalWrite(dirPin, HIGH);  // Establezco una dirección

 for (int x = 0; x< steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(5000);
 
 digitalWrite(dirPin, LOW);  // Cambio la dirección

 for (int x = 0; x< steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(5000);

}

El problema es que soy muy cazurro, tal como puse ahí arriba y lo unico que he podido variar es la velocidad, que está en

int microPausa = 1000;

Cuanto más alto ponga ese valor, más despacio gira el motor. Pero el resto del código no tengo ni idea de qué va.
Eso que tiene tener mas de 50 tacos y no haber estudiado.
Si me pudieses echar una mano te lo agradeceria, por que me he comprado el PDF de Arduinoblocks para que me resultase mas facil pero ni asi me entra.
Gracias por contestar.

Aca, siempre se ayuda y si no soy yo, siempre alguien aparecerá para darte una mano.

Si un codigo funciona entonces se lo toma como punto de partida.

Este código hara lo que quires aunque para responder a tu pulsador hay que esperar que se cumpla toda la secuencia.

const byte botonPin = 2;
const byte dirPin   = 3;
const byte stepPin  = 4;
const byte relePin  = 5;
const byte steps    = 200;
int microPausa      = 1000;
bool estado, estadoAnt = false;

void setup() {
  pinMode(botonPin, INPUT);              // declaramos el pulsador en el pin 2 como entrada
  pinMode(relePin, OUTPUT);             // declaramos el rele en el pin 5 como salida
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
}

void loop() { 

  estado = digitalRead(botonPin);           // leo el estado del pulsador

  if (estado && !estadoAnt) {         // al accionar el pulsador lee el pin digital 2
      delay(2000);                    // espera el tiempo que se le indique, en este caso 2 segundos
      muevo_stepper(HIGH, 800);       // gira el motor el numero de vueltas indicado
      delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
      digitalWrite(relePin, HIGH);    // activa el rele que esta declarado en el pin 5
      delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
      digitalWrite(relePin, LOW);     // desactiva el rele que esta declarado en el pin 5
      delay(2000);                    // vuelve a esperar el tiempo que se le indique, otros 2 segundos
      muevo_stepper(LOW, 800);       // gira el motor el numero de vueltas indicado en sentido inverso
  }
  estadoAnt = estado;
}


void muevo_stepper(byte direccion, unsigned int pasos) {
  digitalWrite(dirPin, direccion);  // Establezco una dirección

  for (int x = 0; x< pasos ; x++) {
       digitalWrite(stepPin, HIGH);
       delayMicroseconds(microPausa);
       digitalWrite(stepPin, LOW);
       delayMicroseconds(microPausa);
  }
}

Pues sí, surbyte efectivamente funciona como yo quiero y ante todo darte las gracias.
Ahora lo que no entendí fué esta linea.

Este código hara lo que quires aunque para responder a tu pulsador hay que esperar que se cumpla toda la secuencia.

Te refieres que hasta que acabe de hacer todo lo programado una vez completa no volverá a estar operativo el botón?, si es por eso no hay problema ya que es así como lo quiero.
A partir de aquí voy a empezar el montaje del proyecto. Como te comenté en otro post anterior seguramente le implementaré 2 finales de carrera por seguridad y como mucho me meteré un poco con la aceleración y desaceleración del motor, ya que necesito que el arranque y final de cada trayecto sea suave.

Por eso te pido que no des por finalizado este post, ya que así no hará falta iniciar otro por si me surgen mas dudas, que surgirán, no lo dudes. En el tema de los finales de carrera no creo, pero en lo de aceleración ya tengo mis dudas.

Por ultimo me puedes recomendar un libro o alguna web que tenga explicaciones o curso de arduino pero para "cazurros".

Mil gracias por tu ayuda surbyte.

Todas las recomendaciones estan en la sección Documentación.
Existe un Indice de temas tutoriales con lo mas relevante pero hay muchos tutoriales ahi y hasta libros pagos y gratuitos.