Nema 17 con TB6600

Hola a todos. Este es mi primer post.
Os cuento:
Tengo conectado un motor NEMA 17 a un driver TB6600, todo controlado con un ARDUINO UNO.
Necesito que el motor dé un determinado número de pasos y entre estos avances una pausa, y así sucesivamente. Esto lo he conseguido con un "for" sin problemas buscando por google y tal... Todo esto acompañado de el encendido de un LED.
El problema está cuando he intentado introducir un pulsador en el circuito. Al intentar arrancar y parar este proceso con un pulsador no consigo que el motor se mueva mas de una vez, es decir, da el número de pasos UNA VEZ y ya se queda parado. Eso sí, el LED se enciende cuando aprieto el pulsador y se apaga cuando vuelvo a apretarlo pero el motor gira solo una vez cuando aprieto el pulsador la primera vez.
Aquí dejo el scketch que estoy utilizando.
Muchas gracias.

int LED = 9;
int ON_OFF_MOTOR = 12;
int DIRECCION_MOTOR = 10;
int PULSOS_MOTOR = 11;
const byte botonPin = 3;
const int velocidad = 1000;
const int PPR = 141;
bool status, statusAnt = false;
bool botonStatus = false;

void girar_derecha();

void setup() {
   pinMode(botonPin, INPUT); // tu pulsador esta conectado entre GND y el PIN, nada mas.
   pinMode(LED, OUTPUT);
   pinMode(ON_OFF_MOTOR, OUTPUT);
   pinMode(DIRECCION_MOTOR, OUTPUT);
   pinMode(PULSOS_MOTOR, OUTPUT);
   Serial.begin(9600);
}

void loop() {

   status = digitalRead(botonPin);
   if (!status && statusAnt) { // cuando pulses el boton pasa de 1 a 0
      botonStatus = !botonStatus;
      if (botonStatus) {
          digitalWrite(LED, HIGH);
          girar_derecha();}
      else 
          digitalWrite(LED, LOW);
   }
   statusAnt = status;
}

void girar_derecha(){
digitalWrite(ON_OFF_MOTOR, LOW);
    digitalWrite(DIRECCION_MOTOR, HIGH);
    for (int i = 0; i < 141; i++)
    {
        digitalWrite(PULSOS_MOTOR, HIGH);
        delayMicroseconds(velocidad);
        digitalWrite(PULSOS_MOTOR, LOW);
        delayMicroseconds(velocidad);
    }
}

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Lo primer es que tu código tiene errores.
repites esto

  if (botonStatus)
      digitalWrite(LED, HIGH);
  if (botonStatus)
      girar_derecha();
  }
  else
       digitalWrite(LED, LOW);

por lo tanto si esta en VERDADERO botonStatus se enciende el led y gira a la derecha
cuando este en falso se apaga.
Obviamene hay algo mal.

Hola Surbyte. Gracias por tu pronta respuesta.
Ya he editado el post y he corregido (creo que bien) el error que me has comentado pero sigue haciendo lo mismo:
Al apretar el pulsador se enciende el led y el motor gira a la derecha 141 pasos y se para. El led sigue encendido hasta que vuelvo a apretar el pulsador y se apaga. El fallo está en que el giro a la derecha lo hace una vez y no en bucle como indica el FOR de

Prueba así

void loop() {

  status = digitalRead(botonPin);
  if (!status && statusAnt) { // cuando pulses el boton pasa de 1 a 0
    botonStatus = !botonStatus;
    digitalWrite(LED, botonStatus);
    statusAnt = status;
  }   
  if (botonStatus) {
    girar_derecha();
  }
  
}

Saludos

Hola gatul. Gracias por responder.
Con lo que me has enviado no hace nada de nada. Ni led ni motor.

Si, me quedó una línea mal ubicada :man_facepalming:t2:

void loop() {

  status = digitalRead(botonPin);
  if (!status && statusAnt) { // cuando pulses el boton pasa de 1 a 0
    botonStatus = !botonStatus;
    digitalWrite(LED, botonStatus);
  }   
  if (botonStatus) {
    girar_derecha();
  }
  statusAnt = status;
}

Saludos

Ok.
Ahora al darle al pulsador se enciende el led y el motor empieza a girar sin parar (no hay control sobre el número de pasos). Si vuelvo a apretar el pulsador se apaga el led y se para el motor.

Buenos días.
Al final lo he solucionado.
He conseguido una librería llamada MobaTools y he adaptado uno de los ejemplos que traía a mi proyecto evitando hacer el bucle "for", donde creo que estaba el problema, e incluyendo todo, el encendido del led y el movimiendo del motor repetitivo, dentro de un "if".
De todos modos gracias a todos los que han atendido mi duda.
Dejo el scketch final por aquí por si a alguien le sirve.

#include <MobaTools.h>

int LED = 9;
int ON_OFF_MOTOR = 12;
const byte DIRECCION_MOTOR = 10;
const byte PASOS_MOTOR = 11;
const int PASOS_POR_VUELTA = 1600; //El driver está configurado en 1/16 micropasos
const byte botonPin = 3;
const int velocidad = 1000;
const int intervalopasos = 1000; //Intervalo entre pasos 1 segundo
int PPR = 141;
bool status, statusAnt = false;
bool botonStatus = false;

MoToStepper myStepper ( PASOS_POR_VUELTA, STEPDIR );
MoToTimebase intervall;

void girar_derecha();

void setup() {
   myStepper.attach( PASOS_MOTOR, PASOS_MOTOR );
   myStepper.setSpeed( 300 );
   intervall.setBasetime( intervalopasos );
   pinMode(botonPin, INPUT); // tu pulsador esta conectado entre GND y el PIN, nada mas.
   pinMode(LED, OUTPUT);
   Serial.begin(9600);
}

void loop() {

  status = digitalRead(botonPin);
  if (!status && statusAnt) { // cuando pulses el boton pasa de 1 a 0
    botonStatus = !botonStatus;
    digitalWrite(LED, botonStatus);
    }   
  if (botonStatus) {
    delay(500);
    myStepper.doSteps( PPR );
  }
  statusAnt = status;
}

Lo que entendí en base a lo que le dijiste a @Surbyte era que después de pulsar, si bien el LED quedaba encendido, el motor solo hacía un ciclo de 141 pasos y paraba pero vos querías que siguiese haciendo los ciclos de 141 pasos hasta que lo pararas pulsando otra vez.
Si no era eso entonces entendí mal.

Lo que si te corrijo es que no gira sin control del numero de pasos porque son los que vos programaste, o sea 141 por ciclo completo.

Creo que no explicaste bien cual era tu idea porque primero dices que solo da 141 pasos y se detiene pero quieres que siga haciendo los ciclos y cuando sigue girando haciendo los ciclos dices que "gira sin control".

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.