본문 바로가기

메이커 Maker

반려동물 공놀이 기구, 놀아주개 작품 소개

반응형

 

 

아이들이 잘 만든 작품이었다. 물론 이런 제품이 몇 개 나와 있지만 전혀 모른채 작업했다. 꼭 만들어 보고 싶은 작품이었는데 스스로 아이디어를 내고 만들었고, 나중에 LINC+ 산학연계 교육과정 영상콘텐츠 공모전에 출품하여 전시하고 직접 시연하는 기회를 얻었다. 우리는 늘 넘을 수 없다고 생각하는 한계에 부딪힌다. 일부는 넘지 못하고 누군가는 넘는다. 넘는 사람의 성취를 누구나 부러워 한다. 그건 자기 자신에게 달려있는데도 말이다. 늘 뛰어 넘으려고 노력해야 한다.

 

 

유튜브 영상을 보시려면 링크를 클릭

 

Follow Bot: 메타버스(Metaverse) 경험 기반 원격 제어 로봇

놀아주 개 - 반려동물 공놀이 기구

반려견 무선 목줄

칵테일 제조 서비스 로봇

지하철 임산부 좌석보호 시스템

음식을 직접 테이블로 배달하는 비대면 서비스로봇

시각 장애인 횡단보도 안전 지킴이 

 

 

2021년 1학기 어드벤처 디자인 작품 목록 리스트와 블로그 링크

 

Follow Bot: 메타버스(Metaverse) 경험 기반 원격 제어 로봇

놀아주 개 - 반려동물 공놀이 기구

반려견 무선 목줄

칵테일 제조 서비스 로봇

지하철 임산부 좌석보호 시스템

음식을 직접 테이블로 배달하는 비대면 서비스로봇 

시각 장애인 횡단보도 안전 지킴이

 

 

반려동물 공놀이 기구, 놀아주개 작품 소개 

 

작품 제안 배경 

 

농림축산식품부와 국민경영연구소의 자료에 따르면 2020년 말 반려동물을 기르는 반려가구는 604만 가구로 한국 전체 가구의 약30%에 해당한다.

 

또한, 반려동물을 기르는 가구 또한 매년 증가하고 있는 추세이다. 2019년 대비 2020년은 반려동물을 기르는 구가가 1.3% 증가했다. 이에 따라 반려동물을 기르는 사람들의 반려동물 상품에 대한 관심이 증가하고 있다.  

 

반려동물 가구 현황, 2021 한국반려동물 보고서, KB 금융그룹 경영연구소

 

반려동물과 함께하는 시간에 변화가 있는지 반려가구를 조사한 결과 약75%는 반려동물을 집에 혼자 남겨두는 경우가 있다고 답했다. 또한, 혼자 남겨두는 시간은 평균 5시간 40분으로 꽤나 긴 시간동안 반려동물을 혼자 남겨둔다. 반려동물은 혼자 있을수록 분리불안 증세를 느끼게 되어 이상행동을 보이는 경우가 있다.

 

이를 방지하고자 반려동물을 겨냥한 시장을 파악해보면 ‘펫테크’라고하는 상품을 판매하고 있다. 그림2 자료를 살펴보면 50%가 넘는 반려가구가 반려동물에게 자동으로 급식을 줄 수 있는 상품을 구매하여 사용중이다. 우리 조는 앞서 얘기한 반려가구의 증가와 펫테크 시장의 성장을 파악하고 반려동물을 위한 펫테크를 만들고자 하였다. 

 

펫 테크 사용 현황, 반려동물 가구 현황, 2021 한국반려동물 보고서, KB 금융그룹 경영연구소

 

 

아이디어 구현

 

펫테크 중에서도 주인들의 걱정을 많이 덜어줄 자동 장난감을 만들기로 정했고, 활동적이면서 안전하고 반려동물의 스트레스를 해소해 줄 장난감을 생각했다. 주인과의 공놀이를 할 때 반려동물이 스트레스도 해소가 되며 활동적이라 느끼고, 이를 자동적으로 할 수 있게 그리고 안전하게 만들 수 있다면 좋은 상품이 될 수 있다고 생각했다. 야구선수들이 훈련할 때 사용하는 피칭머신처럼 공을 넣으면 공을 쏴주는 기계를 만들면 좋겠다고 판단했다. 

 

그림 1 피칭 머신

그림1은 야구 피칭머신을 참고하여 가지고 있던 장비들로 구현해본 틀이다. 공을 쏴줌으로써 반려동물이 혼자 놀 수 있고 반려동물이 작품에 공을 넣는다면 자동적으로 공을 쏴주는 방도로 개발하려고 했고, 반려동물이 공을 다시 물어와 넣는다면 간식과 주인의 목소리가 녹음된 음성을 들려주도록 개발했다. 

 

구성품 설명

 

놀아주개’의 하드웨어 및 프로그램 

 

위에서도 간략하게 언급되었다시피, 전반적인 작동 알고리즘은 장치가 발사한 공을 강아지가 물어와 입구에 다시 넣게 되면 스피커에서 주인의 칭찬 문구가 재생됨과 함께 상단의 먹이통에서 먹이가 나오는 것을 반복하는 것이다. 공의 발사는 야구장의 피칭머신에서 아이디어를 얻어 서로 역방향으로 회전하는 모터의 바퀴 사이에 공이 굴러가도록 하여 순간적으로 큰 가속도를 가지고 발사되도록 하였고, 투입된 공이 중간에 가속을 받아야 하므로 관의 중간에 양쪽으로 구멍을 뚤고, 안으로 회전하는 바퀴가 들어올 수 있도록 하였다.

 

