술 친구 로봇

작성자
김민주
작성일
2021-11-26 01:55
조회
385
안녕하세요! 저희는 술 친구 로봇 팀의 김민주, 김지원, 우연주, 차준호입니다.

저희는 와디즈에서 펀딩한 '혼술 로봇'에서 아이디어를 얻어 인공지능을 추가하여 '술 친구 로봇'을 설계했습니다.

술 친구 로봇의 기능은 술을 받거나 건배를 하는 등 술자리에서 하는 상호작용 행동은 물론, 그 실제 액체를 몸 안에 넣고 저장시키는 기능까지 계획했었습니다. 또한 LED로 이루어진 눈으로 색깔이나 모양을 통해 현재의 감정 (기분 좋음, 슬픔, 술 취함 등)을 표현합니다.

인공지능으로는 사용자와 서로 안부를 묻거나 술자리에서 어울릴만한 간단한 상호작용 대사들을 탑재하여 대화가 가능하도록 하고자 하였습니다.



아두이노 우노로 움직임을 제어하고, 라즈베리 파이로 인공지능을 구현할 계획을 세웠습니다.



마지막으로 로봇의 몸체는 3D 프린트로 만들어내고자 하였습니다.

다만 시간이 부족하여 인공지능(라즈베리파이 오류)과 실제 액체를 몸 안에 넣고 저장하는 기능은 구현하지 못하였고, 건배를 하고, 술잔을 입으로 가져간 후 마시는 동작을 수행하며, 이 과정 동안 LED의 모양의 변화를 통해 감정을 눈으로 표현하는 단계까지 제작을 완료하였습니다. 또한 3D 프린트에 차질이 생겨 대신 상자로 몸체를 구현하였습니다.



술 친구 로봇의 동작 순서는 다음과 같습니다. 우선 슬픈 표정과 함께 기본 자세로 팔을 위치시킵니다. 그 다음 로봇 팔의 끝쪽, 즉 들고 있는 술잔에 위치한 초음파 근접 센서 모듈이 사용자의 술잔과 처음으로 일정 거리 이내로 가까워지는 경우 기쁜 표정(^^)어 과 함께 팔을 술 받는 모양으로 변화시킨 다음, 일정 시간 (술 따르는 시간) 대기 후 다시 기본 자세로 돌아옵니다. 그 다음 두 번째로 사용자가 가까워지는 경우 로봇은 표정이 하트(♥♥)로 변하면서 팔을 건배하는 모양으로 변화시킨 후, 마시는 동작을 수행, 마지막으로 기본 자세로 돌아오면서 초기화됩니다.



로봇의 팔은 5개의 서보모터를 사용합니다. 모든 서보모터와 술잔의 무게를 버텨야 하는 로봇의 어깨쪽 서보모터는 다른 모터들보다 큰 것을 사용하였습니다. 이로인해 술 친구 로봇은 사람과 비슷한 모든 움직임을 구현할 수 있지만, 저희의 술 친구 로봇에는 술을 먹기에 필요한 움직임만을 구사하였습니다.

마지막으로 술 친구 로봇의 코드는 다음과 같습니다.
#include <Servo.h>
#include "LedControl.h"

int a = 0; //처음 각도
int count=0;
int trig=12, echo=13;
int mg=0, fir=0, sec=0, thir=0, four=0, head=0;

LedControl lc = LedControl(4, 8, 7, 2);//눈 DIN, GLK, CS ,번째 순

unsigned long delaytime = 500;

Servo servo_mg; //어깨쪽부터 차례대로 5개 선언
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo_head;

int sul_flag = 0;


byte happy[] =
{
  B00000000,
  B00011000,
  B00100100,
  B01000010,
  B01000010,
  B10000001,
  B10000001,
  B00000000
};

byte sad[] =
{
  B00000000,
  B10000001,
  B10000001,
  B01000010,
  B01000010,
  B00100100,
  B00011000,
  B00000000
};

byte heart[] =
{
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00011000,
  B00000000
};

