2013. 5. 25.

99
2013. 5. 25. ROBOTC 활활활활 - 활활 활활활활활 활활활활 1 활 활활 활활활 -

description

ROBOTC 활용하기 - 전국 전문대학교 로봇대회 1 차 기술 세미나 -. 2013. 5. 25. - Index -. • 제 1 장 LEGO MINDSTORMS Education • 제 2 장 ROBOTC 설치 및 기본 로봇 조립 제 3 장 ROBOTC 프로그램의 이해 제 4 장 ROBOTC 기초 프로그래밍 ( 모터 구동 프로그래밍 ) 제 5 장 ROBOTC 제어문 (While, if, if–else) 제 6 장 라인 로봇 (Light Sensor 사용 ). - PowerPoint PPT Presentation

Transcript of 2013. 5. 25.

Page 1: 2013. 5. 25.

2013. 5. 25.

ROBOTC 활용하기 - 전국 전문대학교 로봇대회 1 차 기술 세미나 -

Page 2: 2013. 5. 25.

- Index -

• 제 1 장 LEGO MINDSTORMS Education

• 제 2 장 ROBOTC 설치 및 기본 로봇 조립

• 제 3 장 ROBOTC 프로그램의 이해

• 제 4 장 ROBOTC 기초 프로그래밍 ( 모터 구동 프로그래밍 )

• 제 5 장 ROBOTC 제어문 (While, if, if–else)

• 제 6 장 라인 로봇 (Light Sensor 사용 )

Page 3: 2013. 5. 25.

-제 1 장 LEGO MINDSTORMS Education -

Page 4: 2013. 5. 25.

• NXT 는 LEGO MINDSTORMS Education Set의 컨트롤러

• 프로그래밍이 가능한 인텔리전트 브릭

• 주변환경을 인식하고 , 인터페이스 할 수 있는 다양한 센서와 전동기를 연결하여 데이터를 수집 및 테스트 할 수 있는 최고의 장비

- NXT -

Page 5: 2013. 5. 25.

• RCX 에 이은 LEGO 사의 차세대 로봇 컨트롤러

• 32bit ARM7 Processor / 256k Flash / 64k Ram

• 입력포트 4 / 출력포트 3

• USB / Bluetooth 통신 지원

• 60*100 Graphic LCD / 스피커 / 충전식 배터리 지원

• 엔코더 내장 모터 / 초음파 / 사운드 / 터치 / 빛 센서

- NXT -

Page 6: 2013. 5. 25.

충전식리튬폴리머배터리

터치 센서

사운드 센서

라이트 센서초음파 센서

엔코더 내장형서보 모터

그래픽 LCD 및블루투스 무선통신 내장USB 2.0 지원

기존 LEGO RCX 용디바이스 호환

- 사용할 수 있는 Sensor/Actuator -

Page 7: 2013. 5. 25.

Output

Input

LCD

USB

Speaker

 

꺼진 상태 : 전원 켜기켜진 상태 : 가운데 메뉴 실행 

좌측의 메뉴로 넘어감

우측의 메뉴로 넘어감

취소 / 최상위 메뉴에서 끄기

- NXT 의 외형 -

Page 8: 2013. 5. 25.

-제 2 장 ROBOTC 설치 및 기본 로봇 조립 –

Page 9: 2013. 5. 25.

- ROBOTC 설치하기 -

http://www.robotc.net에 접속하여 RobotC for Lego 프로그램과 드라이버를 down-load 받는다 .

인터넷이 되지 않을 경우USB 메모리에서 설치파일을받는다 .

Page 10: 2013. 5. 25.

대회 공식 사이트에 공지된 이미지를 참조하여 ,

다음 로봇 조립

- 교육용 로봇 조립 -

Page 11: 2013. 5. 25.

-제 3 장 ROBOTC 프로그램의 이해 -

Page 12: 2013. 5. 25.

- ROBOTC 소개 -

• RobotC 는 카네기멜론 대학에 서 만든 ROBOT 전용 프로그래 밍언어로 , LEGO Mindstorms RCX 와 NXT 를 지원

