미로 찾기

작성자
박재현
작성일
2021-04-25 22:56
조회
851
미로 찾기

2021 SIOR 실습 세미나 주제 '미로 찾기'는 아두이노 포럼의 Arduino Marble Maze Labyrinth를 기반으로 설계되었습니다.

(https://create.arduino.cc/projecthub/AhmedAzouz/arduino-marble-maze-labyrinth-bd9ea6)


준비물

(필수) 아두이노, 브래드보드, 점퍼선, 서보모터(sg-90) 2개, 조이스틱 모듈 (SZH-EK056/선택) , 초음파 센서(HC-SR04), 능동 부저, 택트 스위치 등

간략한 설명

'미로 찾기' 장치는 조이스틱으로 서보모터를 조종하여 미로판의 x,y축을 회전시켜 공을 움직이는 것이 핵심입니다.

부가적으로, '미로 찾기'에서는 버튼을 눌러 게임을 시작하고, 초음파 센서를 이용해 공이 도착점에 도착했는지 판단하여 부저가 울리게 하는 것을 추가하였습니다.

따라서 수강자들이 제작 전에 숙지해야할 것들은 1) 조이스틱을 움직여 코드상에서 값 받아오기, 2) 서보모터 작동시키기, 3) 버튼 누름 인식하기,

4) 초음파센서 거리 값 받아오기, 5) 부저음 내기등이 있습니다. 위 5가지를  미리 연습해보고,  제작을 시작한다면 훨씬 수월하게 제작할 수 있을 것입니다.

기초 세미나에서 진행하였던 서보모터 작동, 버튼(스위치) 누름, 초음파 센서 값 받아오기는 기초 세미나에서 진행하였기 때문에 생략하도록 하겠습니다.

구글링하면 손쉽게 예제 코드를 찾을 수 있어 팀원들끼리도 잘 할 수 있을 것으로 생각됩니다.

1) 조이스틱을 움직여 코드상에서 값 받아오기



위 사진을 보다시피 조이스틱 모듈에는 총 5개의 핀이 존재합니다. 우리는 맨 오른쪽에 위치한 SW핀을 제외하고 GND, +5V, VRx, VRy핀, 4개의 핀을 사용합니다. GND, +5V 핀은 아두이노의 GND, 5V핀에 꼽아주면 되고, VRx, VRy는 아날로그 신호로 INPUT 되므로,  원하는 아날로그 핀에 꼽아주도록 합시다. (ex) A0, A1) 조이스틱의 VRx가 x축의 값, VRy는 y축의 값을 출력해줍니다. 값을 받아오는 방법은 초음파 센서의 pwm 신호를 받는 것과 비슷하게, analogRead(핀넘버)함수를 사용하면 됩니다.
int x_pin=0; //x축 핀(A0)
int y_pin=1; //y축 핀(A1)

int x_axis, y_axis; //x축, y축 값 변수

void setup()
{
    pinMode(A0, INPUT); //핀모드 선언: 인풋으로
    pinMode(A1, INPUT);
    Serial.begin(9600);

}

void loop()
{
    x_axis = analogRead(x_pin); // x,y축 값 받아오기 (0-1023값 사이로 들어옴)
    y_axis = analogRead(y_pin);

    Serial.print("x_axis: "); //시리얼 창에 출력
    Serial.print(x_axis);
    Serial.print(" / ");
    Serial.print("y_axis: ");
    Serial.println(y_axis);
    delay(5);
}
이 값의 변화를 이용해서 서보모터의 각도를 조정하면 됩니다! 여기서 한가지 팁은 조이스틱 아날로그에서 들어오는 값은 0-1023 사이의 값으로 들어오고,서보모터의 각도 범위는 0-180도이므로, 0-1023을 0-180으로 변환해야 합니다. 이때 사용하기 좋은 함수가 map(변환할 변수, 초기최소값, 초기 최대값, 이후 최소값, 이후 최대값) 입니다. 범위를 지정해주면 위 함수가 선형변환을 통해 알아서 범위에 맞게 변환시켜 출력해 줍니다.  위 코드에서 x_axis를 각도 범위로 변환하고 싶다면, 임시 변수 temp_x 같은 변수를 선언한 후, temp_x = map(x_axis, 0, 1023, 0, 180)과 같이 작성하면 됩니다.

