Comedero de perros automático

Introducción:

En el momento de elegir este proyecto nos encontramos con innumerables posibilidades a la hora de crear diseños con Arduino. Una vez elegido el proyecto que queríamos hacer, el comedero de animales, se nos ocurrieron miles de modelos distintos para construirlo, pero el que más interesante nos pareció fue un comedero para varios animales con distintas funcionalidades.

Se trataría de un comedero automático con la posibilidad de ser personalizado por su dueño. Cuenta con dos dispensadores de comida, para dos animales distintos, un zumbador que emite una melodía distinta para cada animal a modo de alarma, un led que señala si se está o no sirviendo la comida, al igual que una pantalla que indica al usuario el estado del comedero y por último, una minibomba de agua que servirá la bebida a nuestro animal.

La metodología llevada a cabo fue bastante intuitiva por no conocer los componentes con los que estábamos trabajando, por lo que en un inicio tuvimos que investigar su funcionamiento, así como los respectivos códigos de cada componente por separado para luego unirlos en un único proyecto.

Materiales utilizados:

MaterialPrecio
1 x Placa Arduino UNO Incluido en el material de la URJC
2 x ProtoboardIncluido en el material de la URJC
Cables (Male-to-Male, Male-to-Female)6 euros
2 x Servomotor9 euros
1 x Pantalla LCD (16×2)Incluido en el material de la URJC
1 x Led RGBIncluido en el material de la URJC
1 x BuzzerIncluido en el material de la URJC
1 x PotenciómetroIncluido en el material de la URJC
1 x Pila 9V4 euros
1 x Caja de cartón7 euros
2 x Botellas de plástico1 euro/unidad
1 x minibomba de motor sumergible8 euros

Servomotores:

HARDWARE:

Un servomotor o servo (Micro Servo 9g SG90 de Tower Pro) es un motor eléctrico con dos características:

Permite mantener una posición que indiquemos. El rango que alcanza este modelo es de 180º

Permite controlar la velocidad de giro, podemos hacer que antes de que se mueva a la siguiente posición espere un tiempo.

Se ha añadido a la protoboard tal y como se muestra en la siguiente imagen:

SOFTWARE:

#include <Servo.h>

Servo servo1, servo2;

void setup() {
  
  servo1.attach(8); //ponemos el pin 8 al servo 1
  servo2.attach(7); //ponemos el pin 7 al servo 2
  
  servo1.write(0); //ponemos el servo 1 en posición 0
  servo2.write(10); // ponemos el servo 2 en posición 10
  Serial.begin(9600);

}

void loop() {

//abrimos el servo para la comida del perro grande
  servo1.write(90);

//cerramos el servo
  servo1.write(0);

//abrimos el servo del perro pequeño
  servo2.write(90);

//cerramos el servo
  servo2.write(10);
 
}

Pantalla LCD(16×2)

HARDWARE:

Para poder mostrar si el comedero está o no dispensando la comida u otros mensajes usaremos una Pantalla de Cristal Líquido (LCD) 16×02, es decir 16 columnas y 2 líneas. Dispone de 16 pines.

Para poder conectarlo al Arduino necesitaríamos usar 6 pines digitales ademas de un potenciómetro.

Se conecta a la protoboard de la siguiente manera:

SOFTWARE:

//Añadimos la librería
#include <LiquidCrystal.h>

//ponemos los pines que vamos a usar
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
//inicializamos la pantalla y la limpiamos
  lcd.begin(16, 2); 
  lcd.clear();
  Serial.begin(9600);

}

void loop() {
  lcd.setCursor(0, 0);
  lcd.clear();

//imprimimos el mensaje inicial
  lcd.print("Comedero");
  delay(10000);

//entre perro y perro mostramos el siguiente mensaje
  lcd.clear();
  lcd.print("esperando");
  delay(10000);

}

//En las funciones de alimentación mostramos el mensaje "Sirviendo comida"
void comidaPerroGrande(){
      lcd.clear();
      lcd.print("Sirviendo comida");
}

void comidaPerroPequeno(){
    lcd.clear();
    lcd.print("Sirviendo comida");
}

Buzzer (Zumbador)

HARDWARE:

El zumbador se encargará de sonar de formas distintas según sirva la comida del primer animal o del segundo.

Se conecta a la protoboard de la siguiente manera:

SOFTWARE:

//ponemos el pin del buzzer
int buzzerPin = 6;

//lo usamos dentro de las funciones de alimentar, creando melodías distintas

void comidaPerroGrande(){
  for(int i = 0; i < 3; i++ ){ //perro grande
      tone(buzzerPin, 1000);
      delay(100);
      tone(buzzerPin, 1500);
      delay(100);
      tone(buzzerPin, 1000);
      delay(1000);
      noTone(buzzerPin);
    }
}

void comidaPerroPequeno(){
    for(int i = 0; i < 3; i++ ){ //perro pequeño
      tone(buzzerPin, 3000);
      delay(100);
      tone(buzzerPin, 2500);
      delay(100);
      tone(buzzerPin, 3000);
      delay(1000);
      noTone(buzzerPin);
    }
}

Minibomba de agua

HARDWARE:

Nuestra idea para este dispositivo es el de dispensador, pero al conectar la minibomba a la placa de Arduino se producía un cortocircuito con los servomotores por lo que decidimos optar por conectarla a una pila de 9V, por lo tanto no precisará de ningún código, solamente de una fuente de alimentación.

Problemas encontrados y soluciones:

A lo largo del proyecto nos hemos encontrado con gran cantidad de problemas entre los cuales unos han podido ser solucionados y otros no.

Una vez tuvimos los servomotores en perfecto funcionamiento, así como la pantalla y el buzzer nos dimos cuenta de que el mayor problema era la falta de pines en la placa de Arduino. Problema que no pudimos subsanar. Este problema nos llevó a otra serie de problemas:

Cuando nos pusimos a programar el código de la minibomba para que actuara como los servomotores, que se activase y desactivase a conveniencia, y posteriormente al conectarla a la placa junto con el resto de los componentes nos dimos cuenta de que debido a que la minibomba requiere mucha potencia producía cortocircuitos con los servomotores y éstos se abrían cuando la bomba se activaba. Investigamos, probamos diferentes códigos y diferentes soluciones e incluso compramos diferentes materiales para intentar evitar el cortocircuito pero no lo conseguimos, por lo que finalmente conectamos la minibomba a una batería externa.

Posteriormente y debido a que la placa de Arduino no contaba con la suficiente potencia para todos los componentes que estábamos usando la pantalla LCD empezó a dar problemas. Se encendía y se apagaba y le salían letras aleatorias que aun tocando el potenciómetro no se solucionaban, conseguimos subsanar este problema volviendo a correr el programa cada cierto tiempo. Cuando construimos la caja del comedero y probamos a echar la comida para cerciorarnos de que funcionaban los servomotores perfectamente nos dimos cuenta de otro problema, la comida llegaba a un punto de la botella donde se atascaba consigo misma y no conseguía bajar. La solución que habríamos implementado habría sido añadir dos servomotores más y que removiesen la comida y así bajase perfectamente. El problema es que ya no quedaban pines suficientes en Arduino para realizarlo.

Casos de uso:

A continuación, se muestran las funciones del comedero:

-Dispensar comida a dos comederos distintos para dos animales distintos: los servomotores se abrirán y la comida caerá hasta el comedero del animal.

– Visualizar el estado del comedero por la pantalla: la pantalla mostrará si el dispensador está sirviendo la comida o está cerrado.

-Visualizar el estado del comedero a través de los colores del led: cuando el comedero esté sirviendo la comida se encenderá un led verde que informará al usuario, cuando se cierren los servomotores se encenderá un led rojo.

-Alarmas: según la comida que se esté sirviendo sonará una alarma distinta.

Si tuviésemos la posibilidad de disponer de más fondos y tiempo, proponemos los siguientes cambios a añadir para poder completar de personalizarlo:

-Dos servomotores más, se colocarían dentro de las botellas moviendo continuamente la comida y evitando así el atasco de la comida dentro de la botella.

-Otra placa de Arduino para evitar los cortocircuitos entre la minibomba y los servomotores y así poder controlar la minibomba para que se abra y se cierre en un momento determinado

-Sensor de nivel de agua para alertar al dueño del descenso del agua en el recipiente

-Sensor de presión para la comida, para poder rellenar el cuenco de comida del perro en caso de que este se haya quedado vacío.

Código completo:

#include <Servo.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Servo servo1, servo2;
int buzzerPin = 6;
int ledRojo = 9;
int ledVerde = 10;


void setup() {
  
  lcd.begin(16, 2); 
  servo1.attach(8);
  servo2.attach(7);
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  lcd.clear();
  servo1.write(0);
  servo2.write(10);
  digitalWrite(ledRojo, HIGH);
  digitalWrite(ledVerde, LOW);
  Serial.begin(9600);

}

void loop() {
  lcd.setCursor(0, 0);
  lcd.clear();
  digitalWrite(ledRojo, HIGH);
  lcd.print("Comedero");
  delay(10000);

//abrimos el servo para la comida del perro grande
  servo1.write(90);
//apagamos el led rojo y encendemos el verde
  digitalWrite(ledRojo, LOW);
  digitalWrite(ledVerde, HIGH);
  Serial.println("Perro grande comiendo");
  comidaPerroGrande();

  digitalWrite(ledVerde, LOW);
  digitalWrite(ledRojo, HIGH);
  delay(2000);

//entre perro y perro  
  lcd.clear();
  lcd.print("esperando");
  delay(10000); // entre perro y perro;

//perro pequeño
  digitalWrite(ledRojo, LOW);
  digitalWrite(ledVerde, HIGH);
//abrimos el servo del perro pequeño
  servo2.write(90);
  Serial.println("Perro pequeño comiendo");
  comidaPerroPequeno();
  digitalWrite(ledRojo, HIGH);
  digitalWrite(ledVerde, LOW);
    
 delay(10000);
 Serial.println ("Echando agua");
}

void comidaPerroGrande(){
  for(int i = 0; i < 3; i++ ){ //perro grande
      tone(buzzerPin, 1000);
      delay(100);
      tone(buzzerPin, 1500);
      delay(100);
      tone(buzzerPin, 1000);
      delay(1000);
      noTone(buzzerPin);
  }

      lcd.clear();
      lcd.print("Sirviendo comida");
      delay(3000);
      servo1.write(0);
    
}

void comidaPerroPequeno(){
    for(int i = 0; i < 3; i++ ){ //perro pequeño
      tone(buzzerPin, 3000);
      delay(100);
      tone(buzzerPin, 2500);
      delay(100);
      tone(buzzerPin, 3000);
      delay(1000);
      noTone(buzzerPin);
    }

    lcd.clear();
    lcd.print("Sirviendo comida");
    delay(2000);
    servo2.write(10);
}

Video complementario:

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *