DETENER MOTOR PASO A PASO

BUEN DÍA FORO!!

apenas aprendo de arduino y pues he dedicado bastantes horas a buscar la solucion a mi problema, pero no e encontrado ningun ejemplo claro que me pueda ayudar por eso recurro a ustedes.

El proyecto que estoy tratando de realizar se trata de una puerta corrediza con un motor paso a paso.
lo que necesito que haga es lo sgt:

-preguntar el estado de un suiche y de un final de carrera
-y basado en ese estado el motor se mueva un determinado numero de pasos hasta que el segundo final de carrera cambie su estado (no se si me hago entender) igual les dejo el codigo debajo

#include <Stepper.h> // Esto es el número de pasos en un minuto
#define STEPS 4096 
const int finalA = 1;
const int finalC = 2;
const int SWT = 3;
int value = 0;
int value1 = 0;
int val = 0;
// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);
void setup() {
  Serial.begin(9600);
  pinMode(finalA, INPUT);
  pinMode(finalC, INPUT);  
  pinMode(SWT, INPUT);

  stepper.setSpeed(5);// Asignamos la velocidad en RPM (Revoluciones por Minuto)
}
 
void loop(){
  value = digitalRead(finalC);  //lectura digital de pin cerrrado
  value1 = digitalRead(finalA);  //lectura digital de pin ABIERTO
  val = digitalRead(SWT);  //lectura digital de pin cerrrado
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH && val == LOW) {   
      Serial.println("CERRADO");
  }
  if (value == HIGH && val == HIGH){
      Serial.println("ABRIENDO");
  stepper.step(200); //numero de paso que queremos que de 
  delay(2000);
  }
  delay(1000);
}

Ya que eres nuevo me tomo el atrevimiento de corregirte en algunas palabras técnicas sin que eso se mal entienda>

-preguntar el estado de un suiche y de un final de carrera

Se dice switch o interruptor.

Tu código:
Primer error

const byte finalA  = 1;
const byte finalC  = 2;
const byte SWT     = 3;

y luego defines en el setup

Serial.begin(9600);

Si defines Serial, los pines 0,1 deben reservarse o tendras confilictos
Entonces

const byte finalA = 1

no puede ser y debes mover todo a por ejemplo

const byte finalA  = 4;

Esto como no dices como estan conectados los pines no se como entenderlo, estan como pull-down o pull-up?

  value = digitalRead(finalC);    // lectura digital de pin cerrrado
  value1 = digitalRead(finalA);   // lectura digital de pin ABIERTO
  val = digitalRead(SWT);         // lectura digital de pin cerrrado
  
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH && val == LOW) {   
      Serial.println("CERRADO");
  }
  if (value == HIGH && val == HIGH){
      Serial.println("ABRIENDO");

En tus comentarios pones que finalA y finalC son los finales de carrera.
Pero luego usas val y value o sea no tomas en cuenta value1, no comprendo.

HOLA!!
gracias por las correcciones.

value1 verifica el estado del segundo final de carrera, no segui desarrollando el codigo porque necesito saber como puedo girar el motor indefinidamente hasta que se accione el segundo final de carrera (finalA); por consiguiente no segui desarrollando dicho codigo pedi su opinion y sus intervenciones ahora are las correciones que me proporcionaste

Bien, las tareas siempre deben realizarse desde que se comprende algo hasta que se lo controla.

Consulta sabes hacer que el stepper funcione?

supongo que si.

Pero no respondiste mi pregunta sobre el tipo de pulsador o final de carrera que usas, es pull-up o pull-down si no sabes busca en google : arduino pull-up o pull-down

Gracias nuevamente por contestar tan rapido....!! hacia el proyecto pero aun no tengo los finales de carrera fisicos entonces no se cual tendre si pull-dow o pull-up eso si lo entiendo, independientemente de eso puedo cambiar el codigo si es pull-dow o pull-up porque entiendo como funciona, es mas yo creo que no usare las de arduino porque le dan poca potencia al motor y no me sirve para la aplicacion para la que quiero hacer este proyecto.

se hacer que se mueva en los dos sentidos utilizando la libreria stepper.h y sin la libreria pero es un poco engorroso yo solo necesito hacer que el motor se mueva ejemplo hacia la izquierda cuando se active el interruptor hasta que se accione el final de carrera(finalA) luego el motor se detenga y se quede hay hasta que se accione nuevamente el interruptor entonces el motor se movera en sentido contrario hasta accionar el final de carrera(FinalC)

Bueno comienza poniendo nombres y comentarios que ayuden a entender a los que no estamos leyendo tu código porque no se comprende que es cada elemento.

Los finales de carrera estan bien pero el comentario de todos es confuso.

Solo para que te sirva.
Hoy programas esto y luego lo miras en 1 mes y no entiendes que has hecho.
Esto fue lo que pensé

fcA ---------------------MOTOR---------------------- fcC

a la izq final de carrera A y a la derecha fcC
Entonces direccion de motor stepper positiva es sentido horario.
Ahora hay una variable llamada direccion
True sentido horario
False sentido anti horario

Tienes una variable estado
estado = true se mueve el motor
estado = false se detiene el motor pero hablo del pulsador que controla eso.

Los finales de carrera los defino como pull-down o sea resistencia conectada a GND. Cuando se presiona tenemos un HIGH y cuando no tenemos un LOW en el pin de lectura.

#include <Stepper.h> // Esto es el número de pasos en un minuto
#define STEPS 4096 

/* 
      swA ---------------------MOTOR---------------------- swC
*/

const byte SWT     = 2;
const byte finalC  = 3;
const byte finalA  = 4;

bool valueA, valueAant = false;
bool valueC, valueCant = false;
bool val, valAnt = false;
bool direccion = true;                    // true horario false anti horario

// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup() {
  Serial.begin(9600);
  pinMode(finalA, INPUT);         // supongo que A esta a la izq
  pinMode(finalC, INPUT);         // supongo que C esta a la derecha
  pinMode(SWT   , INPUT);

  stepper.setSpeed(5);// Asignamos la velocidad en RPM (Revoluciones por Minuto)
}
 
