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

Hola buenas, después de un largo tiempo intentándolo, por fin terminé mi puerta para el gallinero. Y ahora vengo a mostrar lo que he hecho por si alguien quiere intentarlo, ponérselo lo más fácil posible :wink:

Ante todo decir que yo no tengo ni idea de electrónica y es mi primer proyecto, así que cualquier persona que sepa un poco verá errores o cosas que se pueden mejorar, por favor si es así, háganmelo saber y así seguir mejorando.

Componentes necesarios:

  • Madera. Con la madera hacemos la estructura de la puerta, las tapas y la propia puerta en sí. "Os pongo unos dibujos para que veáis cómo está hecha".

Estructura:

La estructura la he hecho con tablillas de un palet que tienen un largo de 60 cm por 10 cm de ancho y por 1 de greso.

Tapas:

Las tapas, son para poner por un lado y otro de la estructura, y dejar sólo el hueco que cerraría y abriría la puerta corredera.

Puerta:

La puerta es también un tablero rectángulo de madera que tape el hueco que hay entre las tapas.

  • Motor paso a paso bipolar NEMA 17.

  • Controladora "driver" para el motor POLOLU A4988.

  • 1 Adaptador del motor NEMA 17 al Husillo.

  • Husillo de 50 centímetros. Un husillo es como una barra roscada pero que desplaza más en menos vueltas, así el motor no tendrá porqué girar mil vueltas para avanzar un centímetro.

  • 2 tuercas para el husillo.

  • 2 finales de carrera.

  • 1 LDR o fotorresistor.

  • 1 Zumbador o speaker o altavoz "se dice de muchas maneras".

  • 2 rodamientos del mismo diámetro que el husillo. Pongo una imagen de un conjunto que tiene los rodamientos, el husillo, las tuercas del husillo y el adaptador para encajarlo al motor NEMA17

  • 1 condensador de 100 microfaradios. Tengan en cuenta la polaridad

  • 3 resistencias de 10k.

  • 1 protoboard.

  • 1 Arduino UNO.

  • 2 transformadores de red, que van de 220V a 9V y 1 amperio.

  • Cables para protoboard, tanto macho macho, como macho hembra..

He comprado todos los componentes en una tienda de electrónica de Santander. Tienen venta online pero no sé si puedo poner su dirección web por las normas del foro. Si alguien me confirma si puedo o no puedo lo modificaré.

La puerta la tengo en el exterior, por lo que se moja, entonces he metido lo mínimo de electrónica en la puerta y el resto de componentes están en un tupper en un cobertizo que hay al lado.

Por lo que en el tupper está la electrónica:

Esquema "en el esquema aparecen todos los componentes que hay metidos en el tupper menos los finales de carrera que están en la puerta, el motor que también está en la puerta, el LDR "que tiene que estar en el exterior para captar la luz del día" y un zumbador que le he puesto para que suene una melodía al abrir y otra distinta al cerrar":

Y la puerta por dentro "sin tapas" es así:

Vídeo de cómo funciona:

Vídeo puerta gallinero automatizada con arduino

Código Sketch:

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
}

Todos los ficheros les podrán descargar desde aquí.

Muchas gracias!

Puerta Gallinero Arduino.zip (1.01 MB)