void display_face(byte face[], int a)
{
  if (a == 0) {
    for (int i = 0; i < 8; i++)
    {
      lc.setRow(0, i, face[i]);
      delay(150);
    }
  } else {
    for (int i = 0; i < 8; i++) { lc.setRow(0, i, B00000000); } } } void read_angle(){ mg = servo_mg.read(); fir = servo1.read(); sec = servo2.read(); thir = servo3.read(); four = servo4.read(); } void setup() { Serial.begin (9600); servo_mg.attach(3); servo1.attach(5); servo2.attach(6); servo3.attach(9); servo4.attach(10); servo_head.attach(11); read_angle(); for ( mg ; mg>a ; mg--) {
    servo_mg.write(mg); //서보모터 초기값
    delay(10);

  for (int j=0;j<2;j++){ //얼굴 lc.shutdown(j, false); lc.setIntensity(j, 5); lc.clearDisplay(j);//2 일단 안함 } } for ( fir ;fir>a;fir--){
    servo1.write(fir);

    delay(10);
    }

  for(sec;sec>a;sec--){
    servo2.write(sec);

    delay(10);
    }
  for(thir ;thir>a; thir--){
    servo3.write(thir);
    delay(10);
    }
    
    servo4.write(180);
  

  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  delay(1000);
  display_face(sad, 0);
}

void loop() {
  int distance = checkdistance();
  Serial.println(distance);
  delay(100);
  
  if (distance<30){
    if (sul_flag == 0){
      sulbada();
    }
    else if (sul_flag == 1){
      drink();
    }
  }  
}

void sulbada()
{
  //salute 자세에서 앞에 물체가 인식되면 실행 
  display_face(happy, 0);
  for ( int i=0 ; i<50 ; i++ ){
    servo_mg.write(a+i);
    servo3.write(a+i);
    delay (10);
    }
  
  delay (1000);
  //다시 salute

  for ( int j=0 ; j<50 ; j++){
    servo_mg.write(a+50-j);
    servo3.write(a+50-j);
    delay(10);
    }
  sul_flag = 1;
  delay(1000);
}



void gunbae()
{
  
  for(int g = 0; g<90 ; g++){
    servo_mg.write(a+g);
    servo3.write(a+g);
    delay(10);
  }
  delay (1000);
}

void drink() //술 원샷하고 다시 정자세로
{
  display_face(heart, 0);
  gunbae();
  read_angle();
  //입벌리기
  for (int di=0; di<100; di++){
    servo_head.write(di);
    delay(10);
  }
  

  for( int d1=0 ; d1<80 ; d1++ ){//입앞에 술 가져가기(서보4 조절 필요)
    
    servo2.write(sec+d1);
    servo3.write(thir+d1);
    servo4.write(four-d1);
    delay(10);
    }

  delay(1000);
  
  read_angle();
  
  for(int dl=0; dl<90;dl++){
    servo4.write(four-dl);
    delay(10);
  }
  for(int dl=0; dl<90;dl++){
    servo4.write(four-90+dl);
    delay(10);
  }

// 되돌리자
  read_angle();

    for( int d2=0 ; d2<80 ; d2++ ){ //건배 자세로 돌아가기
    servo2.write(sec-d2);
    servo3.write(thir-d2);
    servo4.write(four+d2);
    delay(10);
    }
    for(int g = 0; g<90 ; g++){ //정자세로 돌아가기
    servo_mg.write(a+90-g);
    servo3.write(a+90-g);
    delay(10);
  }

  sul_flag = 0;
  count++;
  display_face(sad, 0); 
}

long checkdistance()
{
  long duration = 0, distance = 0;
  //초음파 발사 trig
  digitalWrite(trig, HIGH);
  delay(1);
  digitalWrite(trig, LOW);
 
  duration = pulseIn(echo, HIGH);

  //시간을 거리로 cm단위 환산
  distance = duration * 340 / 20000;

  return distance;
}
이상으로 술 친구 로봇의 초기 계획, 준비 과정과 결과물에 대한 설명이였습니다. 감사합니다.
전체 0