Автокормушка для котов с подачей сух. корма, мяса, воды и автоматическим определением разных кошек

Тема в разделе "Глядите, что я сделал", создана пользователем okuznetcov, 2 июн 2015.

  1. okuznetcov

    okuznetcov Нерд

    Всем привет! Наверное вы уже сотни раз видели автоматические кормушки для кошек и собак на Arduino, однако так как необходимость сего предмета все-таки возникла, я решил сделать кормушку с не совсем стандартным функционалом. Давайте я не буду долго распинаться с предысториями о том, как мне пришла идея такого устройства, а перейду к описанию работы. Итак, в первую очередь, когда кот или кошка подходит к кормушке, включается система распознавания любимца. Система знает, какое количество корма необходимо питомцу. Сервопривод открывает проход и корм высыпается в миску. Вместе с этим, одновременно включается свет, который помимо своей основной функции является индикатором правильного распознавания кошки, а также помпа, которая подает коту свежую проточную воду. Кормушка подает корм небольшими порциями, т.е по 10-20 грамм. Если кот остается на месте, она высыпает еще (разумеется, в разумных приделах). Как только кот отходит от кормушки на 7-10 см., система закрывает сессию кормления кота и заносит количество съеденного корма в память микроконтроллера. Кроме всего прочего, один раз в день котам необходимо есть свежее, охлажденное, предварительно нарезанное мясо. Оно располагается в сборнике продуктов сверху, там же где находится сухой корм. Мясо необходимо охлаждать. Для этого, в месте его хранения предусмотрен элемент пельтье. Он будет непрерывно охлаждать емкость в которой находится мясо. На словах, скажем так, все звучит не так уж просто.

    Для создания устройства понадобились следующие электронные компоненты:
    Iskra Neo- управляющая плата
    Troyka Shield- плата расширения для удобного подключения
    Relay Shield- реле для включения помпы
    3 датчика холла- для определения уровня воды (чтобы не спалить помпу) и кошки (с помощью определения полярности магнитов, приклеенных на ошейник)
    2 Troyka-светодиода- для подсветки и индикации работы
    ИК-приемник- для простого управления, если вы рядом
    Датчик температуры- определение температуры воздуха
    Фоторезистор- определение уровня освещенности
    Зуммер- для оповещений
    2 сервопривода- для подачи сух. корма и мяса
    Элемент Пельтье- охлаждение мяса
    Погружная помпа- подача воды

    Кроме этого, понадобились некоторые специфические компоненты:
    Прозрачная канистра- корпус
    5 прозрачных форм для еды- две формы для мисок с кормом, 2 больших формы для хранения корма и мяса, 1 большая форма- для хранения воды
    Веб-камера- для онлайн трансляции из кормушки
    USB-удлинитель- для удобного подключения
    Отвертка, газовая или электрическая плита, острый нож с заостренным концом, тонкая трубка, гибкая трубка-гормошка, пластиковые обрезки из под канистры, скотч (обычный, малярный и двухсторонний)
    Пульт ду на 38 Khz-
    для управления кормушкой "на месте"
    Компьютер- в качестве сервера для веб-камеры и Arduino

    Как вы уже поняли, наличие сервера предполагает отправку данных в интернет, а соответственно, наличие клиенской части. В нашем случае, ее сыграет платформа Blynk, которая предоставляет IOS и Android приложения для удаленного контроля. Для организации видеопотока я буду использовать давно зарекомендовавшую себя, платформу Ivideon. В обоих случаях, главным их преимуществом является отсутствие привязанности к выделенным IP-адресам, бесплатность обоих платформ, наличие приложений для смартфонов, а также их поддержка почти на всех ОС для серверного ПО. В моем случае я буду использовать мою старую прошку (MacBook Pro 13’ mid 2009, OS X 10.10), которого заменил новый Air 2014. Т. е. установку я буду описывать под OS X. На самом деле, вся сложность установки заключается в запуске скрипта Blynk на Mac OS, который в отличие от Ivideon не имеет собственного интерфейса. На Windows никаких проблем нет: вам необходимо пройти регистрацию в обоих сервисах, поставить приложения, и запустить их (в Ivideon необходимо войти в самом приложении на компьютере и указать путь до камеры). После этого надо скачать приложение Ivideon и Blynk на ваш смартфон на IOS или Android (для Blynk в IOS версии понадобится американская учетная запись) и войти под вашей учетной записью. В Ivideon вы сразу увидите поток с камеры, если сервер работает. А в Blynk необходимо поставить библиотеку в Arduino IDE, загрузить тестовый скетч и вставить туда токен, по которому Arduino и приложение будут соединяться. На странице http://www.blynk.cc/getting-started/ есть пошаговый мануал, который поможет во всем разобраться. После того, как мы разобрались с теоретической частью, давайте переходить к сборке сего устройства. На этой позитивной ноте я закончю свой пост. Все комплектующие уже закуплены, сборка уже началась. Через несколько дней выложу процесс сборки вмесе со всеми проблемами, с которыми я столкнулся, полным описанием работы распознавания котов, а также скетчем. Если у вас есть какие-либо идеи по поводу данного проекта, пишите!
     
    Последнее редактирование: 2 июн 2015
  2. okuznetcov

    okuznetcov Нерд

    Еще раз всем привет. Работа кипит полным ходом. Все комплектующие уже закуплены. Началась сборка корпуса и разработка приложения. Вот как будет выглядеть интерфейс:
    image1.PNG
    (Гур и Кася- это имена моих кошек). Потребление воды я решил не отслеживать. Пусть пьют столько, сколько им необходимо. Мясо загружается на один день. В конце дня оно высыпается в миску. Нажимая на кнопки в приложении "Доп. Кася/Гур" можно удаленно побаловать кота, добавив ему лишних 20-40 грамм корма. Разумеется, если кот захочет этого. Маленькие индикаторы в правой части приложения показывают какой кот находится в кормушке. А два индикатора "мясо", показывают доступность мяса для каждого кота. Графики показывают потребление корма и обновляются раз в минуту.
     
    Последнее редактирование: 2 июн 2015
  3. okuznetcov

    okuznetcov Нерд

    Привет народ! Сборка все еще идет полным ходом, а вот код уже готов! Значения пока взяты произвольные, все будет корректироваться и проверяться "методом тыка"
    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial SwSerial(10, 11);
    #define BLYNK_PRINT SwSerial
    #include <BlynkSimpleSerial.h>
    #include <Servo.h>

    #define WATER_PUMP 5 //помпа
    #define BUZZER 3 //пищалка
    #define COOLER 4 //элемент пельтье

    #define LED_GREEN 12 //зеленый светодиод
    #define LED_RED 13 //красный светодиод

    #define CAT_SENSOR_RIGHT A2 //сенсоры для определения уровня воды и кошки
    #define CAT_SENSOR_LEFT A3
    #define WATER_SENSOR A4

    #define LIGHT_SENSOR A0 //сенсоры окружающей среды
    #define TEMP_SENSOR A1

    #include <IRremote.h> //быблиотека для работы с ИК-приемников
    int RECEIVE_PIN = 8; //расположение ИК-приемника
    IRrecv irrecv(RECEIVE_PIN);
    decode_results results;

    Servo dry_feed; //сервомотор для подачи сухого корма
    Servo meat; // сервомотор для подачи мяса

    int Feed_weight_gur; //сколько корма съел гур за день
    int Feed_weight_Kasia; // сколько корма съела Кася за день

    int FEED_GUR_MAX = 200; //количество корма Гура на день
    int FEED_KASIA_MAX = 150; //количество корма Каси на день
    int DRY_FEED_ANGLE = 15; //угол поворота для подачи сухого корма
    int FEED_20_GRAMMS = 600; //время ожидания для высыпания 20 грамм
    int feed_cat_20 = 10000; //время ожидания добавки
    int Dry_feed_weight = 1000; //начальное количество корма (в гр.)
    int angle_meat = 30; //угол поворота сервопривода для высыпания мяса на одного кот
    bool meat_1; // переменные наличия мяса
    bool meat_2;

    int Add_gur = 0; //виртуальные пины Blynk для организации добавки через приложение
    int Add_Kasia = 1;
    // You should get Auth Token in the Blynk App.
    // Go to the Project Settings (nut icon).
    char auth[] = "YourAuthToken"; // токен для связи с приложением

    void setup()
    { // указываем выходы-входы
      pinMode(WATER_PUMP, OUTPUT);
      pinMode(BUZZER, OUTPUT);
      pinMode(COOLER, OUTPUT);
      pinMode(LED_GREEN, OUTPUT);
      pinMode(LED_RED, OUTPUT);

      pinMode(CAT_SENSOR_RIGHT, INPUT);
      pinMode(CAT_SENSOR_LEFT, INPUT);
      pinMode(WATER_SENSOR, INPUT);
      pinMode(LIGHT_SENSOR, INPUT);
      pinMode(TEMP_SENSOR, INPUT);
      irrecv.enableIRIn(); //включаем ИК-приемник

      dry_feed.attach(6); //указываем расположение серврприводов
      meat.attach(7);

      delay(2000); //ждем
      SwSerial.begin(9600); //инициализация SoftwareSerial
      Blynk.begin(auth); //подключаемся к серверу
      digitalWrite(COOLER, HIGH); //включаем элемент пельтье

    }

    void loop()
    {
      Blynk.run(); //начинаем сессию

      int cat_data_right = analogRead(CAT_SENSOR_RIGHT); //читаем информацию с датчиков определения кота
      int cat_data_left = analogRead(CAT_SENSOR_LEFT);

      int voltage = 5.0 / 1024.0 * analogRead(TEMP_SENSOR); //считываем и конвертируем показатели с датчиков
      int temp_c = ( voltage - 0.5 ) * 100;
      int temp = temp_c - 5.0;
      int light = analogRead(LIGHT_SENSOR);

      if(cat_data_right < 390 && cat_data_right < 390) //авторизация кота кота (гур)
      {
        digitalWrite(WATER_PUMP, HIGH); //включаем воду
        Blynk.virtualWrite(6, LOW); //отправляем информацию в приложение
        Blynk.virtualWrite(7, HIGH);
     
        if(Feed_weight_gur >= FEED_GUR_MAX) { //вечерний прием мяса
        if(meat_1 = true) { //определяем, как открывать бункер (если кошка ест первой или второй)
          meat.write(angle_meat * 2);
          meat_2 = true;
        } else {
          meat.write(angle_meat);
          meat_1 = true;
        }
        }
     
        if(Feed_weight_gur < FEED_GUR_MAX) //если коту можно есть
        {
          digitalWrite(LED_GREEN, HIGH); //индикация
          digitalWrite(LED_RED, LOW);
       
          dry_feed.write(DRY_FEED_ANGLE); //угол для открытия клапана подачи корма
          delay(FEED_20_GRAMMS); //время, для высыпания 20 грамм
          dry_feed.write(0); //возвращаемся в исходный угол
       
          Feed_weight_gur = Feed_weight_gur + 20; //заносим количество съеденного корма
          Dry_feed_weight = Dry_feed_weight - 20;
          delay(feed_cat_20);
        } else {
          digitalWrite(LED_GREEN, LOW);
          digitalWrite(LED_RED, HIGH);
        }
      }

      if(cat_data_right > 610 && cat_data_left > 610) //авторизация кота (кася)
      {
        digitalWrite(WATER_PUMP, HIGH); //подаем воду
        Blynk.virtualWrite(6, HIGH); //отправляем в приложение сигнал
        Blynk.virtualWrite(7, LOW);
     
        if(Feed_weight_Kasia >= FEED_KASIA_MAX) { //вечерний прием мяса
        if(meat_1 = true) { //определяем, как открывать бункер (если кошка ест первой или второй)
          meat.write(angle_meat * 2);
          meat_2 = true;
        } else {
          meat.write(angle_meat);
          meat_1 = true;
        }
        }
     
        if(Feed_weight_Kasia < FEED_KASIA_MAX) //если кошке можно есть
        {
          digitalWrite(LED_GREEN, HIGH); //инфдикация
          digitalWrite(LED_RED, LOW);
       
          dry_feed.write(DRY_FEED_ANGLE); //угол для открытия клапана подачи корма
          delay(FEED_20_GRAMMS); //время, для высыпания 20 грамм
          dry_feed.write(0); //возвращаемся в исходный угол
       
          Feed_weight_Kasia = Feed_weight_Kasia + 20; //заносим количество съеденного корма
          Dry_feed_weight = Dry_feed_weight - 20; //считаем, сколько корма осталось
          delay(feed_cat_20); //ждем, пока кот съест порцию
        } else {
          digitalWrite(LED_GREEN, LOW);
          digitalWrite(LED_RED, HIGH);
        }
      }
      if(cat_data_right > 390 && cat_data_right < 610 && cat_data_left > 390 && cat_data_left < 610)
      { //если котов нет

        delay(500);
        digitalWrite(WATER_PUMP, LOW);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
     
        Blynk.virtualWrite(6, LOW);
        Blynk.virtualWrite(7, LOW);
      }

      if (irrecv.decode(&results)) { //функция для управления "на месте"
        switch (results.value) {
          case 0x77E13A3B:    //закрываем бункер для мяса
          meat.write(0);
          meat_2 = false;  //устанавливаем, что бункер полный
          meat_1 = false;
          tone(BUZZER, 600, 600); // 0,6 сек. (оповещение)
          break;
       
          case 0x77E1603B:    //вечерний сброс съеденного корма
          Feed_weight_Kasia = 0;
          Feed_weight_gur = 0;
          tone(BUZZER, 600, 300);  //индикация сброса
          digitalWrite(LED_GREEN, HIGH);
          digitalWrite(LED_RED, HIGH);
          delay(300);
          tone(BUZZER, 600, 300);
          digitalWrite(LED_GREEN, LOW);
          digitalWrite(LED_RED, LOW);
          break;
        }
          irrecv.resume();
      }

      Blynk.virtualWrite(1, Feed_weight_gur); //выводим показания датчиков в приложение
      Blynk.virtualWrite(2, Feed_weight_Kasia);
      Blynk.virtualWrite(3, Dry_feed_weight);
      Blynk.virtualWrite(4, temp_c);
      Blynk.virtualWrite(5, light);

      if(Add_gur == HIGH) {              //балуем кота со смартфона  (даем лишнюю порцию)
        FEED_GUR_MAX = FEED_GUR_MAX + 20;
        delay(2000);
      }
      if(Add_Kasia == HIGH) {            //балуем кошку со смартфона (даем лишнюю порцию)
        FEED_KASIA_MAX = FEED_KASIA_MAX + 20;
        delay(2000);
      }

    }
     
  4. Vad33

    Vad33 Капитан-оригинал

    У вас коты разного окраса и могут заходить в кормушку только по одному? :)

    По опыту похожего проекта, больше всего у меня было проблем с механикой подачи корма.
     
  5. okuznetcov

    okuznetcov Нерд

    Коты одного окраса, русские голубые. Определение происходит с помощью двух датчиков холла и магнитов, находящимся в ошейнике. А по поводу входа, то да. По одному.
     
  6. 9xA59kK

    9xA59kK Гик

    А если они оба подойдут к кормушки?
     
    okuznetcov нравится это.
  7. okuznetcov

    okuznetcov Нерд

    Корпус сделан таким образом, что подойти может только один кот. Скоро выложу эскиз конструкции
     
  8. Vad33

    Vad33 Капитан-оригинал

    Они не подерутся у кормушки? А то так и не долго разломать конструкцию из-за еды...
     
  9. okuznetcov

    okuznetcov Нерд

    Нее, коты- это мама и сын. Они мирные и тихие. И кстати, из за размеров "сыночка", совместимого с мейкуном, они привыкли кушать одельно (не помещаются на маленькой кухне рядом)
     
  10. okuznetcov

    okuznetcov Нерд

    Набросал небольшую схему устройства. Я конечно не художник, но как-то вот так:
    image1-1.jpg
    P.S. приобщаемся к творчеству: рисуем на iPad ;)
     
  11. KamAdm

    KamAdm Нерд

    Вместо датчика Холла, надо какой нибудь идентификатор личности животного. Можно будет вести статистику.
     
  12. Vad33

    Vad33 Капитан-оригинал

    Если кошки чипированные, то вообще проблем нет, правда сканер дорогой.
    Но можно в ошейник RFID метку сделать.
     
  13. Monstr

    Monstr Нуб

    Кормушку то сделали?
     
  14. DrProg

    DrProg Вечный нерд

    Кормушку то зачем делать, насыпал сухарей побольше, воды налил пару мисок - дня на 3-4 хватит, а на дольше все равно нельзя оставлять скотинку без присмотра.

    А вот тубз сделать, да такой чтобы сам убирал и жидкое и твердое, при этом не пугал котейку, вот это задача почти на нобелевку. Котовладельцы бы не отказались, и я в том числе.
     
    ИгорьК нравится это.
  15. Megakoteyka

    Megakoteyka Оракул

    Некоторые коты в этом случае обожрутся и будут блевать, поэтому их нужно кормить дозированно.
    Если лоток без наполнителя, то принципиально тут ничего сложного нет. Можно сделать механизм, который будет опрокидывать лоток в унитаз. А потом еще ополаскивать водой и в конце смывать воду в унитазе. А вот с наполнителем все существенно сложнее.
     
  16. Salk

    Salk Гик

    Проще домашнего робота сделать, чтобы лоток поднимал, отвозил до унитаза и опрокидывал, т.к. не у всех кошачий туалет стоит в туалете человечьем, в угоду этих же самых кошачьих. Или сильную вытяжку проложить под лотком и когда питомец сделал своё грязное дело, механизм переворачивал лоток и вытяжкой все это втягивалось в канализацию. А дозировано обратно наполнитель насыпать.
    Я бы отпугиватель сделал (думаю над этим), а то некоторые кошки в силу своих инстинктов могут до дыр заскоблить лоток издавая при этом противные звуки и довольно долго (хотя зависит от вредности этих кошачьих). Вот только что использовать в качестве отпугивателя.. Какой либо писк, резкий звук или может лазер который заинтересует внимание кошки и постепенно уводя её в сторону от лотка, т.е. отвлекая?
     
  17. Megakoteyka

    Megakoteyka Оракул

    Сдается мне, что в здравом уме никто не будет городить дома механизм для опрокидывания лотка или заводить робота :)
     
  18. Gibbel

    Gibbel Нерд

    Такое устройство уже существует на рынке, Catgenie называется. Посмотрите, как работает, и можно сделать по аналогии.
     
    Tomasina и Megakoteyka нравится это.
  19. DrProg

    DrProg Вечный нерд

    Я видел разгромный обзор на этот или подобный туалет, надо поискать. Основным недостатком является то, что он включает уборку по таймеру вне зависимости от того есть что убирать или нет, но самое главное вне зависимости от того есть кот на горшке или нет. Включится такая штука под срущим котом и он больше близко к ней не подойдет. Готовьте стиральную машину для тапок и подушек.
     
    ИгорьК нравится это.
  20. Megakoteyka

    Megakoteyka Оракул

    В видео говорят, что очистка включается кнопкой.