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

Hola, estoy haciendo una portilla para las gallinas, y quiero que cuando llegue el día se abra, y cuando caiga la tarde o sea de noche se cierre.

Me he metido en esta aventura sin tener ni idea de electrónica y un poco "muy poco" de programación.

El caso es que estoy buscando por internet para mover el motor y para la célula LDR y no encuentro lo que yo quiero.

Quisiera saber cómo poder hacer para que cuando sea de día, el motor 28BYJ-48, con una controladora para el motor ULN2003, gire unas 70 vueltas en sentido de las agujas del reloj. Y cuando sea de noche, haga las otras 70 vueltas en sentido contrario a las agujas del reloj para cerrarse.

he buscado y encontré no sé si se llamará script que ya había hecho algún otro usuario de arduino y me hizo funcionar el motor "sin la fotorresistencia" pero no conseguí establecer el número de vueltas que quiero que gire ni la velocidad, de la velocidad sí que encontré una variable "int motorSpeed = 1200;" que se supone que era para la velocidad del motor, pero por más que cambio el valor no consigo que vaya un poco más rápido. Quizás 1200 sea su velocidad máxima "que es bastante lento como para contar 70 vueltas".

Como vereis estoy muy perdido pero con ganas de aprender. Y muy cansado de bajar por las mañanas hasta la finca familiar a abrir a las gallinas y volver a la tarde noche a cerrarlas.....

Alguna ayuda????

GRACIAS!!

Perdón pero me respondo a mi mismo… he encontrado un código que funciona bien, a falta de ajustar un par de cosas:

int motorPin1 = 5;               // Pines del Motor
int motorPin2 = 6;
int motorPin3 = 7;
int motorPin4 = 8;
int delayTime = 1;            // DelayTime determina la espera entre uno y otro paso
int delayTime1 = 2;            // DelayTime1 determina la velocidad de giro entre uno y otro paso
int count = 0;                 // cuenta los pasos del motor 400 una vuelta completa
int pinLDR = A1;          // leeremos el pin 0 LDR
int i = 0;
int valorLDR = 0;                       //Aquí almacenamos los datos recogidos del LDR:
int vuelta = 1;           //Aqui almacenamos el numero de ciclos de vueltas

void setup()
{
 // Visualización de los valores por la consola, hay que clicar en el botón Serial Monitor
Serial.begin(9600);

 pinMode(motorPin1, OUTPUT);     // Configuracion de los Pines como salida digital
 pinMode(motorPin2, OUTPUT);
 pinMode(motorPin3, OUTPUT);
 pinMode(motorPin4, OUTPUT);
}

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 count >= 0 and vuelta <= 0)
   abrir();
 else if (valorLDR >= 220 and count <= 9555 and vuelta >= 1)
   cerrar();
   else
   parar();
}


void abrir()
{
 for (count = 0; count < 9555; count++)
 {
               
       // Punto  A (Primero)
       digitalWrite(motorPin1, HIGH);      
       digitalWrite(motorPin2, LOW);        
       digitalWrite(motorPin3, LOW);        
       digitalWrite(motorPin4, HIGH);        
       delay(delayTime1);
       
       // Punto  B (Segundo)        
       digitalWrite(motorPin1, HIGH);
       digitalWrite(motorPin2, HIGH);
       digitalWrite(motorPin3, LOW);
       digitalWrite(motorPin4, LOW);
       delay(delayTime1);
       
       
       // Punto  C (Tercero)
       digitalWrite(motorPin1, LOW);
       digitalWrite(motorPin2, HIGH);
       digitalWrite(motorPin3, HIGH);
       digitalWrite(motorPin4, LOW);
       delay(delayTime1);
       
        // Punto  D (Cuarto)
       digitalWrite(motorPin1, LOW);
       digitalWrite(motorPin2, LOW);
       digitalWrite(motorPin3, HIGH);
       digitalWrite(motorPin4, HIGH);
       delay(delayTime1);
Serial.println(vuelta);
  }  
 
  count = 9555;
  vuelta = vuelta + 1;
 delay(delayTime);

}

void cerrar()
{
 for (count = 9555; count > 0; count--) //
 {
       // Punto  D (Cuarto)
       digitalWrite(motorPin1, LOW);
       digitalWrite(motorPin2, LOW);
       digitalWrite(motorPin3, HIGH);
       digitalWrite(motorPin4, HIGH);
       delay(delayTime1);
       
       // Punto  C (Tercero)
       digitalWrite(motorPin1, LOW);
       digitalWrite(motorPin2, HIGH);
       digitalWrite(motorPin3, HIGH);
       digitalWrite(motorPin4, LOW);
       delay(delayTime1);
       
       // Punto  B (Segundo)        
       digitalWrite(motorPin1, HIGH);
       digitalWrite(motorPin2, HIGH);
       digitalWrite(motorPin3, LOW);
       digitalWrite(motorPin4, LOW);
       delay(delayTime1);
       
       // Punto  A (Primero)
       digitalWrite(motorPin1, HIGH);        
       digitalWrite(motorPin2, LOW);        
       digitalWrite(motorPin3, LOW);        
       digitalWrite(motorPin4, HIGH);      
       delay(delayTime1);
Serial.println(vuelta);
  }
 
  count = 0;
  vuelta = vuelta - 1;
 delay(delayTime);

}

void parar()
{
   for (i = 0; i < 3; i++)
   
       digitalWrite(motorPin1, LOW);        
       digitalWrite(motorPin2, LOW);        
       digitalWrite(motorPin3, LOW);        
       digitalWrite(motorPin4, LOW);      
       delay(delayTime1);
       
}

