Создайте надежный автоматический кормушку для кошки — DIY-проект для беспокойного ухода за питомцем
Компоненты и расходные материалы
| Механический таймер розетки | × | 1 |
| Шаговый двигатель | × | 1 |
| Драйвер шагового двигателя L9110S | × | 1 |
| Линейная опора вала SHF8 | × | 1 |
| USB-зарядное устройство для розетки | × | 1 |
| SparkFun Arduino Pro Mini 328 — 5V/16MHz | × | 1 |
| Адаптер USB Male на DIP | × | 1 |
| Удлинитель USB | × | 1 |
| Угловые крепления | × | 1 |
О проекте
Когда я уезжаю из дома на несколько дней, кормление кошки становится серьезной проблемой. Приходится просить друзей или родственников заглянуть к питомцу. В интернете я нашел множество автоматических кормушек, но они мне не подошли: во-первых, они дорогие; во-вторых, подходят только для сухого корма (моя кошка ест преимущественно влажный); в-третьих, они слишком громоздкие для моей квартиры. Поэтому я решил собрать компактный, дешевый и простой автоматический кормушку, оптимизированную для влажного корма.
Проблема влажного корма в том, что он быстро портится. После открытия банки корм пригоден максимум сутки. Чтобы сэкономить место, сохранить качество корма и сделать проект максимально дешевым и простым, я спроектировал устройство, которое выдает только одну порцию. Это дает мне два дня свободы от кормления кошки.
Принцип работы прост: я наполняю контейнер для еды (пустую коробку от йогурта), закрываю крышку и подключаю кабель с таймером розетки к сети 230В. Настраиваю таймер так, чтобы через сутки он включил питание кормушки. При подаче питания шаговый двигатель открывает крышку контейнера. Через сутки дверца открывается, и кошка получает свежий прием пищи. По возвращении я извлекаю контейнер, удаляю остатки, мою его, наполняю свежим кормом, закрываю крышку — и цикл повторяется.
Все основные этапы сборки показаны в видео.
Код
Прошивка для Arduino (C/C++)
Код загружается в Arduino Pro Mini через Arduino IDE, FTDI-адаптер и кабель Mini-B USB. Инструкция по загрузке: видео.
Алгоритм прост: в setup() шаговый двигатель поворачивается на заданный угол, затем в основном цикле ожидает нажатия кнопки для следующего вращения.
// Automatic cat feeder made by: J. Rundhall
// Original stepper code from: R. Jordan Kreindler, Oct 2016
float RPM;
boolean isButtonpressed = false;
unsigned long timee;
// Pin assignments
int buttonPIN = 6;
int aPin = 4; // IN1
int bPin = 3; // IN2
int aPrimePin = 5; // IN3
int bPrimePin = 2; // IN4
int one = aPin, two = bPin, three = aPrimePin, four = bPrimePin;
int degrees = 0;
int delay1 = 5; // задержка между шагами (мс)
int delay2 = 200; // задержка после полного оборота (мс)
int count = 0;
int numberOfRotations = 1;
void setup() {
Serial.begin(9600);
pinMode(6, INPUT_PULLUP); // Кнопка
pinMode(aPin, OUTPUT);
pinMode(bPin, OUTPUT);
pinMode(aPrimePin, OUTPUT);
pinMode(bPrimePin, OUTPUT);
Serial.println(" Clockwise");
digitalWrite(aPin, LOW);
digitalWrite(bPin, LOW);
digitalWrite(aPrimePin, LOW);
digitalWrite(bPrimePin, LOW);
for(int ii=0; ii<20; ii++) doTurn(); // Начальное вращение
}
void loop() {
int sensorVal = digitalRead(6);
// Pull-up: HIGH = отпущена, LOW = нажата
if (sensorVal == LOW) {
isButtonpressed = true;
} else {
if(isButtonpressed) {
isButtonpressed = false;
doTurn();
digitalWrite(aPin, LOW);
digitalWrite(bPin, LOW);
digitalWrite(aPrimePin, LOW);
digitalWrite(bPrimePin, LOW);
}
}
}
void doTurn() {
// Half-step sequence (8 шагов)
// 1. aPin HIGH
digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
// 2. aPin + bPin HIGH
digitalWrite(aPin, HIGH); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
// 3. bPin HIGH
digitalWrite(aPin, LOW); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
// 4. bPin + aPrimePin HIGH
digitalWrite(aPin, LOW); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, LOW); delay(delay1);
// 5. aPrimePin HIGH
digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, LOW); delay(delay1);
// 6. aPrimePin + bPrimePin HIGH
digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, HIGH); delay(delay1);
// 7. bPrimePin HIGH
digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, HIGH); delay(delay1);
// 8. bPrimePin + aPin HIGH
digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, HIGH); delay(delay1);
count += 8;
degrees = (360.0 * (count / 400.0));
if ((numberOfRotations % 2) == 1) {
Serial.println(" Clockwise ");
Serial.println(degrees);
} else {
Serial.println(" Anti-Clockwise ");
degrees = 360 - degrees;
Serial.print("-");
Serial.println(degrees);
}
if (count == 160) { // Полный оборот (400 шагов / 2.5 = 160 half-steps)
numberOfRotations++;
timee = millis();
RPM = timee / numberOfRotations;
RPM = (60000.00 / RPM);
if (numberOfRotations >= 10) {
Serial.print("RPM:");
Serial.println(round(RPM));
}
delay(delay2);
count = 0;
// Смена направления после каждого оборота
if ((numberOfRotations) % 2 == 0) {
aPin = four; bPin = three; aPrimePin = two; bPrimePin = one;
} else {
aPin = one; bPin = two; aPrimePin = three; bPrimePin = four;
}
digitalWrite(aPin, LOW); digitalWrite(bPin, LOW);
digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW);
}
}
Схемы
Сначала я выполнил пайку электроники: подключил кабели питания к плате USB-адаптера. Перед подключением к сети 230В рекомендую проверить схему лабораторным блоком питания с контролем тока — это спасет компоненты при ошибках в монтаже. Общее потребление не должно превышать 1А при 5В.
Затем собрал угловые крепления, модифицировал коробку и закрепил её на конструкции.
Производственный процесс
- DIY Thermocam: от идеи в классе к глобальному продукту
- Подробное руководство по автоматическим подавателям прутков: характеристики, преимущества и лучшие практик…
- Автоматические прессовые станки: принцип работы, преимущества и применение
- Питатели прессов: принцип работы, функции и промышленное применение
- Автоматические кованые прессы: особенности, преимущества и применение
- Пневматические бароавтоматы: экономичное решение для автоматизации токарных станков с ЧПУ
- Автоматические трубогибоны: функции, преимущества и применение
- Автоматические вращательные столы: точность и эффективность в металлообработке
- Автоматическая коробка передач: полное руководство — виды, узлы, принцип работы
- Автоматические системы смазки (ALS): принципы, виды, компоненты и преимущества