This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 2 voto(s) - 4.5 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Proyecto: Dispensador de comida automático para conejos
#1
Recientemente he hecho un dispensador de comida automático para mis conejos, y aunque ya tiene una página "oficial" en inglés, me parece bien comentarlo un poco en esta nuestra comunidad y en español. El dispensador es parte de un proyecto mayor y hay un par de temas que están detallados en la página "oficial" y aquí me saltaré.

Para comunicarme con el dispensador, utilizo un servidor MQTT, con un par de programas que guardan los datos de los sensores y me los muestran en una página web.

Página del proyecto: https://conejoninja.github.io/home/devices/food01/
Repositorio Github: https://github.com/conejoninja/home_food

[Imagen: food0104.gif]

Idea y motivación

La idea principal era poder alimentar a mis pequeños trastos cuando no estoy en casa. Dos veces al día, un pequeño desayuno y una cena con más cantidad. Y ya que estamos, medir la temperatura en caso de que hiciera mucho calor.

El dispensador estará "durmiendo" (deepsleep) la mayoría del tiempo, se despertará cada 15minutos, medirá la temperatur/humedad y comprobará si es hora de alimentar a los conejos. Está diseñado de que sea lo más autónomo posible, si no hubiera internet, seguiría funcionando (sin enviar los datos de los sensores). Si el dispensador se atasca, la próxima vez que se despierte volverá a intentar dispensar comida. Si alguno de los sensores o el propio reloj no funcionan, avisa por mensaje del error.

[Imagen: rabbits.jpg]

Componentes
  • ESP12F (o similar)
  • DS1307 AT24C32 (módulo DS1307 con memoria)
  • Sensor de temperatura y humedad DTH11 (o cualquiera de la familia DHTXX)
  • L293B / L293D half-bridge
  • Motor DC (de los "amarillos" con engranaje)
  • Rotary encoder
  • Conversor DC-DC con salida de 3.3V (YL-46, AMS1117)
  • 2x 10K ohm resistencias
  • 4x 1N4007
  • Algunas partes impresas en 3D (están los archivos STL)
  • Alimentación de 6V
  • 6x M3 tornillos y tuercas
  • Cables
  • Pegamentos



Circuito

[Imagen: circuit.png]

Tanto el motor como el L293D/L293B son alimentados por los 6V. Cualquier cargador USB/de móvil actual de 5V funcionaría sin problema, pero sin duda el motor puede aprovechar ese voltio de más si hay algún atasco en el dispensador. El voltaje es reducido a 3.3V para alimentar el ESP12F y el resto de componentes por el conversor DC-DC (es de los baratos).

Nota: He usado el L293B en vez del L293D. También he usado un módulo DS1307 con memoria EEPROM de eBay que funciona a 3.3V en vez de los 5V que se muestran en la imagen. No encontraba estos componentes en Fritzing.



Conexiones

En el caso de que con el esquema no estuvieran claras las conexiones, aquí dejo una pequeña tabla (si supiera meter tablas en el foro)


Pin ESP12F - Componente
RST - ESP12F GPIO16 (to be able to deepsleep)
ADC -
CH_PD / EN - 3.3V
GPIO16 - ESP12F RST
GPIO14 - DHT11 data pin
GPIO12 - Rotary encoder pin A
GPIO13 - Rotary encoder pin B
VCC - 3.3V (from DC-DC converter)
GND - GND
GPIO15 - GND
GPIO2 - L293B IN2
GPIO0 - 3.3V
GPIO4 - RTC SDA
GPIO5 - RTC SCL
RXD - L293B IN1
TXD -

Debido a las limitaciones del ESP12F, el pin RXD es usado para el motor, esto causará algunos pequeños problemas si se intenta conectar al Serial monitor, usando solo el pin TXD se puede ver la salida Serial sin problemas.
Intenté usar los pines GPIO9 y GPIO10 que no están en el adaptador, pero hay limitaciones adicionales al usarlos (como que tienen que estar casi siempre encendidos) y no pude hacerlos funcionar.

Motor

Para el primer diseño utilicé un servo adaptado para girar 360º, en las primeras pruebas pareció funcionar bien, pero finalmente carecía de la potencia necesaria y se atascaba con bastante frecuencia. He terminado utilizando uno de esos "motores amarillos" (ojo, también los venden en negro), que seguramente has visto. Funcionan en un rango de 3V a 6V y tienen la fuerza suficiente como para no atascarse casi nunca.

[Imagen: motor1.jpg]


Estos motores tienen un pequeño bulto en uno de los lados, ese bulto indica que esa transmisión es, por decirlo de alguna manera "directa" y no debería fallar (si no gira, es que el motor no gira). El otro lado, sin bulto, la transmisión está encajada a una varilla metalica, puede darse el caso de que ese anclaje se coja algura y aunque el motor gire, no lo haga la transmisión.


[Imagen: motor2.jpg]