2), 3), 4) 생략, 기초 세미나 영상, ppt 참고/ 구글링 참고

5) 부저음 내기

                    

부저는 흔히 컴퓨터를 켰을때 삐-삑 소리와 같이 간단한 음을 낼때 사용됩니다. 도레미파솔라시도와 같은 간단한 음은 부저로 출력이 가능합니다. 위 사진을 보면 왼쪽 부저는 핀이 2개, 오른쪽 부저는 핀이 3개가 있습니다. 왼쪽 부저는 능동 부저, 오른쪽 부저는 수동 부저라고 부르는데, 둘은 5V 출력 핀이 따로 나뉘어 있는지에 따라 구분됩니다. 능동 부저는 전원도 GPIO pwm 핀에서 받아오는 것이고, 수동 부저는 5V 핀에서 전원을 따로 받아옵니다. 우리는 능동 부저를 쓸 예정이므로, +부분에는 디지털 pwm gpio와 연결을, 반대쪽은 GND와 연결을 하면 됩니다.
int buzzer = 3; //부저 핀

void setup() {
pinMode(buzzer, OUTPUT); //핀 모드 설정
}

void loop() {
    tone(buzzer, 262, 500); //도
    delay(500);
    tone(buzzer, 294, 500); //레
    delay(500);
    tone(buzzer, 330, 500); //미
    delay(500);
    tone(buzzer, 349, 500); //파
    delay(500);
    tone(buzzer, 392, 500); //솔
    delay(500);
    tone(buzzer, 440, 500); //라
    delay(500);
    tone(buzzer, 494, 500); //시
    delay(500);
    tone(buzzer, 523, 500); //도
    delay(500);
}
부저음을 낼 때는 tone(pin, frequency, duration) 함수를 사용합니다. 기초 세미나에서 배웠던 pwm을 이용하여 주파수를 조정하여 원하는 음계를 출력할 수 있습니다. 출력 시간을 늘리거나 줄이고 싶으면 duration을 조정하면 됩니다. tone 함수가 작동되는 중에는 3,11번 핀의 pwm이 작동되지 않으니 주의 바랍니다.

전반적인 필수 예제들은 전부 해보았으니 이제 하드웨어 제작으로 넘어가겠습니다.

하드웨어 제작



저는 아두이노 포럼의 사진과 같이 종이박스를 가공하여 제작하였습니다. 굳이 종이박스 말고도 우드락과 같이 가공이 쉬우면서도 단단한 재료를 이용하여 제작해도 됩니다.

먼저, 미로 메인판 부분을 제작합니다. 아래 사진과 같이 미로 부분을 어떻게 만들지, 미로 판의 크기는 얼마나 크게 할지, 미로 벽의 길이를 미리 계산하고 제작하면 편합니다.

       

이 '미로 찾기' 하드웨어 제작의 핵심 포인트는 바로 서보모터 회전 축입니다. 위 제작 사진과 영상을 보면 알겠지만, 한 쪽은 서보모터와 붙어있어야 하고, 반대쪽은 회전축은 자유롭게 회전하되, 다른 축은 고정되어 있어야 합니다. 일반적으로 산업에서는 이와 같이 한축으로만의 회전을 시킬때 '베어링'이라는 것을 사용하는데, 이런 곳에 베어링을 사용하기는 과하다고 생각했고, 대안으로  큰 너트와 직경이 작은 볼트를 사용하여 고정은 하면서, 회전은 잘 되도록 하였습니다. (너트의 구멍이 볼트 두께보다 더 커야 합니다!)

        



서보모터 부분은 아래 사진과 같이 판에 서보모터가 들어갈 수 있게 구멍을 내고 고정한 후, 서보모터 날개(혼)을 나사를 조여 결합한 후 글루건을 이용해 판에 붙였습니다. 이때 주의할 점이 판에 붙이기 전에 서보모터의 각도를 90도로 맞추고 수평으로 부착해야 합니다. 서보모터가 0도로 되어 있는데 판을 수평으로 놓고 부착하게 되면 한쪽으로는 돌지 못하겠죠?  또한, 서보모터는 미로 메인판에 구멍을 내서 고정하는 것이 아니라는 걸 주의하세요!! 작동 영상을 잘 살펴보고 어떻게 제작해야 할지 생각해보기 바랍니다.

           



이후 맨 바깥쪽 기둥에도 너트를 고정, 안쪽 판에 볼트를 고정하여 베어링 대용으로 사용하고, 반대쪽은 서보모터를 고정합니다. 마지막으로 두 기둥을 고정하는 밑판을 붙이면 미로 외관 제작은 완료됩니다.

               


회로도 설계

이제 위에서 했던 5가지 예제들을 한곳으로 합칠 시간입니다. 한번에 작동시키려면, 회로들도 다 합쳐야겠죠?  먼저 생각해야 할 것이 전원부입니다. 부저, 버튼을 제외하고, 초음파센서, 조이스틱, 서보모터들은 전부 전원이 필요합니다. 기초 세미나에서 언급했듯이, 모터들은 전류를 많이 사용하기 때문에, 아두이노의 5V를 사용하면 아두이노가 꺼질 가능성이 매우 높습니다. 5V 핀에서 내보낼 수 있는 전류의 양이 한정적인데, ( 5V 핀: 약 200mA, 다른 GPIO 핀: 약 40mA) 이보다 더 많은 전류를 요구하니 버티지 못하고 꺼져버리는 것입니다. 따라서 모터류와 같이 전류를 많이 사용하는 부품들은 아두이노 5V가 아닌, 외부 전원을 연결해 주어야 합니다. 작은 모터이고, 엄청나게 많은 전류를 필요로 하지 않기 때문에, 이번 세미나에서는 간단하게 1.5V AA배터리를 직렬로 4개 연결해서 6V로 모터에 전원을 공급할 계획입니다. 나머지 초음파 센서와 조이스틱은 아두이노 5V핀으로 전원을 공급받으면 됩니다. GND는 배터리, 아두이노 GND에 꼽되, 전위차가 나지 않도록 아두이노 GND와 배터리의 GND를 연결하여 GND를 통일시켜주는 것을 추천드립니다.

나머지 선은 각자 핀에 맞게 아날로그, 디지털, 디지털 pwm에 꼽아주면 됩니다. 이와 같은 회로를 설계할 때 브래드보드를 이용하여 연결해도 되고, 저와 같이 만능기판에 납땜을 해서 회로도를 직접 설계해도 됩니다. 브래드보드를 사용할때의 장점은 납땜을 하지 않고 핀 위치를 쉽게 옮길 수 있다는 점. 만능기판을 사용할 때의 장점은 회로기판을 최적화할수 있어 보다 작은 크기로 설계할 수 있다는 점이 있습니다. 이번 세미나는 괜찮지만, 높은 전류를 사용한다면(1A이상) 테스트 후 제작 시에는 브래드보드말고 만능기판으로 제작하는 것을 추천드립니다.



위 사진은 만능기판에 납땜하기 전 납땜 위치를 그려본 사진입니다. 분홍색은 5V라인, 검은색은 GND라인, 노란색은 저항(330옴), 남색은 부품으로 들어가는 아날로그/디지털 핀, 연두색은 아두이노로 들어가는 아날로그/디지털 핀입니다. 중앙에 위치한 5V/GND는 아두이노의 5V/GND와 연결한 부분이고, 왼쪽은 AA배터리와 연결한 전원부입니다. 만약 만능기판을 사용할 때에는 5V라인과 GND라인의 합선을 주의하기 바랍니다. 합선이 일어날 경우 아두이노 기판이 고장날 가능성이 높습니다.

 

+++추가: 버튼의 한쪽은 5V, 한쪽은 버튼핀-저항(GND로 연결)-디지털 핀과 연결이 되어야 합니다!

       

위 사진과 같이 점퍼선과 연결하기 위해 '핀 커넥터'라는 부품을 기판과 납땜하였고, AA배터리 홀더 전선은 클림프와 커넥터를 이용하여 탈부착식으로 제작하였습니다.

아까도 말했듯이, 브래드보드로 제작하여도 전혀 상관 없습니다! 만능기판으로 제작하고 싶다면 상주 인원의 도움을 받아 납땜에 도전해보기 바랍니다!


소프트웨어 알고리즘 설계



제가 작성한 미로 찾기의 전반적인 알고리즘입니다. 제가 추천하는 제작 방식은  소프트웨어 알고리즘 부분을 복사하여 붙여넣어 그냥 작동만 시키기보다

위 알고리즘과는 다른 알고리즘을 직접 설계해 보고, 문제 및 버그가 발생하면 직접 해결해 나아가면서 제작하는 방식을 추천드립니다.

