아두이노 프로젝트 4. 족저압 검사 깔창: 두 판 사이의 차이

아두위키 : Arduwiki
편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
10번째 줄: 10번째 줄:
* 압력센서 8개를 깔창에 부착하고, 각각의 데이터를 수집합니다.
* 압력센서 8개를 깔창에 부착하고, 각각의 데이터를 수집합니다.
* 깔창 위에 가만히 올라서있는 정적 검사, 깔창 위에서 자연스럽게 걸어서 검사하는 동적 검사, 무게 중심을 확인하는 평발 검사 모드를 구현합니다.
* 깔창 위에 가만히 올라서있는 정적 검사, 깔창 위에서 자연스럽게 걸어서 검사하는 동적 검사, 무게 중심을 확인하는 평발 검사 모드를 구현합니다.
* 유저 인터페이스를 통해 실시간으로 압력센서가 눌리는 세기를 보여줍니다.
* 유저 인터페이스를 통해 실시간으로 압력 센서가 눌리는 세기를 보여줍니다.


=== '''사용 하드웨어''' ===
=== '''사용 하드웨어''' ===


* [https://gongzipsa.com/shop/1699939293 아두이노 나노]
* [https://gongzipsa.com/shop/1699939293 아두이노 나노] 2개
* [[초음파 센서(HC-SR04)]] 2개
* [https://gongzipsa.com/shop/1699939305 아두이노 메가]
* [[네오픽셀(WS2812)|네오픽셀]]
* RA30P 압력 센서 16개
* [[소형 진동 모터 1027|소형 진동 모터]]
* [https://gongzipsa.com/shop/1699939292 1K옴 저항 16개]
* [https://gongzipsa.com/shop/1699939433 9V 배터리 케이스 DC잭 타입]
* [[HM-10 블루투스 모듈]] 4개
* [[HC-06 블루투스 모듈]]
* [[조도 센서(CDS)]]
* [https://gongzipsa.com/shop/1699939289 점퍼 케이블]
* [https://gongzipsa.com/shop/1699939289 점퍼 케이블]
* [[택트 스위치(Tact Switch)|택트 스위치(Tact Swtich)]] 3개
 
* 사용자용 안드로이드 기기


== '''회로 구성''' ==
== '''회로 구성''' ==
[[파일:스마트_지팡이_회로1.png|가운데|클래스=coders100]]
 
=== 나노 파트 (같은 회로를 2개 구성해야 합니다.) ===
[[파일:족저압 회로 나노파트.jpg|가운데|class=coders100]]
 
=== 메가 파트 ===
[[파일:족저압 회로 메가파트.jpg|가운데|class=coders100]]


== '''기능 구현''' ==
== '''기능 구현''' ==
=== 나노 파트 ===
<syntaxhighlight lang="c++" line="1">
<syntaxhighlight lang="c++" line="1">
/* 스마트 지팡이 프로젝트
/*
사용 부품
시리얼 이름 : BTSerial
- Arduino nano
baudrate : 115200 -> (AT+BAUD4)
- 조도센서(cds)
- 저항(1k옴)
- 초음파 센서(HC-SR04) 2개
- 진동모터
- NeoPixel 바
- 버튼 3개
- 블루투스 모듈(HC-06)


기능
왼발 연결 블루투스 모듈
- 어두울 시 NeoPixel 점등
모듈 이름 : S_LEFT
- 버튼으로 보호자 문자 발송 기능 : 블루투스 모듈로 지팡이 사용자의 스마트폰에 연결
핀번호 : 123456
  - 버튼 1 : 출발 문자 발송
 
  - 버튼 2 : 도착 문자 발송
오른발 연결 블루투스 모듈
  - 버튼 3 : 위험 및 현재 위치 문자 발송
모듈 이름 : S_RIGHT
- 초음파센서로 물체 감지
핀번호 : 111111
  - 초음파 센서 사양(2cm ~ 400cm 거리의 물체 감지)으로 10cm ~ 350cm 의 구간만 구별 가능하게 하였으며 350 초과시 350, 10 미만 시 10으로 측정되도록 지정
  - 알람(진동)단계별 세기 기능
  - 단위 [cm], 단계가 높아질수록 진동의 세기가 강해짐
    1단계 100 ~ 80
    2단계 80 ~ 60
    3단계 60 ~ 40
    4단계 40 ~ 20
    5단계 0 ~ 20
*/
*/
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);                      //2(tx), 3(rx)
int Sensor[] = { A0, A1, A2, A3, A4, A5, A6, A7 };  //순서대로 1 ~ 8번 센서 사용 핀번호


#define trigPin_1 3  //1번초음파(상단) trig핀번호
unsigned char ValueSensor[9];
#define echoPin_1 4  //1번초음파(상단) echo핀번호
unsigned long ScanningTime = 30000; //단위 [ms]
#define trigPin_2 6  //2번초음파(하단) trig핀번호
int dly = 100;                      //단위 [ms]
#define echoPin_2 7  //2번초음파(하단) echo핀번호
#define vibratePin 5 //진동센서 핀번호(PWM)
#define cds A0        //조도센서 핀번호
#define neoPixel 2    //네오픽셀 핀번호
#define hc06Rx 10    //블루투스 rx 핀번호
#define hc06Tx 9      //블루투스 tx 핀번호
#define btn1 8        //버튼 핀번호(출발)
#define btn2 11      //버튼 핀번호(도착)
#define btn3 12      //버튼 핀번호(긴급)
#define NumPixel 23    //네오픽셀 갯수
#define bright 255    //네오픽셀 밝기


SoftwareSerial BTSerial(hc06Tx, hc06Rx);
void sensing_func_inner(int dy) {
  for (int i = 0; i < 8; i++)
    ValueSensor[i] = map(analogRead(Sensor[i]), 0, 1024, 0, 254);
  BTSerial.write(ValueSensor, 9);
  delay(dy);
}


Adafruit_NeoPixel neo(NumPixel, neoPixel, NEO_GRB + NEO_KHZ800);
void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
  Serial.println("Serial start");
  ValueSensor[8] = 255;
}


int Btn1, Btn2, Btn3;
void loop() {
  sensing_func_inner(dly);
}


double distance_now_top = 0;  //현재 장애물과의 거리 변수
void value_check(){
double distance_now_bot = 0;  //현재 장애물과의 거리 변수
  for(int i=0;i<8;i++){
int vibratePower = 255;      //진동 세기 변수(0~255)
    Serial.print(ValueSensor[i]);
int vibrateTime = 150;        //진동 유지 시간[ms]
     Serial.print("\t");
double alert_distance = 100;  //알람작동 거리[cm]
 
int btnFlg1 = 0;
int btnFlg2 = 0;
int btnFlg3 = 0;
int btn1Chk() {
  if (digitalRead(btn1) == 0) {
    btnFlg1 = 1;
     return 0;
  }
  if (btnFlg1 == 1) {
    btnFlg1 = 0;
    return 1;
   }
   }
   return 0;
   Serial.println();
}
}


int btn2Chk() {
void sensing_func(unsigned long ScanTime, int dy) {
   if (digitalRead(btn2) == 0) {
   unsigned long StartTime = millis();
    btnFlg2 = 1;
  unsigned long EndTime = millis();
    return 0;
   while ((EndTime - StartTime) < ScanTime) {
   }
     sensing_func_inner(dy);
  if (btnFlg2 == 1) {
     EndTime = millis();
     btnFlg2 = 0;
     return 1;
   }
   }
  return 0;
}
}
</syntaxhighlight>


int btn3Chk() {
=== 메가 파트 ===
  if (digitalRead(btn3) == 0) {
<syntaxhighlight lang="c++" line="1">
    btnFlg3 = 1;
/*
    return 0;
공통사항
  }
baudrate : 115200 -> (AT+BAUD4)
  if (btnFlg3 == 1) {
    btnFlg3 = 0;
    return 1;
  }
  return 0;
}


왼발 연결 블루투스 모듈
시리얼 번호 : Serial1
모듈 이름 : M_LEFT
핀번호 : 123456


void BTsignal() {
오른발 연결 블루투스 모듈
  if (btn1Chk() == 1) BTSerial.println('1');
시리얼 번호 : Serial2
  else if (btn2Chk() == 1) BTSerial.println('2');
모듈 이름 : M_RIGHT
  else if (btn3Chk() == 1) BTSerial.println('3');
핀번호 : 111111
}
*/


void setup() {
void setup() {
   BTSerial.begin(9600);
   Serial.begin(9600);     //pc 시리얼
   pinMode(btn1, INPUT_PULLUP);
   Serial1.begin(9600); //블루투스 시리얼(왼발)
  pinMode(btn2, INPUT_PULLUP);
   Serial2.begin(9600); //블루투스 시리얼(오른발)
  pinMode(btn3, INPUT_PULLUP);
   Serial.println("Serial start");
  pinMode(cds, INPUT);
  pinMode(vibratePin, OUTPUT);
   digitalWrite(vibratePin, LOW);
  pinMode(trigPin_1, OUTPUT);
  pinMode(echoPin_1, INPUT);
  pinMode(trigPin_2, OUTPUT);
  pinMode(echoPin_2, INPUT);
  digitalWrite(trigPin_1, LOW);
  digitalWrite(trigPin_2, LOW);
  neo.begin();
  neo.setBrightness(bright);
  neo.clear();
   neo.show();
}
}


void loop() {
char idx1 = 0;
  BTsignal();                                        //블루투스 모듈
char idx2 = 0;
  cdsNeo(NumPixel);                                  //조도값 낮을 시 neopixel ON
  distance_now_top = distance(trigPin_1, echoPin_1); //상단 초음파 센서 장애물 거리
  distance_now_bot = distance(trigPin_2, echoPin_2); //하단 초음파 센서 장애물 거리


  distance_interval(distance_now_top, distance_now_bot); //상단 초음파 센서
int left_val[100];
  distance_interval(distance_now_bot, distance_now_top); //하단 초음파 센서
int right_val[100];
  delay(vibrateTime);
unsigned char t1;  
}
unsigned char t2;


void distance_interval(double dis_cm, int dis_cm_otherside) {
void loop() {
   if (dis_cm < dis_cm_otherside) {
   if (Serial1.available() > 0) {
     if (dis_cm < alert_distance / 5) {  //0~20cm
     t1 = Serial1.read();
      analogWrite(vibratePin, vibratePower);
     if (t1 == 255) {
     } else if (dis_cm < alert_distance / 5 * 2) { //20~40cm
       idx1 = 0;
       analogWrite(vibratePin, vibratePower / 5 * 4);
      for (int i = 0; i < 8; i++) {
    } else if (dis_cm < alert_distance / 5 * 3) { //40~60cm
        Serial.print(left_val[i]);
      analogWrite(vibratePin, vibratePower / 5 * 3);
        Serial.print("\t");
    } else if (dis_cm < alert_distance / 5 * 4) {  //60~80cm
       }
       analogWrite(vibratePin, vibratePower / 5 * 2);
       Serial.println("0");
    } else if (dis_cm < alert_distance) {  //80~100cm
       analogWrite(vibratePin, vibratePower / 5);
     } else {
     } else {
       analogWrite(vibratePin, 0);
       left_val[idx1] = t1;
      idx1++;
     }
     }
   }
   }
}


void cdsNeo(int i) {
  if (Serial2.available() > 0) {
  int val = analogRead(cds);
    t2 = Serial2.read();
  if (val > 950) {
    if (t2 == 255) {
    for (int j = 0; j < i; j++)
      idx2 = 0;
      neo.setPixelColor(j, bright, bright, bright);
      for (int i = 0; i < 8; i++) {
    neo.show();
        Serial.print(right_val[i]);
  } else {
        Serial.print("\t");
    for (int j = 0; j < i; j++)
      }
      neo.setPixelColor(j, 0, 0, 0);
      Serial.println("1");
     neo.show();
    } else {
      right_val[idx2] = t2;
      idx2++;
     }
   }
   }
}
}
</syntaxhighlight>
=== 블루투스 연결 ===
[[HM-10 블루투스 모듈]]은 아두이노 나노 2개에 각각 하나씩, 메가에 2개까지 총 4개가 사용됩니다.
아두이노 나노 파트의 모듈들은 Slave 모드, 메가 파트의 모듈들은 Master 모드로 설정되어 통신합니다.
자세한 내용은 [[HM-10 블루투스 모듈]] 문서의 Master, Slave 모듈 연결 파트를 참고하세요.
'''Q.''' 압력센서 16개라면 굳이 블루투스 통신을 하지 않고 아두이노 메가 하나에서 작업해도 핀 개수가 충분하지 않나요?


'''A.''' 처리 속도의 차이를 고려해 메가, 나노로 나누어 수집과 데이터 처리를 따로 처리했습니다.


double distance(int trig, int echo) {
아두이노 메가 하나로 모든 작업을 실행했을 때 처리 속도의 지연으로 인해 이후 인터페이스에서 빨간 점으로 표시되는 부분의 적용이
  digitalWrite(trig, HIGH);
 
  delayMicroseconds(10);
늦어지는 듯한 느낌을 받을 수 있습니다.
  digitalWrite(trig, LOW);
 
  double pulseTime = pulseIn(echo, HIGH);
 
  double distance_cm = pulseTime * 17.33 / 1000;
=== 데이터 수집 ===
  if (distance_cm > 350) {
아두이노 나노 파트에서 RA30P 압력센서(각 8개)의 데이터를 수집합니다.
    return 350;
 
  } else if (distance_cm < 10) {
나노 파트에서 수집된 데이터들은 블루투스 통신을 통해 메가 파트로 전송되며, 데이터 시각화 및 정적, 동적, 평발 검사 모드의 결과 계산을 위해 사용됩니다.
    return 10;
 
  }
 
  return distance_cm;
=== 데이터 시각화 및 검사 인터페이스 제작 ===
}
Pygame 라이브러리를 활용해 압력센서 데이터 시각화 및 정적, 동적, 평발 검사 인터페이스를 제작합니다.
</syntaxhighlight>
 
모습은 다음 사진과 같습니다.


=== 장애물 감지 시 진동 기능 ===
[[파일:족저압 인터페이스.png|가운데|class=coders100]]
[[초음파 센서(HC-SR04)]]를 상단과 하단에 각각 하나씩 부착하여 장애물 감지 거리 구간에 따라 부착된 [[소형 진동 모터 1027|소형 진동 모터]]의 세기를 조절합니다.


[[소형 진동 모터 1027|소형 진동 모터]]의 경우 진동 세기가 잘 체감될 수 있도록 지팡이의 손잡이에 부착합니다.


=== 주변 밝기 확인 및 네오픽셀 점등 ===
[[조도 센서(CDS)]]를 활용해 주변의 밝기를 확인한 후 주변 사람들이 인지할 수 있도록 지팡이에 부착한 네오픽셀이 점등됩니다.


이를 통해 시야 불명에 의한 충돌 사고를 대비합니다.
압력센서 데이터에 따라 더 강한 압박을 받은 부분은 빨간 점이 더 크게, 약한 압박을 받은 부분은 더 작게 표현됩니다.


=== 안드로이드 앱을 통한 문자 전송 ===
좌측 상단 정적, 동적, 평발 검사 시작 버튼을 누르면 각 검사에 대한 파트가 나오게 됩니다.
[[HC-06 블루투스 모듈]]을 활용해 스마트폰의 앱에 연결합니다.


지팡이에는 3개의 [[택트 스위치(Tact Switch)|택트 스위치]]가 부착되어 있으며 각각 "목적지로 출발", "목적지에 도착", "현재 위치" 신호의 역할을 합니다.
* '''정적 검사''' : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 무게가 쏠리는 부위를 파악하고 이에 따른 결과(ex . 무게가 좌측, 우측, 전방, 후방으로 집중됩니다.)를 제공합니다.
* '''동적 검사''' : 일정 시간동안 깔창 위에서 제자리 걸음을 하는 사람의 압력센서 데이터를 수집하여 결과를 제공합니다.
* '''평발 검사''' : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 발의 아치 부분 압력을 파악하고 이에 따른 결과를 제공합니다.


앱에서 택트 스위치 신호를 수신했다면 미리 설정된 전화번호로 문자를 송신합니다.


[[파일:스마트_지팡이_어플_캡처.png]]


== '''결과''' ==
== '''결과''' ==


=== 사진 ===
=== 정적 검사 ===
[[파일:스마트_지팡이_완성_사진1.png|가운데|클래스=coders100]]
[[파일:정적검사.png|가운데|class=coders100]]
 
 
=== 동적 검사 ===
[[파일:동적검사.png|가운데|class=coders100]]
 
 
=== 평발 검사 ===
[[파일:평발검사.png|가운데|class=coders100]]
 
 


=== Comment ===
=== Comment ===
완성된 지팡이의 모습입니다.
위에서부터 정적, 동적, 평발 검사 모습입니다.
 
불을 끈 어두운 환경에서는 지팡이에 길에 부착된 [[네오픽셀(WS2812)|네오픽셀]]이 점등한 모습을 확인할 수 있습니다.


상단, 하단에 [[초음파 센서(HC-SR04)|초음파 센서]]가 하나씩 부착되어 장애물을 감지하며 작은 동그란 [[소형 진동 모터 1027|소형 진동 모터]]가 손잡이 끝에 부착되어 진동합니다.
손으로 압력센서를 누른 데이터를 기반으로 임의의 공식을 활용해 각 검사별 결과가 제공되는 모습입니다.


[[택트 스위치(Tact Switch)|택트 스위치]]는 손잡이에 부착되어 사용자가 쉽게 누르고, 누르면 문자가 발송됩니다.


== '''추신''' ==
== '''추신''' ==

2024년 6월 5일 (수) 18:27 기준 최신판


개요

족저압 검사 깔창

압력 센서가 부착된 깔창에 올라서서 발바닥의 무게 중심을 확인하고 데이터를 수집하는 장치입니다.

고려사항

  • 압력센서 8개를 깔창에 부착하고, 각각의 데이터를 수집합니다.
  • 깔창 위에 가만히 올라서있는 정적 검사, 깔창 위에서 자연스럽게 걸어서 검사하는 동적 검사, 무게 중심을 확인하는 평발 검사 모드를 구현합니다.
  • 유저 인터페이스를 통해 실시간으로 압력 센서가 눌리는 세기를 보여줍니다.

사용 하드웨어


회로 구성

나노 파트 (같은 회로를 2개 구성해야 합니다.)

메가 파트

기능 구현

나노 파트

/*
시리얼 이름 : BTSerial
baudrate : 115200 -> (AT+BAUD4)

왼발 연결 블루투스 모듈
모듈 이름 : S_LEFT
핀번호 : 123456

오른발 연결 블루투스 모듈
모듈 이름 : S_RIGHT
핀번호 : 111111
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3);                      //2(tx), 3(rx)
int Sensor[] = { A0, A1, A2, A3, A4, A5, A6, A7 };  //순서대로 1 ~ 8번 센서 사용 핀번호

unsigned char ValueSensor[9];
unsigned long ScanningTime = 30000;  //단위 [ms]
int dly = 100;                       //단위 [ms]

void sensing_func_inner(int dy) {
  for (int i = 0; i < 8; i++)
    ValueSensor[i] = map(analogRead(Sensor[i]), 0, 1024, 0, 254);
  BTSerial.write(ValueSensor, 9);
  delay(dy);
}

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
  Serial.println("Serial start");
  ValueSensor[8] = 255;
}

void loop() {
  sensing_func_inner(dly);
}

void value_check(){
  for(int i=0;i<8;i++){
    Serial.print(ValueSensor[i]);
    Serial.print("\t");
  }
  Serial.println();
}

void sensing_func(unsigned long ScanTime, int dy) {
  unsigned long StartTime = millis();
  unsigned long EndTime = millis();
  while ((EndTime - StartTime) < ScanTime) {
    sensing_func_inner(dy);
    EndTime = millis();
  }
}

메가 파트

/*
공통사항
baudrate : 115200 -> (AT+BAUD4)

왼발 연결 블루투스 모듈
시리얼 번호 : Serial1
모듈 이름 : M_LEFT
핀번호 : 123456

오른발 연결 블루투스 모듈
시리얼 번호 : Serial2
모듈 이름 : M_RIGHT
핀번호 : 111111
*/

void setup() {
  Serial.begin(9600);     //pc 시리얼
  Serial1.begin(9600);  //블루투스 시리얼(왼발)
  Serial2.begin(9600);  //블루투스 시리얼(오른발)
  Serial.println("Serial start");
}

char idx1 = 0;
char idx2 = 0;

int left_val[100];
int right_val[100];
unsigned char t1; 
unsigned char t2;

void loop() {
  if (Serial1.available() > 0) {
    t1 = Serial1.read();
    if (t1 == 255) {
      idx1 = 0;
      for (int i = 0; i < 8; i++) {
        Serial.print(left_val[i]);
        Serial.print("\t");
      }
      Serial.println("0");
    } else {
      left_val[idx1] = t1;
      idx1++;
    }
  }

  if (Serial2.available() > 0) {
    t2 = Serial2.read();
    if (t2 == 255) {
      idx2 = 0;
      for (int i = 0; i < 8; i++) {
        Serial.print(right_val[i]);
        Serial.print("\t");
      }
      Serial.println("1");
    } else {
      right_val[idx2] = t2;
      idx2++;
    }
  }
}

블루투스 연결

HM-10 블루투스 모듈은 아두이노 나노 2개에 각각 하나씩, 메가에 2개까지 총 4개가 사용됩니다.

아두이노 나노 파트의 모듈들은 Slave 모드, 메가 파트의 모듈들은 Master 모드로 설정되어 통신합니다.

자세한 내용은 HM-10 블루투스 모듈 문서의 Master, Slave 모듈 연결 파트를 참고하세요.


Q. 압력센서 16개라면 굳이 블루투스 통신을 하지 않고 아두이노 메가 하나에서 작업해도 핀 개수가 충분하지 않나요?

A. 처리 속도의 차이를 고려해 메가, 나노로 나누어 수집과 데이터 처리를 따로 처리했습니다.

아두이노 메가 하나로 모든 작업을 실행했을 때 처리 속도의 지연으로 인해 이후 인터페이스에서 빨간 점으로 표시되는 부분의 적용이

늦어지는 듯한 느낌을 받을 수 있습니다.


데이터 수집

아두이노 나노 파트에서 RA30P 압력센서(각 8개)의 데이터를 수집합니다.

나노 파트에서 수집된 데이터들은 블루투스 통신을 통해 메가 파트로 전송되며, 데이터 시각화 및 정적, 동적, 평발 검사 모드의 결과 계산을 위해 사용됩니다.


데이터 시각화 및 검사 인터페이스 제작

Pygame 라이브러리를 활용해 압력센서 데이터 시각화 및 정적, 동적, 평발 검사 인터페이스를 제작합니다.

모습은 다음 사진과 같습니다.


압력센서 데이터에 따라 더 강한 압박을 받은 부분은 빨간 점이 더 크게, 약한 압박을 받은 부분은 더 작게 표현됩니다.

좌측 상단 정적, 동적, 평발 검사 시작 버튼을 누르면 각 검사에 대한 파트가 나오게 됩니다.

  • 정적 검사 : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 무게가 쏠리는 부위를 파악하고 이에 따른 결과(ex . 무게가 좌측, 우측, 전방, 후방으로 집중됩니다.)를 제공합니다.
  • 동적 검사 : 일정 시간동안 깔창 위에서 제자리 걸음을 하는 사람의 압력센서 데이터를 수집하여 결과를 제공합니다.
  • 평발 검사 : 일정 시간동안 깔창 위에 올라서서 가만히 서있는 사람의 압력센서 데이터를 수집하여 발의 아치 부분 압력을 파악하고 이에 따른 결과를 제공합니다.


결과

정적 검사


동적 검사


평발 검사


Comment

위에서부터 정적, 동적, 평발 검사 모습입니다.

손으로 압력센서를 누른 데이터를 기반으로 임의의 공식을 활용해 각 검사별 결과가 제공되는 모습입니다.


추신

공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.

문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.