A nivel de código, para evitar atascos, muevo el motor unos milisegundos hacia adelante, y luego retrocedo un poco. En el caso de un atasco (bastante raro), para evitar sobrecalentamientos del motor, limitamos el número de intentos en los que tratamos de dispensar comida. Si falla, emitimos una alerta y lo intentaremos la próxima vez que se despierte el cacharro.


Para controlar el motor, usamos un puente-H con el L293B o el L293D, aunque cualquier componente similar también valdria:


[Imagen: hbridge.jpg]






Rotary encoder


Para saber si el dispensador está atascado o la cantidad de comida servida, usamos un rotary encoder (codificador de rotación?). Usamos uno sin PCB y con un lado plano en el chirulo que gira. El encoder usa interrupciones en el micro cuando cambia de una posición a otra. Comprueba qué pines de tu placa soportan estas interrupciones. En el ESP12F, solo el GPIO16 no las soporta, pero tampoco nos importa porque el GPIO16 lo usamos para despertar del deepsleep. En los arduinos convencionales, el número de pins que admiten interrupciones es bastante más limitado, puedes comprobar la compatibilidad en esta tabla.



DHT11 - Temperatura y humedad

[Imagen: dht11.jpg]

DHT11, DHT22 o DHT21, cualquiera de ellos funcionará bien. Son baratos, siendo el DHT11 el más barato de ellos, funcionan a 3.3V y a 5V. Tomaremos 10 medidas a intervalos de 2 segundos y calcularemos la media de ambas, la temperatura y la humedad para minimizar posibles errores en las lecturas. Algunos de las lecturas (las primeras) pueden fallar.



DS1307 AT24C32 - Reloj RTC con memoria


[Imagen: ds1307at24c32.jpg]


Queremos tener en cuenta la fecha/hora para poder usar las alarmas y dispensar comida cuando toca, para ello usamos un RTC. La memoria nos sirve para saber si hemos dispensado la comida o se ha atascado y además guardar algunos otros datos de configuración. Con el RTC calculamos el tiempo y mandamos despertar el ESP12F a las :00, :15, :30 y :45 (aproximadamente, ya que el deepsleep del ESP12F es un poco impreciso.


Archivos 3D/STL

[Imagen: food0103.jpg]

Los archivos STL listos para imprimir se peuden encontrar en el repositorio del proyecto. Son bastante "printer-friendly", aunque soportes son necesarios para un par de ellos. Para cualquier cosa relacionada con comida, deberías usar PLA (o PETG) en vez de ABS. PLA está reconocido generalmente como seguro para la comida por algunos estudos, pero hay ciertas cosas a tener en cuenta.

A toro pasado, hay algunas cosas que cambiaría del modelo, pero imprimir toma tiempo y gasta plástico, así que he ido inlcuyendo algunas mejoras y modificaciones tratando de conservar lo que ya tenía impreso. Por ejemplo, los cables del rotary encoder deberían ir ocultos de alguna forma para evitar que los muerdan.

El ensamblaje es sencillo y no hay que explicar mucho, pero aqui dejo un video casi (aunque faltan algunas piezas por incluir):






Protocolo / JSON

Durante la fase de "discovery", el dispensador manda el siguiente mensaje:

Código:
{
   "id":"food01",
   "name":"Dulicomida 3000",
   "version":"1.0.0",
   "out":[
       {"id":"t1","name":"temperature"},
       {"id":"h1","name":"humidity"},
       {"id":"m1","name":"memory1"},
       {"id":"m2","name":"memory2"},
       {"id":"m3","name":"alarm1"},
       {"id":"m4","name":"alarm2"},
       {"id":"m5","name":"bigqty"},
       {"id":"m6","name":"smallqty"}
   ],
   "methods":[
       {"name":"food"},
       {"name":"ping"},
       {"name":"setmem","params":[{"name":"id"},{"name":"value"}]},
       {"name":"getmem"}
   ]
}


Hay 8 valores de sensores. m1-m6 son las diferentes configuraciones/espacios de memoria que explicaré más abajo. t1 y h1 son la temperatura y humedad respectivamente. Los valores de t1 y h1 se actualizan cada 15 minutos (si hay wifi y se conecta al servidor MQTT), los de m1-m6 solo bajo demanda. El dispensador admite 4 funciones: ping que responderá pong para comprobar que el dispositivo sigue vivo. Con food dispensará una pequeña cantidad de comida la próxima vez que despierte. Puedes cambiar los valores de configuración con setmem, y obtenerlos con getmem. Como el dispositivo está normalmente durmiendo, la petición para que haga algo se manda a la red MQTT como un mensaje persistente, de manera que sea leido cuando se despierte. Puedes llamar a varias funciones a la vez en un único mensaje MQTT, pero si mandas varios MQTT solo el último será válido.


Nota: Esto puede parecer bastante lio, está mejor explicado en la página del proyecto general: Home Automation Project.

Memoria

El dispensador guarda en la memoria del DS1307 AT24C32 algunas configuraciones. Puede ser configurado remotamente con la llamada a la funcion setmem. Para más información, leer la página del protocolo de comunicación.

  • memory1: timestamp de unix (desde 1 Enero 2000) para la alarma2. Valor de ejemplo: 553291190
  • memory2: timestamp de unix (desde 1 Enero 2000) para la alarma2. Valor de ejemplo: 553330790
  • alarm1: hora para la primera alarma (cantidad de comida grande) en formato de 24h sin símbolos. Valor de ejemplo: 2030 (2030 = 20:30 = 8:30pm)
  • alarm2: hora para la segunda alarma (cantidad de comida pequeña) en formato de 24h sin símbolos. Valor de ejemplo: 745 (745 = 07:45 = 7:45am)
  • bigqty: numero mínimo de pasos del rotary encoder para dispensar comida con la primera alarma
  • smallqty: numero mínimo de pasos del rotary encoder para dispensar comida con la segunda alarma

Nota
: memory1 y memory2 son timestamp a partir del 1 de Enero de 2000, necesitas restar 946684800 al timestamp real (o común). 07/13/2017 @ 7:59pm (UTC) es equivalente a 1499975990 y para el dispensador, sería 553291190.


[Imagen: food0102.jpg]
  Responder
#2
me apunto al hilo, que buen proyecto! me encanta!
  Responder
#3
Fascinante, enhorabuena!!!!
Una curiosidad... Los conejos no se asustan con el ruido del motor o con ese extraño aparato?

Enviado desde mi ONEPLUS A3003 mediante Tapatalk
  Responder
#4
Al principio estaban un poco extrañados y curioseaban, pero no se asustan, tampoco hace tanto ruido, en realidad son muy curiosos y cuando viene alguna caja o bolsa de la compra tienen que ir a meter el hozico e investigar.
  Responder
#5
Y digo yo... siendo PLA lo que utilizas, ¿No te lo han mordisqueado? Estoy de acuerdo en que el abs es tóxico para ellos si lo comen, pero quizá deberías contemplar la posibilidad de utilizar otro material diferente al PLA. El PLA es un material que absorbe humedad y no tolera temperaturas muy altas, si le llega a dar el sol mucho rato se te ablandarán las piezas y podría deteriorarse, lo mismo si le cae agua o hay mucha humedad.

Es interesante el proyecto la verdad, yo hace mucho tenia conejos pero ahora no, y si, coincido, suelen ser curiosos, quizá se alarmen la primera vez pero luego ya ni se inmutan.
  Responder
#6
Espectacular proyecto y super bien documentado. A nivel de código me ha gustado mucho el tema de usar MQTT con autodiscovery montado en un Docker. Por cómo lo tienes montado, entiendo que es el primero de muchos dispositivos que vas a implementar. ¡MOLA MU-CHO!

Saludos!
  Responder
#7
Enhorabuena, muy buen proyecto e impecable construcción.

Yo hice algo similar para un dispensador de gatos, usando también un ESP8266, un servo modificado que mueve una pieza de expulsion hecha con impresora 3D ( similar a la que tú usas) , y utilizando MQTT para comunicarme con una App Android propia y ... nada documentado , todo lo contrario que tu caso :-)