1º - Están invertidos los sentidos de giro con respecto a lo que yo necesito, en este código cuando es apertura gira en un sentido, y yo necesito que sea en el contrario… y lo mismo cuando es cerrar la puerta.

2º - Creo que el número de vuetas está especificado en la cifra 9555, si subo serán más vueltas y si bajo serán menos ¿correcto?

GRACIAS!!

Me vuelvo a contestar yo mismo, cambié las direcciones del motor y obtuve el giro deseado, y cambié el valor de 9555 y también cambió el número de vueltas y puedo buscar las que exáctamente quiero. Pero después de leer por internet y hacer algunas pruebas me entran otras dudas:

¿¿sería conveniente poner fines de carrera??

Cuando se reinicia el arduino "le apago y le enciendo mil veces para hacer pruebas", siempre el motor empieza a girar en sentido de apertura de puerta, y si la puerta ya estaba abierta el motor suena como que quiere abrir la puerta pero evidentemente no puede porque ya lo está. ¿¿¿ cómo podría hacer para que cuando se reinicie no haga nada hasta que cambie la luz ?????

¿¿Se puede alimentar un arduino uno con 220v y tener una pila de 9v también conectada por si acaso se va la luz??? sería maravilloso....

GRACIAS!!

Hay un trabajo hecho por hiddennotebook similar al tuyo.
Proyecto puerta de gallinero con BH1750 y Arduino Pro Mini

Ahora respondo tus preguntas

¿¿sería conveniente poner fines de carrera??

Uno piensas las cosas de la mejor manera pero que ocurre cuando fallan? Desastres. Entonces los fines de carrera te aseguran que aún equivocándote tienes limites para ese motor.
Entonces si, es conveniente.

Cuando se reinicia el arduino “le apago y le enciendo mil veces para hacer pruebas”, siempre el motor empieza a girar en sentido de apertura de puerta, y si la puerta ya estaba abierta el motor suena como que quiere abrir la puerta pero evidentemente no puede porque ya lo está. ¿¿¿ cómo podría hacer para que cuando se reinicie no haga nada hasta que cambie la luz ???

que tal si agregas esto en el setup

void setup()
{
  // Visualización de los valores por la consola, hay que clicar en el botón Serial Monitor
  Serial.begin(9600);

  pinMode(motorPin1, OUTPUT);     // Configuracion de los Pines como salida digital
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  cerrar();                                  // <= linea agregada
}

Muchas gracias SurByte, mañana probaré a añadir esa parte del código al principio del Setup a ver si deja de abrirse cuando se reinicia el arduino.

Voy a comprar los dos finales de carrera pero antes de comprarles quería saber más o menos qué tendré que añadirle al código y como instalarles "esquema", ya que al no tener ni idea de electrónica tengo miedo a comprarles y que acaben en un cajón tirados por no saber usarles.

GRACIAS!! ;)

Gracias por contestar surbyte, en cuanto al problema que tengo con que cuando reinicio el arduino se abre la portilla en vez de quedarse como esté sigo sin resolverlo :frowning: y ya he roto un motor que va a saltos :frowning: puse la línea de código que me indicabas al final del setup() :

void setup()
{
  // Visualización de los valores por la consola, hay que clicar en el botón Serial Monitor
  Serial.begin(9600);

  pinMode(motorPin1, OUTPUT);     // Configuracion de los Pines como salida digital
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  cerrar();                                  // <= linea agregada
}

Pero no consigo que funcione correctamente.

¿¿Alguien sabría decirme porqué en ese sketch se gira la portilla para abrir() cada vez que reinicio el sistema???

Gracias!!

Vamos a ponernos de acuerdo cotarejo. La subrutina parar() detiene el motor? Si es si, al ponerla en el setup debería detenerlo también.

Hay algo que tienes mal conectado o el motor Revisando conexiones me encuentro con este cableado a seguir Es como tienes conectadas las bobinas al ULN2003? Mira este tutorial de prometec y verifica.

Hola surbyte, ante todo gracias por contestar!!

Como bien dices se supone que la subrutina parar() detiene el motor, pero tú me habías dicho que pusiese "cerrar()" en vez de "parar()". No obstante lo cambié y puse parar() y al encender el arduino aunque sea de noche, por defecto la puerta se sigue abriendo, y luego como está oscuro se vuelve a cerrar.... ahí no habría problema ya que no creo que en ese minuto que se abre y se vuelve a cerrar entre el zorro y me mate a las gallinas... pero si veo un problema cuando es de día y se reinicia, intenta volver a abrirse pero sin poder porque ya está abierta la puerta lógicamente. Y ahí fuerza el motor hasta que para de intentarlo.

Y lo que me comentas de cómo está conectado el motor 28BYJ-48, a la controladora ULN2003 no creo que haya error ya que tiene unas pestañas el conector del motor que entran en el conector de la controladora sólo en una posición. Es imposible conectarlo de alguna otra manera ya que las pestañas del conector no dejan....

Creo que se podría solucionar el tema de que se abra la portilla o que se cierre, con los finales de carrera que ya compré... ahora tendré que intentar estudiar cómo decirle al "código" que existen esos finales de carrera y de que pare cuando se pulse, y dónde y cómo conectarlos al arduino.....

Me parece a mi que me he aventurado en algo que me queda un poco grande...

Algún alma caritativa me echa una mano??????

GRACIAS!!