Автоматическая кормушка для кота

Автоматическая кормушка для кота

У меня есть рыжий кот, который, как и многие, любитель вскочить в 5 утра и поднять на уши весь дом. А все от чего? От того что биоритмы у нас с ним не совпадают. Встанешь, покормишь, и все окей.
Но вставать каждый день в 5 утра мне не особо нравится. Поэтому я решил соорудить кормушку с таймером. Как раз у меня была свободная ардуинка и сервопривод.

Конструирование контейнера и механической части

Вдохновленный роликами с ютуба, я не стал мудрить и купил упаковку Pringels. Сразу же опустошил ее и вырезал четверть площади дна.
Далее прикрутил пластиковую крестовину от сервопривода ко дну так, чтобы паз для вала сервы приходился по центру.

2018-01-11-21.44.331

2018-01-11-21.44.23-1

Нашел пластикоую банку от саморезов, вырезал в ней выямку под поверхность сервопривода, и отверстие через которое будет высыпаться корм при сомещении с отверстием пачки. Затем установил сервопривод на пару шурупов.

2018-01-11-21.44.40-1

Вставил вал сервы в паз на упаковке от чипсов и вуаля - контейнер для хранения корма готов!

2018-01-11-21.44.47-1

Электронная часть

Управление сервоприводом производится при помощи ШИМ (PWA) - широтноимпульсной модуляции.

Ардуино Нано имеет 6 портов с функцией PWA

nano

Подключаем провод управления сервоприводом к одному из портов PWA, остальные - порты питания - к 5V и GND. На этом сборка электронной части закончена.

a4a81ef4d7914facb584e68eaa7dfdb2

Программирование

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

Однако, ни одна библиотека не способна вводить контроллер в спящий режим и пробуждать по таймеру. Поэтому я решил сделать все по простому и сделать все при помощи функции delay. И запитать устройство от 5V зарядника для телефона.

Важно

Драйвер для возможности прошивки Ардуино для MacOS тут. Если использовать Version 1.3 OEM драйвера, то есть возможность словить синий экран на маке.

#include <Servo.h> //подключаем библиотеку для сервопривода

Servo myservo; 
int counter;
int am12;
int am5;
int comparer;
int delayTime;
int closeAngle;
int openAngle;

void setup() {
  counter = 0;
  delayTime = 10000; //10s
  am5 = 1440; //5 hours *60 * 60 *1000/delayTime
  am12 = 8640; //24 hours *60 * 60 *1000/delayTime
  comparer = am5;
  closeAngle = 160;
  openAngle = 60;
}

void feed() {
    myservo.attach(5); // attaches the servo on pin 5 to the servo object
    myservo.write(openAngle); //открываем кормушку
    delay(1000); //ждем 1 секунду
    myservo.write(closeAngle); //закрываем
    delay(1000); //ждем 1 секунду
    myservo.detach();
}

void loop() {
  if(counter == comparer){
    counter = 0;
    comparer = am12;
    feed();
  } else {
    counter++;
    delay(delayTime);
  }
}

Т.к. таймер выставляется при подаче питния, то мы хардкодом устанавливаем первичное время срабатывания кормушки. Т.к. я закончил этот проект около 12 ночи, то кормушка должна сработать через 5 часов. А затем подача управляющего сигнала должна производиться через 24 часа. Переводим это все в секунды/10 (т к delayTime = 10 секунд)

Когда счетчик совпадает со временем срабатывания, вызывается функция feed, которая поворачивает вал сервопривода на 100 градусов и через секунду - обратно.

Модернизация

Дальше в планах прикрутить:
* часы RTC реального времени DS3231, чтобы выпилить костыли с counter и не зависить от времени включения устройства
* Blueoth BLE HC-06, чтобы управлять кормушкой с телефона или Raspberry Pi