만약 제작 도중 도저히 모르겠거나 너무 어렵다면 아래 전반적인 코드를 참고하길 바랍니다.

지금부터는 제가 제작하면서 생긴 몇가지 문제들을 알려드리고, 이에 따라 고안한 몇가지 함수들을 설명해드리고 마치도록 하겠습니다.

1)Debounce 함수 &&  check_buttn 함수

이 함수들은 버튼 누름 유무를 판별할때 사용하는 함수입니다. 아두이노상에서 루프는 매우 빠른 속도로 순환하기 때문에 우리가 아주 짧게 버튼을 눌렀다고 생각해도 실제로는 여러 루프동안 버튼을 눌렀을 가능성이 존재합니다. 그렇게 된다면 누름 입력을 여러번 받아 의도치 않은 함수를 여러번 실행할 수 있습니다. 또한 누르지 않았는데, 잠시 불안정한 전기적 신호 노이즈에 의해 눌렀다고 판단할 가능성이 존재합니다. Debounce함수는 안누름->누름/ 누름->안누름과 같이 변화가 생겼을 때, 잠시동안 기다리고, 이후에도 같은 값을 가지고 있다면(=노이즈가 아니라면) 눌렀다고 출력해 줍니다. check_buttn 함수는 여러번 출력을 방지하기 위해서 값이 바뀔 때 한번만 출력되도록 도와주는 함수입니다.

2) writeservo 함수

우리가 일반적으로 서보모터를 제어할때는 바로 각도값을 넣어줘 해당 각도로 이동하게 합니다. 이 '미로 찾기'에서도 map 함수를 이용해 조이스틱 값에 비례해서 각도를 변환시키고, 이 각도를 바로 넣어준다면 원하는 방향으로 미로판을 회전시킬 수 있을 것입니다. 다만, 이렇게 움직여보면 서보 모터의 회전속도가 매우 빨라 1)판이 부드럽게 회전하기 어려움, 2) 빠른속도로 이동했다가 해당 각도에서 급정지하면 해당 각도에서 정확히 멈추지 못해 떨림(jiggle) 발생 등의 문제가 발생합니다.  따라서 변환한 각도 값으로 이동하는 것이 아닌  'servo1'.read() 함수를 이용하여 현재 각도보다 큰지, 작은지 확인하여 한 루프당 미리 약속한 작은 각도만 움직여 여러 루프동안 천천히 움직이도록 하였습니다.

3) prevent_zig 함수

writeservo 함수에서의 2번 문제가 정지상태에서도 발생하게 됩니다. 미로 판이 무게가 있다보니 그냥 write만 계속 한다면 정지 상태에서 해당 각도를 유지하려고 토크를 지속적으로 가하는데,  해당 각도를 벗어나는 토크를 한번 주면, 이를 막기위한 반대방향의 토크, 또 반대로 벗어나 이를 막기위한 반대방향의 토크를 지속적으로 가하게 되어 결과적으로 모터가 점점 크게 떨리게 됩니다. 기초 세미나 모터 편에서도 간략히 언급했었는데, 이를 아두이노에서 해결하기 위해서는 attach의 반대, detach() 함수를 이용하여 정지 상태일 때 모터와의 연결을 끊으면 전원은 입력되어 해당 각도에서 고정은 되어 있으면서, 떨림은 발생하지 않게 됩니다. 이와 관련한 자세한 알고리즘은 아래 코드를 참고하시면 되겠습니다.
#include <Servo.h>

Servo servo1; //서보모터 x, y축 2개 선언
Servo servo2;

int servo1_pin=9;// 서보&조이스틱 부, 서보모터 2개 핀 지정(D9,D10)
int servo2_pin=10;
int x_pin=0; // 조이스틱 아날로그 핀 지정(A0,A1)
int y_pin=1;

int butt_pin=11; //버튼 핀 지정(D11)

int buzzer_pin = 3; //부저 핀 지정(D3)

int trigPin = 5; //초음파 센서 핀 지정(D5,D6)
int echoPin = 6;

int x_axis, y_axis; //서보모터 조이스틱부 값 받아오는 변수
int nowangle_1; //현재각도_서보 1번
int nowangle_2; //현재각도_서보 2번

int servo_zig_flag1=0; //
int servo_zig_flag2=0;