void loop(){
  valueC  = digitalRead(finalC);    // lectura digital de pin cerrrado
  valueA  = digitalRead(finalA);   // lectura digital de pin ABIERTO
  val     = digitalRead(SWT);         // lectura digital de pin cerrrado
  
  if (val && valAnt)
      estado = !estado;             // flag que controla movimiento 
                                    // estado = HIGH se mueve
                                    // estado = LOW no se mueve o esta parado
  valAnt = val;

  if (estado)                       // si me muevo verifico finales de carrera
      if (direccion)                // horario
          stepper.step(200);        // muevo sentido horario
      else                          // anti horario
          stepper.step(-200);       // muevo sentido anti horario
      

  if (valueA && !valueAant)         // cambio switch izq direccion 
      direccion = true;             // sentido Horario
  valueAant = valueA;

  if (valueC && !valueCant)         // cambio switch izq direccion 
      direccion = false;            // sentido anti Horario
  valueCant = valueC;  
}

:grinning: :grinning:
MUCHAS GRACIAS DE VERDAD y tendre encuenta lo que me dijo de los comentarios para que puedan entender mejor mis codigos GRACIAS

tengo un nuevo inconveniente...!! o en realidad es el mismo por un momento pense que era el montaje pero no es el programa

cuando acciono o cambio estado de los finales de carrera no se detiene el motor y deberia hacerlo hasta que cambie el estado del interruptor...

hice un nuevo codigo pero no me corre en proteus les dejare una foto del proteus y del nuevo codigo...

#include <Stepper.h>
 
// Esto es el número de pasos en un minuto
#define STEPS 4096 
const byte fcc = 2; //final de carrera cuando la puerta este cerrada
const byte fca = 4; //final de carrera cuando la puerta este abierta
const byte sw = 3;  // switch = indicara cuando la puerta esta abierta o cerrada
int cerrado;
int abierto;
int estado;
 
// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);
 
void setup(){
 pinMode(fcc,INPUT);
  pinMode(fca,INPUT);
 pinMode(sw,INPUT);// on off
  // Asignamos la velocidad en RPM (Revoluciones por Minuto)
  stepper.setSpeed(5);
}
 
