Автоматическая кормушка для кота
У меня есть рыжий кот, который, как и многие, любитель вскочить в 5 утра и поднять на уши весь дом. А все от чего? От того что биоритмы у нас с ним не совпадают. Встанешь, покормишь, и все окей.
Но вставать каждый день в 5 утра мне не особо нравится. Поэтому я решил соорудить кормушку с таймером. Как раз у меня была свободная ардуинка и сервопривод.
Конструирование контейнера и механической части
Вдохновленный роликами с ютуба, я не стал мудрить и купил упаковку Pringels. Сразу же опустошил ее и вырезал четверть площади дна.
Далее прикрутил пластиковую крестовину от сервопривода ко дну так, чтобы паз для вала сервы приходился по центру.
Нашел пластикоую банку от саморезов, вырезал в ней выямку под поверхность сервопривода, и отверстие через которое будет высыпаться корм при сомещении с отверстием пачки. Затем установил сервопривод на пару шурупов.
Вставил вал сервы в паз на упаковке от чипсов и вуаля - контейнер для хранения корма готов!
Электронная часть
Управление сервоприводом производится при помощи ШИМ (PWA) - широтноимпульсной модуляции.
Ардуино Нано имеет 6 портов с функцией PWA
Подключаем провод управления сервоприводом к одному из портов PWA, остальные - порты питания - к 5V и GND. На этом сборка электронной части закончена.
Программирование
Прежде чем начать разработку, я долго копался в гугле и пытался найти библиотеку с таймером, которая позволяла бы выставить время для срабатывания. Одним из критичных факторов было энергопотребление, т.к. хотелось чтобы система работала от 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