int flag_start=0, flag_doing=0; //미로 찾기 시작여부, 진행여부 확인

int offset=3; //현재각도에서 해당 각도만큼 벗어났을때 모터 움직이기
int moveoffset=1; //한번 루프에서 움직이는 서보모터 각도

int temp_x, temp_y; //조이스틱에서 받아온 값을 서보모터 1,2번 각도로 변환하기
int past_nowangle_1, past_nowangle_2; //이전 루프에서의 각도

boolean lastbutton = LOW; //버튼부, 이전 루프에서의 버튼 상태
boolean currentbutton = LOW; //현재 버튼 상태

long duration, distance; //초음파 도달 시간, 거리 변수

unsigned long game_start, game_finish; //시간부, 게임시작 시간, 게임종료 시간 변수

 

void setup()
{
    pinMode(A0, INPUT); //조이스틱 x 핀모드 지정
    pinMode(A1, INPUT); //조이스틱 y
    pinMode(servo1_pin, OUTPUT);
    pinMode(servo2_pin, OUTPUT);
    pinMode(butt_pin, INPUT);
    pinMode(buzzer_pin, OUTPUT);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    servo1.attach(servo1_pin); //서보모터 연결
    servo2.attach(servo2_pin);

    Serial.begin(9600); //시리얼 모니터 시작

}

boolean debounce(boolean last) // 한번 버튼을 누르면 한번만 동작하도록 하는 함수
{
    boolean current = digitalRead(butt_pin);
    if(last != current)
    {
        delay(5);
        current = digitalRead(butt_pin);
    }
    return current;
}

int check_buttn(){ //debounce를 이용하여 현재 버튼 상태 출력 함수

    currentbutton = debounce(lastbutton);
    if(lastbutton == LOW && currentbutton == HIGH)
    {
        lastbutton = currentbutton;
        return 1;
    }
    else{
        lastbutton = currentbutton;
        return 0;
    }

}
void readjoy() //조이스틱 값 받아오는 함수
{
    x_axis = analogRead(x_pin);
    y_axis = analogRead(y_pin);

    nowangle_1=servo1.read();
    nowangle_2=servo2.read();

    temp_x=map(x_axis, 0,1023,1,179); //아날로그 값 0-1023을 서보모터 각도 0-179로 변환
    temp_x=constrain(temp_x, 1, 179); //혹시 모를 오류로 모터 파손을 막기 위해 안전한 각도로 제한
    temp_y=map(y_axis, 0,1023,1,179);
    temp_y=constrain(temp_y, 1, 179);
}

void writeservo(int servonum) //서보모터 작동 함수
{
    if(servonum==1){ //만약 1번 서보모터라면

        if(temp_x-offset<nowangle_1 && temp_x+offset>nowangle_1) //현재 각도와 변환된 각도(temp) 차이가 offset 이내라면
        {}//아무것도 하지 않음
        
    else if(nowangle_1>temp_x){ //변환된각도보다 현재 각도가 작다면

        if(servo_zig_flag1!=0){ //이전에 1번모터가 휴식모드였다면(=모터가 해제되었었다면)

            servo1.attach(servo1_pin); //모터 다시 연결

        }

    servo1.write(nowangle_1-moveoffset); //한 루프 이동 각도만큼 모터 이동
    servo_zig_flag1=0; //jiggle flag 없애기

    }

    else if (nowangle_1<temp_x){ //변환된각도보다 현재 각도가 크다면

        if(servo_zig_flag1!=0){

            servo1.attach(servo1_pin);

        }
    
        servo1.write(nowangle_1+moveoffset);
        servo_zig_flag1=0;

        }
    }

    else if(servonum==2) //만약 2번 서보모터라면
    {

        if(temp_y-offset<nowangle_2 && temp_y+offset>nowangle_2)
        {}

        else if(nowangle_2>temp_y){

            if(servo_zig_flag2!=0){

                servo2.attach(servo2_pin);

            }
    
            servo2.write(nowangle_2-moveoffset);
            servo_zig_flag2=0;
        }

        else if (nowangle_2<temp_y){

            if(servo_zig_flag2!=0){

                servo2.attach(servo2_pin);
    
            }

            servo2.write(nowangle_2+moveoffset);
            servo_zig_flag2=0;
        }
    }
    else{}
}

