Facebook Twitter RSS Reset

Hacete un alimentador automático para pecera.

Hacete un alimentador automático para pecera.

¿Cuantas veces no te ha sucedido que sales de vacaciones o necesitas salir de viaje unos días y no puedes llevar a tu mascota o no hay quien la cuide? ¿O simplemente eres un olvidadizo que no se acuerda de darles de comer?

Bueno, en este breve Instructable vamos a ver como solucionar este problema. En mi caso especifico tengo una tortuga y el alimento son pellets pequeños, así que no necesitare construir un gran contenedor. Pero claro si tienes un perro o algo mas grande (como por ejemplo una vaca, no me creerías si te contara las cosas que he visto como mascota) puedes facilmente fabricar el mecanismo adecuado al alimento.

En fin, este proyecto busca ser compacto y preciso por lo que emplearemos un trinket y un reloj en tiempo real para llevar a cabo dicha tarea. Dicho esto, creo que es hora de comenzar.



Materiales

Hacete un alimentador automático para pecera.

  • Trinket 5V de Adafruit Industries.
  • Modulo RTC DS1307.
  • Micro servo. (SG90, MG90 o similar)
  • Fuente de poder de 5v y almenos 1A.
  • Protoboard.
  • Jumpers.
  • Conectores adicionales para la fuente.
  • Tubo de CPVC de 3/4″
  • Un trozo de plastico.
  • Un pedazo de acrilico.
  • Tornillos M3.
  • Una pistola de silicon caliente.

Construyendo el circuito y programando

Hacete un alimentador automático para pecera.
Hacete un alimentador automático para pecera.
Hacete un alimentador automático para pecera.

El circuito es bastante simple, lo primero sera colocar el RTC y el Trinket sobre un protoboard. Después haremos las siguientes conexiones:

  • Conectaremos el GND de la fuente externa al GND del proto, de ahi al GND tanto del Trinket como del RTC y del servo.
  • Conectamos Vcc de la fuente externa al pin BAT+ del Trinket y al Vcc del servo.
  • Conectamos el pin 5V del Trinket al RTC.
  • Conectamos el pin #3 del Trinket a la entrada de señal del servo.
  • Por ultimo el pin #0 del Trinket al pin SDA del RTC. Y el pin #2 del Trinket al SCL del RTC.

Ya hemos terminado las conexiones y estamos listos para cargar el código. Mismo que puedes descargar en este mismo paso, todo viene explicado y comentado para que sea facil de entender. Hace falta descargar 3 librerias para que te funcione el programa en Arduino.

Si nunca has usado un trinket te recomendamos visitar la siguiente pagina: https://learn.adafruit.com/introducing-trinket

Aca esta el codigo del programa:





// Auto-alimentador de mascotas basado en Adafruit Trinket y modulo RTC DS1307.

// La fecha y hora se obtiene a travez de un RTC DS1307 conectado via I2C y la libreria TinyWireM.

//Necesitaras descargar e instalar las librerias listadas a continuacion para hacer funcionar este programa. Enlaces adjuntos en los comentarios.

  

#include           // Descarga en github: https://github.com/adafruit/TinyWireM

#include          // Descarga en github: https://github.com/adafruit/TinyRTCLib

#include  // Descarga en github: https://github.com/adafruit/Adafruit_SoftServo

//definir los pines que usaremos, el pin #0 y #2 corresponden a SDA y SCL respectivamente. No hay necesidad de declarar los pines por separado, la libreria lo hara por nosotros.

#define SERVO1PIN 3 // Usa el pin #3 para controlar el servo. Nota: desconectar el servo durante la programacion. 

#define LED 1       // Usa el pin #1 para controlar un led, este led es el integrado en tarjeta. 

 

RTC_DS1307 rtc;                // Inicializar modulo RTC.

Adafruit_SoftServo myServo1;   // Crea objeto “myServo1” para usar el servo.    

void setup () 

