Собираясь в прошлом году в отпуск, решил приобрести автоматическую кормушку для домашних питомцев. Выбор был сделан в пользу изделия брэнда Animal Planet. Уже точно не помню, почему именно была выбрана эта модель, вероятно, на тот момент времени она оптимально сочетала в себе невысокую цену и достаточно хорошие потребительские свойства, представление о которых были составлены по отзывам на веб сайте amazon.com.
Устройство было в скором времени получено по почте, собрано, включено и в него был засыпан корм. Кошки сразу одобрили дизайн, радостно прибегали на шум моторчика и принимались поедать корм еще до того, как он заканчивал высыпаться сверху из бачка. Все бы хорошо, если бы не одно «но». Мне никак не удавалось добиться того, чтобы корм высыпался по установленному расписанию, ради чего собственно и затевалось дело. Но пытливые руки не сдавались и экспериментально было выяснено, что расписание иногда работает, правда, только при условии, что изначально не устанавливалось реальное время на часах. Поняв, что имею дело с явным «багом», обратился к продавцу и тот радостно заверил, что это известная проблема и мне бесплатно заменят устройство более новой версией, лишенной указанной проблемы.
Прошло несколько дней, прислали замену. В «новой версии» прибора «баг» воспроизвелся в полном объеме. К сожалению, времени на разбирательство до отъезда не оставалось и кормление кошек было поручено друзьям. После возвращения, в силу упавшей актуальности, проблема была заброшена и забыта.
Выбирая для себя учебную задачу для ознакомления с микроконтроллерами и платформой Arduino, вспомнил про забытую кормушку. Было решено использовать уже готовый механизм, реализовать систему подачу корма по расписанию, а также проверить теорию условного рефлекса Павлова.
Механизм диспенсера корма устроен таким образом, что на каждый полный поворот крыльчатки приходится 4 замыкания контакта, что соответствует 4 порциям корма. Подсчитывая число замыканий контактов можно определить, сколько корма высыпалось в тарелку.
Прототипирование устройства и отладка производилась на платформе Arduino Uno. Для подачи корма по расписанию на Ebay был приобретен модуль реального времени DS3231 cо встроенной батарейкой, в котором можно запрограммировать два будильника.
Предполагаемый алгоритм будет простым. Контроллер будет периодически просыпаться, чтобы проверить, не сработал какой-либо из запрограммированных будильников, и засыпать дальше для экономии энергии. В случае срабатывания будильника будет проиграна мелодия и высыпано требуемое количество корма. Реализация прототипа на Arduino трудностей не вызвала и ее рассмотрение мы пропустим.
В конструкции донорской кормушки есть отсек для 3-х батареек «D», от которых будет работать конечное устройство. Для уменьшения потребляемой энергии и продления жизни батареек нужно избавиться от лишнего обвеса Arduino. Для разработки конечного устройства был выбран контроллер ATTiny85. Допустимое напряжение питания для него находится в диапазоне 2.7-5.5V, поэтому применения регуляторов напряжения не потребуется и устройство может питаться напрямую от батарейки.
При проектировании конечного устройства были решены следующие задачи, на которых хотелось бы остановиться подробнее:
- Уменьшение потребления энергии. Достигается переводом контроллера в спящий режим и обесточивания ненужных в данный момент цепей, в частности, питание на модуль RTC подается только на время, необходимое для операций с этим модулем. В моей реализации потребляемый устройством ток в режиме ожидания составляет примерно 300 mkA.
- Решение проблемы с недостаточным числом выводов контроллера. Обычно это решается добавлением сдвигового регистра или переназначением функции вывода Reset. В моем случае было возможным использовать один из выводов поочередно для вывода звукового сигнала на динамик и чтения состояния контакта. Кроме того, были использованы перемычки для возможности отключения внутренних цепей устройства при переключении контроллера в режим программирования.
Принципиальная электрическая схема устройства.
Контакты J1-J4, J8-10 служат для подключения Arduino Uno в качестве программатора. Перемычки J5-J7 — для отключения внутренних цепей при программировании Attiny85. В качестве силового элемента в цепи питания электродвигателя используется N-канальный полевой транзистор с изолированным затвором рассчитанным на максимальный ток 500 mA (пусковой ток мотора не превышает 150-200 mA). Очень важно подключить сглаживающий конденсатор (С2 на схеме) большой емкости к VCC. Без него, особенно при питании от батарейки, в момент запуска мотора программа сбивается.
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Time.h> //http://playground.arduino.cc/Code/Time
#include <TinyWireM.h> //https://github.com/adafruit/TinyWireM
#include <Narcoleptic.h> //https://code.google.com/p/narcoleptic/
//The library was modified for ATTiny85 as described here:
//http://www.willowdesign.info/blog/digistump-cricket-generator/
const int Note_D = 213;
const int Note_G = 159;
const int Note_A = 142;
const int Note_B = 127;
const int Speaker = 1;
const int feedPin = 1;
const int RTCPowerPin = 4;
const int motorPin = 3;
const int MAX_FEED_TURN = 2; //Dispenced food volume
int feedCounter = 0; // counter for the number of feed revolution
int feedState = HIGH; // current state of the feed contacts
int lastFeedState = HIGH; // previous state of the feed contacts
int reading = HIGH;
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 20; // the debounce time; increase if the output flickers
void setup(void)
{
pinMode(RTCPowerPin, OUTPUT);
digitalWrite(RTCPowerPin, HIGH);
RTC.squareWave(SQWAVE_NONE);
setSyncProvider(RTC.get);
//set the system time to 17h 35m on 22 March 2015
//setTime(17, 35, 0, 22, 3, 2015);
//RTC.set(now());
pinMode(motorPin, OUTPUT);
digitalWrite(motorPin, LOW);
// initialize the feed contact pin as a input:
pinMode(feedPin, INPUT);
}
void loop(void)
{
digitalWrite(motorPin, LOW);
digitalWrite(RTCPowerPin, HIGH); //Turn RTC power ON
delay(50); //ensure RTC is stable after powering it ON
RTC.setAlarm(ALM1_MATCH_HOURS, 0, 0, 7, 0); //morning feed alarm
RTC.setAlarm(ALM2_MATCH_HOURS, 0, 0, 19, 0); //evening feed alarm
digitalWrite(RTCPowerPin, LOW); //Turn RTC power OFF
digitalWrite(Speaker, LOW);
Narcoleptic.delay(20000); // During this time power consumption is minimized
digitalWrite(RTCPowerPin, HIGH);
if (readVcc() < 3500) {
playBatteryLow();
}
delay(50); //ensure RTC is stable after powering it ON
if (RTC.alarm(ALARM_1) || RTC.alarm(ALARM_2)) { //has any of 2 Alarm1s triggered?
//yes, act on the alarm
// Wake up CPU.
feedCounter = 0;
// Wake up the CAT - play some music
playTune();
// Turn ON food dispenser motor
digitalWrite(motorPin, HIGH);
while (feedCounter < MAX_FEED_TURN) {
// read the feed input pin:
reading = digitalRead(feedPin);
// compare the feedState to its previous state
if (reading != lastFeedState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != feedState) {
feedState = reading;
// if the state has changed, increment the counter
if (feedState == HIGH) {
// if the current state is HIGH then the feed contacts
// went from on to off
feedCounter++;
}
else {
// if the current state is HIGH then the feed contact
// went from on to off:
}
}
}
// save the current state as the last state,
//for next time through the loop
lastFeedState = reading;
}
}
}
void TinyTone(unsigned char divisor, unsigned char octave, unsigned long duration)
{ //http://www.technoblogy.com/show?KVO
//TCCR1 = 0x90 | (8-octave); // for 1MHz clock
TCCR1 = 0x90 | (11 - octave); // for 8MHz clock
OCR1C = divisor - 1; // set the OCR
delay(duration);
TCCR1 = 0x90; // stop the counter
delay(duration * 1.30); // pause between notes
}
void playTune(void)
{
pinMode(Speaker, OUTPUT);
TinyTone(Note_D, 4, 125);
TinyTone(Note_D, 4, 125);
TinyTone(Note_G, 4, 250);
TinyTone(Note_G, 4, 200);
TinyTone(Note_G, 4, 62);
TinyTone(Note_A, 4, 250);
TinyTone(Note_A, 4, 200);
TinyTone(Note_A, 4, 62);
TinyTone(Note_D, 5, 350);
TinyTone(Note_B, 4, 150);
TinyTone(Note_G, 4, 300);
delay(350);
TinyTone(Note_D, 5, 500);
delay(200);
TinyTone(Note_D, 5, 500);
delay(200);
TinyTone(Note_D, 5, 500);
delay(200);
TinyTone(Note_D, 6, 1000);
TCCR1 = 0; // stop the timer
pinMode(Speaker, INPUT);
}
void playBatteryLow(void)
{
pinMode(Speaker, OUTPUT);
TinyTone(Note_D, 4, 125);
TinyTone(Note_D, 6, 250);
TCCR1 = 0; // stop the timer
pinMode(Speaker, INPUT);
}
long readVcc() { //http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
// #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
// #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
// ADMUX = _BV(MUX5) | _BV(MUX0);
// #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
// #else
// ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
// #endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA, ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high << 8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}
Комментарии к скетчу
В коде широко используются функции и фрагменты кода, найденные на просторах Интернета. Ссылки на источники приводятся в комментариях к коду.
Код для записи реального времени в RTC запускается один раз, затем я его убираю и перезаливаю скетч заново. Часы достаточно точные и коррекции времени в дальнейшем не потребуется.
Контроллер выходит из спящего режима на очень короткое время каждые 20 секунд (вполне можно увеличить то 1 минуты). В это время подается питание на RTC, производится проверка напряжения питания при помощи функции readVcc() и состояние будильников ALARM_1 и ALARM_2. При понижении напряжения ниже установленного порога 3.5 V на динамик выводится короткий звуковой сигнал. Если сработал любой из будильников которые установлены у меня на 7 часов вечера и 7 часов утра, то проигрывается музыкальная мелодия функцией playTune() и включается мотор. При подсчете порций высыпанного корма используется программное подавление дребезга контакта замыкающегося при повороте крыльчатки. Для уменьшения потребления энергии важно остановить вращение мотора в момент размыкания контактов.
Устройство было собрано методом навесного монтажа на небольшой плате размером 5x7 см.
Ну и в заключение кино про котиков:
Комментарии (52)
evnuh
03.04.2015 12:54+4Судя по видео на ютубе, автоматические кормилки — большой соблазн для котиков. Некоторые из них идут на зверские погромы ради того, чтобы добыть себе еду:
www.youtube.com/watch?v=JUyRuCgRu0Q
www.youtube.com/watch?v=KRBH21IvSrc
Так что, кормилку следует делать более защищённой, примерно как терминалы оплаты)TheRaven
03.04.2015 13:12Отсюда вывод: котеич не должен видеть корм, возможно и саму кормушку видеть не стоит.
Еще возникла мысль что котики быстро вычислят расписание кормления и это может стать негативным фактором. Может ввести пару-тройку случайностей в этот процесс?
Mokkey
03.04.2015 16:28После видео из статьи YouTube в списке похожих предлагает массу сюжетов, где котики с упоением расправляются на подобными агрегатами. Не понятно по какой логике у всех кормушек ёмкость прозрачная (для хозяев, чтобы видно было). Котэ корм видит, котэ корм чует — надо быть очень ленивым котом, чтобы не захотеть вскрыть эту банку. Просто от скуки.
Ради интереса я хотел бы увидеть за сколько секунд мой котя вскроет этот агрегат (мейн-кун, 12,5 кг молодой любознательности и слоновьей проходимости) :)
expolit
04.04.2015 03:46+3А я предлагаю перед тарелкой ставить весы.
Взешивать кота, и если он слишком тяжелый — насыпать меньше. А если легкий — больше :)
А в настройках тупо задавать желаемый вес животного :)apple01 Автор
04.04.2015 04:24Cуществуют еще «похудательные» хрустяшки, можно более активно воздействовать на вес питомца подмешивая их в нужной пропорции :)
patch1
04.04.2015 20:49котэ может подойти к тарелки не с одно и той же стороны, может вообще эти весы сдвинуть)
amarao
06.04.2015 19:10Очень интересно, сколько времени потребуется коту, чтобы научиться «недовешиватся» на весах.
patch1
Круто, но ведь это не вся проблема при отъезде.
1)Кормушку кот может перевернуть (когда балуется по ночам)
2)Что насчет поилки? можно реализовать такую же систему, но вот куда девать старую воду или молоко? Молоко прокиснет, Вода может начать плесневеть и пахнуть болотом, да и опять же кот может перевернуть поилку.
3)Туалет — купить 30 лотков и надеяться что кот будет ходить в свободные лотки и случайно не залезит в загаженный лоток?
Спрашиваю т.к тема собственно интересная.
cyber_genius
думаю кормушки и поилки должны прибиваться к стене, чтобы кот не перевернул. Поилка должна выдавать воды столько, чтобы она успевала высыхать, если кот не пьёт, воду можно дистиллированную или в боклашках очищенную, ещё есть вариант с каким-нибудь покрытием. Туалет самое сложное, простой системой тут не обойтись и обычным лотком. Наспех можно придумать такую систему закрытых лотков, со сменными лотками, места только много займёт, pp.vk.me/c624928/v624928400/27e06/usPLWdrB4xQ.jpg
edogs
Приучить кота к обычному унитазу и научить смывать. Приучить несложно, научить смывать сложнее но тут как раз можно автомат сделать.
SunX
Про смыв уже даже были статьи на Хабре :)
Zenitchik
Экспериментами на мышах это не подтвердилось. Соли организм получает почти исключительно из пищи, отсутствие их в воде практически не сказывается на солевом балансе.
MaxxxZ
На себе проверьте. Купите в автомагазине 20-30 литров и неделю пару недель пейте только её. Об ощущениях можно неплохой пост запилить.
patch1
Я пью только бутилированную воду в последнее время 2 месяца (она же вроде и есть дистиллированную ) ссылка на сайт воды и мне не хреново а лучше, т.к я ее могу выпивать по 2 литра в день (норма), а вот с под крана хорошо если 0.5 выпью за день (больше не лезит) и вот от этого хреново бывает.
MaxxxZ
По вашей ссылке (не реклама!!!):
«Протера» имеет оптимальный естественный сбалансированный природой ионно-солевой состав макро — и микроэлементов, кристальную прозрачность и великолепный вкус натуральной питьевой воды.
В составе питьевой воды «Протера» содержится более 50 жизненно необходимых для здоровья человека макро — и микроэлементов, таких как — природный кальций, магний, калий, фтор, кремний и другие необходимые человеку элементы.
Вы уверены, что понимаете значение слова «дистиляция»?
patch1
по сути это очищенная вода без вредных и полезных примесей. Нет не реклама (доставка по минску), чисто хотел уточнить, зачем предлагают дистилированую если есть бутилированая типа этой очищеная с полезными миниралами??
patch1
Словом доставка по минску, хотел подчеркнуть что в данный момент учитывая количество посетителей и любителей данной темы, мала вероятность (хотя она и есть) что сюда зайдут посмотреть комменты жители Минска, да и вреатли заинтересуются данной темой (бутилированной водой)
MaxxxZ
Да, дистиллированная — это чистый H20. Без каких-либо примисей. Минеральных, органических, полезных или вредных — не важно.
Она не стухает. Но и пить её нельзя.
Бутилированная вода имеет свойство протухать при контакте с воздухом, даже если при заливке в ней убили всю органику. Она её возьмёт из атмосферы. А дистиллированная не возьмёт.
Я дистиллированную предлагал купить и попить самому человеку, который сказал
потому что не верю в научную чистоту эксперимента на мышах.
patch1
спасибо за более понятное разъяснение, я б такую воду своему бы питомцу не рискнул бы тоже давать)
Zenitchik
Это ненаучно. Кстати, в автомагазине вода без гидразина? А то водоподготовка для технических целей разная бывает.
DIHALT
Я уже много лет пью воду из осмотического фильтра. Это практически дистилят, она даже ток не проводит. Ощущение только одно — в гостях чай пить невозможно ибо даже бутилированная вода кажется полным говном.
Теща на обратном осмосе сидит уже лет 15 наверное. Тоже никаких проблем.
patch1
Я ради эксперемента использовал 2 чайника, 1 чайник воду кипетил для варки макарон и т.д (воду с подкрана), во втором чайнике бутилированую воду кипетил (чай, кофе) в итоге в первом чайнике с пустям месяц значительный осадок, во втором чайнике 0 осадка. Мб дело в компании которая эту воду очищает и заливает в бутыль? ту что вы пьете в гостях мб не очень очищена?
DIHALT
Да я же в гости не в одно и то же место хожу. Вода везде разная, но я чувствую ее вкус и он мне не нравится.
patch1
у меня такое же ощущение когда у себя пью бутилированую) а в гостях с подкрана делают))))
DIHALT
Ставь осмос. И тогда тебе ваще везде вилы будут :)
cyber_genius
дык, на время поездки же только, потом то обычную воду можно давать
чёт мне кажется не каждого далеко кота можно к сортиру приучить, некоторые даже к лотку с трудом, да и свалится ещё сам туда)
k1b0rg
Можно использовать серебряную или медную посуду, т.к. ионы серебра и меди убивают микроорганизмы.
patch1
и за сколько по времени он убьет запах и вкус плесени? или вы предлагаете из серебра или меди, сделать «поилку» в которой будет хранится вода в течении отсутствия хозяина?) — дорогая вещь будет))
MaxxxZ
Серебряная поилка это не так дорого… по крайней мере сопоставимо со сложной электронно-механической схемой.
Но разве серебро даёт хорошую безопасность? При каких условиях и в достаточном ли количестве оно выделяет ионы в долгосрочной перспективе? И выделяются ли необходимые ионы после окисления поверхности?
patch1
т.е инкубатор в 3 литра (не миска для воды, а именно бутыль) — полностью состоящий из серебра (это не таку ж и дорого?). Если данный агрегат поможет сохранить свойство бутилированной воды, а так же защитит воду от плесени в воде, то помойму это идеальный выход (не считая стоимости данной бутыли).
MaxxxZ
Я не спец по гниению воды, но мне кажется так:
Вода стухает при контакте с кислородом. Вода в перевёрнутой бутыли гнить не будет — нет достаточного контакта, поэтому задача обеззараживания стоит только для миски, в которой вода контактирует с атмосферой. Это не большой объём и выполнить его не дорого. Если в миске вода будет чистой, то и в бутыли всё будет ок.
Zenitchik
Каким образом вода в перевёрнутой бутыли потеряет контакт с кислородом?
apple01 Автор
Вондалоустойчивость можно повысить прикрепив кормушку хомутом к стене. С поилкой сложнее, существуют простые диспенсеры, но не 30 дней наверное по указанным вами причинам и молоко придется исключить из рациона. Наверное для длительного автономного полета нужно забирать воду из водопровода и остатки периодически откачивать в канализацию. Туалет — одного может хватить на неделю, они вроде неплохо поглощают влагу и запахи. Наша кошка сама ходит на улицу через маленькую дверку.
Shajtan
Молоко кошкам вообще не особо полезно — они его плохо усваивают, ферментов нету соответствующих. Есть исключения, но чаще всего — от молока, особенно жирного, кошака может пробрать та-а-кой понос, что и тридцать лотков не спасут.
SunX
Не стоит поить кошек молоком, оно им, как минимум, не полезно (если мы говорим о коровьем молоке). Проблему с поилкой, похоже, можно решить только подключением поилки к канализации (или хотя бы холодильнику).
Что касается лотков, то экспериментально проверено, что кошка пойдет в более чистый лоток, так что за это можно не переживать :). Но вообще есть немало автоубирающих лотков.
patch1
и куда убирают отходы, «автоубирающие лотки»?
MaxxxZ
Вот рекламка:
zyalt.livejournal.com/1055710.html
там всё подробно
patch1
спасибо)
MaxxxZ
Автопоилка давно придумана:
Причём без всякой электроники.
Скажу больше — она и для мелкофракционного сыпучего корма подходит. Но тогда это было бы не для хабра.
patch1
у воды есть такое свойство как плесневеть, вода с под крана заплесневеет при комнатной температуре за 5-6 дней (если духота то за 1-2 дня может), бутилированная по факту заплесневеет через месяц полтора, но у меня был чистый эксперемент, было как то душно в комнате несколько дней, вода (бутилированная) заплесневела за 4 дня духоты (если точнее отдавала запах воды плесенью). так что такой метод, ну не знаю на сколько актуален, кот же не будет регулировать комнатную температуру при помощи открытых форточек или регуляторов на батареях.
MaxxxZ
А вот форточку можно посадить на микроконтроллер!
patch1
может сделать домашний ИИ, функции:
1) регулирует температуру в квартире (настройка регуляторов в батареях)
2) функция открытия и блокировки дверей и окон (круто когда ИИ сочтет заблокировать двери, если не почистил зубы а спешишь на работу)
3) функция автоматического смыва унитаза
4) функция автоматической выдачи корма и воды домашним животным
5) автоматическое вычисление живых существ в квартире
6) функция автокофе по утрам, кофе начинает завариваться когда видет что хозяин проснулся, если более 1 человек в квартире, делаем больше чашек.
Крутая вещь, покуда перебоя с электричеством не будет, мб еще резервный генератор поставить?
SkyNet — не загорами))
MaxxxZ
Ну или кота-киборга, который не ест а из розетки подзаряжается.
Hooter
Сама по себе вода из под крана в чистой бутылке и в темном месте может простоять год без серьезных изменений (проверял).
Проблема именно в блюдце, в котором скапливается органика, и даже если просто сливать, то на стенках все одно будет скапливаться слизь.
Надо что то типа ниппельной поилки которую применяют для грызунов и птиц.
SunX
Пробовал я такую поилку (нук точнее похожую) приходилось менять как минимум раз в два дня, после этого кошки отказывались из нее пить — в ней накапливаюится слюни, корм ну и просто вода протухает.
Такие штуки удобны, когда у Вас много кошек, а места что бы поставить таз с водой нет. Но вот для долгого отсутствия не подходит.
Если использовать для корма, то, конечно же лучше, но иногда приходится кошек ограничивать в еде — в таких случаях подобная конструкция бессмысленна.
DIHALT
Я коту наливаю 3 литровый таз воды из фильтра обратного осмоса. Пока не выхлебает обычно не обновляю. Вода не плесневеет и не пахнет ничем даже через неделю. Главное поилку ставить подальше от кормушки, у меня вообще в разных комнатах.
Туалет если засыпать силикагелем, то моча вся впитывается наглухо, а говно вполне годно закапывается и облепляется этим силикагелем. А еще усушивается до почти каменного состояния. Так что то что кот туда еще раз залезет вообще никаких проблем не создает. Двух котов оставляю на несколько дней, потом по приезду пол кило дерьма оттуда сгружаю.