이때 처음에는 공을 발사만 해야 하고, 이후로 공을 가져온 것에 대해 보상을 제공해야 하기 때문에 조건문을 활용하여 1차 시도에는 별다른 반응이 일어나지 않도록 코드를 작성하였다.

 

공의 인식은 입구에 부착된 컬러센서로 이루어지며, 인식 오류를 최소화하고자 공의 색깔은 흰색, 입구와 공이 흘러가는 관의 색깔은 검은색으로 하여 색깔 대비를 이루었다. 또한, 강아지가 공을 물어왔을 때 간식을 받아먹을 충분한 시간이 필요하기 때문에 특정 시간이 지난 후에 공이 발사될 수 있도록 하는 컨트롤이 필요했다. 이를 위해 입구의 컬러센서 바로 아래에 서보모터로 입구를 열고 닫을 수 있는 공간을 마련하였다. 마지막으로 먹이통은 내부를 경사지게 하고, 상단에 입구를 열고닫을 수 있는 서보모터를 부착하여 입구가 열리면 먹이가 경사를 따라 내려옴으로써 강아지에게 제공되는 방식으로 설계하였다. 

 

시행착오 및 주의사항

 

모터의 핀 설정 과정에서 중복정의가 일어나 모터의 작동이 되지 않는 문제가 있었다. 공의 발사에 사용된 DC모터는 모터 드라이버의 별도의 위치에 연결을 하기 때문에 코드상에서 출력 핀을 설정하더라도 메인보드에는 연결되지 않는다. 때문에 서보모터와 DC모터 중 하나가 같은 출력 핀으로 설정되어 있었음에도 알아차리지 못하고 장시간 동안 문제 해결에 힘을 쓰게 되었다. 따라서 본 제품의 사용 시 모터의 출력 핀 설정에 주의할 필요가 있다.

 

기대효과

 

이 작품이 더욱 개발된다면, 작품을 만들고자 했던 반려동물의 분리불안 극복, 주인의 걱정 감소가 해결된다. 또한, 소형화를 개발할 수 있으므로 조금 더 소형화를 시킨다면 또 다른 목적인 주인이 직접 공을 던져 주는 것이 아니라 주인이 공을 쏴주는 형식으로 바뀔 수 있는 다양성도 가지고 있다. 더욱 개발할 수 있는 기회가 주어진다면 주인이 둔 장소에 고정되어 공을 발사하는 것이 아니라 바퀴를 달아 공을 불규칙한 장소에서 발사하고, 공을 발사하는 형태도 여러군데에서 무작위로 발사되도록 개발할 것이다. 

 

반려동물 공놀이 기구, 놀아주개 작품 소개

 

반려동물 공놀이 기구, 놀아주개 작품 소개

 

전체 동작 코드

 

#include <Servo.h>
#include <Adafruit_TCS34725.h>
#define S_LED 7
#define RGB_INT 2
Servo myservo1;
Servo myservo2;
double m1;                                    // double형 변수 2개 선언
double m2;

int count = 0;
uint16_t r, g, b, c;
const int dirPinA = 10;
const int pwmPinA = 12;
const int dirPinB = 11;
const int pwmPinB = 13;

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_1X);
volatile boolean rgb_flag = false;

void setup() {
  myservo1.attach(8);
  myservo2.attach(9);
  myservo1.write(0);                          // 두 서보모터의 초기 각도 0도로 설정
  myservo2.write(0);
  delay(2000);
  pinMode(dirPinA, OUTPUT);
  pinMode(pwmPinA, OUTPUT);
  pinMode(dirPinB, OUTPUT);
  pinMode(pwmPinB, OUTPUT);
  pinMode(RGB_INT, INPUT_PULLUP);
  pinMode(S_LED, OUTPUT);
  pinMode(5, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(RGB_INT), RGB_isr, FALLING);
  Serial.begin(115200);
  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1);
  }

  tcs.write8(TCS34725_PERS, TCS34725_PERS_2_CYCLE);
  tcs.setInterrupt(true);
  Serial.flush();
}

void loop() {
  if (rgb_flag) {
    getRawData_noDelay(&r, &g, &b, &c);

    Serial.print("r: "); Serial.print(r);    Serial.print(",");
    Serial.print("g: "); Serial.print(g);    Serial.print(",");
    Serial.print("b: "); Serial.print(b);    Serial.print(",");
    Serial.print("c: "); Serial.println(c);
    tcs.clearInterrupt();
    rgb_flag = false;
    digitalWrite(S_LED, HIGH);
  }

  if (c > 300) {
    if (count >= 1) {
      delay(1000);
      myservo2.write(30);
      delay(500);
      digitalWrite(5, 1);
      digitalWrite(5, 0);
      myservo2.write(0);
      delay(6000);
    }
    delay(3000);

    digitalWrite(dirPinA, HIGH);
    analogWrite(pwmPinA, 250);
    digitalWrite(dirPinB, HIGH);
    analogWrite(pwmPinB, 250);
    delay(1000);

    myservo1.write(65);
    delay(500);
    digitalWrite(dirPinA, LOW);
    analogWrite(pwmPinA, 0);
    digitalWrite(dirPinB, LOW);
    analogWrite(pwmPinB, 0);
    delay(100);
    myservo1.write(0);
    delay(500);
    count = 1;
  }
}

void RGB_isr() {
  rgb_flag = true;
  digitalWrite(S_LED, LOW);
}

void getRawData_noDelay(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c) {
  *c = tcs.read16(TCS34725_CDATAL);
  *r = tcs.read16(TCS34725_RDATAL);
  *g = tcs.read16(TCS34725_GDATAL);
  *b = tcs.read16(TCS34725_BDATAL);
}

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^