void prevent_zig(){ // jiggle 방지 함수 -> 오래 멈춰있다면 모터 휴식시키는 함수

    if(servo_zig_flag1>5){ //1번 서보에서 5루프이상 멈춰있다면(=jiggle flag가 5초과라면)

        servo1.detach(); //1번 서보모터 연결 해제

    }

    else if(past_nowangle_1==nowangle_1){ //1번 서보모터 현재 각도가 이전 각도와 같다면

        servo_zig_flag1++; // jiggle flag에 1더하기

    }

    if(servo_zig_flag2>5){

        servo2.detach();

    }

    else if(past_nowangle_2==nowangle_2){

        servo_zig_flag2++;
    }

    past_nowangle_1=nowangle_1; //이전 루프 각도 변수에 현재 각도 넣기(다음루프를 위해)
    past_nowangle_2=nowangle_2;

}

long checkdistance(){ //초음파 거리 측정 함수

    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration * 17 / 1000; //음속을 이용해 거리 계산
    delay(5);

    return distance; //거리를 출력

}
void loop() //메인 루프
{

    if(check_buttn() && !flag_doing){ //만약 버튼을 눌렀고, 현재 게임 진행중이 아니라면

        game_start=0; //게임 시작, 종료 시간 초기화
        game_finish=0;

        flag_start=1; //게임 시작했고, 진행중이라고 변수에 1 넣기
        flag_doing=1;

        tone(buzzer_pin, 330, 500); //시작음 부저 출력
        delay(500);
        tone(buzzer_pin, 330, 500);
        delay(500);
        tone(buzzer_pin, 330, 500);
        delay(1000);

        game_start= millis(); //현재 시간(진짜 시간 아님) 게임 시작시간 변수에 넣기


        Serial.println("Game Start!"); //시리얼 모니터에 출력
        Serial.print("Start time: ");
        Serial.println(game_start);

    }

    if(flag_start){ //게임이 시작되었다면

        readjoy(); //조이스틱 값 받아오기

        writeservo(1); //이를 이용해 서보모터 움직이기
        writeservo(2);

        prevent_zig(); //휴식 상태 확인하기(이전과 각도가 동일한지)

        if(checkdistance()<5){ //도착점에 도착한지 확인하기 위해 5cm이내에 감지되었는지 확인
        if(checkdistance()<5){ //잠시 노이즈로 인해 검출될 수도 있으니 한번 더 확인 -> 게임 종료

        game_finish=millis(); //현재 시간 게임 종료 시간 변수에 넣기

        tone(buzzer_pin, 392, 500); //게임 종료음 부저 출력
        delay(200);
        tone(buzzer_pin, 392, 500);
        delay(200);
        tone(buzzer_pin, 392, 500);
        delay(200);

        flag_start=0; //게임 종료되었으니 게임 시작됨, 진행중 변수 0으로 초기화
        flag_doing=0;

        Serial.println("Game finished!"); //게임 종료되었음을 시리얼 모니터에 출력
        Serial.print("Finished time: ");
        Serial.println(game_finish);
        Serial.print("Duration time: ");
        Serial.println(game_finish-game_start); //종료시간-시작시간하여 도착점까지 걸린 시간 출력

        }
    }
}
delay(5);
}


결론

'미로 찾기'에 관한 설명은 끝이 났습니다. 서보모터, 조이스틱, 초음파센서와 같은 기본 뼈대는 따라가면서 여러분들만의 독창적인 '미로 찾기'를 제작해 보면 좋을거 같습니다. 추가적으로 써보고 싶은 부품이나 재료가 있다면 언제든지 운영진에게 문의 부탁드립니다. 주기적으로 취합하여 주문해드리도록 하겠습니다. 제작 도중 궁금하거나 어려운 점이 있다면 언제든지 댓글 작성하셔서 문의 바랍니다.
전체 0

  • 🚨현재 코로나19 방역지침 준수를 위해 집합금지와 관련하여🚨
    기존 부원들께서는 구글 폼으로 예약 후 사용 부탁드리겠습니다.
  • 동아리방 사용시 항상 마스크 착용, 취식 절대 금지, 자주 환기 부탁드립니다!
  • 동아리방 방문 예약은 전날 24시전까지 부탁드립니다.
시간
12:00     
13:00     
14:00     
15:00상주상주상주 상주
16:00 
17:00 
18:00저녁시간~
19:00상주상주상주 상주
20:00 
21:00 
22:00