Sun넘었조 - 차량 운전자 눈부심 방지 선바이저 로봇
프로젝트 개요
프로젝트 요약
파일:프로젝트 시작.jpg 파일:프로젝트 시작.jpg 파일:프로젝트 시작.jpg
프로젝트 명 입력
프로젝트 배경 및 기대효과
프로젝트 개발 목표
경제성
- 재료비
- 불필요한 고사양 부품 사용을 지양하며, 오픈 소스 하드웨어 및 소프트웨어를 적극적으로 활용하고, 각 부품(모터, 구동장치, 제어어장치 등) 선정 시 요구 성능을 만족하면서 전체 시스템 구축 비용을 개발 소요 비용 목표치(500천원) 내에서 해결할 수 있도록 시스템을 구축하였다.
기능성
- 정확성
- 본 시스템은 Glare의 존재 유무에 따라 선바이저의 작동 여부가 결정되고, Glare의 위치에 따라 선바이저가 목표 위치로 이동하는 기능을 갖는다. 따라서 Glare의 존재 유무 및 Glare의 위치를 정확하게 특정할 수 있어야 한다.
- 실시간성
- 본 시스템은 차량 운전 상황에서 동적으로 변화하는 Glare의 위치에 맞게 신속하게 대응할 수 있어야 한다.
안정성
- 구조안정성
- 본 시스템은 차량 주행 중 발생하는 진동 환경에서도 안정적으로 작동할 수 있도록,각 부품의 내구성을 고려하여 설계되어야 한다. 특히 반복적인 선바이저 구동 상황에서도 성능의 저하나 물리적 손상없이 지속적인 작동이 가능하도록 해야한다.
- 유지보수성
- 본 시스템은 제어부와 구동부로 핵심 구성 요소들을 독립적인 모듈 단위로 설계함으로써, 특정 부분에 문제가 발생했을 경우 해당 모듈만 쉽게 분리하여 진단 및 교체가 가능할 수 있도록 하여 유지보수의 편의성을 지니게 하고자 한다.
- 또한, 시스템 전체의 물리적 구조와 배선을 최대한 단순화함으로써, 고장이 발생할 수 있는 잠재적 요소를 줄이며, 문제 발생 시 원인 파악과 해당 부품 접근이 용이하도록 구성하고자 한다.
프로젝트 개요
프로젝트 요약
프로젝트의 배경 및 기대효과
프로젝트 개발 목표
- 3.1 HW (민규)
- 3.1.1 : 시스템 개략도

- 3.1.2 회로부 회로부는 크게 전원부, 제어부, 출력부로 구성된다. 전원부는 외부 전원 제어 장치(차량용 시거잭 인버터) , 내부 전원 제어 장치(SMPS)로 구성되며, 제어부는 라즈베리파이와, 아두이노로 구성되어 Glare detection 및 좌표 변환을 담당한다 . 또한, 출력부는 피에조 부저 및 모터로 구성되며, 제어부의 신호를 바탕으로 선바이저를 구동시키게 된다.

- 전체 회로 구상도
- 전원부
- 외부 전원 제어 장치(차량용 시거잭 인버터)
차량의 12V DC 전원을 AC 전원처럼 사용 할 수 있도록 변환해 주는 장치로, 이를 통해 외부 배터리 없이도 라즈베리파이 및 아두이노 기반 구동부에 안정적인 전원 공급을 가능하게 한다.
또한 장시간 운행시에도 지속적으로 시스템이 작동할 수 있도록 하며, 별도의 충전이나 전력 소모 걱정 없이 차량 자체의 전원으로 구동이 가능하다.
- 내부 전원 제어 장치(SMPS)
콘센트용 케이블을 통해 차량용 시거잭 인버터와 연결 되며, 인버터로 받아온 차량의 AC전원을 다시 DC 전원으로 변환해 준다. 사용 예상 전력을 토대로, 프로젝트에서 사용한 SMPS의 사양(12V 10A)을 선택했다. SMPS에서 나온 전력은 전체 내부 시스템(라즈베리파이5, 아두이노 메가, 모터 등)의 전력을 담당한다.
- 제어부
- 라즈베리파이 카메라 모듈 V3
차량 내부에 고정되어, 차량 전방의 영상을 라즈베리파이로 전달한다.
- 라즈베리파이 5
카메라로부터 영상 입력을 수신하여 OpenCV 기반으로 Glare 인식 및 위치를 특정하고, 좌표 변환 모듈을 통해 카메라 내의 Glare 위치 좌표를 선바이저의 그리드 좌표로 변환한다. 이때 Glare 유무, 지속시간 등을 판단하여 최종 제어 명령을 생산하여 아두이노로 전달한다.
- 아두이노 메가
라즈베리파이와의 시리얼 통신을 통해 제어 명령을 수신하여, 수신된 명령을 해석하고 연결된 모터 드라이버에 정밀한 제어 신호를 출력한다. 즉, 실제 모터를 구동하고 선바이저의 물리적 위치를 제어한다. 라즈베리파이와 아두이노 간의 통신은 UART 기반의 유선 시리얼 통신 방식을 사용한다.
데이터 전송 속도는 시스템의 요구 반응 속도를 고려하여 115200 bps로 설정하였다. 안정성을 고려하여 전송 속도를 늦출 수도 있었으나 안정성 문제는 발견되지 않아 높은 전송 속도를 채택하였다.
- 모터 드라이버
아두이노 메가로부터 받은 명령을 기반으로 스텝모터를 제어한다. 스텝모터의 방향 제어를 수행하며, 이를 통해 로봇이 레일 위를 정확하게 이동하도록 한다. 프로젝트에서 사용한 드라이버는 마이크로 스테핑 기능을 내장하는데, 이는 분주비를 조절하여 정밀한 제어를 가능하게 하는 방법이다. 소음을 고려하고자 마이크로 스테핑 기능을 사용하고자 했으나, 분주비의 증가로 모터의 발열에 큰 영향을 미치게 되어, 기능 사용을 철회했다.
- 출력부
- 피에조 부저
햇빛 인식을 통해 접혀있던 선바이저가 펴지는 상황에서, 사용자에게 동작 여부를 직관적으로 알리기 위해 피에조 부저를 적용하였다. 부저는 아두이노 메가의 제어 신호에 따라 작동하며, 소리를 통해 사용자에게 선바이저 동작 여부를 즉각적으로 전달한다. 이는 운전 중 시각적인 확인이 어려운 상황에서도 청각적 피드백을 통해 사용자의 인지성을 높이기 위함이다.
- Main 서보모터
아두이노 메가의 신호를 통해 선바이저 작동시 회전을 담당하게 되는 서보모터이다. 해당 서보모터의 선정시 모터 자체의 무게와 회전시 발생하는 관성 모멘트, 회전으로 인한 출력 샤프트의 마모성 등을 고려하였고, 이를 통해 반복 회전 동작시의 안정성을 확보할 수 있도록 했다.
- Sub 서보모터
구동되지 않는 상태에서도 차량 주행 중 발생하는 진동에 의해 선바이저가 흔들리거나 펼쳐지는 현상을 방지하기 위해, 접힌 선바이저를 물리적으로 잡아주는 역할을 수행하는 서보모터를 추가로 배치하였다. 해당 모터는 선바이저가 작동하지 않을 때 선바이저를 고정 상태로 유지함으로써, 구조적 안정성과 사용자 안정성을 모두 확보할 수 있도록 한다.
- 스텝모터
선바이저 위치 제어를 위해 사용된다. 스텝모터의 작동을 통해 전체 선바이저를 특정 grid로 이동시켜 Glare를 효과적으로 가리게 된다. 구동부에서 가장 큰 무게를 차지하게 되는 모터이다. 따라서, 시스템에 작용할 하중 및 모멘트 등의 물리적 요소들을 고려하여, 요구 스펙을 결정했으며, 무게를 최소화 할 수 있는 모터로 선정하였다.
- 3.1.3 구동부 구동부는 몸체부, 레일부, 링크부로 구성되어있다.

- 3.1.3.1 몸체부


몸체부는 구조적 안정성과 조립성 등 다양한 요소를 종합적으로 고려하여 설계하였다. 선바이저 로봇에서 가장 큰 하중을 차지하는 부품은 스텝모터이며, 이를 차량과 로봇이 고정되는 지점 바로 아래에 배치함으로써 무게로 인한 돌림힘을 최소화하였다. 무게 중심을 고정점과 최대한 가깝게 두어 링크부의 구동 시 불필요한 영향을 줄이도록 설계하였다. 또한, 스텝모터의 회전력을 직접 링크부로 전달할 수 있도록 레일 고정부를 스텝모터 인접부에 배치하였고, 몸체 내부에는 회로 및 구동 부품이 안정적으로 탑재될 수 있는 공간을 확보하였다. 몸체의 뚜껑은 서보모터를 견고히 고정할 수 있도록 설계되었으며, 본체와 정확하게 체결되도록 제작되었다.

- 3.1.3.2 레일부


레일부는 몸체부 좌,우에 각각 연결되어 작동한다. 레일에 슬라이드 롤러가 장착되어 있고, 조인트는 슬라이드 롤러에 고정되어있다. 스텝모터의 구동으로 조인트가 레일을 따라 좌우로 움직이며 동력을 전달할 수 있도록 설계된 구조이다. 벨트가 레일의 정중앙에 배치 되도록 하여 벨트의 손상을 최소화 했다.
- 3.1.3.3 링크부

링크부는 레일부의 조인트와 연결되어 위치한다. 4개의 링크를 결합한 링크 구조를 통해 선바이저가 장착되는 엔드 이펙터의 상/하,좌/우 움직임을 구현하였으며, 엔드 이펙터에는 선바이저를 회전시킬 고토크 서보모터와, 선바이저를 고정할 경첩이 달려 있도록 설계하였다. 링크와 경첩 사이의 마찰이 발생할 수 있는 부분에 금속 와셔 2개를 추가하여 금속 간의 미끄러짐을 통해 마찰을 최대한 줄이고, 부품의 마모를 막아 부드러운 움직임을 구현하였고, 볼트와 구멍 사이의 유격을 최소화하기 위해 공차를 미세하게 고려하여 수치를 설계하였다.

링크 구조의 경우 왼쪽의 링크 2개와 레일부의 경첩, 엔드 이펙터로 만들어지는 링크 구조는 평행사변형 형태를 띄는 것을 확인할 수 있다. 레일부의 경첩의 두 볼트 사이의 거리와 엔드 이펙터의 두 볼트 사이의 거리가 동일하고, 2개의 링크 길이가 동일하기 때문으로, 이로 인해 엔드 이펙터는 항상 레일과 평행한 방향을 유지한다.그러나 왼쪽의 평행사변형 링크 구조만 존재한다면 여유 자유도가 존재해 회전운동이 발생하므로, 오른쪽에 동일하게 평행사변형 형태의 링크 구조를 만들어 이러한 여유 자유도를 구속하며, 안정적인 링크 구조를 구현했다.
- 3.1.4 제어함
 제어함 안에는 전력 공급을 위한 SMPS와 라즈베리파이5가 내장되어 있다. SMPS와 라즈베리파이 및 전선들의 크기를 고려하여 적절한 크기로 설계하였으며, 카메라를 고정하기 위해 상부에 돌출부를 제작하였다. 라즈베리파이의 발열이나 차량 외부에서 비치는 햇빛으로 인해 제어함 온도가 상승할 수 있으므로 이를 예방하기 위해 라즈베리파이가 위치할 부분의 상부에 통풍구를 배치하였다.
- 3.1.5 HW 전체 구상도
  전체 구동부의 경우 실제 차량의 선바이저가 위치하는 부분에 고정되며, 제어함의 경우 차량의 대시보드 전방에 위치하게 된다.
- 3.1.6 HW 제어 코드
- 3.1.6.1 : 제어 코드 개발 배경
구동부의 경우 아두이노 메가를 통해 움직이게 된다. 특히, 로봇 제어의 경우 라즈베리파이에서 시리얼 통신을 통해 보내주는 바이트 신호를 바탕으로 지시를 받으며, 바이트 신호를 정수로 치환하여 움직인다. 다음은 기본 제어 매커니즘이다.

1번부터 9번 위치는 하드웨어 링크 구조 특성으로 인해 생기는 사다리꼴 모양의 경로를 의미한다. 그림 상에서 빨간 점은 각 n번 위치에서의 선바이저 중앙 위치를 나타낸 것이다.

좌/우 좌표 기준으로 보면, 왼쪽 레일의 조인트 위치와 오른쪽 레일의 조인트 위치의 중간 위치에 엔드 이펙터가 존재함을 알 수 있다.
선바이저의 좌/우 움직임은 좌/우 조인트를 동일한 방향으로, 동일한 거리만큼 이동시키도록 하여 구현했다. 좌/우 레일의 조인트 위치를 알면, 링크의 길이는 고정되어 있기에 엔드 이펙터와 레일 사이의 거리를 알 수 있고, 이를 통해 엔드 이펙터의 상/하 움직임을 제어할 수 있다. 좌/우 레일의 조인트가 가까이 위치할수록 엔드 이펙터는 아래로 내려가고, 좌/우 레일의 조인트가 멀리 위치할수록 엔드 이펙터는 올라간다.
- 3.1.6.2 제어 코드 개발
- 1 : 스텝 모터 제어
기본 스텝 모터 제어를 통해 로봇의 부드러운 움직임을 구현하는 코드이다. 소음이 적게 발생하고, 분주비 설정 및 딜레이 시간에 대한 실험을 통해 스텝모터 제어 코드를 도출하였다.
```arduino
void moveTo(int target_left, int target_right) {
int steps_needed = abs(target_left - position_left); // 동일 스텝 수 가정
bool dir_left = (target_left > position_left) ? HIGH : LOW;
bool dir_right = (target_right > position_right) ? HIGH : LOW;
digitalWrite(dir_1, dir_left);
digitalWrite(dir_2, dir_right);
for (int i = 0; i < steps_needed; i++) {
digitalWrite(steps_1, HIGH);
digitalWrite(steps_2, HIGH);
delayMicroseconds(1600);
digitalWrite(steps_1, LOW);
digitalWrite(steps_2, LOW);
delayMicroseconds(1600);
position_left += (dir_left == HIGH) ? 1 : -1;
position_right += (dir_right == HIGH) ? 1 : -1;
}
}
```
- 2: 조인트 위치 제어
스텝모터의 특성 상 스텝 수를 활용하여 정확한 각도 제어가 가능하나, 현재 위치에 대해 기억하는 기능은 존재하지 않다. 따라서 이동한 스텝 수에 대해 변화를 기록하여 현재 좌/우 레일에서의 조인트 위치를 기억하는 변수를 도입하여 위치 제어에 사용하도록 코드를 개발하였다. 조인트 위치 변수값에 대응하는 조인트의 실제 위치는 아래 그림으로 명시해 두었다. 이를 바탕으로 각 인덱스에 따른 위치를 테이블로 기록하여, 해당 위치로 이동할 때 테이블에서 위치를 찾아서 이동하도록 구현하였다. 조인트 위치 변수값에 대응하는 조인트의 실제 위치는 아래 그림으로 명시해 두었다.

```arduino
// ------------- 위치 테이블 (1~9) ---------------------
int positionTable[9][2] = {
{-1200, 0}, // 1
{-600, 600}, // 2
{ 0, 1200}, // 3
{-850, 0}, // 4
{-425, 425}, // 5
{ 0, 850}, // 6
{-400, 0}, // 7
{-200, 200}, // 8
{ 0, 400} // 9
};
// 위치 추적 변수
int position_left = -600; // 왼쪽 모터의 현재 위치 (음수)
int position_right = 600; // 오른쪽 모터의 현재 위치 (양수)
int currentIndex = 0; // 최신 위치 (1번째)
void moveTo(int target_left, int target_right) {
int steps_needed = abs(target_left - position_left); // 동일 스텝 수 가정
bool dir_left = (target_left > position_left) ? HIGH : LOW;
bool dir_right = (target_right > position_right) ? HIGH : LOW;
digitalWrite(dir_1, dir_left);
digitalWrite(dir_2, dir_right);
for (int i = 0; i < steps_needed; i++) {
digitalWrite(steps_1, HIGH);
digitalWrite(steps_2, HIGH);
delayMicroseconds(1600);
digitalWrite(steps_1, LOW);
digitalWrite(steps_2, LOW);
delayMicroseconds(1600);
position_left += (dir_left == HIGH) ? 1 : -1;
position_right += (dir_right == HIGH) ? 1 : -1;
}
}
```
- 3. 선바이저 위치 이동 경로 코드
선바이저의 위치가 1번 위치에서 9번 위치로 한 번에 이동할 경우, 대각선 방향의 움직임이 필요하다. 그러나, 실제 운전 상황에서 해의 움직임으로 고려한다면, 대각선 방향으로의 움직임보다 상/하, 좌/우의 움직임의 현상이 지배적이기에 정해진 규칙에 따라 상/하, 좌/우 움직임만을 통해 위치 이동을 가능하도록 코드를 개발하였다. 상/하 움직임이 구현될 경우, 선바이저는 항상 좌/우 기준 중앙 위치로 이동한 후 상/하 움직임을 실행하도록 하였다. 나눗셈 연산과 나머지 연산을 사용하여 구현하였으며, 이에 대한 코드는 다음 <그림 20>과 같다
```arduino
// ----------------------- 계단식 이동 구현 -----------------------------
void moveToGridPosition(int targetIndex) {
int curRow = currentIndex / 3;
int curCol = currentIndex % 3;
int tgtRow = targetIndex / 3;
int tgtCol = targetIndex % 3;
// 1단계: 현재 층의 중간으로 이동
if (curCol != 1) {
int midIndex = curRow * 3 + 1;
moveTo(positionTable[midIndex][0], positionTable[midIndex][1]);
currentIndex = midIndex;
}
delay(500);
// 2단계: 다른 층의 중간으로 이동
if ((currentIndex / 3) != tgtRow) {
int tgtMidIndex = tgtRow * 3 + 1;
moveTo(positionTable[tgtMidIndex][0], positionTable[tgtMidIndex][1]);
currentIndex = tgtMidIndex;
}
delay(500);
// 3단계: 최종 복구
if (currentIndex != targetIndex) {
moveTo(positionTable[targetIndex][0], positionTable[targetIndex][1]);
currentIndex = targetIndex;
}
}
```
- 4. 부저 및 선가드 구동 코드
선가드 접힘 및 펼침에 대해 알림을 주기 위해 피에조 부저의 주파수 조절을 사용
하여 서로 다른 음을 사용하여 알림음을 구현하였고, 서보모터 구동의 경우 delay를
활용하여 원하는 각도에서 다른 각도로의 움직임을 구현하였다.
```arduino
// ------------- 부저 멜로디 설정 ---------------------
int arraySize = 5;
int melody[] = {245, 260, 292, 328, 348, 390, 439, 492, 523, 586, 1317};
int song1[] = {1, 2, 3, 4, 5};
int song2[] = {5, 4, 3, 2, 1};
int noteDuration[] = {2, 2, 2, 2, 2};
// ----------------------- 썬가드 작동 함수 -----------------------------
void sungard_down() {
for (int note = 0; note < arraySize; note++){
int duration = 700/noteDuration[note];
tone(buzzer, melody[song1[note]], duration);
delay(duration+30);
}
delay(500);
for (int i = 110; i >=0; i--) {
mainServo.write(i);
delay(10);
}
}
void sungard_up() {
for (int note2 = 0; note2 < arraySize; note2++){
int duration2 = 700/noteDuration[note2];
tone(buzzer, melody[song2[note2]], duration2);
delay(duration2+30);
}
delay(500);
for (int i = 0; i <= 110; i++) {
mainServo.write(i);
delay(10);
}
}
```
- 5. 시리얼 통신 구현 코드
시리얼 통신으로 주고받는 데이터를 바이트 단위로 설정하였고, 바이트 단위의 데이터를 변환하여 사용하기 위해, 코드를 추가하였다.
```arduino
int get_grid_coords(int index) {
switch(index) {
case 0b0000: return 3;
case 0b0100: return 2;
case 0b1000: return 1;
case 0b0001: return 6;
case 0b0101: return 5;
case 0b1001: return 4;
case 0b0010: return 9;
case 0b0110: return 8;
case 0b1010: return 7;
default: return 0;
}
}
// grid_coords (1~9)
// 1 2 3
// 4 5 6
// 7 8 9
// --- RPi 1바이트 통신 처리 ---
byte latestRPiByte = 0; // RPi에서 온 가장 마지막 바이트
bool rpiDataAvailable = false;
while (Serial.available() > 0) {
latestRPiByte = Serial.read();
rpiDataAvailable = true;
}
.....
```
- 3.1.7 HW 개발 과정
- 3.1.7.1 기초 제작
비슷한 시제품이 없기에, HW의 제작은 사용할 내부 부품(레일, 모터)등의 치수를 기반으로 제작하였다. 또한, 결과물은 최적설계 연구실의 3D 프린터를 이용하여 제작했기에, 출력되는 결과물의 크기에 따라 공차가 미세하게 달랐다. 결과물을 직접 조립해 보니, 설계 단계에서 생각하지 못한 문제가 발생한 경우도 허다했다. 따라서 여러번의 3D 프린팅 출력을 통해 보완해 나갔고, 여러 Trial and Error 과정을 거치며 진행되었다.