{

  OCR0A = 0xAF;            // Cualquier numero esta bien.

  TIMSK |= _BV(OCIE0A);    // Activar interrupcion por timer. (al final del codigo)

  pinMode(LED, OUTPUT);    // Deja el pin como salida digital.

  myServo1.attach(SERVO1PIN);    // Activar el servo en el pin definido.

  myServo1.write(140);           // Mover el servo a la posicion definida.

  delay(500);                    // Esperar un poco a que el servo llegue a la posicion definida

  myServo1.detach();             // Desactivar el servo para ahorrar energia. (permanece en la misma posicion)

  TinyWireM.begin();             // Iniciar comunicacion I2C 

  rtc.begin();                   // Iniciar RTC.

  

  if (! rtc.isrunning()) //Si el RTC no ha sido configurado a la fecha y hora anteriormente, ejecuta lo siguiente: 

  {

          rtc.adjust(DateTime(__DATE__, __TIME__)); //carga la fecha y hora de la compilacion del programa en el RTC. 

  }

}

void loop () 

{

 uint8_t hourvalue, minutevalue;  //Variables para la hora y los minutos 

 

 DateTime now = rtc.now();           // Obtiene los datos actuales desde el RTC.

 hourvalue = now.hour();             // Obtiene la hora actual.

 minutevalue = now.minute();         // Obtiene los minutos actuales.

 

 if(((hourvalue == 14)&& (minutevalue == 20))||((hourvalue == 14)&& (minutevalue == 22))) //en mi caso si la hora coincide (14:20 y 14:22) abre el servo y deja caer la comida. Aqui puedes poner tu rutina si el mecanismo es diferente.

    {

     myServo1.attach(SERVO1PIN);   // Activar el servo en el pin definido.

     myServo1.write(140);          // Mover el servo a la posicion definida.

     delay(5000);  // Espera 5 segundos. 

     for(int i = 0; i<=0;i++)  //el numero de veces que queremos se abra la compuerta. En mi caso 1 vez.
     {

      myServo1.write(30);  // Mover el servo a la posicion definida.

      delay(100);          //Espera un poco a que se mueva el servo.

      myServo1.write(140); // Mover el servo a la posicion definida.

      delay(2500);         //Tiempo antes de repetir la secuencia.

     }

     myServo1.write(140); // Mover el servo a la posicion definida.

     delay(1000);         // Espera 1 segundos.

     myServo1.detach();   // Desactivar el servo para ahorrar energia. (permanece en la misma posicion)

     for(int i = 0; i<= 60;i++)  //Retardo de 1 minuto para evitar que se active mas de una vez consecutiva en el mismo dia de forma indebida. 
     {

      delay(1000);

     }

    }

    

 digitalWrite(LED, HIGH);  //Parpadea el led del Trinket y ademas espera 5 segundos antes de volver a leer el RTC.

 delay(2500);

 digitalWrite(LED, LOW);

 delay(2500);

}

//Esta es la interrucion encargada de generar la señal PWM a 50Hz para controlar el servo correctamente.

volatile uint8_t counter = 0;

SIGNAL(TIMER0_COMPA_vect) 

{

  // entra aqui cada 2 mili-segundos.

  counter += 2;

  // actualizar servo y restablecer el contador cada 20 mili-segundos.

  if (counter >= 20) {

    counter = 0;

    myServo1.refresh();

  }

}

// JAX4EVER





El mecanismo

Hacete un alimentador automático para pecera.

En mi caso lo único que hice fue montar el servo con una compuerta de plástico al final del tubo de CPVC de 3/4″.

Creo que las imágenes son mas explicativas que cualquier cosa que pueda escribir, igualmente si tienes alguna duda con gusto la respondo.

Nota: cuenta con un sensor óptico para saber cuando la comida esta por agotarse, aunque en esta versión decidí no implementar este sistema para dejar las cosas simples.

Terminamos

Hacete un alimentador automático para pecera.