void loop() {

  cerrado = digitalRead(fcc);
  abierto = digitalRead(fca);
  estado = digitalRead(sw);
  if (estado == LOW && (cerrado == LOW) && abierto == HIGH){ //el motor estara detenido y no girara hasta que se cambie el estado del switch
  stepper.step(0); //numero de paso que queremos que de 
  delay(2000);
  }
  if (estado == HIGH && (cerrado == LOW) && abierto == HIGH){ // se comenzara a mover hacia la izquierda para cambiar el estado de cerrado
  stepper.step(-10); //numero de paso que queremos que de 
  if (estado == HIGH && (cerrado == HIGH) && abierto == HIGH){ // se mueve con libertad para la izquierda esperando hasta que cambie el estado 
  stepper.step(-200); //numero de paso que queremos que de 
  delay(2000);
  }
}
if (estado == HIGH && (cerrado == HIGH) && abierto == LOW){ //  se abre completamente la puerta y se queda abierta
  stepper.step(0); //numero de paso que queremos que de

 if (estado == LOW && (cerrado == HIGH) && abierto == LOW){ // comienza a cerrarse la puerta moviendose hacia la derecha
  stepper.step(10); //numero de paso que queremos que de 
  delay(2000);
 
  if (estado == LOW && (cerrado == HIGH) && abierto == HIGH){ // se cierra completa mente y quedan los estados como en el primer if
  stepper.step(200); //numero de paso que queremos que de 
  delay(2000);
}
 }
}
}

hassss no puedo montar la imagen desde mi PC

pero no usaste nada de lo que yo te hice?

Moderador:
Porque abriste otro hilo con el mismo tema en Proyectos? Eso es doble posteo.
No debes abrir hilos similares en diferentes secciones del foro, sea en español, portugués o inglés.
El otro hilo fue borrado directamente.

disculpe lo siento no sabia que no se podia!!
bueno lo que pasa es que el codigo que me dio corrio bien pero no se detenia cuando cambiaba el estado de los finales de carrera si no que se detenia cuando cambiaba el sentido y no es el proposito

//definicion de pins
const int motorPin1 = 8;    // 28BYJ48 In1
const int motorPin2 = 9;    // 28BYJ48 In2
const int motorPin3 = 10;   // 28BYJ48 In3
const int motorPin4 = 11;   // 28BYJ48 In4
const int fcC = 2;
const int fcA = 4;
const int sw = 3;
                
//definicion variables
int motorSpeed = 1000;   //variable para fijar la velocidad
int stepCounter = 0;     // contador para los pasos
int stepsPerRev = 4076;  // pasos para una vuelta completa
int motorstop = 1000;
int ya = 0;
//tablas con la secuencia de encendido (descomentar la que necesiteis)
//secuencia 1-fase
//const int numSteps = 4;
//const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };
 
//secuencia 2-fases
//const int numSteps = 4;
//const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };
 
//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
 
 
void setup()
{
  //declarar pines como salida
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(fcC, INPUT);
  pinMode(sw, INPUT);
  pinMode(fcA, INPUT);
}
 
void loop()
{
  if ( (digitalRead(sw == HIGH)) && (digitalRead( fcA== HIGH))){ 
  for (int i = 0; i < stepsPerRev * 2 ; i++)
  {
    clockwise();
    delayMicroseconds(motorSpeed);
  }
  }
   if ( (digitalRead(sw == LOW)) && (digitalRead( fcA== HIGH))){ 
  for (int i = 0; i < ya; i++)
  {
    para();
    delayMicroseconds(motorSpeed-motorstop);
  }
  }
   if ( (digitalRead(sw == LOW)) && (digitalRead( fcC== HIGH))){ 
  for (int i = 0; i < stepsPerRev * 2; i++)
  {
    anticlockwise();
    delayMicroseconds(motorSpeed);
  }
   }
      if ( (digitalRead(sw == HIGH)) && (digitalRead( fcC== HIGH))){ 
  for (int i = 0; i < ya; i++)
  {
    para();
    delayMicroseconds(motorSpeed-motorstop);
  }
  }
  delay(1000);

}
void clockwise()
{
  stepCounter++;
  if (stepCounter >= numSteps) stepCounter = 0;
  setOutput(stepCounter);
}
 
void anticlockwise()
{
  stepCounter--;
  if (stepCounter < 0) stepCounter = numSteps ;
  setOutput(stepCounter);
}
void para()
{
  stepCounter = 0;
  if (stepCounter = 0) stepCounter == 0 ;
  setOutput(stepCounter);
}
 
void setOutput(int step)
{
  digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
  digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
  digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
  digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}

error que tengo si le quito los if corre normal pero solo da dos vueltas y gira en sentido anti ahorario quiero colocar que gire a la derecha cuando se cumplas las condiciones y a la izquierda cuando se cumplan otras