산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

믿을 수 있는 자동 고양이 급식기 만들기 – 스트레스 없는 고양이 케어를 위한 DIY 프로젝트

부품 및 소모품

기계식 콘센트 타이머×1
스테퍼 모터×1
스테퍼 모터 드라이버 L9110S×1
리니어 샤프트 서포트 SHF8×1
USB 벽면 충전기×1
SparkFun Arduino Pro Mini 328 - 5V/16MHz×1
USB Male Connectors to DIP Adapter×1
USB 연장 케이블×1
브라켓 코너 브레이스×1

프로젝트 소개

며칠간 집을 비울 때 고양이 밥을 챙기는 건 늘 큰 고민이었습니다. 친구나 친척에게 부탁해야 했죠. 인터넷에서 펫 자동 급식기를 찾아봤지만 마음에 드는 제품이 없었습니다. 첫째, 너무 비쌌고, 둘째, 건사료만 가능해서 습식 사료를 주로 먹는 제 고양이에게는 맞지 않았으며, 셋째, 크기가 너무 커서 좁은 원룸에 두기 어려웠습니다. 그래서 작고 자동으로 작동하며 습식 사료에 최적화된 고양이 급식기를 직접 만들기로 했습니다.

습식 사료의 문제는 개봉 후 금방 상한다는 점입니다. 캔을 따면 최대 하루 안에 다 써야 하죠. 공간을 절약하고 사료 신선도를 유지하면서 최대한 저렴하고 간단하게 만들기 위해, 한 끼 분량만 제공하는 기계를 설계했습니다. 덕분에 이틀간 고양이 밥 걱정 없이 외출할 수 있게 되었습니다(자유!).

작동 원리

급식기 작동은 매우 간단합니다. 식품 용기(빈 요거트 통)에 사료를 담고 뚜껑을 닫은 뒤, 콘센트 타이머가 연결된 케이블을 220V 콘센트에 꽂습니다. 타이머를 설정해 하루 뒤에 급식기에 전원이 들어오게 하면 됩니다. 전원이 켜지면 스테퍼 모터가 용기 뚜껑을 열어주고, 고양이가 식사할 수 있게 됩니다. 귀가 후에는 용기를 꺼내 남은 사료를 치우고 새 사료를 채운 뒤 다시 장착하면 사이클이 반복됩니다.

믿을 수 있는 자동 고양이 급식기 만들기 – 스트레스 없는 고양이 케어를 위한 DIY 프로젝트

주요 제작 과정은 다음 영상에서 확인할 수 있습니다.

코드

Automatic_cat_feeder 아두이노 코드 (C/C++)

아두이노 프로 미니 보드에 아두이노 IDE(https://www.arduino.cc/en/Main/Software)와 FTDI 어댑터, Mini-B USB 케이블을 사용해 코드를 업로드했습니다. 업로드 과정은 다음 영상을 참고하세요: https://www.youtube.com/watch?v=78HCgaYsA70

코드는 단순합니다. setup에서 스테퍼 모터를 한 번 돌리고, 메인 루프에서 버튼이 눌릴 때까지 대기하다가 눌리면 다시 한 번 회전합니다.

// Automatic cat feeder made by: J. Rundhall
// Original code for stepper from: Sketch by R. Jordan Kreindler, written October 2016
float RPM; boolean isButtonpressed = false; unsigned long timee;

// Pin assignments
int buttonPIN = 6;
int aPin = 4;  // IN1: coil a one end
int bPin = 3;  // IN2: coil b one end
int aPrimePin = 5; // IN3: coil aPrime other end of coil a
int bPrimePin = 2; // IN4: coil bPrime other end of coil b
int one = aPin; int two = bPin; int three = aPrimePin; int four = bPrimePin;
int degrees = 0;
int delay1 = 5;  // The delay between each step in milliseconds
int delay2 = 200; // The delay after each full revolution, in milliseconds
int count = 0; // The number of steps
int numberOfRotations = 1; // The number of times the rotor has turned 360 degrees.

void setup() {
  Serial.begin(9600);
  pinMode(6, INPUT_PULLUP); // Button
  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 means logic is inverted: HIGH when open, LOW when pressed
  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 for stepper motor
  // 1. aPin HIGH
  digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW);
  digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW);
  delay(delay1);
  // 2. aPin and 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 and 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 and 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 and aPin HIGH
  digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW);
  digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, HIGH);
  delay(delay1);

  count = 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) { // A full revolution
    numberOfRotations = ++numberOfRotations;
    timee = millis();
    RPM = timee / numberOfRotations;
    RPM = (60000.00 / RPM);
    if (numberOfRotations >= 10) {
      Serial.print("RPM:");
      Serial.println(round(RPM));
    }
    delay(delay2);
    count = 0;
    
    // Reverse direction after each turn
    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 어댑터 PCB에 전원 케이블을 연결할 때만 두 번 사용했습니다. 220V 네트워크에 연결하기 전, 전류 제어 및 측정이 가능한 실험실용 벤치 파워 서플라이로 먼저 테스트할 것을 권장합니다. 배선 오류가 있을 경우 어댑터나 다른 부품 손상을 방지할 수 있습니다. 전체 소비 전류는 5V에서 1A 미만이어야 합니다.

이후 코너 브레이스를 조립하고 박스를 가공해 기계 구조물에 고정했습니다.

믿을 수 있는 자동 고양이 급식기 만들기 – 스트레스 없는 고양이 케어를 위한 DIY 프로젝트

제조공정

  1. DIY 서모캠: 교실 아이디어에서 글로벌 제품으로
  2. 자동 바 피더 종합 가이드: 특징, 이점, 모범 사례
  3. 자동 프레스 머신(Automatic Press Machine)의 작동 원리, 장점 및 응용 분야
  4. 프레스 피더의 작동 원리, 기능 및 산업적 응용 이해하기
  5. 자동 파워 프레스 이해: 특징, 이점, 응용 분야
  6. 공압 바 피더: CNC 선반 자동화의 가성비 솔루션
  7. 자동 파이프 벤더의 이해: 기능, 장점 및 응용 분야
  8. 자동 로터리 테이블: 금속 가공의 정밀도와 효율성
  9. 자동 변속기 시스템 종합 가이드: 종류, 부품, 작동 원리
  10. 자동 급유 시스템(ALS) 완벽 가이드: 종류·구성·작동·장단점 총정리