반응형
자전거 타는 사람들이나 다른 도로 이용자들이 더 안전하게 이동할 수 있도록 "스마트 글러브"와 그 LED 패널을 만드는 방법에 대한 설명입니다.
스마트 글러브: 자전거 타는 사람들을 위한 안전한 동행을 위한 제작 방법
안녕하세요! 이번에는 자전거 타는 사람들이나 다른 도로 이용자들이 더 안전하게 이동할 수 있도록 도움을 주는 "스마트 글러브"를 만들어 보려고 합니다. 이 글에서는 제가 어떻게 이 "스마트 글러브"와 그 LED 패널을 제작했는지에 대해 자세히 설명하겠습니다.
[1. 재료 준비]
먼저, "스마트 글러브"를 만들기 위해 필요한 재료를 준비해야 합니다. 필요한 재료는 다음과 같습니다:
글러브: 편안하고 자전거를 탈 때 편리하게 사용할 수 있는 글러브를 선택해야 합니다.
LED 패널: 안전 신호를 표시하기 위한 LED 패널을 구매해야 합니다.
마이크로컨트롤러: LED 패널을 제어하기 위한 마이크로컨트롤러를 선택해야 합니다.
배터리: 글러브에 전원을 공급하기 위한 배터리를 선택해야 합니다.
전선 및 연결 부품: 글러브와 LED 패널, 마이크로컨트롤러, 배터리 등을 연결하기 위한 전선과 연결 부품을 준비해야 합니다.
[2. 스마트 글러브 제작]
스마트 글러브를 제작하기 위해 다음과 같은 단계를 따르세요:
글러브에 LED 패널을 부착할 위치를 결정합니다. 주로 손등 부분이 가장 적합합니다.
LED 패널을 글러브에 고정하기 위해 필요한 작업을 수행하세요. 이는 LED 패널과 글러브의 형태와 재료에 따라 달라질 수 있습니다. 일반적으로 손바닥 부분에 작은 구멍을 내어 LED 패널을 고정합니다.
마이크로컨트롤러를 글러브에 부착할 위치를 결정하고 고정하세요. 이는 사용자의 편의에 따라 다를 수 있습니다. 일반적으로 손목 부분이 적합합니다.
마이크로컨트롤러와 LED 패널을 연결하기 위한 전선을 사용하여 연결하세요. 연결 방법은 제품의 설명서를 참조하세요.
배터리를 글러브에 부착할 위치를 결정하고 고정하세요. 일반적으로 손목 부분이 적합합니다. 배터리를 마이크로컨트롤러에 연결하세요.
글러브의 손등 부분에 있는 LED 패널을 통해 안전 신호를 표시할 수 있도록 프로그래밍된 마이크로컨트롤러를 사용하여 기능을 테스트하세요.
[3. 스마트 글러브 사용]
스마트 글러브를 사용하기 위해 다음 단계를 따르세요:
글러브를 손에 착용하세요.
글러브에 부착된 마이크로컨트롤러를 사용하여 안전 신호를 표시하세요. 예를 들어, 왼쪽으로 방향지시를 하려면 왼손으로 제스처를 취하세요.
LED 패널에 표시된 안전 신호를 주변 차량이나 보행자들이 인식할 수 있도록 주의하세요.
이렇게 제작된 스마트 글러브를 사용하면 자전거 타는 사람들이나 다른 도로 이용자들이 더 안전하게 이동할 수 있습니다. 스마트 글러브를 사용하여 교통 안전에 기여하는 것은 매우 중요하며, 이를 통해 사고를 예방할 수 있습니다.
이 지침에서는 자전거 타는 사람이나 다른 도로 사용자가 더 안전하게 타거나 운전할 수 있도록 이 "스마트 장갑"과 LED 패널을 어떻게 만들었는지 자세히 설명하겠습니다.
작동 원리 :
장갑은 자이로스코프와 가속도계에서 데이터를 수집하는 Arduino 보드로 만들어집니다. Arduino 코드는 작은 기계 학습 모델(tinyML)을 사용하며 제스처 인식과 함께 작동하여 각 손의 움직임을 분석하고 인식합니다(왼쪽, 오른쪽, 앞, 뒤 등으로 기울어진 손). 그런 다음 이 신호는 Bluetooth(BLE)를 통해 LED 매트릭스에 연결된 다른 마이크로 컨트롤러(예: 배낭에 배치됨)로 전송됩니다. 마이크로 컨트롤러에서 수신한 신호에 따라 LED 매트릭스에 일부 패턴이 켜지므로 다른 도로 사용자가 자전거 운전자가 하는 일을 볼 수 있습니다(예: 오른쪽, 왼쪽 및 직선 화살표 또는 텍스트).
프로젝트의 기원 :
이것이 제가 이 프로젝트를 만들게 된 동기입니다.
우선은 자전거로 출근하고 매일 1시간 이상(약 22km)을 달립니다. 프랑스에서 가장 붐비는 도시 중 하나에 살고 있고 자동차와 자전거 타는 사람 사이의 사고가 빈번하다는 점을 제외하고는 항상 재미있습니다. 마르세유는 자전거 도로가 크게 부족한 자전거 타기 (프랑스에서)에 최악의 도시이기 때문에 특히 그렇습니다 ( 여기 에서 읽을 수 있듯이). 따라서 이것은 자전거 이용자의 안전을 개선하기 위한 프로젝트이지만 자전거 이용자에 대한 시의 배려 부족을 보고하기 위한 프로젝트이기도 합니다.
둘째, 도로 이용자들이 서로 더 잘 소통하고 이해할 수 있도록 돕는 프로젝트입니다. 제 관점에서, 도로 사용자들 사이에서 볼 수 있는 대부분의 무례함은 일부 사용자가 다른 사용자의 행동을 잘못 해석하여 겁을 주고 공격성으로 이어졌기 때문입니다. 이 장치를 사용하면 도로 사용자가 서로를 더 잘 이해할 수 있기를 바랍니다 : 화살표는 방향을 나타내고 텍스트를 표시 할 수 있습니다 (그러나 충돌을 피하기 위해 훌륭하고 건설적인 텍스트를 엄격하게 고수합니다).
"스마트 글러브"라고 불리는 이유는 무엇입니까?
저는 처음에 겨울에 이 프로젝트를 시작했고, 추운 날씨 때문에 장갑에 이 장치를 만들게 되었습니다. 그러나 나는 여름에 꽤 덥기 때문에 그것이 나쁜 생각이라는 것을 빨리 깨달았다. 따라서 이 장치를 상자에 넣고 손에 부착하는 것이 완벽한 솔루션이었습니다. 그러나 그러한 장치를 호출하는 방법은 무엇입니까? 나는 새로운 이름에 대한 단서가 없었기 때문에 "장갑"이라는 용어를 유지했습니다.
"스마트"는 이 프로젝트에 사용된 작은 기계 학습 기술에서 유래했습니다.
영감:
이 프로젝트는 내가 찾은 2 가지 주요 프로젝트가 혼합되어 있습니다. 저는 처음부터 시작하지 않고 이러한 프로젝트를 활용하여 더 나아가 더 발전된 프로젝트를 만들었습니다. 영감을 얻은 프로젝트는 다음과 같습니다.
Arduino Nano 33 BLE SENSE를 사용한 제스처 인식은 여기를 클릭하여 읽을 수 있습니다.영감의 또 다른 원천은 특정 프로젝트가 아니라 사이클리스트를 위한 LED 패널의 개념입니다. 이러한 프로젝트가 많이 있으며 일부는 LED 매트릭스가 통합된 백팩이고 일부는 어디에나 부착할 수 있는 매트릭스로 구성되어 있습니다. 그러나 모든 경우에 이러한 LED 패널은 리모컨으로 제어됩니다(제스처 인식이 아님).
공급
3D 프린팅 부품의 경우:
- 3D 프린터 또는 팹랩 또는 온라인 3D 프린팅 서비스에 대한 액세스;
- PLA입니다.
전자 부품의 경우:
- 아두이노 나노 33 BLE 센스;
- BLE가 있는 또 다른 마이크로컨트롤러(아두이노 나노 33 BLE, 아두이노 33 BLE 센스, 아두이노 나노 33 IOT, ESP32 등). 나중에 설명하겠지만 ESP32 보드를 사용하기로 결정했습니다.
- LED 스트립(WS2812B). 160개의 LED를 사용하여 20x8의 LED 매트릭스를 만들었습니다.
- 쿼드 레벨 시프터 3V - 5V: 74AHCT125;
- 1000 microF 커패시터;
- SPST 스위치(x3);
- Perfboards;
- 전선 및 점퍼 전선;
- 9V 배터리;
- 파워 뱅크.
다른:
- M3 나사 및 너트;
- 벨크로 패스너.
1단계: 필수 구성 요소(마이크로 컨트롤러, 코드)
Arduino 보드 및 기계 학습에 관한 이 게시물을 읽은 후 시도해 봐야겠다고 결정했습니다. 새로운 Arduino Nano 보드가 있기 때문에 구매하기 전에 더 나은 선택을 하기 위해 특성을 비교하는 표를 만들었습니다.
이 모든 보드는 정말 흥미롭지만 제스처 인식에 사용할 수 있는 유일한 보드는 센서가 있고 Tensorflow Lite를 지원하는 유일한 보드이기 때문에 Arduino Nano 33 BLE SENSE 보드입니다. 또 다른 흥미로운 점은 Arduino Nano 33 IOT, BLE 및 BLE SENSE 보드에 Bluetooth가 있으므로 모두 LED 매트릭스에서 BLE 신호를 수신하는 데 사용할 수 있다는 것입니다.
나중에 보시다시피 Arduino 보드에 업로드한 코드는 제가 찾은 많은 Arduino 코드를 기반으로 합니다. 그래서 시작하기 전에 내가 찾은 예제로 이 코드를 테스트하기로 결정했습니다.
BLE로 플레이하기이 프로젝트에서 Bluetooth 연결은 센서에서 LED 패널로 신호를 보내는 방식이기 때문에 매우 중요합니다. 이 프로젝트 전에는 2개의 Arduino 보드를 BLE와 연결한 적이 없습니다. 그래서 ArduinoBLE 라이브러리에서 다음 예제로 연습했습니다.
Arduino Nano 33 BLE Sense와 함께 사용되는 LedControl 스케치 및 핀 2에 연결된 풀업 저항이 있는 버튼. 이 예에서는 보급된 서비스 "19b10000-e8f2-537e-4f6c-d104768a1214" UUID가 있는 주변 장치를 찾을 때까지 BLE 주변 장치를 검색합니다. 검색 및 연결되면 버튼을 누르거나 놓을 때 BLE 주변 장치의 LED를 원격으로 제어합니다.
LED 스케치, Arduino Nano 33 IoT와 함께 사용됨.
불행히도 LED 스케치에 많은 문제가 있었고 이 스케치를 업로드하는 동안 3개의 보드가 "고장났습니다". 이 문제가 어디에서 왔는지 모르겠지만 Arduino 보드를 BLE가 있는 다른 마이크로 컨트롤러인 ESP32 보드로 교체하기로 결정했습니다. 이 새로운 보드에서는 다음을 사용했습니다.
BLE ESP32 ARDUINO 라이브러리의 스케치를 BLE_write. Arduino Nano 33 BLE SENSE 보드와 함께 작동하도록 몇 가지 변경 사항을 추가했습니다. BLE_write 스케치와 10단계에서 작성하고 업로드한 Smartglove_BLE_LED 행렬 스케치를 비교해 보시기 바랍니다.
내장 RGB LED로 제어
Arduino Nano 33 BLE SENSE 보드에 RGB가 내장되어 있다는 사실을 알고 계셨습니까? 그런데 왜 이 프로젝트에서 그것들을 사용할까요? 제스처 인식이 작동하는지 확인합니다. 여기서 아이디어는 신호가 LED 패널로 전송되었는지 확인하는 것이지만 패널이 자전거 타는 사람의 등에 부착될 가능성이 높기 때문에 제스처 인식이 작동하고 신호가 패널로 전송되었는지 확인하는 것은 매우 어렵습니다.
복잡한 것은 없으며 Blink 예제를 약간 수정했습니다. 아래에서 볼 수 있듯이 핀 22에는 빨간색 LED, 핀 23에는 녹색 LED, 핀 24에는 파란색 LED가 있습니다. "LOW" 출력은 LED를 켜고 "HIGH" 출력은 LED를 끕니다.
/* Blink example modified for built-in RGB LEDs (Arduino Nano 33 BLE sense).http://www.arduino.cc/en/Tutorial/Blink */
const int LED_BUILTIN_RED = 22;
const int LED_BUILTIN_GREEN = 23;
const int LED_BUILTIN_BLUE = 24;
//the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN_RED, OUTPUT);
pinMode(LED_BUILTIN_GREEN, OUTPUT);
pinMode(LED_BUILTIN_BLUE, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN_RED, LOW); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN_RED, HIGH); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN_GREEN, LOW); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN_GREEN, HIGH); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN_BLUE, LOW); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN_BLUE, HIGH); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
제스처 인식 및 tinyML로 재생
마지막으로 Arduino에서 기계 학습 시작하기 가이드를 읽고 제스처 인식 예제로 연습했습니다. 이 예제는 3가지 주요 부분으로 나뉩니다.
IMU_Capture 코드로 데이터 기록(Arduino Nano 33 BLE 감지 포함);
Google colab에서 이전에 기록된 데이터로 모델을 학습시키세요: 여기(컴퓨터 사용)에서 찾을 수 있습니다.
그리고 IMU_Classifier와 함께 Arduino에서 훈련된 모델을 사용하여 제스처를 인식합니다(Arduino 보드를 다시 사용).
2단계: 장갑(1/6) : 전자 제품
2 단계부터 7 단계까지 장갑을 만드는 과정을 더 잘 이해할 수 있도록 구성표를 사용합니다. 체계의 강조 표시된 부분은 현재 단계에서 설명한 프로젝트 부분에 해당합니다.
장갑의 회로에 관해서는 매우 간단합니다.
아두이노 보드;
9V 배터리(저는 충전식 9V 배터리를 사용했습니다);
SPST 스위치.
3단계: 장갑 (2/6) : 케이스
케이스는 두 개의 3D 프린팅 부품으로 구성됩니다.
노란색의 첫 번째 부분에는 Arduino 보드, 배터리 및 스위치가 포함되어 있습니다. 이 부분에 구멍을 설계하여 배터리를 충전할 수 있고 뚜껑을 제거하지 않고도 Arduino 보드를 프로그래밍할 수 있습니다.
배터리와 보드를 보호하기 위해 검은 색의 두 번째 부분 (뚜껑).
이 상자를 손에 부착하기 위해 벨크로 패스너 스트립을 사용했습니다.
마지막으로 뚜껑에 붙인 로고도 디자인했습니다. 위에서 본 사이클리스트를 나타내며 3개의 화살표(직선, 왼쪽, 오른쪽)가 있습니다. 4번째 화살표는 자전거가 뒤로 이동하지 않기 때문에 다른 화살표와 분리되어 있습니다.
4단계: 장갑(3/6): 데이터 기록
장치가 준비되면 데이터를 기록 할 차례였습니다 : 목표는 모든 제스처를 여러 번 기록하는 것입니다. 자이로스코프에 임계값을 설정했기 때문에 자이로스코프 값이 이 임계값을 초과하면 Arduino 보드가 기록된 데이터를 모니터에 표시하기 시작합니다.
다음은 내가 녹음한 제스처입니다.
왼쪽을 가리키는 팔(자전거 타는 사람이 왼쪽으로 회전하는 것을 나타내는 일반적인 제스처);
브레이크(브레이크에 도달하기 위한 손가락 제스처);
손 뒤로 기울기;
손 전면 기울기;
손 왼쪽 기울기;
손을 오른쪽으로 기울입니다.
물론 다른 제스처를 추가할 수 있습니다.
이 데이터를 기록하기 위해 20번 움직일 때마다 다른 색상의 LED를 켜는 프로그램을 만들었습니다. 이렇게 하면 제스처를 언제 변경해야 하는지 알 수 있습니다. 아두이노 모니터가 열린 상태에서 아두이노 보드를 컴퓨터에 연결하고 컴퓨터를 배낭에 넣었습니다.
모든 제스처가 기록되면 마지막으로 할 일은 모니터에 표시된 데이터를 복사하여 "csv"파일로 저장하는 것입니다 (다음 단계에서 업로드 된 파일 참조).
5단계: 글러브(4/6): 트레이닝
교육을 위해이 링크를 사용하고 몇 줄의 코드를 수정했습니다. 훈련을 시작하기 전에 데이터를 플로팅하고 모든 움직임이 하나의 "csv" 제스처 파일에 대해 유사한지 확인하는 것이 좋습니다.
"데이터 업로드"에서 모든 파일을 업로드합니다.
"그래프 데이터(선택 사항)"에서 파일 이름 중 하나를 추가합니다.
filename = "Arm_left.csv"
그런 다음 이 선을 수정하여 자이로스코프 데이터만 플로팅합니다.
#index = range(1, len(df['aX']) + 1)
index = range(1, len(df['gX']) + 1)
다음 줄을 주석으로 처리하면 다음과 같이 보입니다 (다시 가속도계 데이터를 사용하지 않습니다).
#plt.plot(index, df['aX'], 'g.', label='x', linestyle='solid', marker=',')
#plt.plot(index, df['aY'], 'b.', label='y', linestyle='solid', marker=',')
#plt.plot(index, df['aZ'], 'r.', label='z', linestyle='solid', marker=',')
#plt.title("Acceleration")
#plt.xlabel("Sample #")
#plt.ylabel("Acceleration (G)")
#plt.legend()
#plt.show()
"데이터 구문 분석 및 준비"에서 데이터에 사용한 모든 이름을 추가합니다.
#GESTURES = ["punch", "flex",]
GESTURES = ["Arm_left", "Brake", "Hand_back-tilt", "Hand_front-tilt", "Hand_left-tilt", "Hand_right-tilt"]
그리고 초기 Arduino 코드에서 변경된 경우 제스처 당 샘플도 변경하십시오.
#SAMPLES_PER_GESTURE = 119
SAMPLES_PER_GESTURE = 64
마지막으로 변경해야 할 사항은 가속에 주석을 다는 것입니다.
# normalize the input data, between 0 to 1:
# - acceleration is between: -4 to +4
# - gyroscope is between: -2000 to +2000
tensor += [
#(df['aX'][index] + 4) / 8,
#(df['aY'][index] + 4) / 8,
#(df['aZ'][index] + 4) / 8,
(df['gX'][index] + 2000) / 4000,
(df['gY'][index] + 2000) / 4000,
(df['gZ'][index] + 2000) / 4000
]
이 페이지의 모든 줄을 읽고 실행하면 결국 학습된 모델을 다운로드할 수 있습니다.
6 단계 : 장갑 (5/6) : Arduino 코드
스마트 글러브에서 사용하는 최종 코드는 다음 코드가 혼합되어 있습니다.
- "LED" 예amp"ArduinoBLE" 라이브러리의 파일(Peripheral>LED).
- 여기에서 찾은 "IMU_Classifier": https://github.com/arduino/ArduinoTensorFlowLiteT...
이 Instructable은 너무 길기 때문에 설명하지 않겠지만 더 나은 이해를 위해 원본 코드를 읽는 것이 좋습니다.
코드에 새 모델을 추가하면 테스트할 준비가 된 것입니다.
7단계: 장갑(6/6): 테스트
아래 비디오에서 볼 수 있듯이 LED는 인식된 제스처에 따라 다르게 켜집니다.
8단계: LED 패널(1/4): 전자 제품
앞서 말했듯이 Arduino Nano 33 보드의 ArduinoBLE 라이브러리에서 LED 스케치를 업로드할 때 몇 가지 문제가 발생하여 대신 ESP32 보드를 사용하기로 결정했습니다. 따라서 위의 사진에서 두 보드를 모두 볼 수 있습니다.
Arduino Nano 33 BLE SENSE 및 ESP32 보드는 모두 3.3V 로직 레벨과 통신하므로 Adafruit 모범 사례 가이드에서 권장하는 대로 레벨 시프팅을 수행하기 위해 쿼드 레벨 시프터 3V를 5V(74AHCT125)에 추가했습니다.
또한 1000 microF 커패시터를 추가하여 초기 전류 유입으로 인해 픽셀이 손상되는 것을 방지했습니다.
그리고 저는 이 회로를 퍼프보드에 만들었습니다.
또한 LED 매트릭스에 너무 많은 전류가 필요할까 봐 두려웠기 때문에 보조 배터리의 두 플러그를 모두 사용했음을 알 수 있습니다. 따라서 매트릭스와 마이크로 컨트롤러는 보조 배터리의 서로 다른 출력으로 전원이 공급됩니다.
9 단계 : LED 패널 (2/4) : 케이스
LED 패널은 모듈형 케이스를 원했습니다. 따라서 케이스는 여러 부품으로 만들어지며(작은 3D 프린터가 있기 때문에) 나사를 쉽게 사용할 수 있도록 많은 구멍을 뚫었습니다.
패널을 부착하기 위해 다시 한 번 벨크로 패스너 스트립을 사용했습니다.
내가 디자인한 모든 파일을 다운로드할 수 있습니다.
10 단계 : LED 패널 (3/4) : 아두이노 코드
최종 코드는 몇 가지 수정 후 다음 코드가 혼합된 것입니다.
- "BLE ESP32 ARDUINO" 라이브러리의 "BLE_Write" 예제입니다.
- "FastLED NeoMatrix" 라이브러리의 "MatrixGFXDemo64" 예제.
다시 한 번 설명하지는 않겠지만 원본 코드와 내가 작성한 코드를 읽고 비교하는 것이 좋습니다. 그러나 의견 섹션에서 자유롭게 질문하십시오!
11단계: LED 패널(4/4): 테스트
그리고 그것을 테스트 할 때입니다! 제스처가 인식될 때마다 신호가 LED 패널로 전송되고 패턴이 표시됩니다. 또한 인식된 제스처에 따라 스마트글러브에 LED가 켜지는 것을 확인할 수 있습니다.
혹시 놓치셨다면, 소개에 표시된 동영상은 다음과 같습니다.
12 단계 : 최종 테스트 및 결론
결론적으로 저는 이 장치에 매우 만족합니다. tinyML과 BLE에 대한 자신감을 얻는 데 도움이 되었습니다. 그 이후로 또 다른 Arduino Nano 33 IOT 보드를 구입했으며 현재 곧 게시할 매우 흥미로운 프로젝트를 진행하고 있습니다(놓치지 마세요)! 그러나 두 번째 버전을 만들면 변경할 사항도 있습니다.
스마트글러브를 위한 더 나은 뚜껑. 현재 상자는 상자 위에 놓이고 빡빡하기 때문에 고정되어 있습니다. 하지만 라이딩 중에 손이 물체에 부딪혀 뚜껑이 떨어져 깨졌습니다. 그래서 다음 버전에서는 뚜껑에 나사를 사용할 것입니다.
LED 패널을 위한 더 나은 케이스. 나는 내가 만든 케이스가 전체 케이스의 나사를 풀지 않고도 디버깅하거나 코드를 변경하기 위해 마이크로 컨트롤러 USB 포트에 쉽게 액세스할 수 없다는 것을 빠르게 알게 되었습니다. 또한 나사를 제거하지 않고는 보조 배터리에 접근하여 충전할 수 없습니다.
학습을 위한 추가 데이터. 몇 번, 일부 제스처가 인식되지 않는 경우가 있고 일부 제스처가 다른 제스처 대신 인식됩니다. 이것은 아마도 데이터가 부족하기 때문일 것입니다(각 제스처에 대해 20개의 움직임만 있음). 따라서 더 많은 움직임이 더 나은 모델을 만들고 제스처 인식의 오류를 줄일 수 있습니다.
반응형
'전기자전거' 카테고리의 다른 글
자전거 라이트 만들기: Arduino로 방향 지시등과 주행 거리계 기능 추가하기 (2) | 2024.09.13 |
---|---|
커스터마이즈 가능한 디지털 자전거 경적 만들기 (0) | 2023.12.14 |
자전거 글 (0) | 2023.12.07 |