Ahora estoy con algo similar para controlar el riego del jardin... a ver si lo termino y lo documento para ponerlo por aquí.

Saludos.
  Responder
#8
(20-07-2017, 01:21 PM)Shellmer escribió: Y digo yo... siendo PLA lo que utilizas, ¿No te lo han mordisqueado?  Estoy de acuerdo en que el abs es tóxico para ellos si lo comen, pero quizá deberías contemplar la posibilidad de utilizar otro material diferente al PLA. El PLA es un material que absorbe humedad y no tolera temperaturas muy altas, si le llega a dar el sol mucho rato se te ablandarán las piezas y podría deteriorarse, lo mismo si le cae agua o hay mucha humedad.

Pues lo del PLA no lo había pensado, por color era el que más me encajaba y que fuera "food safe", también tengo PETG pero el color llamaría mucho la atención. Sobre la temperatura, ahora mismo está sobre los 30-32º no creo que tenga problemas con eso, pero no lo había pensado y estaré atento. Tengo otra piza de PLA en contacto constante con agua y no parece afectarle, en cualquier caso los pelets son secos y no debería haber problema con eso. Los conejitos son curiosos, pero ya no suelen moder según qué cosas. después de un par de semanas no han mordido nada Number_one


(20-07-2017, 05:07 PM)splasma escribió: Enhorabuena, muy buen proyecto e impecable construcción.

Yo hice algo similar para un dispensador de gatos, usando también un ESP8266, un servo modificado que mueve una pieza de expulsion hecha con impresora 3D ( similar a la que tú usas) , y utilizando MQTT para comunicarme con una App Android propia y ... nada documentado , todo lo contrario que tu caso :-)

Ahora estoy con algo similar para controlar el riego del jardin... a ver si lo termino y lo documento para ponerlo por aquí.

Saludos.

Todo es ponerse, la documentación y compartirlo es importante.
  Responder