- 3.1.7.2 해석
차량에 고정되어 작용하는 로봇의 특성 상, 과속방지턱에서 가해지는 큰 하중들에 취약하다. 따라서 부품에 작용하는 최악의 상황을 가정하여, 해석을 진행하였고, 기초 제작된 제품에 피드백을 반영하여 수정하는 과정을 거쳤다.

- 3.1.7.3 HW 1차 테스트
기초 제작 이후 직접 자동차에 장착해 실제 환경에 대한 초기 테스트를 진행하였다. 설계 했던 전력 공급 회로의 정상 작동 확인과, 차량 내부 간섭 여부등을 파악했다. 이때, 로봇의 크기가 커 운전석 장착시, 차량 핸들과 충돌하였고, 로봇 몸체의 레일부가 차량의 백미러와 충돌함을 확인할 수 있었다. 1차 테스트를 기반으로 링크 길이, 레일의 길이들을 축소 시키게 되었다.


- 3.1.7.4 HW 2차 테스트
HW 1차 테스트를 기반으로 로봇의 모델을 개선하여 2차 테스트를 진행하였다. 2차 테스트는 로봇을 운전석에 장착하였을 때의 안정성을 중심으로 테스트를 진행하였고, 장착한 상태로 실제 주행을 해봐도 안정적으로 차량에 부착되어 구동하는 모습을 확인할 수 있었다. 특히, 차량이 심하게 흔들리는 경우의 로봇의 안정성을 확인하고자 과속방지턱을 빠른 속도로 넘어가는 실험 주행을 진행한 결과, 로봇이 천장에서 떨어지지 않고 강하게 부착 되어 있었고, 링크부 역시 손상없이 구동되는 모습을 확인할 수 있었다.
동작 시나리오
구현 내용
하드웨어 설계 및 구현
소프트웨어 설계 및 구현
프로젝트 결과
최종 결과물
결과물 사진 혹은 시연 영상 등
미구현 내용
사진 올리기 테스트
프로젝트 평가
평가 항목 및 결과
추가 평가 사항
느낀점
부록
위키페이지 작성을 위한 문법 가이드
- 표
표는 위키 문법에 맞추어 작성할 수 있습니다. Mediawiki table generator를 이용하면 손쉽게 표를 작성하여 위키 문법으로 export할 수 있습니다. 아래는 Mediawiki table generator를 이용하여 작성한 표의 예시입니다. 위 웹페이지에서는 직접 CSV파일을 가져와서 바로 표를 만들 수도 있습니다. 직접 표를 문법에 맞추어 편집하고자 하시는 분들은 wiki 표 문법을 참조하면 도움이 됩니다.
| 구분 | 실험 1 | 실험 2 | 실험 3 | 실험 4 |
|---|---|---|---|---|
| 결과 1 | 1.1 | 2.1 | 3.1 | 4.1 |
| 결과 2 | 1.2 | 2.3 | 4.5 | 6.4 |
| 결과 3 | 5.1 | 5.4 | 2.7 | 8.5 |
- 수식
원래 위키백과에서는 math 태그를 이용하여 바로 수식을 작성할 수 있지만 capstone wiki에서 그 기능은 지원되지 않는것으로 확인됩니다. 따라서 수식을 올리기 위해서는 수식을 사진으로 변환한 후 올려야 합니다. LATEX 수식 생성기 를 이용하면 tex 문법을 이용하여 수식을 작성하여 파일로 저장할 수 있습니다.
위 수식은 support vector machine의 비용 함수를 표현한 예시입니다. tex 문법은 tex 수식 문법 에서 확인할 수 있습니다.
- 사진
사진은 "도구-파일 올리기" 탭에서 파일을 올린 후 아래와 같이 올릴 수 있습니다. 파일명은 파일 올리기에서 정한 "파일의 새 이름"을 사용하면 됩니다.
시립대 엠블렘 예시
- 코드
코드는 syntaxhighlight 기능을 이용하여 아래와 같이 표현할 수 있습니다.
#include <iostream>
int main ( int argc, char **argv ) {
std::cout << "Hello World!";
return 0;
}
이에 대한 자세한 내용은 Mediawiki syntaxhighlight를 참고하면 도움이 됩니다.

