Puerta gallinero. Control de motores

Hola muy buenas a todos, estoy iniciandome con esto de arduino y queriendo hacer un proyecto copiado de un compañero del foro, pero resulta que no me aclaro con la programación .
se trata de una puerta corredera con un motor paso a paso, a la hora de abrir si que abre pero luego al cerrar no cierra y vuelve a abrir estando en la posicion del final de carrera de cierre. adjunto el codigo para ver si veis algun fallo.
un saludo

int spk = 5;    // pin del zumbador
int frecuenciaapertura = 220;      // frecuencia correspondiente a la nota La
int frecuenciacierre = 1000;      // frecuencia correspondiente a la nota La
const int fincarreracierre = 6;
const int fincarreraapertura = 7;
const int dirPin = 8;
const int stepPin = 9;

int c[5]={131,262,523,1046,2093};       // frecuencias 4 octavas de Do
int cs[5]={139,277,554,1108,2217};      // Do#
int d[5]={147,294,587,1175,2349};       // Re
int ds[5]={156,311,622,1244,2489};    // Re#
int e[5]={165,330,659,1319,2637};      // Mi
int f[5]={175,349,698,1397,2794};       // Fa
int fs[5]={185,370,740,1480,2960};     // Fa#
int g[5]={196,392,784,1568,3136};     // Sol
int gs[5]={208,415,831,1661,3322};   // Sol#
int a[5]={220,440,880,1760,3520};      // La
int as[5]={233,466,932,1866,3729};    // La#
int b[5]={247,494,988,1976,3951};      // Si

int stepDelay;
int pinLDR = A1;          // leeremos el pin 0 LDR
int valorLDR = 0;                       //Aquí almacenamos los datos recogidos del LDR:
int vuelta = 1;           //Aqui almacenamos el numero de ciclos de vueltas

int valuefincarreraapertura;
int valuefincarreracierre;

void nota(int a, int b);            // declaración de la función auxiliar. Recibe dos números enteros.


void setup()
{
// Visualización de los valores por la consola, hay que clicar en el botón Serial Monitor
Serial.begin(9600);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(fincarreraapertura, INPUT);
  pinMode(fincarreracierre, INPUT);
}

void loop()
{
//Guardamos el valor leido en una variable
valorLDR = analogRead(pinLDR);
// Impresión de los valores leídos por el sensor por pantalla
Serial.print("LDR = ");
Serial.println(valorLDR);
delay (10000);// tiempo de retardo



if (valorLDR <= 110 and vuelta <= 0)
  cerrar (); //Esta función es para CERRAR
else if (valorLDR >= 220 and vuelta >= 1)
  abrir(); //Esta función es para ABRIR
  else
  parar();
}


void cerrar() //Esta función es para CERRAR
{
{

   // Música de Star Wars para cerrar la puerta
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(1000);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(180000); //dejamos tres minutos para que entren todas las gallinas

   //Fin de música
   
   //Cambiamos la direccion y aumentamos la velocidad
  digitalWrite(dirPin, HIGH);
  stepDelay = 100;
  // Giramos 
  for (int x = 0; x < 5500; x++) {
     valuefincarreracierre = digitalRead(fincarreracierre);
    if (valuefincarreracierre == HIGH) {
       break;
    }else{
     Serial.println("Cerrando");
     digitalWrite(stepPin, HIGH);
     delayMicroseconds(stepDelay);
     digitalWrite(stepPin, LOW);
     delayMicroseconds(stepDelay);
     }
  }
  vuelta = vuelta + 1;
  delay(1000);

   }
 
}

void abrir()
{


   //Marcha del imperio para abrir puerta
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);
noTone(spk);delay(2000);
   //Fin de música para abrir puerta
   
   //Cambiamos la direccion y aumentamos la velocidad
  digitalWrite(dirPin, LOW);
  stepDelay = 100;
  // Giramos 400 pulsos para hacer dos vueltas completas
  for (int x = 0; x < 5500; x++) {
     valuefincarreraapertura = digitalRead(fincarreraapertura);
    if (valuefincarreraapertura == HIGH) {
     break;
    }else{
     Serial.println("Abriendo");
     digitalWrite(stepPin, HIGH);
     delayMicroseconds(stepDelay);
     digitalWrite(stepPin, LOW);
     delayMicroseconds(stepDelay);
     }
  }
  vuelta = vuelta - 1;
  delay(1000);

}

void parar()
{
digitalWrite(stepPin, LOW);     
digitalWrite(stepPin, LOW);     
      
}

void nota(int frec, int t)
{
   tone(spk,frec);      // suena la nota frec recibida
   delay(t);                // para despues de un tiempo t
}
/code]

**Moderador:**Hola, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.
En el título no debe usarse la palabra Ayuda. Edita!!
Los códigos se postean usando etiquetas. Edita

Para comenzar tu motor no puede ser paso a paso y pretender moverlo con las instrucciones que planteas.
Es posible que sea un motor de CC (Corriente continua).
Si fuera un stepper, tienes una librería para hacerlo en lugar de volverte loco con los comandos planteados

http://diymakers.es/mover-motores-paso-paso-con-arduino/

Como no pones referencia al hilo del que te has copiado el código no puedo opinar.
Recuerdo que era la puerta de un gallinero y que el que lo hizo no tuvo problemas.
Seguramente has confundido el tipo de motor.

Si es un stepper, usa la librería. Si es un DC o motor de Corriente continua, solo debes cambiar el pin indicado como STEP. y girará en la dirección opuesta por supuesto cuando cambies DIR como lo dice el código

Gracias surbyte, he cambiado el código e incluido la librería stepper, ahora ya funciona. De lo que si estoy seguro ves que en el proyecto copiado era un motor nema17

No lo recuerdo porque no pusiste el link.

Puerta para gallinero automática con arduino, motor paso a paso y fotorresistor

Si claro, ese era un motor paso a paso.
Lo que no se como has hecho las conexiones.
Siempre recuerdo que se deben aprovechar las librerías porque son SEGURAS. No vale la pena esforzarse cuando se desconoce el funcionamiento de algo.
Lo que te interesa es el fin no el medio. En tu caso tu fin es la puerta para las gallinas entonces usa lo que esta probado. Entiendo que fuera una sorpresa que ese código que a @cotarejo le funcionó a ti no.

Bueno, pero como ves hay alternativas. Stepper.h
Y esta alternativa es mas elegante. Más fácil de entender.
Intenta publicar tu versión usando Stepper.h por favor.

Yo hice algunos cambios menores a tu código.
agrega esta variable.

unsigned long start;

y el loop usando millis() esto.

void loop() {
  //Guardamos el valor leido en una variable
  if (millis() - start > 10000UL) { // retardo entre lecturas del LDR
      valorLDR = analogRead(pinLDR);
      // Impresión de los valores leídos por el sensor por pantalla
      Serial.print("LDR = ");
      Serial.println(valorLDR);
      start = millis();
  }

  if (valorLDR <= 110 and vuelta <= 0)
      cerrar ();                          // Esta función es para CERRAR
  else if (valorLDR >= 220 and vuelta >= 1)
      abrir();                            // Esta función es para ABRIR
  else
      parar();
}

Lo mismo se puede hacer con la melodía pero mucho trabajo, y encima termina con un delay(180000) que arruina todo esto.