• C 언어를 기반으로 하여 C 언어 의 문법 체계를 90% 동일

• C 언어를 공부한 학생과 이제 시 작하는 학생들 모두 쉽게 배울 수 있음

Page 13: 2013. 5. 25.

- Quick Start Guide-

• 홈페이지 주소

http://www.robotc.net/support/nxt/

Page 14: 2013. 5. 25.

- ROBOTC 실행하기 -

• 바탕화면의 ICON 을 클릭하여 실행

• Activate ROBOTC for Mindstorms = 정품 인증 모드 ( 시리얼 키를 입력 후 실행 )

• Evaluate ROBOTC for Mindstorms = 30 일 평가판 모드 ( 시리얼 키 없이 실행 )

Page 15: 2013. 5. 25.

- 전체적인 프로그램 사용법 -

• Port A,C 에 연결되어 있는 모터를 50 의 파워로 1 초간 전진하는 프로그램

• main() 함수 : 프로그램 내에 오직 1 개만 사용할 수 있는 특별한 함수로서 바디 ( {..} ) 에 작성된 내용을 시작 / 종료 한다 .

Page 16: 2013. 5. 25.

- ROBOTC 메뉴 [File] -

• New File (Ctrl + N) : 새로운 문서 작성

• Open and Compile : 불러오기 / 컴파일을 동시 실행

• Open Sample Program : 샘플 프로그램을 불러오기

• Save(Ctrl+S) : 작성된 소스를 RobotC 파일로 저장

• Save As : 다른 이름으로 저장

• Print(Ctrl+P) : 작성된 프로그램을 인쇄

• Print Preview : 인쇄한 프로그램 미리보기

• Page Setup : 현재 작성된 프로그램의 출력페이지를 설정

Page 17: 2013. 5. 25.

- ROBOTC 메뉴 [Edit] -

• Undo Typing (Alt+Backspace/Ctrl+z) : 실행취소 , 되돌리기 기능

• Can’t Redo (Ctrl+Z) : 실행 취소된 것을 되돌리기 기능

• Cut (Shift+Delete) : 잘라내기

• Copy (Ctrl+C) : 복제하기

• Paste (Ctrl+V) : 붙여넣기

Page 18: 2013. 5. 25.

- ROBOTC 메뉴 [View] -

• Source : 현재 사용 중인 프로그램

• Function Explorer View : 함수 도움말 창 실행

• Compile Errors View : Error 내용 창

• Font Increase (Ctrl +‘ +’) : 폰트 사이즈 증가

• Font Decrease (Ctrl +‘ -’) : 폰트 사이즈 감소

Page 19: 2013. 5. 25.

- ROBOTC 메뉴 [Robot] -

• Download Program(F5) : 소스코드 컴파일 후 NXT 로봇으로 프로그램 다운로드

• Compile Program(F7) : 소스코드 컴파일( 프로그램 다운로드 안함 )

• Debugger : 프로그램의 실행 또는 단계적인 실행을 할 수 있다 . Refresh Rate 를 Contin-uous 를 클릭하면 NXT 에 있는 모터 및 센서의 값들을 계속적인 모니터링이 가능하다 .

Page 20: 2013. 5. 25.

- ROBOTC 메뉴 [Robot]-3 -

• Motors and Sensors Setup : 모터와 센서를 어떤 포트에 어떤 별명 (Alias) 을 사용할 지를 결정하기 위해 Motors and Sensors Setup 을 이용한다 . 프로그램 작성시 모터 및 센서에 대한 변수 이름을 입력하면 코드를 자동으로 생성한다 .

Page 21: 2013. 5. 25.

- ROBOTC Firmware download -

• Download Firmware : 펌웨어 다운로드 기능을 이용하여 확장자가 “ .rfw” 인 파일을 다운로드 한다 . 다운로드가 완료되면 ” Firmware download completed”라는 메시지가 나타난다 .

Page 22: 2013. 5. 25.

- ROBOTC 프로그램 규칙 -

▪ ROBOTC 는 표준 C 언어 프로그램 규칙을 따르는 text 기반의 프로그램 언어이다 .

▪ 사용자가 프로그램을 작성하면서 파랑색이나 보라색으로 글씨가나오면 ROBOTC 가 그 단어를 매우 중요한 단어로 인식한다는 뜻이고 ROBOTC 가 인 식하는 키워드 (keyword) 는 자동으로 색상이 결정되어 표시된다 .

▪ ROBOTC 컴파일러는 대문자와 소문자를 엄격하게 구분한다 .

▪ 프로그램의 실행 순서는 1 번 줄부터 순차적으로 실행된다 .

▪ 스페이스 (space), 탭 (tab) 은 프로그램의 실행에 영향을 주지 않지만 프로그램 의 가독성 ( 읽어 낼 수 있는 정도 ) 을 높이기 위해서 적절한 사용을 해야 한다 .

▪ 세미콜론 (‘;’) 은 모든 ROBOTC 프로그램 문장의 끝을 알려준다 .

▪ 프로그램을 작성할 때는 반드시 적어도 하나의 main() 함수를 갖고 있어야 한다 . Task main() 함수 안에 실행하고자 하는 프로그램을 기록하면 된다

Page 23: 2013. 5. 25.

- 변수 선언 유의 사항 -

변수 선언 시 유의 사항

• 대문자 (A~Z), 소문자 (a~z), 숫자 (0~9), 밑줄문자‘ _ ’ 를 사용한다 .

• 변수명은 숫자로 시작할 수 없다 .

• 변수명은 기본 예약어 또는 함수명을 사용할 수 없다 .

• 변수명은 대 · 소문자를 다르게 구분한다 .

• 변수명은 한글로 사용할 수 없다 .

Page 24: 2013. 5. 25.

- ROBOTC 자료형 ( 데이터형 ) -

• RobotC 의 자료형은 프로그램에서 처리하고자 하는 자료의 형태를 의미

• 자료형은 NXT 메로리 영역의 크기를 결정

Page 25: 2013. 5. 25.

- 화면 출력 서식 -

Page 26: 2013. 5. 25.

- ROBOTC 자료형 ( 정수형 ) -

• 정수형 변수정수형 변수는 RobotC 프로그램 작성 중 가장 많이 사용하는 데이터형으로서 정수 형태의 자료를 표현하기에 적당하다 . 선언 방법은 int 라는 키워드 (keyword) 를 작성하고 뒤에 변수명을 사용하면 된다 . %d 는 10 진수 출력을 의미한다 .

• nxtDisplayTextLine(LCD 위치 , “ 출력 내용” , 출력 변수명 ) : NXT LCD 창에 지정된 형식으로 변수 값을 출력 (LCD 의 글 위치는 0~7 까지 )

• PlaySound( 내장 사운드 명 ) : 미리 정해져 있는 내장 사운드를 재생

Page 27: 2013. 5. 25.

- ROBOTC 자료형 ( 실수형 ) -

• 실수형 변수실수형 변수는 아주 큰 수나 아주 작은 수를 표현해야 하거나 , 소수점을 포함하는 실수 자료를 표현 할 때 사용된다 . 실수형 변수를 출력할 때“ %f” 를 사용한다 . 특별히 소수점 아래에 자릿 수를 지정하고 싶을 때는 위의 예처럼“ %.2f” 처럼 표현하고 이것은 소수 셋째 자리에서 반올림하여 소수점 2 자리로 표현하라는 것이다 .

Page 28: 2013. 5. 25.

- ROBOTC 자료형 ( 문자형 ) -

• 문자형 변수RobotC 에서 문자형 변수는 8비트의 영역을 차지하고 있다 . 주로 ASCII 문자를 표현하기 위해서 사용한다 .위의 예제는 문자 ‘ A’ 에 해당하는 아스키 코드 값을 출력하고 , x 변수에 해당하는 문자를 출력하는 프로그램이며 , 여기서“ %d” 정수형 변수의 값을 출력하고“ %c” 는 문자를 표현하는데 사용한다 .

Page 29: 2013. 5. 25.

- ROBOTC 자료형 ( 지역변수 ) -

• 지역변수 (Local Variables)함수의 내부에 정의된 변수이다 . 지역 변수들은 함수의 실행이 시작될 때 메모리에 만들어지고 , 함수가 종료될 때 메모리로부터 소멸된다 .

Page 30: 2013. 5. 25.

- ROBOTC 연산자 ( 관계연산자 ) -

Page 31: 2013. 5. 25.

- ROBOTC 연산자 ( 논리연산자 ) -

Page 32: 2013. 5. 25.

- ROBOTC 연산자 ( 논리연산자 )-2 - • AND

• NOT

• 조건 값이 참이 아니므로 실행되지 않는다 .

• 11 번 모터가 0.1초 동안 회전한다 .

Page 33: 2013. 5. 25.

- 제 4 장 ROBOTC 기초 프로그래밍 -

Page 34: 2013. 5. 25.

- 로봇을 2 초 동안 전진시켜라 -

• NXT 서보 모터 파워는 건전지의 양에 따른 상대적인 비율로 -100 ~ +100%까지 파워 레벨을 조정 가능

Page 35: 2013. 5. 25.

- 2 초 동안 전진 , 2 초 동안 후진 -

Page 36: 2013. 5. 25.

Swing Turn Point Turn Curve Turn

각 명령에 따른 회전 방식

Page 37: 2013. 5. 25.

- 도전 과제 I -

• 2 초 전진 후 90 도 회전하고 2 초 전진

Page 38: 2013. 5. 25.

- 제 5 장 ROBOTC 제어문 -

Page 39: 2013. 5. 25.

- if 제어문 함수 설명 -

• 조건식이 ‘ True’ 인지 ‘ False’ 인지 판정

• ‘False’ 일 경우에 대한 고려 없이 ‘ True’ 일 경우 문장 1 을 실행

• 한 조건에 대해 여러 문장 실행 시 문장들을 { } 으로 묶어서 사용

if( 조건식 ) 문장 1

Page 40: 2013. 5. 25.

- if 제어문 예제 -

• random 함수 이용 난수값 생성 (0-99)

• if 함수를 이용하여 난수값이 50 보다 크면 1 초간 직진

• 직진 후 사운드 출력

Page 41: 2013. 5. 25.

- if-else 제어문 함수 설명 -

if( 조건식 ) 문장 1else 문장 2

• 조건식이 ‘ True’ 인지 ‘ False’ 인지 판정

• ‘True’ 일 경우 문장 1 실행

• ‘False’ 일 경우 문장 2 실행

• 한 조건식에 대해 ‘ True’ 일 경우와 ‘ False’ 일 경우를 나누어 제어할 때 사용

Page 42: 2013. 5. 25.

- if-else 제어문 예제 -

• random 함수 이용 난수값 생성 (0-99)

• if 함수 이용 값이 50 보다 크면 우회전 , 값이 같거나 작으면 좌회전

• 조건 식 동작 후 사운드 출력

Page 43: 2013. 5. 25.

- while 제어문 함수 설명 -

while( 조건식 ) 반복문장

• 조건식이 ‘ True’ 이면 반복문장 계속 실행

• 그 후 검사하여 ‘ False’ 이면 while 제어 문을 빠져 나와 다음 문장 실행

• 조건 식에 ‘ True’ 또는 ‘ 1’ 을 넣으면 무한반복

Page 44: 2013. 5. 25.

- while 제어문 예제 -

• 0.5 초간 전진과 후진을 10 번 동안 반복 (0-9)

• i++ 는 i = i + 1 을 의미 한다 .

• 단 , while 문을 사용

• 동작 후 사운드 출력

Page 45: 2013. 5. 25.

- do-while 제어문 함수 설명 -

do 반복문장while( 조건식 )

• 반복 문장을 일단 한번 실행 한 후 while 제어문의조건 식 검사

• 조건 식의 값이 처음부터 거짓이라도 반복 문장은 한번 실행

• 위의 내용을 빼고는 while 과 동일

Page 46: 2013. 5. 25.

- 제 6 장 라인로봇 (Light Sesnor) -

Page 47: 2013. 5. 25.

- 빛 센서 (Light Sensor) -

• 전방에 간접조명용 붉은 LED 와 Photo Tran-sistor 가 내장되어 있으며 , 명암을 구분

• 지면과 5mm 가 가장 적합

• 조명의 켜짐 유무에 따라 액티브 모드 /인액티브 모드를 가지고 있다 .

• 측정 값은 0~100% 으로 표현

Page 48: 2013. 5. 25.

- 문턱 값 (Threshold) -

• 어두운 영역과 밝은 영역을 어떻게 구분할 것인가 ?

Page 49: 2013. 5. 25.

1. 빛 센서를 3 번에 연결2. NXT 를 켜고 View 를 선택 ( )

3. 반사광 측정하기 - 반사광 (Reflected light) 아이콘을 선택 - 포트 3 을 선택

4. 주변광 측정하기 - 주변광 (Ambient light) 아이콘을 선택 - 포트 3 을 선택

- 빛 센서 셀프 테스트 -

Page 50: 2013. 5. 25.

- 빛 센서 설정하기 -

• Port S3 의 Name 에 light 를 입력한다 . ( 편의상 light 라고 입력하였으나 다른 이름도 가능하다 .)

Page 51: 2013. 5. 25.

- 빛 센서 값에 따라 로봇의 속도 변화 -

• int 변수 이름 : 정수를 저장하기 위해 변수를 선언 이름은 문자나 ‘ _’ 로만 시작 가능

• int light_value : 정수값을 저장하기 위해 light_value 란 변수를 사용하겠다고 선언

Page 52: 2013. 5. 25.

- 전진하다가 바닥이 검정이면 정지 -

• #define THRESHOLD 50( 매크로 상수 ): THRESHOLD 라고 쓰인 모든 부분을 50 으로 치환하여 실행

• break; : 문을 만나면 반복되는 블록의 마지막에서 반복문 을 이탈

Page 53: 2013. 5. 25.

출발도착

- 1 센서 라인 트레이싱 주행법 -

Page 54: 2013. 5. 25.

- 1 센서 라인 트레이싱 로봇 ( 왼쪽 경계 ) -

Page 55: 2013. 5. 25.

- 빛 센서 2 개로 변경하기 -

• 빛센서 두 개를 사용하는 라인로봇을 위해 아래와 같이 설정한다 . - 왼쪽 빛 센서 설정 : 포트 2, left_light, Light Active - 오른쪽 빛 센서 설정 : 포트 3, right_light, Light Active

Page 56: 2013. 5. 25.

출발

도착

1

3

- 2 센서 라인트레이싱 주행법 -

Page 57: 2013. 5. 25.

- 2 센서 라인트레이싱 로봇 1 -

• 빛 센서 2 개를 사용한 라 인트레이서

• 모터와 빛센서는 각각 움 직인다 .

• StartTask( 태스크명 );-Task 형태로 호출된 함수를 호출하여 멀티 태스크 형태로 동시에 실행시킨다 .

- 최대 255 개 까지 가능

- 종료는 StopTask(태스크명 ); 이나 StopAll-Task(); 를 사용한다 .

• 교차로 통과 불가

Page 58: 2013. 5. 25.

- 2 센서 라인트레이싱 로봇 1 -

Page 59: 2013. 5. 25.

- 2 센서 라인트레이싱 로봇 2 -

Page 60: 2013. 5. 25.

• 빛센서 2 개로 라인트레이스• 두 빛 센서의 상태 조합을 통해 로봇이 동작• 교차로 통과하면서 교차점 개수 카운트

- 2 센서 라인트레이싱 로봇 3 -

Page 61: 2013. 5. 25.

- 도전 과제 Ⅲ -

Page 62: 2013. 5. 25.

컬러 센서의 이용

Page 63: 2013. 5. 25.

• 빨간색 , 파란색 , 초록색의 삼원색을 측정할 수 있는 센서

• 주변광 측정 모드 , 단색 모드 , 컬러 모드 제공

• 미리 정의된 색을 기준으로 감지하거나 raw 값을 읽을 수 있음– 미리 정의된 색 : 검은색 (1), 파란색

(2), 초록색 (3), 노란색 (4), 빨간색(5), 흰색 (6)

– raw 값 : 가공되지 않은 센서의 측정 값

컬러 센서 (Color Sensor)

Page 64: 2013. 5. 25.
Page 65: 2013. 5. 25.

ENCODER 사용하기

Page 66: 2013. 5. 25.

• 회전의 양을 감지하는 센서 , 다른 말로 “각도 센서”• NXT Servo 모터에 내장되어 있음

Encoder 소개

Encoder

Page 67: 2013. 5. 25.

• Encoder 의 값이 저장되어 있는 변수• 값의 단위는 ‘도 (Degree)’• 모터가 회전하면 그에 따라 각도 값이 누적

– + 방향 회전은 값이 증가 , - 방향 회전은 값이 감소• 이 변수에 값을 할당하려고 하면 0 으로 초기화됨

nMotorEncoder[]

Page 68: 2013. 5. 25.

• 3 번 줄 : 사용하기 전에 nMotorEncoder[] 초기화• 4 번 줄 : 모터에 전원 넣기• 5 번 줄 : while 문 조건 – nMotorEncoder[] 가 360 보다 작은

동안에 반복• 6 번 줄 : 루프를 탈출하면 모터 정지• 360 도 이상이 되어야 비로소 모터 정지 360 도를 약간 넘길 수 있다

nMotorEncoder[] 사용 예시

Page 69: 2013. 5. 25.

• 모터의 파워 값은 음수 (-30) 이지만 while 문에서 확인하는 encoder 값은 양수 (+360)– 프로그램이 끝나지 않고 모터는 무한히 회전한다

nMotorEncoder[] 를 이용한 회전의 잘못된 사용 예시 (1)

> -360으로 수정

Page 70: 2013. 5. 25.

nMotorEncoder[] 를 이용한 회전의 잘못된 예 (2)

• 첫 번째 회전은 정상적으로 360 도 회전• 두 번째 회전 이전에 nMotorEncoder[] 의 초기화 과정이 없음• nMotorEncoder[] 의 값이 이미 360 이상인 상태이므로 12 번 줄의 while

루프는 실행되지 않는다

nMotorEncoder[motorA] = 0;명령 추가

Page 71: 2013. 5. 25.

• NXT 펌웨어가 자동으로 회전을 제어하도록 명령하는 변수• (1) 이 변수에 회전할 각도를 할당한 뒤에 (2) 모터 파워를 주면 , 펌웨어가 정확히 해당 각도만큼 모터를 회전시킨 뒤 정지한다

• 장점– 모터 파워를 끄는 명령을 입력할 필요가 없다 (펌웨어가 자동으로 정지시킴 )– nMotorEncoder 만 사용하는 것보다 정확하게 목표한 각도만큼 회전시켜 준다– 모터가 목표 각도만큼 돌 때까지 기다릴 필요가 없다

• 단점– 펌웨어의 제어 처리가 의도하지 않은 버그를 만들어낼 수 있다 (ex: 모터 과부하

시 오작동 )

nMotorEncoderTarget[]

Page 72: 2013. 5. 25.

• 2 번 줄 : nMotorEncoderTarget[] 에 회전 각도의 절대값 입력• 3 번 줄 : 모터에 전원 넣기• 4 번 줄 : 펌웨어가 모터의 전원을 내릴 때까지 루프로 대기

– nMotorRunState[] 는 모터의 회전 상태가 기록된 변수로 , runStateIdle( 브레이크 완료 ), runStateHoldPosition(브레이크 도중 ), runStateRunnig( 회전 도중 ) 의 3 가지 상태가 있다

• 모터를 일부러 멈추는 명령 (motor[motorA] = 0;) 이 없다는 것을 확인할 것

nMotorEncoderTarget[] 사용 예시 (1)

Page 73: 2013. 5. 25.

• nMotorEncoderTarget[] 에 값을 할당한 뒤 다른 작업을 연이어 수행하는 예 ( 여기서는 숫자 카운트 )

• 모터의 회전과 숫자 카운트가 동시에 실행된다– 모터는 목표한 각도에 도달하면 자동으로 멈춘다

• 모터의 멈춤은 펌웨어에서 관리하므로 일부러 모터를 멈추는 명령을 넣을 필요가 없다

nMotorEncoderTarget[] 사용 예시 (2)

Page 74: 2013. 5. 25.

• nMotorEncoderTarget[] 이 motor[] 명령 다음에 있다• 모터가 무한히 회전한다• nMotorEncoderTarget[] motor[] 순서로 명령이

실행되어야만 한다

nMotorEncoderTarget[] 의 잘못된 사용 (1)

Page 75: 2013. 5. 25.

• 첫 번째 회전에서 모터 회전이 끝날 때까지 기다리는 루프가 없다• 곧바로 두 번째 회전으로 넘어가 , 두 번째 회전만을 하고 마친다

nMotorEncoderTarget[] 의 잘못된 사용 (2)

while(nMotorRunState[motorA] != runStateIdle) {}추가

Page 76: 2013. 5. 25.

내장 PID 와 SYNCH 기능

Page 77: 2013. 5. 25.

• 비례 P 적분 I 미분 D 제어 : Encoder 값을 기반으로 모터 파워를 조절해 회전 속도를 일정하게 만드는 제어법

• 현실의 모터는 같은 전압을 주어도 회전 속도가 다르다 : 내부 부품 마찰 등의 이유

• 따라서 소프트웨어적으로 적절하게 각 모터의 전압을 다르게 하여 목표하는 회전 속도를 달성한다 – 이것이 PID

• NXT 펌웨어에 제어 기능이 이미 내장되어 있다 – 프로그래머가 직접 구현하지 않아도 된다

PID 란 ?

Page 78: 2013. 5. 25.

• 모터의 PID 모드를 설정하는 변수• PID 모드에는 여러 가지가 있다

– mtrNoReg: PID 사용 안함– mtrSpeedReg: 회전 속도의 일정함을 우선시하는 PID– mtrEncoderReg: nMotorEncoderTarget[] 의 정확도를

우선시하는 PID– mtrSyncRegMaster, mtrSyncRegSlave: Synch 주행 전용

PID• Motors and Sensors Setup 에서 PID Ctrl 을 체크하면 자동으로

mtrSpeedReg, 아니면 mtrNoReg 다– 따라서 PID Ctrl 만 체크하면 별다른 설정 없이 PID 를 이용할

수 있다• 사용례 : nMotorPIDSpeedCtrl[motorA] = mtrSpeedReg;

nMotorPIDSpeedCtrl[]

Page 79: 2013. 5. 25.

• 두 모터의 회전 속도를 비례하도록 연동해서 제어하는 기능

• 사용자가 제어할 쪽을 Master 모터 , Master 의 동작에 연동될 쪽을 Slave 모터라 한다

• 장점– 손쉽게 각종 회전과 직진 동작을 구현할 수 있다

• 단점– 두 모터의 반응시간이 차이가 있어서 출발 또는

정지 시에 방향이 틀어지는 현상이 발생한다

모터의 Synch 란 ?

Page 80: 2013. 5. 25.

• Synch 를 사용할 모터를 설정하는 변수– synchAB, synchAC, …, synchCB, synch-

None 의 값을 가진다• synchAB: Master 모터가 A, Slave 모터가 B• synchCB: Master 모터가 C, Slave 모터가 B• synchNone: Synch 해제

nSyncedMotors

Page 81: 2013. 5. 25.

• Master 모터 파워 대비 Slave 모터 파워를 설정하는 변수

• -100 ~ +100 사이의 값을 가진다• motor[slave] = motor[master] * nSyncedTurnRa-

tio;– nSyncTurnRatio = 100; 직진– nSyncTurnRatio = 1~99; Curve 턴– nSyncTurnRatio = 0; Swing 턴– nSyncTurnRatio = -100; Point 턴

nSyncedTurnRatio

Page 82: 2013. 5. 25.

• 2 번 줄 : nSyncedMotors 로 Master 와 Slave 모터 설정• 3 번 줄 : nSyncedTurnRatio 로 파워 비율 설정• 4 번 줄 : Master 모터에 파워 • 5 번 줄 : 1 초 기다림• 6 번 줄 : Master 모터 정지 (Slave 는 연동되므로 함께 정지됨 )

Synch 사용 예시

Page 83: 2013. 5. 25.

배열

Page 84: 2013. 5. 25.

배열이란 ?

배열 사용 전 배열 사용 후

• 같은 자료형을 가진 다수의 변수의 묶음• 대괄호 내부의 숫자를 첨자 또는 인덱스라고 부름 ( 배열의 순번 )• 첨자를 활용하여 대량의 자료를 효율적으로 처리할 수 있다

Page 85: 2013. 5. 25.

• 변수의 선언과 거의 동일하나 , 변수명 옆에 대괄호 쌍을 쓰고 그 안에 배열의 크기를 입력한다

배열의 선언

Page 86: 2013. 5. 25.

• 배열의 인덱스는 0 부터 시작한다– 10 개짜리 변수의 인덱스는 0~9

의 범위다• 배열을 선언하면서 동시에

초기화하고자 할 때는 중괄호를 이용한다

배열의 초기화

Page 87: 2013. 5. 25.

• 0.1 초 간격으로 1 초 동안 수집한 초음파 값들 중 최소값을 찾아냄• 초음파 값이 불안정할 때 필터 역할을 할 수 있음

배열의 사용례 :초음파 최소값 찾아내기

Page 88: 2013. 5. 25.

격자 사이의 이동

Page 89: 2013. 5. 25.

1. Encoder 를 활용한 경로 주행– 미리 입력된 Encoder 값에 맞추어 직진과 90 도 회전을

수행한다– 구현하기가 가장 쉽다– 지면과의 미끄러짐 등으로 오차가 누적되면서 갈수록 원래

경로에서 틀어진다2. 라인 트레이싱을 활용한 주행

– 1 센서 라인 트레이싱을 활용해 격자 사이를 주행한다– 구현하기가 비교적 어렵다– 격자 줄 한쪽으로 치우쳐서 주행하게 된다– 오차에서 비교적 자유롭다

격자 사이를 어떻게 이동할까 ?

Page 90: 2013. 5. 25.

동작 나누기 : foward 와 center

foward:앞쪽 격자의 물체 직전까지

center:앞쪽 격자까지

Page 91: 2013. 5. 25.

• drvStraight 함수 : 직진을 수행하는 함수• moveForward 함수 : forward 에 해당하는 동작을 수행하는 함수• moveCenter 함수 : center 에 해당하는 동작을 수행하는 함수

Page 92: 2013. 5. 25.

좌표 주행 알고리즘

Page 93: 2013. 5. 25.

• 3 가지 정보 : X 좌표 , Y 좌표 , 방향– X 좌표 , Y 좌표는 위치를 알기 위한 정보– 방향은 로봇이 바라보는 방향을 알기 위한 정보

• 이 3 가지 정보를 활용해 경기장 상의 격자 위치를 좌표로 표현할 수 있다

좌표 주행을 위한 3 가지 정보

Page 94: 2013. 5. 25.

서 동

(0, 0)

(0, 8)

(4, 0)

(4, 8)

Page 95: 2013. 5. 25.
Page 96: 2013. 5. 25.
Page 97: 2013. 5. 25.
Page 98: 2013. 5. 25.

???

- Q & A -

Page 99: 2013. 5. 25.

감사합니다