Автоматическая кормушка для кошек, сделанная своими руками
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Когда я ухожу из дома на несколько дней, кормить кошку всегда сложно. Я должен попросить друзей или родственников позаботиться о моей кошке. Я искал решение в Интернете и нашел много раздаточных устройств для домашних животных, но они мне не понравились. Во-первых, они очень дорогие. Во-вторых, они подходят только для работы с сухим кормом для кошек (большую часть времени мика ест влажный корм). Наконец, они слишком большие, у меня в квартире не так много места. Поэтому я решил создать компактную автоматическую кормушку для кошек, оптимизированную для влажного корма. Проблема с влажной пищей в том, что она быстро портится. Я понял, что после того, как открою консервы для кошек, у меня есть максимум 1 день, чтобы им воспользоваться. Чтобы сэкономить место и сохранить качество корма, а также сделать этот проект максимально дешевым и простым, я разработал машину, которая может кормить питомца только один раз. Это даст мне два дня отсутствия в моих обязанностях по кормлению кошек (свобода :)).
Кормушка работает очень просто. Я заполняю пищевой контейнер (пустую коробку из-под йогурта) едой, закрываю дверцу контейнера и подключаю кабель с таймером розетки к сети 230VAC. Я настроил таймер так, чтобы через день он включил кормушку. Когда прибор включен, контейнер для еды открывается серводвигателем. Через день дверь откроется, и кошка сможет хорошо поесть. Когда я прихожу домой, я удаляю контейнер с едой, убираю остатки и наполняю свежими продуктами, затем кладу обратно и закрываю верх коробки, и цикл может начаться снова.…
Все основные шаги можно увидеть в этом видео:
Код
- Код Arduino Automatic_cat_feeder
Код Arduino Automatic_cat_feeder C / C ++
Исходный код прошивки Arduino. Я загрузил код на мини-плату Arduino pro с помощью программного обеспечения Arduino IDE (https://www.arduino.cc/en/Main/Software), адаптера FTDI и USB-кабеля Mini-B. Вот видео о том, как это сделать:https://www.youtube.com/watch?v=78HCgaYsA70Код прост. В настройке он повернет шаговый двигатель, чем в основном цикле, он ждет, пока кнопка не будет нажата, затем он снова переместится.
// Автоматическая кормушка для кошек, сделанная:J. Rundhall // Исходный код для шагового от:Эскиз Р. Джордана Крейндлера, написанный в октябре 2016 г., для вращения RPM; логическое isButtonpressed =false; unsigned long timee; // Назначение выводов int buttonPIN =6; int aPin =4; // IN1:свернуть a one endint bPin =3; // IN2:катушка b one endint aPrimePin =5; // IN3:катушка aPrime другой конец катушки aint bPrimePin =2; // IN4:катушка bPrime другой конец катушки bint one =aPin; int two =bPin; int three =aPrimePin; int four =bPrimePin; int sizes =0; // int delay1 =20; // Задержка между каждым шагом в миллисекундах int delay1 =5; // Задержка между каждым шагом в миллисекундах // int delay2 =50; // Задержка после каждого полного оборота в миллисекундах int delay2 =200; // Задержка после каждого полного оборота в миллисекундах int count =0; // Количество шаговint numberOfRotations =1; // Сколько раз ротор // повернулся на 360 градусов .void setup () {// Установить все выводы как выходные для отправки выходных сигналов от Arduino // UNO на обмотки катушки statorSerial.begin (9600); // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит / с pinMode (6, INPUT_PULLUP); // ButtonpinMode (aPin, OUTPUT); pinMode (bPin, OUTPUT); pinMode (aPrimePin, OUTPUT); pinMode (bPrimePin, OUTPUT); Serial.println ("Clockwise"); // Начать со всех катушек offdigitalWrite (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); // Помните, что подтягивание означает инвертированную логику кнопки. Он становится // ВЫСОКИМ, когда он открыт, и НИЗКИМ при нажатии. Включите контакт 13, // когда кнопка нажата, и выключите, если это не так:if (sensorVal ==LOW) {isButtonpressed =true; } else {если (isButtonpressed) {isButtonpressed =false; doTurn (); digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); }}} void doTurn () {// Посылаем ток // 1. aPin // 2. aPin и bPin // 3. bPin // 4. Затем к bPin и aPrimePin // 5. Затем к aPrimePin // 6. Затем к aPrimePin и bPrime Pin // 7. Затем к bPrimePin // 8. Затем к bPrimePin и aPin. // Таким образом, создание шагов с использованием метода полушага // 1. Установите значение aPin High digitalWrite (aPin, HIGH); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 // 2. Подключаем aPin и bPin к HIGH digitalWrite (aPin, HIGH); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 3. Установите для bPin значение High digitalWrite (aPin, LOW); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 4. Установите для bPin и aPrimePin значение HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, HIGH); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, LOW); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 5. Установите для пина aPrime высокое значение digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, LOW); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 6. Установите для aPrimePin и bPrime Pin значение HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, HIGH); digitalWrite (bPrimePin, HIGH); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 7. Установите для bPrimePin значение HIGH digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, HIGH); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды // 8. Установите для bPrimePin и aPin значение HIGH digitalWrite (aPin, HIGH); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, HIGH); // Позвольте некоторую задержку между подачей питания на катушки, чтобы дать // шагному ротору время среагировать. задержка (задержка1); // Итак, delay1 миллисекунды count =count + 8; градусы =(360.0 * (count / 400.0)); if ((numberOfRotations% 2) ==1) {// Проверяем, четное ли количество оборотов Serial.println ("По часовой стрелке"); Serial.println (градусы); // Печатать угловое положение в градусах} else {// Если numberOfRotations нечетное число Serial.println ("Против часовой стрелки"); градусы =360 - градусы; Serial.print ("-"); // Выводим знак минус Serial.println (градусы); // Вывести угловое положение в градусах} if (count ==160) {// Полный оборот шагового двигателя numberOfRotations =++ numberOfRotations; timee =миллис (); RPM =timee / numberOfRotations; // Среднее время вращения RPM =(60000.00 / RPM); // Количество оборотов в минуту if (numberOfRotations> =10) {Serial.print ("RPM:"); Serial.println (раунд (об / мин)); // Вывести число оборотов в минуту в виде целого числа} delay (delay2); // задержка 2/1000 секунд после каждого полного вращения count =0; // Сбрасываем счетчик шагов на ноль // Обратное направление после каждого поворота if ((numberOfRotations)% 2 ==0) {// Проверяем, четное ли количество оборотов // если да, обратное направление aPin =четыре; bPin =три; aPrimePin =два; bPrimePin =один; } else {// Если количество оборотов нечетное aPin =one; bPin =два; aPrimePin =три; bPrimePin =четыре; } digitalWrite (aPin, LOW); digitalWrite (bPin, LOW); digitalWrite (aPrimePin, LOW); digitalWrite (bPrimePin, LOW); }}
Схема
Сначала я подключил электронику. Я использовал свой паяльник всего два раза, чтобы подключить кабели питания к плате USB-адаптера. Перед подключением к сети 230В рекомендую использовать лабораторный настольный блок питания с контролем и измерением тока. если вы неправильно подключили кабель, эта проверка может спасти вас от повреждений адаптера или другого компонента. Общее потребление должно быть меньше 1 Ампер при 5 Вольт.Во-вторых, я собрал угловые распорки, затем модифицировал коробку и закрепил ее на конструкции машины.
Производственный процесс
- Сделайте самодельную термокамеру
- Плюсы и минусы автоматических устройств подачи прутка
- Что такое автоматический пресс?
- Что такое пресс-питатель?
- Что такое автоматический силовой пресс?
- Что такое пневматический питатель прутка?
- Что такое автоматический трубогиб?
- Что такое автоматический поворотный стол?
- Понимание системы автоматической коробки передач
- Понимание автоматической системы смазки